|
| 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` | |
0 commit comments