优化 岗位编辑agent 性能
This commit is contained in:
@@ -282,14 +282,16 @@
|
||||
|
||||
### 处理流程(两步走)
|
||||
|
||||
核心思路:将用户操作原子化,把模块级并发拆成记录级并发,减少单次 AI 输出量,提升响应速度。
|
||||
|
||||
#### 第一步:准备数据
|
||||
|
||||
1. 从 Redis 取当前定制简历(不存在则报错)
|
||||
2. 查 `bg_job` 拿 title、description
|
||||
2. 查 `bg_job` 拿 title、description、requirement
|
||||
|
||||
#### 第二步:规划 AI(意图识别)
|
||||
#### 第二步:规划 AI(意图识别 + 操作原子化)
|
||||
|
||||
输入:用户指令 + 对话历史 + 当前完整简历内容 + 岗位 title
|
||||
输入:用户指令 + 对话历史 + 当前完整简历内容 + 岗位信息(title + description + requirement)
|
||||
|
||||
输出两种结果:
|
||||
|
||||
@@ -299,18 +301,31 @@
|
||||
```
|
||||
→ 直接返回 `{ "type": "message", "message": "..." }`,结束。
|
||||
|
||||
**修改计划(指令明确)**:
|
||||
**操作计划(指令明确)**:
|
||||
```json
|
||||
{
|
||||
"action": "modify",
|
||||
"modules": [
|
||||
{ "module": "resume", "instruction": "在 summary 中融入数据分析技能,skills 添加 Python" },
|
||||
{ "module": "work", "instruction": "精简第一段工作经历,突出量化成果" }
|
||||
],
|
||||
"updatedModulesLabel": "个人简介、工作经验"
|
||||
"operations": [
|
||||
{ "type": "delete", "module": "work", "id": "abc12345" },
|
||||
{ "type": "update", "module": "work", "id": "def67890", "instruction": "精简描述,突出量化成果" },
|
||||
{ "type": "update", "module": "resume", "instruction": "在summary中融入数据分析关键词" },
|
||||
{ "type": "add", "module": "internship", "instruction": "新增一段数据分析实习经历" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
操作类型:
|
||||
- **delete**:删除记录,需要 module + id
|
||||
- **update**:修改记录,需要 module + id + instruction(resume 主表不需要 id)
|
||||
- **add**:新增记录,需要 module + instruction
|
||||
|
||||
规则:
|
||||
- 每个操作对应一条原子操作,一个用户指令可拆出多条操作
|
||||
- `instruction` 限 50 字以内
|
||||
- `delete` 和 `update`(非 resume)必须带 `id`,从当前简历中匹配
|
||||
- `update` module 为 `resume` 时不需要 `id`(主表是单对象)
|
||||
- `add` 不需要 `id`
|
||||
|
||||
模块划分(按表结构,共 6 个):
|
||||
|
||||
| 模块名 | 对应表 | 可修改字段 |
|
||||
@@ -322,25 +337,27 @@
|
||||
| `project` | `bg_user_resume_project` | 全部字段 |
|
||||
| `competition` | `bg_user_resume_competition` | 全部字段 |
|
||||
|
||||
#### 第三步:按模块并发执行修改
|
||||
#### 第三步:按操作类型并发执行
|
||||
|
||||
根据修改计划,对每个模块并发调 AI(asyncio.gather):
|
||||
- 每个模块传入该模块的完整数据(如 work 传 `[{工作1}, {工作2}]` 整体)
|
||||
- AI 返回修改后的该模块完整数据
|
||||
- 所有模块统一走 AI,包括 skills 等简单操作(因为需要 AI 理解用户自然语言指令)
|
||||
先处理 delete(零 AI 开销),再并发执行所有 update 和 add(asyncio.gather):
|
||||
|
||||
- **delete**:后端直接按 module + id 从数组移除,不调 AI
|
||||
- **update(含 resume 主表和子表记录)**:按 id 取出单条记录 + instruction + schema + 岗位信息(title + description + requirement)+ 最近 10 条对话历史,调 AI 修改,只输出单条记录。resume 主表和子表记录复用同一个 prompt
|
||||
- **add**:instruction + schema + 岗位信息(title + description + requirement)+ 最近 10 条对话历史,调 AI 生成一条新记录
|
||||
|
||||
#### 第四步:合并
|
||||
|
||||
- AI 调用失败的模块保持原数据不动
|
||||
- 成功的模块直接用 AI 返回结果替换
|
||||
|
||||
把所有模块结果合并回完整简历。
|
||||
- delete 已直接处理
|
||||
- update 按 module + id 替换回原数据(resume 主表直接整体替换)
|
||||
- add 按 module 追加到对应数组
|
||||
- AI 调用失败的操作跳过,不影响其他操作
|
||||
|
||||
#### 第五步:保存 + 返回
|
||||
|
||||
1. 当前简历存为回滚数据(key:`customize:resume:rollback:{userId}`,过期 30 分钟)
|
||||
2. 新简历覆盖 Redis(key:`customize:resume:{userId}`),刷新过期时间 12 小时
|
||||
3. 返回 `type: updated` + 消息(前端通过 GET 接口查询新简历,通过回滚接口恢复)
|
||||
3. `updatedModulesLabel` 由后端根据 operations 中的 module 去重映射中文名拼接
|
||||
4. 返回 `type: updated` + 消息(前端通过 GET 接口查询新简历,通过回滚接口恢复)
|
||||
|
||||
### description 字段处理
|
||||
|
||||
@@ -427,10 +444,11 @@
|
||||
### 4. Agent - 规划 Prompt
|
||||
|
||||
```
|
||||
你是一个简历编辑助手。分析用户的指令,决定需要修改简历的哪些模块。
|
||||
你是一个简历编辑助手。分析用户的指令,将其拆解为原子操作。
|
||||
|
||||
【目标岗位】
|
||||
{job_title}
|
||||
{job_description}
|
||||
|
||||
【当前简历】
|
||||
{resume_json}
|
||||
@@ -441,47 +459,81 @@
|
||||
【用户指令】
|
||||
{instruction}
|
||||
|
||||
如果用户指令明确,返回修改计划 JSON:
|
||||
{"action": "modify", "modules": [{"module": "模块名", "instruction": "具体修改要求"}], "updatedModulesLabel": "中文模块名列表"}
|
||||
|
||||
如果用户指令不明确或需要澄清,返回对话 JSON:
|
||||
如果用户指令不明确或需要澄清,返回:
|
||||
{"action": "chat", "message": "你的追问内容"}
|
||||
|
||||
模块名可选:
|
||||
- resume:主表(个人信息,包含 name、email、mobileNumber、city、wechatNumber、portfolioUrl、skills、certificates、summary、avatarUrl)
|
||||
- education:教育经历
|
||||
- work:工作经历
|
||||
- internship:实习经历
|
||||
- project:项目经历
|
||||
- competition:竞赛经历
|
||||
只返回 JSON,不要其他内容。
|
||||
如果用户指令明确,将其拆解为原子操作列表,返回:
|
||||
{"action": "modify", "operations": [...]}
|
||||
|
||||
操作类型:
|
||||
1. 删除记录:{"type": "delete", "module": "模块名", "id": "记录id"}
|
||||
2. 修改记录:{"type": "update", "module": "模块名", "id": "记录id", "instruction": "修改说明(50字内)"}
|
||||
3. 修改主表:{"type": "update", "module": "resume", "instruction": "修改说明(50字内)"}
|
||||
4. 新增记录:{"type": "add", "module": "模块名", "instruction": "新增说明(50字内)"}
|
||||
|
||||
模块名可选:resume(主表,包含 name、email、mobileNumber、city、wechatNumber、portfolioUrl、skills、certificates、summary、avatarUrl)、education(教育)、work(工作)、internship(实习)、project(项目)、competition(竞赛)
|
||||
|
||||
规则:
|
||||
1. 每条操作对应一个最小粒度的修改,一个用户指令可拆出多条操作
|
||||
2. delete 和 update(非resume)必须带 id,从当前简历中匹配
|
||||
3. instruction 不超过50字,简明扼要
|
||||
4. 只返回 JSON,不要其他内容
|
||||
```
|
||||
|
||||
### 5. Agent - 模块修改 Prompt
|
||||
### 5. Agent - 单条记录修改 Prompt
|
||||
|
||||
```
|
||||
你是一个简历编辑助手。根据修改要求,修改简历的指定模块。
|
||||
你是一个简历编辑助手。根据修改要求,修改简历中的一条记录。
|
||||
|
||||
【目标岗位】
|
||||
{job_title}
|
||||
{job_description}
|
||||
|
||||
【修改要求】
|
||||
{module_instruction}
|
||||
{instruction}
|
||||
|
||||
【最近对话】
|
||||
{chat_history}
|
||||
|
||||
【模块数据结构】
|
||||
{module_schema}
|
||||
|
||||
【当前模块数据】
|
||||
{module_data}
|
||||
【当前记录数据】
|
||||
{record_data}
|
||||
|
||||
规则:
|
||||
1. 严格按照修改要求操作,可以增删改
|
||||
2. 未要求修改的记录保持不变
|
||||
1. 严格按照修改要求操作
|
||||
2. 未要求修改的字段保持不变
|
||||
3. 不要编造用户简历中不存在的内容
|
||||
4. 保持原文格式和结构
|
||||
5. description 字段是 [{id, text}] 格式:修改时保留原 id 只改 text,新增段落生成随机8位字符串作为 id,删除段落直接从数组中移除
|
||||
6. 新增记录时按照模块数据结构生成完整字段,id 使用随机8位字符串
|
||||
7. 返回修改后的完整模块数据(JSON 格式,与输入格式一致)
|
||||
5. description 字段是 [{id, text}] 格式:修改时保留原 id 只改 text,新增段落生成随机8位字符串作为 id,删除段落直接移除
|
||||
6. 返回修改后的完整记录数据(JSON 格式,与输入格式一致)
|
||||
```
|
||||
|
||||
### 6. Agent - 新增记录 Prompt
|
||||
|
||||
```
|
||||
你是一个简历编辑助手。根据要求,生成一条新的简历记录。
|
||||
|
||||
【目标岗位】
|
||||
{job_title}
|
||||
{job_description}
|
||||
|
||||
【新增要求】
|
||||
{instruction}
|
||||
|
||||
【最近对话】
|
||||
{chat_history}
|
||||
|
||||
【模块数据结构】
|
||||
{module_schema}
|
||||
|
||||
规则:
|
||||
1. 按照模块数据结构生成完整字段
|
||||
2. id 使用随机8位字符串
|
||||
3. description 中每个段落的 id 也使用随机8位字符串
|
||||
4. 内容要合理真实,贴合目标岗位方向
|
||||
5. 返回一条完整记录的 JSON,与模块数据结构一致
|
||||
```
|
||||
|
||||
### 各模块数据结构定义(传入 prompt 的 module_schema)
|
||||
|
||||
Reference in New Issue
Block a user