Q1 给出了"4 类失败模式 + 7 个 GitHub repo + 5 个量化证据"。Q2 进入下一步:具体怎么做?8 个 best practice 按"影响度 + 实现成本 + 可替代性" 3 维加权排序。
| 必做 / nice | Practice | 何时做 | 投入产出比 |
|---|---|---|---|
| 必做 | Note-taking (scratchpad) | Day 1 · 任何 agent 项目 | ★ × 5 |
| 必做 | Read-before-Write | Day 1 · 任何 agent 项目 | ★ × 5 |
| 必做 | Evals (test-driven) | Week 1 · 任何 LLM 项目 | ★ × 4 |
| nice | Skill 系统化 | 项目 ≥ 5 个 prompt 时 | ★ × 4 |
| nice | RAG | 需要大文档 / 大数据库时 | ★ × 4 |
| nice | Tool call schema | tool call > 5 个时 | ★ × 3 |
| nice | Multi-Agent 验证 | 可靠性要求 > 95% 时 | ★ × 3 |
| nice | DSPy 自动优化 | 已有 eval · 想自动化时 | ★ × 2 |
Drew Breunig 的 Read-before-Write 落地(防止 context poisoning):
def safe_tool_call(tool_fn, args): # 1. 第一次调用:read-only preview = tool_fn.dry_run(args) # 2. 模型验证 preview 是否合理 is_valid = llm.invoke(f"""Is this result sensible? Result: {preview} Task: {task} Answer YES or NO. If NO, explain why.""") # 3. 只有 YES 才真正调用 if "YES" in is_valid.upper(): return tool_fn(args) else: # 重试 + 调整 args return retry_with_adjustment(tool_fn, args, is_valid)
关键设计:不直接信任工具输出 — 让 LLM 自己 sanity check。
Hamel Husain 的 "evals first" 范式(落地代码):
from langsmith import Client from langchain import ChatOpenAI # Step 1: 写 eval cases (期望 verdict) eval_cases = [ {"input": "calculate 5 + 3", "expected": "8"}, {"input": "compute pi to 2 decimals", "expected": "3.14"}, {< class="str">"input": "what's the capital of France", "expected": "Paris"}, ] # Step 2: 跑 baseline def baseline_eval(input_text): return llm.invoke(input_text).content # Step 3: 跑回归测试 def run_evals(cases, predict_fn): passed = sum(1 for c in cases if predict_fn(c["input"]) == c["expected"]) return passed / len(cases) # pass rate # Step 4: 改 context,跑回归 pass_rate_v1 = run_evals(eval_cases, baseline_eval) # ... modify context ... pass_rate_v2 = run_evals(eval_cases, new_eval) # v2 should be > v1
关键设计:先写 eval → 跑 baseline → 改 context → 跑回归。Context Engineering 变成可测量、可回归的工程。
Q2 给出了"8 best practice + 3 必做 + 5 nice-to-have + 代码示例"。Q3 进入 项目中如何应用 — Hairline Area · 5 种典型项目 × 4 时间窗 · 何时应用哪个 best practice。