0a9588abb7
- Add pagination support to findAll (page, limit query params) - Add findByTemplateId method to service - Add GET /by-template/:templateId endpoint to controller - Service already includes CRUD for QuestionBank and QuestionBankItem
122 lines
6.7 KiB
Markdown
122 lines
6.7 KiB
Markdown
# 人才评测智能体 (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 采样”,以保证评测的深度与广度。
|