您的位置:首页 > > 教程攻略 > ai资讯 >使用 LangGraph + DeepSeek 构建 AI 面试官:状态图设计与实践
使用 LangGraph + DeepSeek 构建 AI 面试官:状态图设计与实践
来源:互联网
更新时间:2026-06-13 07:52
先问一个问题:为什么一个普通的AI对话机器人,做不了面试官这件事?
传统的AI对话模式,说白了就是“用户问一句,AI答一句”。每个请求都是独立、无状态的,AI不会记得上一轮发生了什么。这在闲聊场景下问题不大,但放到面试场景里,就完全不一样了。
面试的核心在于动态调整。候选人答得好,得过7分,那就得继续深挖,追问具体细节;答得一般,四五分的水平,得换个角度试探;要是答得差,低于4分,就别在这棵树上吊死,果断切到下一个话题。这种根据用户回答实时变阵的能力,我们称之为条件路由。
如果硬要用普通的API调用来实现,你就得自己写一个状态管理机,把分支逻辑全都堆在代码里。函数调函数,状态散落在各处,逻辑一长,维护成本直接起飞。
而LangGraph就是为了解决这类问题而生的。
LangGraph是LangChain团队推出的一个状态图框架,专门用来编排那些“有状态、多步骤、有条件路由”的工作流。它概念不多,只有三个:State(状态)、Node(节点)和Edge(边)。简单理解就是,State是全局数据对象,在各个节点间传递;Node是一个具体的处理步骤,接收State,然后返回部分更新后的State;Edge则负责决定这些节点的执行顺序,并且支持条件路由。这就像是一张流程图,按部就班,又能随时根据条件拐弯。
具体到我们这个AI面试官项目,状态定义是最基础的一环。我们需要记录对话历史、当前处在哪个面试阶段、本阶段的评分列表、AI生成的回复、以及作为上下文使用的简历和岗位描述。这些信息都需要放在State里,作为整个状态机运行时的共享内存。
有了状态,接下来就是编排节点。整个面试流程可以拆解为三个核心节点:评估回答、策略决策和生成回复。每次用户回答完毕,状态机就启动一轮,先从评估节点出发,对刚才的回答打分;然后进入决策节点,根据分数和当前阶段,判断下一步是深入追问、换题、还是切换阶段;最后才是生成回复节点,把新的问题或者反馈内容生成出来。
说起来复杂,但代码实现其实非常简洁。核心就几行:先构建一个StateGraph,依次添加上面三个节点,然后把它们用边连起来,形成一个完整的闭环。
到这一步,整个骨架就搭起来了。接下来我们逐个节点展开来看。
第一个节点,评估回答。这个节点只做一件事:对用户的最新一条回答进行评分。调用DeepSeek大模型,给它设定一个“严格面试评分员”的角色,把用户的回答喂进去,让它输出一个结构化的JSON评分。这里有个关键技巧:把模型的温度参数调得极低,比如0.1,目的就是让评分尽可能稳定、客观,不给幻觉留任何空间。
第二个节点,条件路由。评分出来后,该往哪儿走?这里需要综合当前阶段的平均分和已回答的题数来做决策。举个例子,如果平均分在7分以上,而且已经问到第3道题了,那就表明这个阶段可以收尾,切换到下一阶段。但如果只问了1道题,而且答得很好,那就继续深挖。如果分数在4到6分之间,就换个角度再问。如果低于4分,就果断放弃,直接切阶段,不浪费彼此的时间。
第三个节点,生成回复。这个节点负责产出最终的面试官回复。它先根据当前决策,确定下一步是继续追问还是切换阶段,然后换上对应阶段的系统提示词。有意思的地方在于,这里用的温度是0.7,比评分节点的温度高得多。原因很简单:评分要准,所以要低温度;但面试官的回复要灵活、自然,甚至带点随机性,所以需要高温度。一高一低,各司其职。
再说说面试阶段的设计。一场完整的面试被拆成了五个阶段:自我介绍、项目深挖、基础考察、系统设计、反问环节。每个阶段都有不同的角色人设和出题策略。比如在项目深挖阶段,面试官扮演的是技术负责人,会严格按照STAR法则层层追问,一直追问到第三层,把技术选型、落地细节和踩坑复盘都挖干净。而在基础考察阶段,面试官会完全基于简历上的技术栈动态出题,写了Vue就问响应式原理,写了SSE就问流式渲染。
整套切换逻辑也很有讲究:每个阶段都有一个题数上限和分数下限,达到任一条件就会自动跳转到下一阶段。比如自我介绍阶段,正常就是3轮,如果哪一轮评分低于4分,也会提前切走。这个设定很关键,它保证了面试既不会在一个阶段里拖得太久,也不会在明显不行的候选人身上浪费过多的时间。
还有一个容易被忽略但很重要的细节:流式输出。面试官的回复要有打字机效果,一个字一个字地往外蹦,才像真人说话。我们用的是后端一次性生成全文,然后逐字通过SSE协议推送给前端。并且在推送时做了节奏控制:遇到句号、感叹号、问号这类的结尾标点,停顿稍长,模拟真人换气;遇到逗号和分号,停顿短一些;普通字符则快速输出。这种节奏感,会让候选人感觉对面坐着的就是个人,而不是一台机器。
最后做个效果对比,就能直观感受到差别了。没有状态机的线性流程,面试官只会按固定顺序出题,不管用户回答什么,都机械地往下推进。而有了LangGraph状态机之后,面试官会动态调整:你回答得好,它就追着问;你答不上来,它立刻换话题,整个体验就和真人面试几乎没什么区别。
总结一下,用LangGraph做这样的AI面试官,核心心得有三点。
第一,State设计决定一切。状态定义是LangGraph的起点,所有需要在节点间传递的数据都要放在State里,宁可多想一步,不要之后反复打补丁。
第二,Node要职责单一。每个节点只做一件事,评分别管决策,决策别管生成。这样方便调试,也方便未来替换模型或者逻辑。
第三,条件路由才是真正的核心能力。普通Chain只能线性执行,而有了条件边,才真正实现了动态决策。
当然,实际操作中也有一些坑值得注意。比如不要直接用LangChain的model.invoke(),在Next.js环境里可能会有类型兼容问题,直接用兼容OpenAI格式的SDK反而更稳定。Prompt一定要分阶段设计,别指望一个万能System Prompt搞定所有场景。还有就是刚才提到的温度策略,评分用低温,生成用高温,这个原则要时刻记着。