人才评测智能体 (Talent Assessment Agent) 工作流程
人才评测智能体(Talent Assessment Agent)是一个基于 LangGraph 的 AI 系统,旨在通过与员工的动态对话,评估其对特定知识领域的掌握程度。
1. 核心流程概述
评测过程分为四个主要阶段:
- 考纲拟定与生题 (Generation):基于知识库内容自动生成考题。
- 交互引导 (Interviewing):AI 作为考官,向用户抛出问题并引导回答。
- 智能阅卷与评分 (Grading):分析用户回答,给出分数及反馈,并决定是否追问。
- 综合学情报告 (Analysis):汇总所有表现,产出最终的能力定级和建议报告。
2. 后端架构 (LangGraph)
系统使用 LangGraph 构建了一个有状态的任务流。
2.1 状态定义 (State)
所有节点共享 EvaluationState,其中包含:
questions: 生成的题目列表(包含知识点和难度)。
currentQuestionIndex: 当前题目索引。
messages: 完整的对话历史(用于上下文推理)。
feedbackHistory: 考官给出的实时反馈和得分记录。
scores: 每道题的量化得分。
shouldFollowUp: 是否需要针对当前题目进行补充追问。
2.2 节点逻辑 (Nodes)
Generator (出题节点):
- 内容提取机制:
- 在评测开始前,
AssessmentService 会根据用户选择的“知识库”或“知识分组”进行内容检索。
- 单文档提取:直接从数据库中获取对应知识库记录的完整正文内容。
- 多文档分组提取:如果是知识分组,则通过
KnowledgeGroupService 并行获取分组内所有已处理文件的内容,并按 --- Document: [标题] --- 格式进行拼接,形成聚合上下文。
- 题目生成:
- 将提取到的文本注入 LangGraph 的
configurable 参数中。
- 节点调用 LLM,将该文本作为 Ground Truth (事实基准),要求 AI 生成 3-5 道覆盖不同知识点和难度(Standard, Advanced, Specialist)的 JSON 格式题目。
- 初始化:将生成的题目写入状态,并初始化评测进度。
Interviewer (提问节点):
- 负责将题目或追问信息转化为自然语言对话。
- 如果
shouldFollowUp 为真,则根据上次的 feedback 生成引导性话术。
- 节点执行后进入 中断挂起 (Interrupt) 状态,等待用户在前端输入。
Grader (评分节点):
- 用户提交回答后唤醒。
- 对比“标准知识点”与“用户回答”的匹配度(准确性、完整性、深度)。
- 给处 0-10 分,并生成建设性反馈。
- 追问判定:如果得分较低且未达到最大追问次数,则设置
shouldFollowUp = true。
Analyzer (报告节点):
- 评测结束(所有题目答完)时触发。
- 汇总所有得分和对话历史。
- 产出包含能力水平(Novice/Proficient/Advanced/Expert)、差距分析及学习建议的 Markdown 报告。
2.3 路由逻辑 (Routing)
__start__ -> Generator -> Interviewer -> (等待用户回答)
- 用户回答后 ->
Grader
Grader 判断:
- 需要追问? -> 回到
Interviewer
- 不需要追问且有后续题目? -> 索引自增,回到
Interviewer
- 题目全部完成? ->
Analyzer -> __end__
3. 前端交互流
3.1 准备阶段 (Setup)
- 用户选择知识分组(Knowledge Group)。
- 前端调用
/assessment/start 获取 sessionId。
- 连接到
/assessment/:id/start-stream 开始流式生成题目。
3.2 测评阶段 (Interactive)
- 实时对话:前端渲染
Interviewer 生成的问题。
- 渐进反馈:用户提交回答后,通过
/answer-stream 实时看到 Grader 给出的点评和得分(Live Feedback)。
- 状态流转:UI 会根据
processStep 提示当前 AI 正在进行的操作(如“正在阅卷”或“正在准备下一题”)。
3.3 结果阶段 (Completion)
- 测评完成后,展示总分、能力定级(Level)及详细分析。
- 支持历史记录回顾,用户可以随时查看之前的测评报告。
4. 数据持久化
- 线程持久化:LangGraph 的
MemorySaver 确保了对话状态的连续性。
- 业务存储:
AssessmentSession 表记录了每场测评的元数据(状态、总分、语言、生成的题目及最终报告)。
- 断点恢复:系统支持在服务器重启后,通过数据库中的历史消息自动重新激活 Graph 状态,实现“续考”。
5. 处理大规模知识库的“合理提取”策略
当知识分组中包含大量文档(如超过 50 份文件或数百万字)时,全量拼接(Raw Concatenation)会超越 LLM 的上下文窗口(Context Window)并降低生成质量。以下是系统推荐的“合理提取”进阶方案:
5.1 语义聚类与去重 (Semantic Clustering)
- 原理:不直接提取文件,而是利用系统中已有的
ElasticsearchService。
- 操作:对知识组内的所有分片(Chunks)进行语义聚类,从中提取 10-20 个最具代表性的核心知识点(Core Concepts),以此作为“出题大纲”,而不是直接喂入全文。
5.2 动态 RAG 检索生成 (Dynamic RAG Generation)
- 原理:将“出题”过程拆分为两步。
- 操作:
- 种子生成:AI 先在没有背景的情况下,根据知识组的主题(Topic)生成几个潜在的问题方向。
- 精准检索:针对每个方向,调用
RagService.searchKnowledge 检索出最相关的 Top-K 个知识分片。
- 基于片段出题:将检索出的精准片段作为 Ground Truth 提供给
Generator 节点,确保题目既真实存在于库中,又不会导致上下文溢出。
5.3 优先级与权重采样 (Weighted Sampling)
- 原理:根据文档的元数据进行筛选。
- 操作:
- 按更新时间:优先选择最近更新的政策或文档进行评测。
- 按文档权重:可以为知识库中的文档打标(如“核心规章” vs “参考资料”),
Generator 优先从核心规章中提取内容。
5.4 层次化提取 (Hierarchical Extraction)
- 原理:先总结,后出题。
- 操作:首先调用 AI 对整个知识分组进行一个“全景总结”(Summary),得到一份 2000 字以内的“知识图谱摘要”,再基于这份摘要进行出题编排。
6. 总结与建议选择
将架构改为 LangGraph 后,状态管理的复杂性从微服务代码退化为了直观的、声明式的图流转。对于大规模知识库的处理,建议逐步从“全量提取”转向“动态 RAG 采样”,以保证评测的深度与广度。