Recruitment · 2024 · In production

New ZhengHe

A hiring platform that connects verified Chinese job seekers directly with employers abroad, using bilingual AI search.

0:50
resumes listed by Chinese job seekers
250.9k
job positions listed by employers
20.9k
commercial service providers listed
1,088
employment agencies on the platform
250

The problem

Chinese workers seeking jobs abroad paid recruitment agencies fees as high as ¥27,000, often borrowed from family, and some were dismissed after three months. Employers hired through those agencies and bore none of the cost.

Who it’s for
Chinese job seekers looking for work abroad, the Chinese institutions that train them, and employers and agencies in Singapore, Japan, Korea and Hong Kong.
My role
AI/ML and backend engineer
Team
1 backend, 1 web, 1 mobile, 1 designer
Timeline
Since February 2024

Stack

AI & search

  • Qwen
  • Elasticsearch
  • LangChain
  • DeepL

Backend

  • NestJS
  • TypeScript
  • PostgreSQL
  • TypeORM
  • Socket.IO

Identity & payments

  • Alibaba Cloud ID Verification
  • Twilio
  • Stripe

Infra

  • Docker
  • GitHub Actions
  • Nginx
  • Alibaba Cloud ECS

How it works

Clients

  • Web app
  • Mobile app

API

  • NestJS API
  • Chat gateway
  • Index sync

AI

  • Qwen embeddings
  • Qwen chat
  • DeepL
  • Face liveness

Data

  • PostgreSQL
  • Elasticsearch

Ops

  • GitHub Actions
  • Blue-green deploy
  1. 01 A seeker proves who they are

    Email and +86 phone codes, then name, ID number and an Alibaba Cloud face-liveness check, before any account exists.

  2. 02 Every job becomes a vector

    When an employer posts, the API stores translations, then embeds the English text with Qwen into Elasticsearch.

  3. 03 A seeker types in Chinese

    One Qwen call returns Chinese job titles, each carrying a hidden English bridge term for matching.

  4. 04 Gate first, then rank

    The term expands into same-role synonyms that filter jobs by title or industry; Qwen vectors rank only what passes.

  5. 05 Employer and seeker talk directly

    Applications, shortlists and messages run through the API and a Socket.IO chat, with no agency in between.

  6. 06 Every push ships safely

    GitHub Actions builds an image; the new container must pass a health check before Nginx switches traffic.

Decisions

01

Relevance gate

Chose Synonym-expanded lexical gating before vector search over similarity-score thresholds.

Pure KNN always returns k neighbours, so a “Maid” search surfaced software jobs, and no threshold cut them reliably.

Trade-off: Each new search term costs a Qwen call to expand synonyms, cached for five minutes.

02

Query bridging

Chose Chinese titles with an English bridge term from one Qwen call over translating Chinese queries at search time.

Most seekers type Chinese but jobs are indexed in English; one call fills the dropdown and supplies the matching term.

Trade-off: Seekers must pick a suggestion; free-text Chinese search is rejected.

03

Label glossary

Chose Curated Chinese–English glossary for short labels over sending every label through DeepL.

DeepL’s reverse translation is lossy on short labels: “type” went to Chinese and came back as “enter”.

Trade-off: The glossary needs an entry for every new dropdown option.

What I’d do next

  • I’d put a relevance gate in front of vector search from the first release. KNN always returns k neighbours, and for five months that let unrelated jobs pad thin searches.
  • I’d move index and vector sync onto a queue with retries. Today a failed embedding is only logged, so that job stays invisible to text search until a reindex.
  • I’d run the 40 test suites in CI from day one. The pipeline’s test step is switched off, and a wrong filter path once silently emptied every filtered search.

Results

  • Off-role jobs on page one of a search

    Before: 35%After: 0%

  • Chinese searches that return jobs

    Before: 0%After: 94%

  • Languages a seeker can search in

    Before: 1After: 2

  • Steps to ship a backend release

    Before: 7After: 1

More work