跳到主要内容

让它去查它没见过的资料 — 先搜一遍,再把搜到的贴进问题里

这一章讲三件事: 有一类问题它为什么注定答不上来; 把资料弄进去的四条路各要付什么代价;以及最便宜那条路具体怎么走。

它在全书链条里的位置: 第 08 章列过四种记忆, 这一章把第④种(外挂一个库)从一句话展开成一整章。 它同时也是第 04 章的一次应用:一个资料库被包成工具挂上去之后,程序就能自己挑该问谁。

1. 先看它答不上来的样子

这一节要说清一件和「它会编」不同的事:有些东西它不是记不牢,是压根没机会见过。

书里的例子极朴素。作者直接问一个聊天机器人: 花语秘境的老板是谁,以及她和咖哥是什么关系? 结果当然是不知道1。 学生在旁边补了一句刻薄的:「是啊,它当然不知道。你觉得你非常有名吗?」

这一句玩笑其实把机制说破了。 请把这个例子和前面两处分开:

哪一章那里说的是什么病因
第 01 章第 1 节它把《浮生六记》讲错了见过,但记岔了
第 08 章第 2 节它查不出自己是从哪儿知道的见过,但没留出处
本章它不知道花语秘境的老板是谁根本不可能见过

第三种是全新的一类。 花语秘境是书里虚构的那家公司; 它的会议记录、员工手册、库存表,从来没有出现在任何公开网页上模型不是笨,是它训练的时候这份资料不存在于它能看到的任何地方。

同一类的还有「新」。 本章后半段那两家电商的第三季度财报, 发布的时候模型早就训练完了。 私有和新,是同一种情况的两副面孔。

这一条决定了后面所有的做法: 你没法靠「换个更强的模型」解决它。 再强的模型也没见过你公司的会议记录。 唯一的出路是把资料送到它面前。

2. 把资料弄进去,有四条路

这一节给一张地图。四条路的难度和成本差一个数量级。

书把这四条路按从难到易排了一遍2:

第几条做法难度与成本
从头训一个自己的模型最难最贵
拿自己的资料微调次难次贵
先去资料里搜一遍,把搜到的贴进问题里中等
就是把资料直接写在问题里最容易

第③条就是本章的主角。 它有个专门的名字,书里全程用它: 检索增强生成——先从相关的数据源检索信息,把这些信息作为上下文加进用户的问题里, 最后请模型基于这个变丰富了的问题来生成答案3。 行内一般管它叫 RAG——指的就是上面这件事的英文缩写

为什么书选第③条? 书给了三条对比第②条的理由,一条比一条实在4:

第一,成本低。无须训练,所以不必去买大批机器算上几天。

第二,信息永远是新的。 数据是实时获取的,你把新财报放进库里,下一次问就用得上; 而第②条要重训一次才能更新。

第三,结果更可信。 因为可以显示检索到的文档—— 这正是第 08 章那张表里「查得出出处」那一列的意思。

书还引了一篇对照实验的结论:在一个农业问答的案例里,论准确率第②条略高于第③条, 但差异并不明显;两者叠加最准,但成本也大得多; 考虑到第③条成本低,在预算有限时它是推荐做法5。作者自己的评价是: 比起微调,它是落地过程中物美价廉的选择。

3. 这条路做什么:先搜一遍,再把搜到的贴进去

这一节把机制拆成两半,顺便纠正一个常见误解。

它不是一个模型,是两个动作。 书把它拆成两块6:

检索——从一大堆资料里找出和这个问题相关的那几段。

生成——把那几段连同原问题一起交给模型,让它写出答案。

用户问:「花语秘境的老板是谁?」


①去你自己的资料里搜 ──▶ 找到会议记录里那一句:
「参会人,小雪的导师——咖哥」


②把这一句 + 原问题一起交给模型


③模型基于这段资料写出答案

图说:模型自始至终没有「学会」任何新东西。
它只是这一次的输入里多了一段它以前没见过的文字。
**下一次你不给,它照样不知道。**

书用的正是这个例子:如果你有大量关于这家公司的文档(比如每次开会的会议记录), 没准哪天的记录上面就写着:参会人,小雪的导师——咖哥。那不就成了!7

现在回头看第 08 章那句「外挂第二大脑」。 那个比喻在这里落地了: 大脑里的东西改不了,但你可以在每次问它之前,把一页纸摊在它面前。

4. 主走查:五行代码,把一份本地文档变成能问的东西

这一节是本章的主走查。四步代码、两个问题、两段真实回答,全部来自书里。

输入: 一个装着「花语秘境」文档的本地文件夹,外加两个问题—— 「花语秘境的员工有几种角色?」和「花语秘境的 Agent 叫什么名字?」8

第 1 步 · 读文件。 一个读取器指向那个文件夹,把里面的文档全读进来9:

documents = SimpleDirectoryReader("data").load_data()

第 2 步 · 把资料变成能按意思搜的东西。 把读进来的文档交给一个类10:

index = VectorStoreIndex.from_documents(documents)

这一行是全章的核心,下一节整节讲它到底干了什么、以及它为什么叫那个名字。

第 3 步 · 造一个查询引擎。 一行:query_engine = index.as_query_engine()

第 4 步 · 问。 两个问题,两段回答原样印在书里11:

问:花语秘境的员工有几种角色?
答:花语秘境的员工有多个角色。无论是营销高手、技术鬼才还是客服天使,
每个员工都扮演着不可或缺的角色。他们的每一个想法和努力都直接
影响花语秘境的成长和发展。

问:花语秘境的Agent叫什么名字?
答:花语秘境的Agent叫作“花语灵”。

请盯住第二段那三个字:「花语灵」。 这是一个虚构公司里一个虚构产品的名字,它只可能来自那份本地文档。 作者的话是:有了这一套的加持,它能够检索出它本来不知道的信息12

第 5 步 · 存下来,别每次重算。 学生在书里问了一个很实际的问题: 每次检索都要重新加载数据吗?作者的答复是:默认那些数据存在内存里, 你也可以把它保存到本地,以免每次需要重新处理13:

index.storage_context.persist()

存完之后本地多了一个文件夹,里面有四个文件——书把每个的用途都猜了一遍, 用词全是「可能是」「通常用于」14这属于书里坦白说不确定的地方,照实记下。

一趟走查的账:
你写的代码 4 行(读、建、造、问)
模型调用 每问一次调一次
资料的去向 建索引时进了内存;存盘之后进了本地 4 个文件
「花语灵」这三个字 只可能来自那份本地文档

图说:书说这一套的高级用法「允许初学者用 5 行代码来提取和查询数据」—— 这里正好 4 行。

5. 索引是什么:把每段文字变成一串数,按意思找

这一节讲第 2 步那一行到底干了什么。它是这条路唯一有点技术含量的地方。

学生在书里问得很好:你把它叫索引,能解释一下为什么吗?

作者的回答分两层15第一层:索引是一种数据结构,由文档对象组成, 用来配合你的查询策略,让检索和处理更高效。

第二层才是关键: 最常见的那种索引会把文件分解为节点, 并为每个节点的文本创建一串数

这串数有个名字叫嵌入——把一段文字变成一串数, 让意思相近的两段文字,数上也相近。书给的说法是: 具有相似含义的两段文本将具有数学上相似的表示,即使实际文本完全不同16

这串数本身也有个正式的名字,就叫向量——书里没用这两个字,但你出门到处都会撞见。

比如专门用来存这些数、并且能按数找东西的那种库,外面叫向量数据库—— 就是把每段文字那串数存起来、给你一串数就能捞出最接近的几段的库。

而「按意思找」这个动作,外面叫向量检索—— 指拿你问句的那串数,去库里比一遍,挑出数上最接近的几段。 这两个名字说的都是这一节这件事,不是新东西。

「即使实际文本完全不同」这半句是全章最重要的一句话。 它意味着:

你问:「花语秘境的Agent叫什么名字?」
文档里写的可能是:「我们给这个智能助手起名为花语灵」

按字面找:「叫什么名字」这几个字在文档里根本没有 ── 找不到
按意思找:两句话讲的是同一件事,数上就接近 ── 找得到

图说:这就是「按意思找」和「按关键词找」的全部差别。
书管前者叫语义搜索。

书的原话是:用户提供查询项,而它能够找到与查询项的意义相关的文本, 而不仅限于简单的关键词匹配。这是这套工作方式的重要部分16

这一节的落点: 第 2 步那一行代码里,藏着「切成小段」和「每段算一串数」两件事书没有讲切多大一段、用哪种办法算那串数——它在另一处承认了这一点: 这个过程里每个环节都有文章可做,比如如何选择数据块的大小、如何选择合适的模型, 但这并不是本书的重点17

6. 另起一处:挂两个资料库,让它自己挑该问谁

这一节走第二处,它把第 04 章那套东西和本章接了起来。

输入: 一句话——「比较一下两家电商的销售额」。 资料: 两家上市电商的第三季度财报文件,各建一个索引18

第 1 步 · 各造一个查询引擎,并且限定取回几段:

A_engine = A_index.as_query_engine(similarity_top_k=3)
B_engine = B_index.as_query_engine(similarity_top_k=3)

similarity_top_k=3 的意思是:每次只抽出相似度最高的 3 段文字19

给这个 3 配个参照:一份季度财报少说几十页,按段切开是几百段。 也就是说,每次问答只有其中大约 1% 的内容会被送到模型面前。 这个数是你自己拧的:调大更全但更贵,调小更省但可能漏。书没有讨论怎么选它。

第 2 步 · 把两个引擎各包成一件工具。 每件工具配一个名字和一句说明20:

工具名说明文字
A_Finance用于提供电商 A 的财务信息
B_Finance用于提供电商 B 的财务信息

请回想第 04 章第 2 节那条:说明文字就是它挑不挑你的唯一依据。 这两句说明只差一个字母,而程序全靠这一个字母分辨该问哪一家。

第 3 步 · 造一个会转圈的程序,把这两件工具交给它。 第 4 步 · 问那句「比较一下两家电商的销售额」。

到这里,走查必须停下,因为书里接下来只有一张截图。 比较结果在书里是图 8.11,正文里没有任何一个具体数字或句子21

但停在这里也够了,因为这一趟真正的看点不是结果,是路径:

「比较一下两家电商的销售额」


①问模型:该点哪个工具?
│ 它得先点 A_Finance —— 因为要比较,总得先拿到一家的数

②跑 A_Finance:去 A 的索引里按意思找,取回 3 段,交给模型写出一段答案


③问模型:够了吗? ── 不够,还差 B 家

④跑 B_Finance:同样取回 3 段,写出一段答案


⑤问模型:够了吗? ── 够了,把两段合起来做比较

图说:这就是第 01 章那一圈,只不过工具从「搜索、计算器」换成了「两个资料库」。
**每一格里还嵌着一次「按意思找 3 段」。**

这一趟把本章和第 04 章缝在了一起: 一个资料库被包成工具之后, 它和搜索、计算器就没有任何区别了——都是「模型写一张调用单、外面去跑、结果回填」。

7. 书里没给的:检索准不准,怎么打分

这一节讲这条路上最大的一个空白,而且它比前几章的空白更要命。

第 6 节那个 3 你拧对了吗?第 5 节那个「切多大一段」你切对了吗? 书对这两个问题的回答是「不是本书的重点」。

为什么这个空白比别的严重? 因为它出错的时候不报错。

回想第 4 节那一趟:如果那份文档里「花语灵」那一段没有被取回来, 模型不会说「资料里没有」,它会用它训练时的知识编一个名字给你—— 而那正是第 1 节里它答不上来时的样子。 换句话说: 检索失败和模型幻觉,在输出上长得一模一样。

书里其实给了一句自我暴露的话。 第 8.4 节说, 把这两件事组合起来之后,程序会独立地决定何时进行检索、如何规划检索策略, 并对收集的信息进行评估22「对收集的信息进行评估」这几个字, 书里没有任何一处给出做法。

补充(不在书里,依据我们的前沿框架书架): 「取回来的那几段到底好不好」今天有一套可操作的打分办法, 而且它把「答案忠不忠于资料」拆成了可以逐句判定的小题。 依据: shelf=ai-frontier-reference/ragas#01-metrics-engine.md @298b68274234c060deacab3cf5fb52aa3a20e885 事实=那套打分办法的通用套路是**「拆成原子判断 → 逐条让模型判定 → 把判定聚合成 0~1 分」**; 以「忠实度」为例:第一步把答案拆成一句句能独立读懂的陈述(提示里明确要求不准用代词), 第二步逐句判断「这一句能不能从取回的资料里直接推出来」,能就给 1、不能就给 0, 且每条都要写出理由;第三步按比例算成一个分数。23

「不准用代词」那半句值得单独记住。 因为「他」「它」脱离上下文没法单独判定—— 这是把一个模糊的「像不像」拆成可判定小题的关键手法, 和第 07 章第 9 节那套「硬检查 + 裁判打分」是同一个思路的两种落法。

所以这条路完整的样子应该是四步,而书只讲了前两步:

  1. 把资料切开、建索引;
  2. 按意思取回几段,贴进问题里问;
  3. 判断取回的那几段对不对(书没讲);
  4. 判断写出来的答案有没有超出那几段(书没讲)。

8. 可带走的

  1. 有一类问题它注定答不上来:私有的和新的。 这和「记岔了」「查不出出处」是三件不同的事;
  2. 换更强的模型解决不了它——再强的模型也没见过你公司的会议记录;
  3. 把资料弄进去有四条路,书选了第三条:先搜一遍,把搜到的贴进问题里再问;
  4. 选它的理由是三条:不用训练所以便宜、数据实时所以永远新、能显示原文所以可信;
  5. 书引的对照实验说:论准确率微调略高但差异不明显,两者叠加最准但贵得多;
  6. 它不是一个模型,是两个动作:检索 + 生成。 模型自始至终没学会任何新东西,下次你不给它照样不知道;
  7. 建索引那一行里藏着两件事:把文档切成小段、每段算成一串数; 意思相近的两段,数上也相近——所以能按意思找,而不只是按字面找;
  8. similarity_top_k 是你拧的那个数,书里设的是 3;一份季度财报按段切开是几百段,3 段大约是 1%;
  9. 一个资料库包成工具之后,和搜索、计算器没有任何区别——照样是「写调用单、去跑、回填」;
  10. 最大的空白是:检索失败和模型编造,在输出上长得一模一样; 书连「切多大一段」都说不是重点,更没给打分办法;
  11. 今天的做法是把「好不好」拆成可以逐句判定的小题,逐条判、再聚合成一个分数。

9. 原文地图

主题原书章原文位置
它不知道花语秘境的老板是谁3.3 何谓LlamaIndextext/27-ch03-03-3-3-llamaindex.txt:35(搜「花语秘境的老板是谁」)
四条路与三个缺点3.3 何谓LlamaIndextext/27-ch03-03-3-3-llamaindex.txt:29(搜「从难到易有4种方式」) · text/27-ch03-03-3-3-llamaindex.txt:31(搜「成本高、信息更新困难」)
这条路的定义、两个动作8.1 何谓检索增强生成 与 3.3 何谓LlamaIndextext/55-ch08-01-8-1.txt:5(搜「结合信息检索和文本生成」) · text/55-ch08-01-8-1.txt:9(搜「信息检索(Retrieval)」) · text/27-ch03-03-3-3-llamaindex.txt:23(搜「然后将这些信息作为上下文加入用户的查询中」)
会议记录那个例子3.3 何谓LlamaIndextext/27-ch03-03-3-3-llamaindex.txt:41(搜「小雪的导师——咖哥」)
农业问答那次对照实验8.1 何谓检索增强生成text/55-ch08-01-8-1.txt:51(搜「准确率最高的应用方法是") · text/55-ch08-01-8-1.txt:53(搜「物美价廉的")
主走查:四行代码与两段回答3.3 何谓LlamaIndextext/27-ch03-03-3-3-llamaindex.txt:124(搜「SimpleDirectoryReader」) · text/27-ch03-03-3-3-llamaindex.txt:135(搜「VectorStoreIndex.from_documents」) · text/27-ch03-03-3-3-llamaindex.txt:149(搜「花语秘境的员工有几种角色」) · text/27-ch03-03-3-3-llamaindex.txt:155(搜「花语灵」)
5 行代码那句话3.3 何谓LlamaIndextext/27-ch03-03-3-3-llamaindex.txt:103(搜「5行代码来提取和查询数据」)
存索引与那四个文件3.3 何谓LlamaIndextext/27-ch03-03-3-3-llamaindex.txt:168(搜「index.storage_context.persist」) · text/27-ch03-03-3-3-llamaindex.txt:176(搜「docstore.json」)
索引是什么、意思相近数也相近8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:39(搜「一种由文档对象组成的数据结构」) · text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:41(搜「具有相似含义的两段文本」)
切块大小不是重点8.1 何谓检索增强生成text/55-ch08-01-8-1.txt:79(搜「如何选择数据块的大小」)
另起一处:两个引擎、3 段、两句说明、那句提问8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:77(搜「similarity_top_k=3」) · text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:91(搜「用于提供电商A的财务信息」) · text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:131(搜「比较一下两家电商的销售额」) · text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:133(搜「输出结果如图8.11所示」)
独立决定何时检索、并评估收集的信息8.4 小结text/58-ch08-04-8-4.txt:15(搜「对收集的信息进行评估」)

Footnotes

  1. 出处:「3.3 何谓LlamaIndex」第 35 段(text/27-ch03-03-3-3-llamaindex.txt:35,搜「花语秘境的老板是谁」)。学生那句吐槽在同节第 39 段(text/27-ch03-03-3-3-llamaindex.txt:39,搜「你觉得你非常有名吗」)。那次问答的截图是图 3.19,正文没有给出它的回答原文。

  2. 出处:「3.3 何谓LlamaIndex」第 29 段(text/27-ch03-03-3-3-llamaindex.txt:29,搜「从难到易有4种方式」)。原书第 8 章开头还给了同一件事的另一张图,把四种做法按「对外部信息的需求」和「对微调的需求」两条轴摆成四个象限(text/55-ch08-01-8-1.txt:29,搜「纵轴代表对大模型外部信息的需求程度」)。

  3. 出处:「3.3 何谓LlamaIndex」第 23 段(text/27-ch03-03-3-3-llamaindex.txt:23,搜「然后将这些信息作为上下文加入用户的查询中」)。书里全程用英文缩写称呼它,本组拆解在正文里用中文全称,只在这里挂一次简称。

  4. 出处:「3.3 何谓LlamaIndex」第 31 段(text/27-ch03-03-3-3-llamaindex.txt:31,搜「成本高、信息更新困难」)。原文把这三条写成微调的三个缺点,再逐条说明这条路怎么避开它们。

  5. 出处:「8.1 何谓检索增强生成」第 51 段(text/55-ch08-01-8-1.txt:51,搜「准确率最高的应用方法是」)与第 53 段(text/55-ch08-01-8-1.txt:53,搜「物美价廉的」)。那篇论文的编号书里印的那个是错的,理由见第 13 章第 6 节,本组拆解不引它的编号。

  6. 出处:「8.1 何谓检索增强生成」第 5 段(text/55-ch08-01-8-1.txt:5,搜「结合信息检索和文本生成」)与第 9 段起(text/55-ch08-01-8-1.txt:9,搜「信息检索(Retrieval)」)。原文特意补了一句:被检索的东西不一定是文档,也可以是图片、代码、关系型数据库等等。

  7. 出处:「3.3 何谓LlamaIndex」第 41 段(text/27-ch03-03-3-3-llamaindex.txt:41,搜「小雪的导师——咖哥」)。这是全书对这条路最好懂的一次说明,可惜它藏在原书第 3 章一个不起眼的位置。

  8. 出处:「3.3 何谓LlamaIndex」第 149 段(text/27-ch03-03-3-3-llamaindex.txt:149,搜「花语秘境的员工有几种角色」)。那份文档的内容在书里是图 3.22,正文没有给出。

  9. 出处:「3.3 何谓LlamaIndex」第 124 段(text/27-ch03-03-3-3-llamaindex.txt:124,搜「SimpleDirectoryReader」)。书里这一行的导入语句有个笔误(from llama_index. coreimport SimpleDirectoryReader),照抄跑不通。

  10. 出处:「3.3 何谓LlamaIndex」第 135 段(text/27-ch03-03-3-3-llamaindex.txt:135,搜「VectorStoreIndex.from_documents」)。

  11. 出处:「3.3 何谓LlamaIndex」第 155 段(text/27-ch03-03-3-3-llamaindex.txt:155,搜「花语灵」)。两段回答是书里原样印出来的文字,不是截图——这也是本章把主走查挂在这一趟上的理由。

  12. 出处:「3.3 何谓LlamaIndex」第 159 段(text/27-ch03-03-3-3-llamaindex.txt:159,搜「检索出它本来不知道的信息」)。

  13. 出处:「3.3 何谓LlamaIndex」第 163 段(text/27-ch03-03-3-3-llamaindex.txt:163,搜「把索引保存到本地」)与第 168 段(text/27-ch03-03-3-3-llamaindex.txt:168,搜「index.storage_context.persist」)。

  14. 出处:「3.3 何谓LlamaIndex」第 176 段起(text/27-ch03-03-3-3-llamaindex.txt:176,搜「docstore.json」)。四个文件的说明原文分别用了「这可能是」「通常用于」「可能是」「可能包含」——作者没有打开看,只是照名字猜。这属于书里坦白不确定的地方。

  15. 出处:「8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索」第 39 段(text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:39,搜「一种由文档对象组成的数据结构」)。学生问「为什么叫索引」这个问题问得很好——它是这本书里少数几处把一个名字的来历讲清楚的地方。

  16. 出处:「8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索」第 41 段(text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:41,搜「具有相似含义的两段文本」)。原文用的词是「词嵌入是大模型应用功能的核心,它是文本语义或含义的数值表示」。 2

  17. 出处:「8.1 何谓检索增强生成」第 79 段(text/55-ch08-01-8-1.txt:79,搜「如何选择数据块的大小」)。作者的原话是:「这个过程中的每个环节都有文章可做。细节特别多……但是,这并不是 Agent 这个主题的重点,这里不再赘述。」并承诺以后专门讲。

  18. 出处:「8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索」第 5 段(text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:5,搜「东南亚的两家鲜花商品经销商」)。学生给的背景是:这件事本来要耗费团队大量人力,有时还要外聘商业分析师。

  19. 出处:「8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索」第 77 段(text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:77,搜「similarity_top_k=3」)与第 74 段(text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:74,搜「抽取3个相似度最高的文本块」)。「几百段」和「大约 1%」是我们估的,不是书里的数——书没有给财报的页数,也没有给切出来多少段。

  20. 出处:「8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索」第 91 段(text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:91,搜「用于提供电商A的财务信息」)。

  21. 出处:「8.3 通过LlamaIndex的ReAct RAG Agent实现花语秘境财报检索」第 133 段(text/57-ch08-03-8-3-llamaindex-react-rag-agent.txt:133,搜「输出结果如图8.11所示」)。正文对这次运行的全部交代只有这一句加一张截图;学生随后说「下个月外聘商业分析师的预算可以砍掉了」,作者也没有给出任何数字来支持这个结论。所以本章的主走查放在第 4 节那趟,而不是这一趟。

  22. 出处:「8.4 小结」第 15 段(text/58-ch08-04-8-4.txt:15,搜「对收集的信息进行评估」)。原文描述的是「基于 Agent 的检索增强生成框架」:程序会独立决定何时检索、如何规划检索策略,并通过评估每次检索的结果来决定要不要继续。这三件事书里一件都没有实现。

  23. 补充(不在书里,依据我们的前沿框架书架):「取回来的那几段好不好」被拆成可以逐句判定的小题。依据: shelf=ai-frontier-reference/ragas#01-metrics-engine.md @298b68274234c060deacab3cf5fb52aa3a20e885 事实=该库裁判类打分办法的通用套路是「拆成原子判断 → 逐条让模型判定 → 把判定聚合成 0~1 分」;以忠实度为例,第一步的提示明确要求把答案拆成可独立理解的陈述、不准用代词,第二步要求「能从资料直接推出给 1,否则给 0」且每条都要带理由,第三步按比例算分。