两种常见架构
A. 经典 RAG 管线
固定:检索一次 → 拼 prompt → 生成。
B. Agent + RAG 工具
模型自主决定:要不要搜、搜什么、搜几次、信息够不够。
对照
| 维度 | 固定 RAG | Agent 里的 RAG 工具 |
|---|---|---|
| 路径 | 可预期 | 动态 |
| 成本 | 通常更低 | 可能多次调用 |
| 调试 | 简单 | 要看轨迹 |
| 复杂问题 | 一次检索易漏 | 可多轮换 query |
| 过度检索 | 较少 | 需要预算/限流 |
我更倾向的折中
默认路径仍走「一次检索」;只有当答案缺证据时,才允许 Agent 再调 search_notes。
并给硬约束:
- 最多 3 次检索
- 单次 top-k 固定
- 超预算就基于现有证据作答或声明不确定
工具怎么封
@tool
def search_notes(query: str) -> str:
"""Search experiment notes. Prefer short factual queries."""
docs = vector_store.search(query, k=4)
return format_snippets(docs)
返回要短、带来源标识,避免把整页文档塞回上下文。
什么时候别用 Agent-RAG
- 问答域极窄、延迟极敏感
- 成本必须可预算到「固定一次调用」
- 审计要求路径完全确定
这些场景固定管线更稳。
结论
RAG 可以是 Agent 的工具,不必是另一套世界观。
简单问题固定检索,复杂问题再开放多轮,通常性价比最高。