Spring AI 实战:RAG 三种架构
理论篇
一、为什么需要 RAG——让 LLM 做'开卷考试'
1.1 RAG 解决什么问题
前几章我们的机票 Agent 已经能查询航班、对比价格、多轮对话了。但如果用户问:
"你们东方航空的退改签政策是什么?"
"经济舱允许携带多大的行李?"
"儿童票怎么购买?"
LLM 要么编造答案(幻觉),要么说'我不知道'——因为这些是航空公司的私有知识,不在 LLM 的训练数据中。
RAG(Retrieval-Augmented Generation,检索增强生成)解决的就是这个问题:让 LLM 在回答前先'翻参考资料'。
不用 RAG = 闭卷考试(凭记忆,可能答错)
用 RAG = 开卷考试(有参考资料,答案有据可查)
1.2 RAG vs 微调 vs Function Calling
| 方案 | 本质 | 适用场景 | 成本 |
|---|---|---|---|
| RAG(Vector) | 运行时检索外部知识 | 事实性问答、政策查询、文档问答 | 低(无需训练) |
| GraphRAG | 构建知识图谱 + 图遍历检索 | 多跳推理、实体关系问答 | 高(需 LLM 抽取实体关系) |
| 微调 | 把知识烧入模型参数 | 学习特定风格、行业术语 | 高(需要 GPU 训练) |
| Function Calling | 调用 API 获取实时数据 | 实时数据查询、执行操作 | 低 |
| 直接搜索(grep/BM25) | 关键词 / 正则精确匹配 | 代码搜索、结构化数据、精确查找 | 极低 |
用户问'退改签政策' → RAG(知识在文档中) 用户问'今天的航班价格' → Function Calling(需要实时数据) 用户要求'用东北话回答' → 微调(学习风格)
生产中常常组合使用:RAG 提供知识,Function Calling 提供能力,微调提升风格。我们的机票 Agent 就是 RAG + Function Calling 的组合。


