跳到主要内容

从一个问题到一个答案 — 检索、生成与生产级对策

这一章讲三件事: 上一章存好的向量库,提问时到底怎么用; 为什么「能跑通的最小 RAG」离生产可用还差整整一章的距离; 以及补上这段距离的四组手段各修哪种病。 读完你会明白:RAG 的难点从来不是「检索一下」,而是「你的用户会以最难预测的方式提问」。

1. 先看现象:贴一段资料,答案就对了

问 ChatGPT「最新的男足世界杯冠军是谁?」,它答法国队 2018——在本书出版时, 正确答案是阿根廷 2022。模型的知识封版在赛事之前,这个错误无法靠改写提问修复1

但作者做了一个手工实验:把维基百科世界杯条目的导语整段粘进问题下面。 模型这次回答:「The latest winner of the men's FIFA World Cup is Argentina, who won their third title at the 2022 tournament.」2——对了。

「最新男足世界杯冠军是谁?」
│ 直接问

France, 2018 ✗ 知识封版之前的事
│ 手工粘贴一段资料当 context 再问

Argentina, 2022 ✓ 材料在手,照着说就行

图说:两次唯一的区别,是第二次多了一段事实。

那 RAG 系统不过就是把「手工粘贴」换成自动化:按问题自动找到该贴的那段,自动贴上去3

2. 顶层全景:三个阶段

阶段干什么在哪一章讲
索引 indexing文档切块、嵌数、入库上章已讲完
检索 retrieval按用户问题捞出相关段落本章前半
生成 generation段落+问题合成一个 prompt 发给模型本章前半

后半章的生产级策略全部长在这两个阶段的关节上4

3. 核心原理

3.1 最小可用版:两行套路

检索侧,db.as_retriever() 把向量库包装成检索器,内部自动完成「问题嵌入→算相似度→取回原文」; 参数 k 控制取回几篇5

生成侧就是一个你已经见过的模板,加一句关键的约束语:

Answer the question based only on the following context…

temperature=0(压住随机性),LCEL 一根管道连起来:prompt | llm6。 最后用第一章学的 @chain 把「检索→拼装→生成」封装成一个只吃问题的函数, 顺手返回 {answer, docs} 让你能审计它到底引用了哪几篇7到这一步,个人用的 RAG 就完工了——作者自己也是这么宣布的8

关于 k,有一个反直觉但必须记住的取向:宁可少取。理由有三,每一条都独立成立: 取得越多响应越慢;提示词越长成本越高;而混进来的无关内容会直接诱发幻觉9。 「上下文污染」在这个设计决策里第一次露出獠牙,后面章节还会反复遇到。

3.2 用户的四种坑:生产级的病征清单

最小版能跑,前提是用户「好好提问」。真实用户会:

  1. 输入里混入大量无关信息;
  2. 一个问题横跨多个数据源;
  3. 用自然语言描述一个本该用数据库语言表达的需求;
  4. 需要的不是离散段落而是某种过滤条件。

作者把这四条列为构建健壮 RAG 必答的问题10,本章其余部分逐一对付。

3.3 病征一·跑题输入:先改写,再检索

拿一个故意搞砸的输入实测:问题前面缀了一堆生活流水账—— 「Today I woke up and brushed my teeth, then I sat down to read the news. But then I forgot the food on the cooker. Who are some key figures…philosophy?」

直接走最小版 RAG,模型回答:「Based on the given context, there is no information provided.」 ——被流水账带偏了,检索器拿着整段噪声去找资料,一无所获11

解法是 Rewrite-Retrieve-Read:在链子最前面加一个小 LLM 步骤,专职改写出干净的查询, 再拿干净查询去检索(原始问题仍然一并交给最后的生成步)12。 同一输入重跑,回答正确地列出了 Pythagoras 与 Plato 等13

流水账问题 ──▶ [改写器 LLM] ──▶ 干净查询 ──▶ 检索器 ──┐
├──▶ 生成答案
流水账问题 ──────────────────────────────────────────┘

图说:改写器只服务检索;生成时问题照旧全量送达。

代价明码标价:串行的两次模型调用,延迟(从提问到拿到结果的等待时间)翻倍级增加14。作者还提醒这招不挑底座: 向向量库还是搜网页都适用14

改写家族其实有四个常见变招15:去掉无关文本;接上前文对话消解指代 (上一句问了旧金山天气,这句冒出的「LA 呢?」要补全成「洛杉矶天气」); 多撒几张网抓相关说法;以及把复杂问题拆成几个简单问题分别检索再汇总。 用哪招取决于场景,没有普适冠军。

3.4 病征二·一个问题多个切面:撒网与择优排队

单一措辞可能错过答案的其他侧面。multi-query 的做法:让 LLM 围绕原题生成五个版本, 五路同时检索(batch 免费提供同时跑多份),再用「以正文为键去重合并」收成一网打尽的唯一集16

RAG-Fusion 更进一步:五路结果的排序质量参差,需要一把统一的尺子把它们重新排队。 这把尺子叫 RRF(reciprocal rank fusion):每个文档按它在每路结果里的名次记分, 公式为 得分 += 1 / (名次 + k),k 默认取 60;多路分数累加后降序排列即最终榜单17。 公式的味道值得咂摸一下:第 1 名得约 1/61 分,第 60 名只得约 1/120 分 ——名次靠前加分多,但谁也不能一家独大;k 调大则名次差异被抹平、榜尾话语权上升18

3.5 病征二变体·问法不像答案:HyDE

还有一类错位:问题和答案长得根本不像,embedding 之后自然也远。 HyDE(Hypothetical Document Embeddings)的反直觉思路: 先让 LLM 写一篇假想的「答案文章」,拿这篇假想文去算向量做检索19。 直觉依据:编出来的答案虽然细节多半是错的,但用词、句式、话题的铺开方式却和真答案神似, 于是它离真正的相关文档更近20。检索命中的还是库里的真文档, 所以「编造」的部分不会直接漏给用户。

3.6 病征三·多数据源:让模型当门卫

数据散落在多个库里时,先要决定「这个问题归谁管」。两种做法气质完全不同:

逻辑路由(logical routing):列出全部候选源,让 LLM 结构化输出选一个 (第一章的结构化输出在此复用):schema 里把可选项写死成 python_docs | js_docs 二选一, 拿到「为什么这段 Python 代码报错」这类问题时输出对应选项21。 落地小技巧值得一抄:比较输出时先转小写再做子串匹配,别精确比对—— 给模型输出「轻微脱轨」留缓冲是全书反复出现的设计意识22

按意思分流(semantic routing):干脆不用 LLM 判断——把几个「人设模板」 (物理教授版、数学家版)预先各自嵌入,问题来了也算嵌入, 余弦相似度谁最高就挂谁的人设23。快、便宜,适合模板少而清晰的场合。

LLM 出现前的老办法是什么?手搭数据集、训练分类器(自动判断「这句话归哪类」的小模型)。作者特意对比: LLM 凭借对语言的先天理解,几乎不给例子、不做专项加工就能顶上,省掉了拼数据集和造衡量尺度两大苦役24

3.7 病征四·结构化条件:把自然语言翻译成查询语言

「评分 8.5 以上的科幻片」这种问题里,「科幻」可以走向量检索, 「8.5 以上」必须走精确过滤。混着来就叫查询构造(query construction)25

元数据过滤路线:SelfQueryRetriever 让你先声明库里每个文档有哪些可过滤字段 (片名、年份、导演、评分及各自的类型说明),LLM 读问题后自动拆出 「过滤条件 + 按意思找词」两部分,再把过滤条件翻译成目标库认识的格式后执行26

text-to-SQL(把自然语言翻成数据库查询语言)路线处理关系数据库。裸翻不行——容错空间太小。书中给了两板斧27: 把每张表的建表语句(CREATE TABLE,含列名类型)连同几行样例数据一起喂给模型打底, 再配几组「问题→SQL」范例(few-shot 又一次登场)。书上用 Chinook 数据库实测 「How many employees are there?」这类问答。

然后是一段所有此类教程都该写、多数不写的警告:放行模型生成的任意 SQL 是危险操作。 作者的防线三条:专用只读账号;账号只能碰到指定表;给每条查询设超时防止失控大查询拖垮库28。 他还如实承认:「LLM 应用的安全是一个仍在发展中的领域」——今天的好清单明天就可能不够用29

4. 作者的判断与证据

  • RAG 这个词的出处,作者归于 Meta AI 研究者的论文并注明发现:带检索的模型输出 「更事实、更具体」30——这是书中罕见的直接给出实证结论的地方。
  • Rewrite-Retrieve-Read 标注了出处(微软研究院委托的研究)31, RAG-Fusion 与 HyDE 也各附论文脚注32;RRF 那个 k=60 属于业界常用默认值, 书里照搬未解释来历。
  • 「按意思分流」的示例代码里,物理模板里写着「不会就承认不会」——这个细节顺带示范了 提示词该怎么写谦逊条款,属于作者没点破的言传身教。

5. 边界与局限

  • 延迟代价贯穿全章而不被正面处理:改写、多查询、HyDE 都是在基础 RAG 上叠加额外模型调用。 书中只在 multi-query 处提了 batch 同时跑多份16,没有给出总量化(调用次数×每次延迟)的账。
  • 择优排队(rerank)手段只有 RRF 一种。今天常用的 cross-encoder 成对精打法——把「问题-候选段」成对送进模型精细打分,精度更高、更慢——书里没有; 补充(不在书里,来自通用知识):它与 RRF 这类免训练的名次融合互补使用。
  • text-to-SQL 示例止步于执行,没有展开「查询结果如何回到用户手上」 (第 6 章架构阶梯里的 chain 版会补上两跳外的完整闭环)。
  • 安全清单只有 SQL 一节有,SelfQuery 的过滤器同样由 LLM 生成,书未讨论其被滥用的面。

6. 可带走的

  1. 手工实验先行:先把正确 context 手动贴进去验证「模型拿到材料就能答对」, 再投资自动化——这是调 RAG 的第一性诊断法;
  2. 生成模板里那句 based only on 与温度 0 是整套机制的「守规矩」保险丝;
  3. k 宁小勿大:慢、贵、污染三个成本都随 k 一路上涨;
  4. 用户输入不可信,前面加一道改写器是最便宜的韧药,代价是多一跳延迟;
  5. 多路召回后用 RRF 融合名次(k 默认 60);问法与答案「长得不像」时换 HyDE 用假想文检索;
  6. 多源分流两条路:逻辑路由(LLM 选,schema 锁死)、按意思分流(向量比,便宜快);
  7. 结构化条件靠查询构造:字段声明 + 自然语言拆分;SQL 场景务必 CREATE TABLE 打底 + few-shot;
  8. 执行 LLM 生成的 SQL 三道闸:只读账号、表白名单、超时——原话「安全仍在发展中」, 清单要常更新;
  9. 所有抗折腾的技巧共享一个心法:别信模型的输出格式与用户的输入质量,两头都要防御

7. 原文地图

主题原书章原文位置
RAG 术语出自 Meta AI 论文Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:15(搜「coined」)
FIFA 错误答案与修复Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:25(搜「France」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:40(搜「Argentina」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:45(搜「won their third」)
「不能靠复制粘贴」过渡句Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:48(搜「copying and pasting」)
三阶段定义Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:52(搜「three core stages」)
retriever 与 k 参数Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:150(搜「as_retriever」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:172(搜「two most relevant documents」)
低 k 的三重理由Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:174(搜「not always better」)
生成模板与温度 0Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:193(搜「based only on」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:241(搜「eliminate the creativity」)
封装 qa 函数与返回 docsChapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:309(搜「encapsulating multiple steps」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:337(搜「basic RAG system」)
生产四问Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:341(搜「variability in the quality」)
流水账输入失败实拍Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:381(搜「brushed my teeth」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:403(搜「no information provided」)
Rewrite-Retrieve-Read 实现与成功输出Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:367(搜「Rewrite-Retrieve-Read」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:465(搜「Pythagoras」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:467(搜「additional latency」)
改写四型小结Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:880(搜「Removing irrelevant」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:882(搜「in LA」)
multi-query 五版本与去重Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:471(搜「multiple queries」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:539(搜「deduplicate them」)
RRF 公式与 k=60Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:596(搜「reciprocal rank fusion」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:667(搜「rank + k」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:718(搜「lower-ranked documents have more influence」)
HyDE 直觉Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:776(搜「hypothetical document」)
逻辑路由 schemaChapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:904(搜「function-calling models」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:985(搜「python_docs」)
子串匹配的韧性 TipChapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1033(搜「off script」)
语义路由双模板Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1043(搜「Semantic Routing」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1058(搜「physics professor」)
LLM 前夜要训分类器的对比Chapter 5(本章引用)text/08-ch05-chapter-5-cognitive-architectures-with-langgraph.txt:380(搜「classifier model using ML techniques」)
1980 外星人例(混合条件)Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1151(搜「aliens」)
SelfQuery 字段声明与四步Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1159(搜「SelfQueryRetriever」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1269(搜「query generation prompt」)
text-to-SQL 两板斧Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1285(搜「CREATE TABLE description」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1287(搜「few-shot examples」)
SQL 安全三防线与发展中领域Chapter 3text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1349(搜「dangerous in a production application」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1351(搜「read-only permissions」) · text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1357(搜「currently in development」)

Footnotes

  1. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 23–27 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:27,搜「factually incorrect and outdated」)。作者补充了利害判断:「幻觉在核实事关重大决策的场景会有灾难性后果」。

  2. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 29–46 段,粘贴的维基导语在第 35–41 段(搜「reigning champions」),修正后的回答在第 45 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:45,搜「won their third」)。

  3. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 48 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:48,搜「automated system to fetch relevant information」)。

  4. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 52–64 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:54,搜「Indexing」)。

  5. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 150–157 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:150,搜「abstracts the logic」)。「as_retriever 之前没见过的新方法」的自我提醒在第 150 段。

  6. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 193–200 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:193,搜「based only on」);温度与解释在第 239–241 段。

  7. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 266–335 段(@chain 版 qa 在第 266 行起,返回 docs 版在第 315 行起);「封装是构建有趣应用的关键」在第 309 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:309,搜「encapsulating multiple steps」)。

  8. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 337 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:337,搜「Congratulations」)。

  9. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 174 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:174,搜「slower your application will perform」)。

  10. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 341–349 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:341,搜「quality of a user's input」)。

  11. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 381–405 段,失败输出在第 403 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:403,搜「no information provided」),病因解读(被无关信息干扰)在第 405 段。

  12. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 367–430 段(rewrite_prompt 全文在第 411 行起)。

  13. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 462–465 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:465,搜「Pythagoras」)。

  14. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 467 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:467,搜「additional latency」)。 2

  15. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 878–886 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:882,搜「Grounding the query」)。

  16. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 471–494 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:471,搜「multiple queries」);去重与 batch 在第 512–541 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:541,搜「runs all generated queries in parallel」)。 2

  17. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 596 段(搜「unified ranking」)与第 642–678 段实现(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:667,搜「1 / (rank + k)」)。

  18. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 718 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:718,搜「A higher value indicates」)。

  19. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 774–793 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:788,搜「write a passage to」)。

  20. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 776 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:776,搜「more similar to the most relevant documents than the original query」)。

  21. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 898–1003 段(schema 定义在第 918 行起,实测路由 python_docs 在第 999–1003 段)。

  22. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 1033–1037 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1037,搜「random nature of LLM outputs」)。

  23. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 1043–1095 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1058,搜「physics professor」)。

  24. 出处:「Chapter 5. Cognitive Architectures with LangGraph」第 380–386 段(text/08-ch05-chapter-5-cognitive-architectures-with-langgraph.txt:386,搜「zero, or very few, examples」)。该 Note 属原书第 5 章路由一节,机制相通,故在此引用。

  25. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 1145–1151 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1147,搜「query language of the database」)。

  26. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 1155–1159 段(字段表在第 1167–1186 行)与四步内幕在第 1269–1275 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1273,搜「Convert the metadata filter」)。

  27. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 1279–1290 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1279,搜「little margin for error」)。

  28. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 1349–1356 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1351,搜「read-only」)、超时建议在第 1355 段。

  29. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 1357 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1357,搜「currently in development」)。

  30. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 15 段(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:15,搜「more factual and specific」);论文信息在该页脚注 1(Lewis 等,2021,text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1369,搜「Patrick Lewis」)。

  31. 出处:「Chapter 3. RAG Part II: Chatting with Your Data」第 367 段正文标注 Microsoft Research 团队;论文为 Ma 等 2023,见章末脚注 2(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1371,搜「Query Rewriting」)。

  32. 出处:RAG-Fusion 论文见章末脚注 3(text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1373,搜「RAG-Fusion: A New Take」),HyDE 见脚注 4(Gao 等 2022,text/06-ch03-chapter-3-rag-part-ii-chatting-with-your-data.txt:1375,搜「Precise Zero-Shot」)。