# 人才评测智能体 (Talent Assessment Agent) 工作流程 人才评测智能体(Talent Assessment Agent)是一个基于 LangGraph 的 AI 系统,旨在通过与员工的动态对话,评估其对特定知识领域的掌握程度。 ## 1. 核心流程概述 评测过程分为四个主要阶段: 1. **考纲拟定与生题 (Generation)**:基于知识库内容自动生成考题。 2. **交互引导 (Interviewing)**:AI 作为考官,向用户抛出问题并引导回答。 3. **智能阅卷与评分 (Grading)**:分析用户回答,给出分数及反馈,并决定是否追问。 4. **综合学情报告 (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) - **原理**:将“出题”过程拆分为两步。 - **操作**: 1. **种子生成**:AI 先在没有背景的情况下,根据知识组的主题(Topic)生成几个潜在的问题方向。 2. **精准检索**:针对每个方向,调用 `RagService.searchKnowledge` 检索出最相关的 Top-K 个知识分片。 3. **基于片段出题**:将检索出的精准片段作为 Ground Truth 提供给 `Generator` 节点,确保题目既真实存在于库中,又不会导致上下文溢出。 ### 5.3 优先级与权重采样 (Weighted Sampling) - **原理**:根据文档的元数据进行筛选。 - **操作**: - **按更新时间**:优先选择最近更新的政策或文档进行评测。 - **按文档权重**:可以为知识库中的文档打标(如“核心规章” vs “参考资料”),`Generator` 优先从核心规章中提取内容。 ### 5.4 层次化提取 (Hierarchical Extraction) - **原理**:先总结,后出题。 - **操作**:首先调用 AI 对整个知识分组进行一个“全景总结”(Summary),得到一份 2000 字以内的“知识图谱摘要”,再基于这份摘要进行出题编排。 --- ## 6. 总结与建议选择 将架构改为 LangGraph 后,状态管理的复杂性从微服务代码退化为了直观的、声明式的图流转。对于大规模知识库的处理,建议逐步从“全量提取”转向“动态 RAG 采样”,以保证评测的深度与广度。