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