Semantic talent intelligence
A production semantic search platform for a talent intelligence firm serving the legal sector. Delivered, client owned, and extended beyond its original scope.

Search that matches people by what they have done, not which words they used. Experience, matter history and published work stay separate until ranking, so a reviewer can see the evidence rather than a number.
Context
The client needed to find people by what they had actually done, not which words appeared in their profile. Their users were asking who has genuinely handled this kind of matter, at this scale, in this jurisdiction. A keyword system can only return what it was told to look for.
The thinking
The conventional approach embeds a person as one vector. That collapses two very different signals into one point: delivery experience and thought leadership. Somebody who wrote six articles about a practice area looks like somebody who ran six of those matters.


What I built
Separate representations for experience, matter history and published work. Each scored against the query independently and merged into a composite only at ranking time, weighted 0.50, 0.30 and 0.20 by default and configurable per tenant.
Late fusion is the whole point. The client retunes what they optimise for without re-embedding anything, and every result can show why it ranked: the profile fit, the strongest matching matter, the reinforcing publication. A reviewer sees the evidence rather than a number.
Candidates are scored against a client-defined competency framework rather than ad hoc tags. Multi tenant isolation is enforced at the retrieval layer rather than filtered afterwards. Warmup pre-builds in-memory indices on tenant selection, trading memory for latency. Delivered with source code and documentation.
What I measured
There is no ground truth for who the right lawyer is, so accuracy is not the measure. What is measurable is discrimination: given two queries in the same practice area, one about delivery and one about authorship, does the system return different people?
Twelve practice area pairs across 285 profiles, top five each, scored on how many names the two lists share. Three architectures compared: the delivered late fusion design, a single collapsed vector, and an evidence-level rank fusion variant built for the test.
Rank fusion won on the headline number. The results said otherwise. One lawyer appeared in 11 of the twelve delivery lists and topped eight, across practice areas he has no claim to. Generic matter text ranks mid table against almost any query, and rank fusion turns consistent mid table presence into a top result. He has no publications, so he never appears on the authorship side, and every list he occupies is a list that shares fewer names with its partner.
The 40% was an artifact. Late fusion stayed in production. Overlap on its own measures difference, not quality. Paired with a count of distinct people returned across all twelve areas, it catches this on the first run.
The limit
Built on one client's corpus, in one sector. What it does well is narrow: find people by the work they have actually done, and show the evidence behind every ranking so the person reviewing can confirm the match rather than take it on trust.

