Building LinkedIn's First Production Agent: Hiring Assistant Platform and Architecture

linkedin · HR · 2025 · source Agentic: yes · promotional bias: low · source-backed · extracted with prompt 0.5.0 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: HR & recruiting software (enterprise SaaS)

LinkedIn wanted to move recruiters from a manual, filter-driven search workflow (40+ facets, human-driven query refinement) to task automation with an agent, targeting the most time-consuming cognitive task: reviewing hundreds of candidates against role qualifications. Two prior product generations showed that translating natural language into constrained structured queries loses information, and that a monolithic LLM block cannot be quality-engineered by a team. Hiring Assistant is LinkedIn's first production agent, built together with a reusable agent platform.

Constraints:

Architecture

A supervisor agent treats specialized sub-agents (intake, sourcing, candidate evaluation) as invocable tools; the intake agent converts free-text hiring intent into human-readable qualifications instead of lossy structured queries, and the sourcing agent runs many parallel searches against the existing Recruiter Search index. All of it sits on a shared agent platform: a prompt source-of-truth service (namespacing, versioning, backward-compatibility checks), an OpenAI-compatible LLM inference proxy (config-based model switching, quota enforcement, runtime moderation), LangChain/LangGraph behind LinkedIn-owned adapters, messaging-based agent-to-agent orchestration reusing LinkedIn's production messaging platform (FIFO threads, nearline retries, retargeting across regions), scoped and layered memory (working, episodic, procedural, collective) with retrieval via recency, summarization and vector search, a central skill registry with runtime skill selection and service-principal authorization, and OTel-fed aggregated observability built for non-deterministic flows.

Diagram confidence: explicit (topology described by the source).

flowchart LR
  messaging-orchestration[Messaging platform + agent orchestrator] --> supervisor-agent[Supervisor agent]
  supervisor-agent --> intake-agent[Intake agent]
  supervisor-agent --> sourcing-agent[Sourcing agent]
  intake-agent --> skill-registry[Skill registry]
  sourcing-agent --> skill-registry
  sourcing-agent --> recruiter-search-index[Recruiter Search index]
  recruiter-search-index --> candidate-evaluation[Candidate evaluation]
  candidate-evaluation --> llm-inference-proxy[LLM inference proxy]
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
supervisor-agent Determines user intent and orchestrates the sub-agents, invoking them as tools and acting on their returned information. intake-agent, sourcing-agent, messaging-orchestration
intake-agent Converts free-text hiring intent plus recruiter preferences into a set of human-readable qualifications that drive the rest of the flow. supervisor-agent, skill-registry
sourcing-agent Reads qualifications and explores the candidate search space with many parallel queries, mimicking a recruiter's iterative search behavior. supervisor-agent, skill-registry, recruiter-search-index
candidate-evaluation High-scale per-candidate task: checks each qualification against profile and resume with a fine-tuned model and returns evidence citations ('receipts'). recruiter-search-index, llm-inference-proxy
recruiter-search-index The pre-existing retrieval and ranking search stack over LinkedIn members, now driven by agent-generated queries. sourcing-agent, candidate-evaluation
messaging-orchestration Models all user-agent and agent-agent communication as messages on LinkedIn's production messaging platform; provides FIFO threads, parallelism via multiple threads, nearline retry and cross-region retargeting; the agent orchestrator exposes plain RPC to developers. supervisor-agent
skill-registry Central registry of skills (RPCs, database queries, prompts, other agents) with gRPC auto-registration, text and embedding search, runtime skill selection, and service-principal authorization; predates and now integrates with MCP. intake-agent, sourcing-agent
llm-inference-proxy Single chokepoint exposing the OpenAI chat-completions API over Azure OpenAI and on-prem fine-tuned open-source models; enables config-based model switching, quota management, and runtime trust/safety moderation. candidate-evaluation
prompt-source-of-truth Facade service managing prompt templates: namespacing, use-case segregation, versioning, and backward-compatibility checks, so developers do not manage prompts by hand. —
memory-service Scoped and layered memory: working (task context), long-term episodic and procedural, and collective memory at multiple granularities (per recruiter, per company, per recruiter type); retrieval via most-recent-N, summarization, and semantic vector search. —
observability-pipeline Sophisticated aggregation over traces/events/logs of non-deterministic flows, fed into OTel; serves single-invocation debugging and production-scale aggregate analytics. —

Data flow

A recruiter submits hiring intent (optionally attaching a job posting or notes). The supervisor agent classifies the intent and routes the request to the intake agent, which looks up recruiter preferences via skills and generates a set of textual qualifications. The sourcing agent reads those qualifications, uses skills to generate multiple search queries in parallel, and feeds them through the Recruiter Search index. Returned candidates flow to the candidate-evaluation task, where a fine-tuned model checks each qualification against the profile and resume and emits citations. When the agent cannot proceed, it escalates to a human. All user-agent and agent-agent hops travel as messages (structured payload + free-text instructions) through the messaging platform, with FIFO ordering inside a thread and nearline retry/retargeting on failure; sub-agents are reached via RPC endpoints behind the agent orchestrator.

4 supporting quotes
“The user gives an input, it goes into our supervisor agent. The supervisor is going to determine, what is that intent about? What is the user trying to do here? Then based on that, it's going to send the request, possibly with some other information to another agent.”article, stated
“Then the intake agent will take over. It might use some skills to look up user preferences, maybe things that the recruiter typically does, or other things associated with this hiring project.”article, stated
“using our sourcing agent, which is going to read those same qualifications we just generated. Then it's going to use other skills like the ones we talked about to generate search queries, and then feed those through our Recruiter Search index.”article, stated
“In case the delivery fails it keeps attempting a nearline retry.”article, stated

Why this architecture

Modularity is the load-bearing decision: sub-agents (like the earlier copilot's specialist modules) can be developed and quality-iterated in parallel and in isolation, which is how a team of engineers scales work on a non-deterministic system — accepting compounded per-stage error in exchange for engineerable sub-components. Messaging was chosen as the orchestration substrate because agentic workloads face exactly the distributed-systems problems (state consistency, traffic shifts, host outages, ephemeral failures) that LinkedIn's messaging platform already solves. Platform abstractions (prompt service, inference proxy, framework adapters, skill registry) exist to standardize boilerplate, keep models and frameworks swappable in a fast-moving ecosystem, and give central enforcement points for quota and trust.

4 supporting quotes
“The basic game plan here is to make sure that we can iterate on the quality of each of them in parallel and independently, and build this thing from the bottom up.”article, stated
“We are able to piggyback on a lot of the resilience mechanisms we have for delivering the messages on LinkedIn which are subject to exactly the same problems with an agentic workload.”article, stated
“The reason to do something like this is because you think you can engineer each of those sub-components to a very high level of quality and thus have an overall better system”article, stated
“Today we like it, tomorrow some other framework comes out or we want to try something, we have the ability to switch relatively cheaply without changing the entire ecosystem.”article, stated

Models used: GPT-4o (development iteration on agent chains) · Azure OpenAI models · EON (LinkedIn multitask instruction-tuned open-source LLMs on economic graph data) · on-prem hosted fine-tuned open-source models

Scale

Alternatives considered (roads not taken)

A single monolithic LLM block (prompt template + RAG few-shot examples) for query understanding, as prototyped

Rejected because: Any few-shot example added to fix one behavior can change unrelated behavior; the whole context influences the output, which bottlenecks a team trying to engineer quality in parallel.

“that introduction of that example could actually affect the behavior of something else in your system. This is the way LLMs work. They're non-deterministic. The whole of the context that they operate over influences the output. This leads to bottlenecks in scaling”article, stated

Keeping the coach-era interface: translating natural language into the existing structured search facets

Rejected because: Rendering open-ended natural language into a constrained logical structure loses information; the agent instead preserves intent as human-readable textual qualifications used for search and evaluation.

“Then we're trying to put that into a constrained logical structure. If you've worked on that kind of problem before, you know that there's a lot of information lost when you do that.”article, stated
“Based on those textual qualifications, which you can read and understand as a person, and preserve a lot more of the meaning.”article, stated

Hand-implementing tool integrations inside every LLM application

Rejected because: It does not scale across teams; LinkedIn inverted the dependency into a central skill registry where every service/agent owner exposes skills that are retrieved and selected at runtime.

“Originally, we had implemented these pretty manually, and later we realized that it's not going to scale to implement it manually, so we inverted it.”article, stated

Sending prompts inside inter-agent messages

Rejected because: Messages carry structured data plus free-text instructions instead; already-structured data should not round-trip through natural language and risk information loss.

“No, we don't send prompts. Sending prompts in messages is problematic.”article, stated
“Because if it's already structured, why go through the non-deterministic path of converting it into a natural language and potentially losing information when you convert it back into structured information.”article, stated

Relying on huge context windows instead of scoped memory with precise retrieval

Rejected because: Long context is slower, more expensive (token-bound), and increases hallucinations, so memory retrieval uses recency, summarization, and semantic vector search.

“Even if you had huge context the problem still remains that it's really slow and it's more expensive to process, because, ultimately, you're bound by the number of tokens.”article, stated
“In general, you will see more hallucinations with a longer context.”article, stated

Patterns

multi-agent-orchestration (orchestration)

A supervisor agent invokes specialized sub-agents (intake, sourcing) as tools, passing information down and acting on returned results; the prior copilot's entire flow became one skill under one agent, applied hierarchically.

“there is a supervisor, but here it's an agent that can treat the other agents under it, the sub-agents, as tools that it can invoke and pass information to, and they can return information back to it, and it can act on that.”article, stated

tool-use-orchestration (orchestration)

Skills (richer than tools: RPCs, database queries, prompts, even other agents) live in a central registry; at runtime the agent selects the most appropriate skill dynamically and fills its arguments, rather than having tools hardcoded per application.

“Rather than hardcode the tool, you dynamically figure out from the skill registry what tool is most appropriate, fill in the arguments to it using the power of the LLM, and after that execute it.”article, stated

async-message-orchestration (orchestration)

All user-agent and agent-agent communication is modeled as messages on LinkedIn's production messaging platform, inheriting its delivery, retry, retargeting, and thread semantics: FIFO within a thread for sequential context, multiple threads for parallelism.

“all the communication between users and agents, and agents and agents should be modeled as a message.”article, stated
“We have this concept of threads which is again really similar to messaging threads, where we will do sequential First-In-First-Out delivery within a thread. If you want parallelism, you just create multiple threads.”article, stated

agent-memory (context)

Memory is scoped and layered — working memory for task context, long-term episodic and procedural memory, experiential memory learned from human interactions, and collective memory at recruiter/company/role granularities — with retrieval via most-recent-N, summarization, and semantic vector search.

“Our memory is actually scoped and layered. We have working memory which is task context within the context of a particular task.”article, stated
“we also have this cool thing called experiential memory, where the agent learns from its experience of interaction with the human and it stores things.”article, stated

model-routing (model-operations)

Model choice is split by path economics: state-of-the-art general models (e.g. GPT-4o) where iteration agility matters, fine-tuned smaller models on the orders-of-magnitude-larger candidate-evaluation path; a config-driven inference proxy lets teams switch models on the fly.

“That's orders of magnitude bigger scale. There we want to use fine-tuned smaller LLMs.”article, stated
“After that we have a configuration-based system via which you can go and you can change your LLM on the fly and call different LLMs.”article, stated

human-in-the-loop-gate (governance)

Escalation to a human is an explicit agent-era concept: when the agent cannot do something it hands off, and the human's response feeds back into the loop.

“We have an explicit concept of human in the loop, where if the agent cannot do something, it escalates to a human.”article, stated

eval-driven-development (evaluation)

Each sub-agent has a defined input/output surface evaluated in isolation via a common quality playbook: human rubrics first, transitioning quickly to LLM-driven, reference-free automated evaluation to unblock iteration speed; candidate evaluation itself emits per-qualification citations.

“Starting with each of them, we would define our rubrics for humans, use those as quickly as we can to transition to LLM driven automated evaluation, because really the bottleneck in developing these tools, the unlock is being able to iterate quickly to improve quality.”article, stated
“If so, it gives you citations that show you where that supporting evidence comes from on the profile or the resume. It has receipts.”article, stated

observability-tracing (operations)

Because agentic flows are non-deterministic, classic observability fails; LinkedIn built sophisticated aggregation feeding OTel traces and analytics dashboards, used both for single-invocation debugging and production-scale aggregates.

“We had to build various forms of sophisticated aggregation which is then fed into industry standard systems like OTel, in order to generate a trace.”article, stated

Tradeoffs

System decomposition: modular sub-agents versus one monolithic LLM block.

Chose supervisor plus specialist sub-agents developed and evaluated in isolation over a single prompt-template-plus-RAG block.

Rationale: Parallel team development and per-component quality engineering outweigh the compounding per-stage error that modularity introduces.

“The reason to do something like this is because you think you can engineer each of those sub-components to a very high level of quality and thus have an overall better system”article, stated

Model selection split by path scale characteristics.

Chose state-of-the-art general models for fast-iterating, recruiter-scaled paths; fine-tuned smaller models for candidate-scaled paths over one model class everywhere.

Rationale: Iteration agility needs best instruction-following; the evaluation path is orders of magnitude larger and needs cheap, specialized inference.

“That means you want the best instruction following to be the most agile. You're going to want to go with something like the most state-of-the-art LLM. During some of this development, it was GPT-4o, for example.”article, stated

Orchestration substrate for distributed agent execution.

Chose message-based orchestration on the existing LinkedIn messaging platform over building new distributed state/retry machinery for agents.

Rationale: Agentic workloads share messaging's failure modes (state consistency, traffic shifts, outages), so reusing its resilience machinery avoids re-solving them.

“We are able to piggyback on a lot of the resilience mechanisms we have for delivering the messages on LinkedIn which are subject to exactly the same problems with an agentic workload.”article, stated

Framework adoption posture.

Chose LangChain/LangGraph behind LinkedIn-owned adapters and platform layers over coupling application code directly to the framework.

Rationale: The space moves fast; layering keeps the framework swappable relatively cheaply.

“Today we like it, tomorrow some other framework comes out or we want to try something, we have the ability to switch relatively cheaply without changing the entire ecosystem.”article, stated

Build-versus-buy default for agent infrastructure.

Chose buy/adopt existing components wherever available over investing in a fully custom stack.

Rationale: A fast-moving ecosystem punishes heavy in-house investment by making new capabilities hard to adopt.

“In general, always try to buy, don't try to build. Only try to build if it's simply not available, because, again, the space is moving really fast, new things keep coming out every day.”article, stated

When to use an LLM at all inside an agent.

Chose procedural code for simple workflow automation; LLMs only where reasoning is required over LLM calls as the default mechanism.

Rationale: Procedural code is more stable and faster; reasoning is the only thing that justifies the LLM's cost and nondeterminism.

“most of the time in an agent, if you're doing simple workflow automation, you may not even need an LLM. You don't even need AI, procedural code works a lot better, a lot more stable, faster.”article, stated

Degree of model customization.

Chose prompt engineering and RAG first; fine-tuning and pre-training only when required by quality, scale, or latency over reaching for custom models early.

Rationale: Techniques at the top of the customization pyramid are expensive and hard to maintain while models evolve quickly.

“use the techniques at the bottom of the pyramid as much as you can, and try to use the techniques at the top as less as you can, because it becomes really expensive, hard to maintain”article, stated

Execution concurrency model for agent communication.

Chose FIFO ordering within a thread, parallelism by creating multiple threads over fully linear or fully parallel execution.

Rationale: Context and reference require sequential delivery within a task, while independent work should fan out.

“Execution concurrency is very important. You don't want it to all be very linear but sometimes you want it to be linear because context matters and reference matters.”article, stated

Gotchas (what bit them)

Errors compound multiplicatively across modular LLM stages.

Root cause: Each stage is statistical; chaining two 90%-accurate stages yields 81% end-to-end.

Resolution: Accepted deliberately: engineer each sub-component to very high quality in isolation so the overall system still wins versus one unengineerable block.

“If you have 90% accuracy in both stages, you're going to have 90% of 90%, that's 81%.”article, stated

In a single LLM block, fixing one behavior with a few-shot example silently changes other behaviors.

Root cause: The whole context influences non-deterministic output; examples are not isolated patches.

Resolution: Modular architecture with an interpreter/coordinator and specialist chains (later, sub-agents) so instructions for one concern cannot leak into another.

“that introduction of that example could actually affect the behavior of something else in your system. This is the way LLMs work. They're non-deterministic.”article, stated

Classic observability tooling fails on agentic systems.

Root cause: Flows are inherently non-deterministic, so per-request traces do not yield insight on their own.

Resolution: Purpose-built aggregation over traces/events/logs feeding OTel and analytics dashboards, for local debugging and production aggregates.

“The problem with these agentic systems is that they are inherently non-deterministic so you can have various different flows going on all the time. Your classic observability doesn't work that well. It's really hard to get insights.”article, stated

Fine-tuning fights product iteration while the problem statement is still moving.

Root cause: Fine-tuning optimizes aggressively within a well-defined problem; an evolving product keeps redefining it.

Resolution: Multitask instruction tuning (EON): fine-tune open-source LLMs on LinkedIn economic graph data while preserving instruction-following, outperforming same-size open-source models yet staying steerable.

“fine-tuning works best when you have a well-defined problem statement and you're just trying to optimize really aggressively to drive up quality within that problem statement. What if you're changing the problem statement along the way?”article, stated
“we end up with a system where it can outperform models of a similar size that are coming from open source, but you can still put in different instructions you can iterate with on your product”article, stated

A bare text box is bad agent UX despite seeming ideal.

Root cause: Users carry the overhead of guessing what to type and whether it will work.

Resolution: Finer-grained controls (e.g. clickable personalization filters next to the editable AI message) instead of free text everywhere.

“A lot of apps just say, stick a text box, have the users enter things into it. Sounds very ideal, actually it doesn't work, because it's a lot of overhead for users to remember”article, stated

Spinners and static UIs fail for long-running agent work.

Root cause: Agents do heavy asynchronous work; users waiting on a spinner get irritated.

Resolution: Show progress indicators only for reasonably fast responses; otherwise use an explicit async flow with an ETA and notification when done.

“only if you're going to respond reasonably fast, show these spinners, show these progress bars, otherwise it's better to use an explicit async flow with some ETA, and use an async notification-like mechanism to inform users when the task is done.”article, stated

A central skill registry can silently grant every agent dangerous capabilities.

Root cause: Any developer can register a skill wrapping a destructive service endpoint, and dynamic skill selection would expose it broadly.

Resolution: Service-principal authorization applied transitively to agents: an agent must hold the registered principals to call a skill.

“If you essentially build an agent, you have to have the service principles registered to be able to call the skill service principles, which is how we enforce this.”article, stated

Evaluation

A common quality playbook per sub-agent: define the input/output surface, write human rubrics, then transition quickly to LLM-driven, reference-free automated evaluation so quality iteration is not bottlenecked on human annotation; components are measured in isolation and then stitched together for overall-agent evaluation. The candidate-evaluation output itself is evidence-based, citing where each qualification is supported on the profile or resume.

Metrics: per-component quality rubrics (human, then LLM-automated) · reference-free evaluation scores · per-qualification evidence citations on candidate evaluations

“The more we can move away from having to use a lot of human annotation or having to, for example, have a correct reference output for every possible example we're evaluating, moving to reference-free evaluation.”article, stated

Outcomes

First production agent at LinkedIn, built on a platform intended for all subsequent agents; candidate-evaluation path designed for thousands of evaluations per job.

3 supporting quotes
“It's currently in a limited charter with a select group of our partners, enterprise customers.”article, stated
“we were actually able to implement almost in parallel another version of the Hiring Assistant, which is built out of some of the same components, but is targeted at small and medium businesses”article, stated
“MCP was not a thing last year when we built this, but right now it is a thing, so our skill registry can be integrated into MCP.”article, stated