Skip to content

Commit b8ecb1a

Browse files
CyningMMcursoragent
andcommitted
docs(task): Portfolio JD 匹配 P0 任务草案与三次 QA 留证
新增 active task(rewrite/rubric/降级)及 2026-06-01 diary, 记录 Moonshot 长 JD 单轮匹配场景的三次人工 QA 结论。 Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent cdfea00 commit b8ecb1a

2 files changed

Lines changed: 246 additions & 0 deletions

File tree

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# Portfolio · 岗位 JD 匹配 — 三次 QA 留证与改进 backlog
2+
3+
|| 内容 |
4+
| --- | --- |
5+
| **日期** | 2026-06-01 |
6+
| **场景** | Portfolio 演示站 Unified Chat · 用户粘贴 **Moonshot「AI Coding Mentor」** 岗位 JD,问「匹配度如何」 |
7+
| **站点 subject** | 演示站默认「他」= **刘新宁**`intent_hints.yaml` · `content/resume/`|
8+
| **关联 task** | [`task_portfolio_jd_match_p0_rewrite_rubric_v1.md`](../tasks/active/task_portfolio_jd_match_p0_rewrite_rubric_v1.md) |
9+
| **模型 PR** | [#118](https://github.com/Cyning12/ai-ink-brain-api-python/pull/118) — Chat/Intent 默认 **DeepSeek-V4-Pro**(本 QA ③ 实测模型) |
10+
| **性质** | **diary 留证**;非 L0 实现真值;结论冻结后须同步 task / SPEC |
11+
12+
---
13+
14+
## 今日结论(TL;DR)
15+
16+
1. **三次跑法差异巨大**:单轮弱模型 → RAG 失败 + 错误降级;多轮有历史 → rewrite 借摘要勉强可用;单轮 + V4-Pro → 主观「非常好」,但 **rewrite 仍未压缩 JD**
17+
2. **根因不在 Intent 路由**:三次均为 `rag_search`、高置信;问题在 **长 Query 无改写****generate 不确定判定****RAG 失败 → direct_answer** 降级链。
18+
3. **模型升级是必要非充分**:PR #118 解决 generate 质量;**P0 仍须**单轮 JD 切分/改写、Portfolio subject 默认、禁止 Portfolio 场景错误 direct_answer。
19+
4. **③ 存在输入污染**`user.message` 末尾误含 `assistant\n刘新宁简介…`(非 session 历史);须排查前端复制/拼接,**不能**当产品能力依赖。
20+
21+
---
22+
23+
## 测试问法(共用 JD 骨架)
24+
25+
用户消息形态(三次相同 JD 正文,问句略有差异):
26+
27+
```text
28+
我的岗位JD如下,你觉得(他/刘新宁)的匹配度如何?
29+
——————
30+
AI Coding Mentor
31+
…(造题/数据集/评测/RL 后训练 · 3–10 年一线工程 · 代码洁癖 · 「助教人格」…)
32+
```
33+
34+
**与五问 chip 的差异**:五问为 **短问、单主题**;JD 匹配为 **复合任务**(解析 JD 维度 + 对齐 resume/evidence 证据 + 输出 rubric 式结论)。
35+
36+
---
37+
38+
## 三次 QA 对照表
39+
40+
| 维度 | ① 单轮 · 弱模型 | ② 多轮 · 弱模型 | ③ 单轮 · V4-Pro |
41+
| --- | --- | --- | --- |
42+
| **前置** | 直接贴 JD | 先问「简单介绍下刘新宁」再贴 JD | **新对话**(Intent:**无历史对话**|
43+
| **Intent** | `rag_search` ~0.92 | 同左 | 同左 |
44+
| **模型(Timeline debug)** | 推测 Qwen2.5-7B / Flash | 同左 | **deepseek-ai/DeepSeek-V4-Pro**(Intent + `rag.generate`|
45+
| **rewrite** | `latency_ms: 0``rewritten_query` = **全文 JD** | ~6.7s;压成带 **刘新宁摘要** 的短检索句 | `latency_ms: 0`**未改写**(= 超长原文) |
46+
| **rewrite 原因** | 无 session 历史 → `build_rewrite_llm_messages` 返回 `None` | 有 history → 走 LLM 改写 | 同① |
47+
| **rag_search** | `RAG_GENERATE_UNCERTAIN` | 成功 | 成功 |
48+
| **sources** | 无有效答案 | resume×4 + methodology 卷一×6 | resume + methodology;含 Mentor/评测映射 chunk |
49+
| **最终路径** | **direct_answer** | RAG 直答 | RAG 直答 |
50+
| **答案基调** | 「您没提供背景信息」 | 「较高,**方向偏差**」(偏 RL/训练侧) |**非常高** / 量身定制」 |
51+
| **耗时** | ~143s | ~73s | ~58s |
52+
53+
---
54+
55+
## 分轮根因(Timeline 对齐)
56+
57+
### ① 单轮 · 最差路径
58+
59+
| 环节 | 代码落点 | 现象 |
60+
| --- | --- | --- |
61+
| rewrite 空转 | `api/query_rewrite.py::build_rewrite_llm_messages`**无 history 返回 None** | 首轮长问句零压缩 |
62+
| generate 失败 | `api/tools.py::rag_search_execute``_rag_should_treat_as_uncertain` | 答案含「无法/不确定」即整段失败 |
63+
| 错误降级 | `api/chatbi_failure.py``RAG_GENERATE_UNCERTAIN → direct_answer` | Portfolio 无简历上下文时 **语义反转** |
64+
65+
### ② 多轮 · 「碰巧修好」
66+
67+
- rewrite 将上一轮 assistant **简介摘要**写入 `rewritten_query`,等价于补全 subject,检索噪声下降。
68+
- **不是产品设计**:依赖用户先问 Q1;单轮 JD 场景仍失败。
69+
- 生成仍偏 **RL/造题/后训练**,对 **Harness/方法论/带教** 证据利用不足 → 「方向偏差」。
70+
71+
### ③ 单轮 · V4-Pro · 需更正的变量
72+
73+
| 因素 | 是否成立 | 说明 |
74+
| --- | --- | --- |
75+
| Session 多轮历史 || Intent 明确「无历史对话」 |
76+
| rewrite 压缩 JD || `rewritten_query` 仍等于原文 |
77+
| **生成模型 V4-Pro** |**主因** | 同一套 sources/score 下,generate 能把 Harness/连载对齐到「设计作业/助教」叙事 |
78+
| **user 内误贴 assistant 简介** |**次因** | 单条 message 含 JD + 分隔符 + 误粘贴的候选人摘要;****服务端 session 恢复 |
79+
| Mentor 映射 chunk | ✅ 小加分 | sources 命中「Mentor/评测」相关 methodology 块 |
80+
81+
**待排查(前端)**:新对话下 `user.message` 为何带 `assistant\n…` 前缀段 — 复制污染 vs UI 拼接 bug。
82+
83+
---
84+
85+
## 与现有栈的能力边界
86+
87+
| 能力 | 五问 short query | JD 匹配 long query |
88+
| --- | --- | --- |
89+
| 512 字固定分块 ingest | 够用 | JD 噪声淹没 embedding |
90+
| 无历史 rewrite | 可接受 | **不可用** |
91+
| 单次 rag_search | 够用 | 应多维度 / 分条检索 |
92+
| Intent hints(人名) | Q4 够用 | 未覆盖「粘贴 JD + 他=谁」 |
93+
| `RAG_GENERATE_UNCERTAIN → direct_answer` | 偶发 | Portfolio **高危** |
94+
95+
---
96+
97+
## 改进 backlog(摘要 · 详 task)
98+
99+
### P0 — 投递后优先(不依赖多 Agent)
100+
101+
| ID || 要点 |
102+
| --- | --- | --- |
103+
| **P0-1** | **长 Query / JD 切分改写** | 无 history 时也须 LLM:拆 JD 维度 + 固定 subject=刘新宁 + 输出短检索句 |
104+
| **P0-2** | **Portfolio subject 默认** | 「匹配度」类问句默认指站点主人 |
105+
| **P0-3** | **降级策略** | Portfolio + rag intent 下禁止 `RAG_GENERATE_UNCERTAIN → direct_answer` |
106+
| **P0-4** | **generate rubric 提示** | 维度对齐 / 证据引用 / 缺口说明 |
107+
| **P0-5** | **语料** | `content/evidence/jd-match-profile.md` |
108+
| **P0-6** | **前端** | 排查 user 消息误含 assistant 段 |
109+
110+
### P1 — 质量与性能
111+
112+
| ID || 要点 |
113+
| --- | --- | --- |
114+
| **P1-1** | **并行 sub-RAG** | JD 维度切分 → 并行检索 → 合并 generate |
115+
| **P1-2** | **标题感知分块** | ingest `section_header` |
116+
| **P1-3** | **评测** | Moonshot JD fixture + Timeline 断言 |
117+
118+
### 已做
119+
120+
|| 状态 |
121+
| --- | --- |
122+
| 默认模型 V4-Pro | PR #118 |
123+
124+
---
125+
126+
## 验收建议(改进完成后)
127+
128+
- [ ] **干净单轮**:仅 JD +「刘新宁匹配度如何」,无 assistant 污染
129+
- [ ] `rewritten_query` 显著短于原 JD;含「刘新宁」
130+
- [ ] 不出现 `RAG_GENERATE_UNCERTAIN → direct_answer`
131+
- [ ] sources ≥1 `resume/*`;答案含 Harness/方法论/带教证据
132+
- [ ] 模型:`deepseek-ai/DeepSeek-V4-Pro`
133+
134+
---
135+
136+
## 关联引用
137+
138+
| 用途 | 路径 |
139+
| --- | --- |
140+
| rewrite | `api/query_rewrite.py` |
141+
| RAG 工具链 | `api/tools.py::rag_search_execute` |
142+
| 失败降级 | `api/chatbi_failure.py::FailureTypeHandler` |
143+
| Intent hints | `docs/chatbi/v1/intent_hints.yaml` |
144+
| Portfolio SPEC | `docs/spec/governance/SPEC-Governance-Portfolio-RAG-Demo-v1_zh.md` §4.5 |
145+
| 执行 task | `docs/tasks/active/task_portfolio_jd_match_p0_rewrite_rubric_v1.md` |
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Task:Portfolio 岗位 JD 匹配 — P0 改写 / rubric / 降级(三次 QA 驱动)
2+
3+
> **状态**`active(草案 · 待 22 审核)`
4+
> **Epic**:Portfolio RAG Demo · **投递后增强****** 6/9 五问硬门槛)
5+
> **QA 留证**[`docs/diary/2026-06-01-portfolio-jd-match-three-qa-improvements_zh.md`](../diary/2026-06-01-portfolio-jd-match-three-qa-improvements_zh.md)
6+
> **关联图谱**`api/query_rewrite.py` · `api/tools.py` · `api/chatbi_failure.py` · `api/intent_agent.py` · `api/intent_hints.py`
7+
> **依赖**:模型默认 [#118](https://github.com/Cyning12/ai-ink-brain-api-python/pull/118) 合 main 后验收 JD 场景
8+
9+
---
10+
11+
## Harness 元信息
12+
13+
| 字段 ||
14+
| --- | --- |
15+
| **task_slug** | `portfolio_jd_match_p0_rewrite_rubric_v1` |
16+
| **semi_auto** | `false`(待 22 定稿后再开 30) |
17+
| **test_strategy** | `required` |
18+
| **test_strategy_note** |`api/query_rewrite` / `api/tools` / `api/chatbi_failure`;须 mock LLM + Timeline 断言;Moonshot JD fixture |
19+
| **audit_profile** | `post_close` |
20+
| **freeze_id** | (待定 · 22 帽分配) |
21+
| **git_branch** | `task/portfolio-jd-match-p0-v1`(从 **最新 `origin/main`** 拉出) |
22+
| **Open Folder** | `ai-ink-brain-api-python` |
23+
| **blocked_by** | 无(可与 #118 并行规划;**验收**建议 #118 merge 后) |
24+
| **blocks** | P1 并行 sub-RAG task(未建) |
25+
26+
### 人工闸 `human_gate`
27+
28+
| human_gate_id | status | blocks_hats | 说明 |
29+
| --- | --- | --- | --- |
30+
| HG-TASK-DRAFT | pending | 22-R1, 30 | 本草案待人审 |
31+
32+
---
33+
34+
## 背景与目标
35+
36+
Portfolio 演示站在 **Moonshot「AI Coding Mentor」****长 JD + 匹配度** 问法下,经 **三次人工 QA**(见 diary)暴露:
37+
38+
1. **单轮**无 session 时 rewrite **完全不工作**,整段 JD 进检索/generate。
39+
2. **`RAG_GENERATE_UNCERTAIN`** 触发 **`direct_answer`**,在 Portfolio 语义下输出「您没提供背景」——与产品意图相反。
40+
3. **多轮**靠 rewrite 借历史摘要「碰巧」可用,不可作为正式能力。
41+
4. **DeepSeek-V4-Pro**#118)显著改善 generate,但 **不替代** JD 切分与 rubric。
42+
43+
**完成态**:干净 **单轮** JD 问法可稳定走 RAG,输出结构化匹配分析,且 **** 错误降级 direct_answer。
44+
45+
---
46+
47+
## 范围
48+
49+
| 在范围 | 说明 |
50+
| --- | --- |
51+
| **P0-1** 无历史长 Query 改写 | 扩展 `build_rewrite_llm_messages`:检测 JD/长文 → 仍调 LLM(或专用 `jd_match_rewrite` 分支) |
52+
| **P0-2** Portfolio subject | Intent hints / generate system:匹配度类默认 **刘新宁** |
53+
| **P0-3** 降级策略 | `chatbi_failure`:Portfolio site_mode + rag intent 下禁止 `RAG_GENERATE_UNCERTAIN → direct_answer` |
54+
| **P0-4** generate rubric | `rag.generate` system 增加 JD 维度对齐模板 |
55+
| **P0-5** 语料(跨仓) | 前端 `content/evidence/jd-match-profile.md` + sync |
56+
| **P0-6** 前端排查 | `ai-ink-brain`:user 消息误含 `assistant` 段(diary ③) |
57+
58+
| 非范围 | 说明 |
59+
| --- | --- |
60+
| 多 Agent 编排全链 | 归 P1 |
61+
| 改 ingest 512 分块算法 | 归 P1 / 独立 ingest task |
62+
| 五问 RUNBOOK 变更 | 除非验收项增补 JD smoke |
63+
64+
---
65+
66+
## 失败路径
67+
68+
| Scenario ID | 触发 | 期望行为 |
69+
| --- | --- | --- |
70+
| **JD-01** | 单轮长 JD,无 history | rewrite **非空**`rewritten_query` 短于原文 |
71+
| **JD-02** | generate 含「不确定」 | **** direct_answer;返回 partial + sources 或澄清 |
72+
| **JD-03** | retrieve 空 | 明确「站内无对应证据」,仍指刘新宁为 subject |
73+
| **JD-04** | user 仅「匹配度」无指代 | 默认刘新宁,不问「您是谁」 |
74+
75+
---
76+
77+
## 验收标准
78+
79+
- [ ] diary §验收建议 全部可勾选
80+
- [ ] `tests/` 新增 Moonshot JD fixture(mock SiliconFlow);覆盖 JD-01~JD-04
81+
- [ ] `pytest tests -m "not intent_eval and not intent_benchmark"` 绿
82+
- [ ] 50 落盘(`test_strategy: required`
83+
- [ ] 前端 jd-match-profile 文稿 ingest 后 sources 可命中
84+
85+
---
86+
87+
## 实现备忘(30 帽回填)
88+
89+
| 模块 | 预期触点 |
90+
| --- | --- |
91+
| `api/query_rewrite.py` | 无 history 长 query 分支;JD 检测启发式(长度 / 「职位描述」等) |
92+
| `api/tools.py` | `rag_search_execute` generate system;可选独立 `_jd_match_system` |
93+
| `api/chatbi_failure.py` | site_mode / intent 条件降级 |
94+
| `docs/chatbi/v1/intent_hints.yaml` | JD / 匹配度 triggers |
95+
| 前端 | `content/evidence/jd-match-profile.md`;Unified Chat 输入排查 |
96+
97+
---
98+
99+
## 给 Cursor
100+
101+
`portfolio``JD 匹配``query_rewrite``RAG_GENERATE_UNCERTAIN``Moonshot``task_portfolio_jd_match_p0`

0 commit comments

Comments
 (0)