talent_assessment_workflow.md 6.7 KB

人才评测智能体 (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 采样”,以保证评测的深度与广度。