我遇到的问题

第一版只是把用户消息转发给大模型。它能聊天,却不知道我的真实经历;如果把整份简历塞进提示词,既浪费上下文,也会把电话、邮箱等隐私带入模型。

因此我把目标写成三个可验证条件:回答履历时必须检索;不知道时不编造;公开知识不能包含敏感联系方式。

从聊天模型到 Agent

普通聊天是一条固定链路。Agent 多了一个决策循环:模型先判断是否需要工具,调用检索工具取得事实,再根据证据组织最终回答。

agent = create_agent(
    model=deepseek,
    tools=[retrieve_resume, retrieve_agent_guide],
    system_prompt=SYSTEM_PROMPT,
)

系统分层

浏览器负责输入与流式展示;Next.js 隐藏内部服务地址;FastAPI 提供 SSE;LangChain 负责 Agent 循环;BM25 Retriever 查询去隐私化简历;DeepSeek 只看到当前问题相关的片段。

我的第一条学习原则:先画清数据如何流动,再决定使用哪些框架。

第一版选择 BM25,是因为简历只有少量结构化段落。它容易解释、无需额外 Embedding API,也方便逐条检查召回结果。