Q2 给出了"8 best practice + 3 必做 + 5 nice-to-have"。Q3 进入下一步:不同项目类型 · 不同的应用组合。5 种典型项目 × 必做 3 件 × 落地优先级。
| 项目类型 | Note-taking | Read-before-Write | Evals | RAG | Skills | 何时应用 |
|---|---|---|---|---|---|---|
| ① 单轮问答 | — | — | 必做 | — | — | Day 1 |
| ② RAG 文档问答 | — | — | 必做 | 必做 | — | Day 1 |
| ③ 多步 agent | 必做 | 必做 | 必做 | 可选 | — | Day 1 |
| ④ Multi-Agent | 必做 | 必做 | 必做 | 可选 | 必做 | Week 2+ |
| ⑤ 跨 session 助手 | 必做 | 必做 | 必做 | — | 必做 | Day 1 |
核心洞察:Evals 永远是 Day 1 — 即使是最简单的项目。其他根据复杂度递进。
场景:替代 ChatGPT 完成某领域问答(投资分析 / 代码 review / 文档总结)。
import openai from dataclasses import dataclass @dataclass class EvalCase: input: str expected_keywords: list # 期望出现的关键词 min_length: int = 50 max_length: int = 500 # 单轮问答的 eval suite invest_qa_cases = [ EvalCase("什么是市盈率?", ["P/E", "股价", "每股收益"]), EvalCase("ROE 怎么算?", ["净利润", "股东权益"]), EvalCase("DCF 模型三要素?", ["现金流", "折现率", "终值"]), ] def run_eval(case): response = openai.ChatCompletion.create( model="gpt-5", messages=[ {"role": "system", "content": "你是投资分析助手..."}, {"role": "user", "content": case.input} ] ) answer = response.choices[0].message.content # 检查关键词 + 长度 return all(kw in answer for kw expected_keywords) pass_rate = sum(run_eval(c) for c invest_qa_cases) / len(invest_qa_cases) print(f"Pass rate: {pass_rate:.0%}") # baseline
场景:企业内部文档 / 法律法规 / 学术论文问答。需要把"大文档"切成"context"塞进 LLM。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader # 1. 加载文档 documents = SimpleDirectoryReader("./docs").load_data() # 2. 构建 index (默认用 OpenAI embedding) index = VectorStoreIndex.from_documents(documents) # 3. query engine (top-k = 3, similarity cutoff = 0.7) query_engine = index.as_query_engine( similarity_top_k=3, filters=None, ) # 4. 问问题 + 拿到带来源的答案 response = query_engine.query("什么是物理 AI 的瓶颈?") print(response.response) # answer for node in response.source_nodes: print(node.metadata["file_name"], node.score) # source
场景:需要 LLM 调用多个工具(搜索 / 数据库 / 文件系统 / API)完成复杂任务。
from langgraph.graph import StateGraph from langchain import ChatOpenAI from langchain.tools import tool # 1. 定义 tools (with clear schema) @tool def search(query: str) -> str: """Search the web for current information.""" return search_api(query) @tool def read_file(path: str) -> str: """Read a local file by path.""" return open(path).read() # 2. LangGraph state = context engineering surface class AgentState(TypedDict): messages: list scratchpad: str # note-taking lives here tool_results: list # 3. Define agent node with note-taking def agent(state): context = state["scratchpad"] # rolling summary response = llm.invoke( context + "\n\n" + state["messages"][-1].content, tools=[search, read_file] ) # Update scratchpad new_scratchpad = update_scratchpad(state["scratchpad"], response) return {"scratchpad": new_scratchpad} # 4. Build graph workflow = StateGraph(AgentState) workflow.add_node("agent", agent) app = workflow.compile()
场景:可靠性要求 > 95%,多 agent 试不同路径 + evaluator 选 best。
在你 short memory 里 D+4 #9 的多 agent 实验(4 framework 比较)就是这个范式 — 4 个 agent 跑同一任务 + 一个 evaluator agent 评分。落地参考 langchain-ai/langgraph + autogen。
场景:你正在用的 Hermes Agent / Cursor / 一个 skill 系统 — 跨 session 保留上下文。
Matt Pocock handoff skill 就是这个范式的工业实现。
Q3 给出了"5 项目类型 × 必做映射"。Q4 进入 量化效果 — Inset Magnifier · 4 个角色 · 复合效应 vs 单点效应。