高级 RAG 架构
学习目标
完成本节后,你将能够:
- 理解基础 RAG 在复杂场景下为什么会不够用
- 认识路由式、多跳式、Agentic RAG 等常见架构
- 跑通一个“多知识库路由”的玩具示例
- 知道什么时候该升级 RAG 架构,什么时候不该
一、为什么基础 RAG 迟早会遇到上限?
1.1 基础 RAG 适合“单次问题 -> 单次检索 -> 单次回答”
这对很多 FAQ 和简单问答已经够用。
但当问题变复杂时,就会出现瓶颈。
例如:
- 需要跨多个知识库
- 需要先查制度,再查具体产品文档
- 需要拆成多个子问题
1.2 常见复杂场景
比如用户问:
“这个学员能不能退款?如果不能,还有没有延期方案?”
这其实隐含了多个动作:
- 查退款政策
- 判断当前条件是否满足
- 再查延期方案
这时“只检索一次”往往不够。
二、路由式 RAG:先决定去哪里查
2.1 一个知识库不够时,先做路由
很多系统不是只有一个文档库,而是有:
- 政策库
- 产品库
- 技术文档库
- FAQ 库
如果所有查询都进同一个库,噪声会很大。
这时更好的做法是:
先判断问题属于哪个库,再去查。
2.2 一个可运行的多库路由示例
policy_docs = [
"退款政策:课程购买后 7 天内可申请退款。",
"证书政策:通过测试后可获得证书。"
]
tech_docs = [
"登录失败时请先检查账号密码和网络连接。",
"API 调用报 401 通常表示鉴权失败。"
]
def route_query(query):
if "退款" in query or "证书" in query:
return "policy"
if "登录" in query or "API" in query or "401" in query:
return "tech"
return "default"
def retrieve_simple(query, docs):
return [doc for doc in docs if any(word in doc for word in query)]
queries = ["怎么退款", "401 报错怎么处理"]
for q in queries:
route = route_query(q)
if route == "policy":
hits = retrieve_simple(q, policy_docs)
elif route == "tech":
hits = retrieve_simple(q, tech_docs)
else:
hits = []
print(q, "-> 路由到", route, "->", hits)
这就是最简版的“Router RAG”。
三、多跳 RAG:问题要分解成多步
3.1 有些问题本来就不是一步能答完
例如:
“这个人完成了哪些条件,还差什么才能拿证?”
这类问题往往需要:
- 查拿证规则
- 查用户完成情况
- 再做对 比
3.2 多跳 RAG 更像“做题”
不是一次把资料全找出来,而是:
- 先解决第一个子问题
- 再根据中间结果继续查
这会更接近 Agent 的味道。
四、Agentic RAG:让检索不再是固定流水线
4.1 它和普通 RAG 的区别是什么?
普通 RAG 更像固定流程:
- 检索
- 拼上下文
- 回答
Agentic RAG 则可能会:
- 判断需不需要检索
- 决定检索几次
- 决定改写查询还是切换数据源
- 再决定是否继续行动
4.2 优势与代价
优势:
- 更灵活
- 能处理复杂任务