让 LLM 编码代理在仓库里 “少问一句、多写一行” 的核心,是一次把最关键的全局信息塞进它的工作记忆,而不是让它边做边猜。本文给出一条可复制的轻量级上下文注入链路:用 4 要素摘要把 README、最近 Issue 与 ADR 压缩成 <4 k token 的 “浓缩包”,通过向量化检索 + 重排,只在每轮对话前插入 top-3 片段,实测让 SWE-bench 类任务的幻觉率相对下降 9.7%,同时减少 30% 以上来回提问。
一、动机:为什么不是 “全量 RAG”
全仓库 embedding + 大召回虽然全面,但在编码代理场景下有三道硬伤:
- token 爆炸:一次召回 20 页文档,轻松吃掉 32 k 上下文,留给生成空间不足,反而降低 Pass@1。
- 信号稀释:README 里一句 “本项目禁用 ORM” 比一百行 CRUD 代码更决定成败,却被平均权重淹没。
- 动态滞后:Issue 状态、ADR 决策随时会变,embedding 库隔天刷新已算 “高频”,仍赶不上实时节奏。
轻量级注入的思路是 “只给决策摘要,不给原始素材”,把高熵信息预先蒸馏成4 要素:
- Core Problem(一句话痛点)
- Key Constraint(设计红线)
- Latest Decision(最近拍板)
- Entry Pointer(文件级入口)
四段加起来 ≤ 512 token,却足以让代理在第一次规划时就避开 “红线区”。
二、4 要素摘要模板与向量化流程
1. 摘要 prompt(可离线缓存)
You are a tech writer. Compress the following artifact into 4 sections:
1. Core Problem: what pain it solves in ≤30 words.
2. Key Constraint: non-negotiable design choices, ≤40 words.
3. Latest Decision: most recent open/closed Issue or ADR conclusion, ≤40 words.
4. Entry Pointer: single file or function name where the logic starts.
Output valid YAML.
对 README、最近 10 条 Issue、最新 ADR 各跑一次,得到 3 份 YAML,总长度 <1 k token。
2. 向量化
- 编码器:Qwen3-Embedding-8B,维度 1024, cosine 相似度。
- 分段策略:每份 YAML 整体入库,不再拆句,避免 “中间丢失” 问题。
- 刷新阈值:README/ADR 文件 hash 变化或 Issue 新增评论即触发增量更新,平均耗时 180 ms。
三、top-k 检索 + 重排参数实战
在线阶段只跑两轮:
- 粗召回:用用户提问的 4 要素摘要做 query,取 top-20,cosine ≥ 0.72。
- 精重排:用 Qwen3-Reranker-4B 交叉编码,按相关度再排,只保留前 3 段,保证总注入长度 <4 k token。
关键参数:
k_rerank = 20 → 3:降低 LLM 上下文 “中间丢失” 风险。min_score = 0.25:低于此分直接丢弃,防止噪声倒灌。cache_ttl = 300 s:同一会话内复用注入结果,避免重复计算。
四、强制引用机制抑制幻觉
知识再精炼,代理也可能 “视而不见”。我们在 prompt 末尾加一行强制引用指令:
If you use any injected context, you MUST quote its Entry Pointer in backticks on first reference, e.g.
src/auth/jwt.ts. Missing quote ⇒ re-plan.
实验表明,该机制把 “知识充足但无视” 导致的失败从 15% 降到 4%,代价是平均多 1.2 轮自我检查,整体耗时增加 <5%。
五、失败回退与监控点
| 场景 | 回退策略 | 监控指标 |
|---|---|---|
| top-3 得分均 <0.25 | 注入空上下文 + 提示 “低置信度” | injection_recall |
| 代理回复未引用任何 Pointer | 触发重试,最多 2 次 | quote_miss_ratio |
| 注入后 token 占用 >50% 窗口 | 截断最末段,留 20% 缓冲 | ctx_util |
日志统一打 trace_id,可对接 Loki + Grafana,默认告警:
injection_recall < 0.6持续 5 minquote_miss_ratio > 0.1持续 10 min
六、落地 checklist(复制即用)
- Token 预算:每轮对话总长度 ≤ 75% 模型窗口,注入段 ≤ 4 k。
- 摘要刷新:README/ADR 文件变更或 Issue 新评论 ≥1 条即触发。
- 评估指标:
- Pass@1(基准补丁一次通过)
- 平均交互轮次 ↓ 30%
- 幻觉引用率(无证据的 API / 文件)↓ 50%
- 压测脚本:用 100 条 SWE-bench 子集跑 3 轮,观察注入耗时 P99 < 600 ms。
- 版本切换:支持知识库多版本并存,回滚窗口 7 天,灰度 10% 流量实验。
结语
轻量级上下文注入不是 “堆更多文档”,而是把最可能左右决策的 1% 信息放在代理面前,并逼它显式引用。只要 4 k token、3 段摘要、1 个强制引用,就能让编码代理少问一句、多写一行,把幻觉率压到个位数。整套流程已在内部 Python/TypeScript 双仓库上线,代码与 prompt 模板将于下周开源,欢迎提前踩坑交流。