尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LLM-Cookbook 学习——搭建基于 ChatGPT 的问答系统>第十章 评估(下)——当不存在一个简单的正确答案时

LLM-Cookbook 学习——搭建基于 ChatGPT 的问答系统>第十章 评估(下)——当不存在一个简单的正确答案时 一、前言如果没有唯一的标准答案应该怎么评估上一节我们学习了当一个问题存在明确标准答案时如何对 LLM 输出进行自动化评估。例如用户问你们有哪些电脑我们可以提前规定标准答案{ 电脑和笔记本: { TechPro 超极本, BlueWave 游戏本, PowerLite Convertible, TechPro Desktop, BlueWave Chromebook } }然后直接比较模型输出 VS 标准答案如果集合完全相同✅ 正确如果模型少返回了一些Subset 子集如果模型多返回了一些Superset 超集这种任务很好评估因为正确答案是比较明确的。但是现实中的 LLM 应用大量都是文本生成任务例如用户问请介绍一下 SmartX ProPhone。模型可能回答SmartX ProPhone 是一款支持 5G 的智能手机 拥有 6.1 英寸显示屏、128GB 存储空间和 12MP 双摄像头。也可以回答SmartX ProPhone 配备 6.1 英寸屏幕 内置 128GB 存储空间并支持 5G 网络。 摄像头采用 12MP 双摄方案。甚至还可以如果您需要一款支持 5G 的手机 SmartX ProPhone 是一个选择。 它拥有 6.1 英寸屏幕、128GB 存储空间 并配备 12MP 双摄像头。这三个答案文字不一样 句子顺序不一样 表达方式不一样但事实内容都可以是正确的因此我们不能再简单使用model_answer ideal_answer判断。这就是第十节研究的问题当不存在一个简单、唯一的正确答案时如何评估 LLM 输出课程主要介绍了两种思路方法一 根据 Context Rubric 让另一个 LLM 判断回答质量 方法二 提供 Expert / Ideal Answer 让另一个 LLM 比较生成回答与标准回答也就是说第十节开始真正使用LLM-as-a-Judge即让 LLM 充当评审模型对另一个 LLM 生成的回答进行评价。课程原文就是围绕“复杂自由文本回答”“基于上下文的 Rubric 评价”以及“生成答案与专家答案比较”展开。三、首先运行完整问答系统课程首先构造一个比较复杂的问题customer_msg f 告诉我有关 the smartx pro phone 和 the fotosnap camera, the dslr one 的信息。 另外你们这有什么 TVs 这个问题实际上包含问题1 SmartX ProPhone 有什么信息 问题2 FotoSnap DSLR Camera 有什么信息 问题3 你们有哪些电视然后调用之前已经封装好的函数products_by_category utils_zh.get_products_from_query( customer_msg )作用用户问题 ↓ 识别相关商品接着category_and_product_list \ utils_zh.read_string_to_list( products_by_category )作用LLM 返回字符串 ↓ 转换为 Python 数据结构然后product_info \ utils_zh.get_mentioned_product_info( category_and_product_list )作用商品名称 ↓ 查询商品数据库 ↓ 得到商品详细资料最后assistant_answer utils_zh.answer_user_msg( user_msgcustomer_msg, product_infoproduct_info )作用用户问题 检索到的商品信息 ↓ LLM ↓ 生成最终客服回答整个过程就是Customer Question ↓ 商品识别 ↓ 商品信息检索 ↓ LLM 生成回答 ↓ assistant_answer四、为什么这个回答不能像上一节那样直接比较假设生成答案SmartX ProPhone 拥有 6.1 英寸显示屏、 128GB 存储空间、12MP 双摄像头 并支持 5G 网络。人工标准答案SmartX ProPhone 是一款支持 5G 的智能手机 拥有 128GB 存储和 6.1 英寸屏幕 同时配备 12MP 双摄像头。如果直接assistant_answer ideal_answer结果一定False因为字符串不同。但是实际上事实16.1 英寸 ✅ 事实2128GB ✅ 事实312MP 双摄 ✅ 事实45G ✅所以语义上完全正确这就是自由文本评估最大的难点我们关心的是事实和含义而不是具体用了哪些字。五、传统相似度指标为什么不一定够用传统 NLP 中可以使用一些指标比较文本之间的相似程度例如BLEU ROUGE它们可以根据词语重叠 n-gram 重叠等方式判断两个文本有多像但是文本“长得像”不一定等于内容正确。例如标准答案SmartX ProPhone 支持 5G 价格为 899.99 美元。模型回答SmartX ProPhone 支持 5G 价格为 899.99 美元。当然非常相似。但是另一个回答这款手机售价 899.99 美元 同时能够连接 5G 网络。虽然文字重叠变少了但事实仍然完全正确再比如SmartX ProPhone 不支持 5G 价格为 899.99 美元。它和标准答案文字非常相似。但多了一个“不”整个事实意义却发生了变化。所以文本相似度并不能完全等价于事实正确性。因此本节尝试让LLM利用自己的语义理解能力进行评价。六、第一种方法根据 Rubric 评价回答课程首先建立cust_prod_info { customer_msg: customer_msg, context: product_info }这里包含两个非常重要的信息。customer_msg表示用户到底问了什么。而context表示生成回答时提供给 LLM 的事实依据。所以cust_prod_info可以理解成{ 用户问题, 参考资料 }七、这里的 context 是什么这个地方非常重要。这里的context不是聊天历史 context而是模型生成答案时所依据的商品信息。例如SmartX ProPhone 屏幕6.1英寸 存储128GB 摄像头12MP 网络5G 价格899.99美元这些资料就是context于是Context 事实依据 / Reference Information我们希望检查assistant_answer是不是严格根据 context 回答而不是自己编造信息。八、定义 eval_with_rubric()课程定义def eval_with_rubric( test_set, assistant_answer ):这个函数的作用就是让另一个 LLM 按照一套评价标准对客服回答进行检查。其中test_set包含用户问题 参考上下文而assistant_answer表示要被评价的模型回答所以eval_with_rubric()可以理解成用户问题 参考资料 模型回答 评价标准 ↓ Evaluator LLM ↓ 评价结果九、Rubric 是什么意思这是这一节非常重要的一个单词Rubric可以理解成评分标准 / 评价准则例如老师批改作文时不只是说感觉写得挺好。而是规定内容正确30分 结构清晰20分 语言表达20分 论证完整30分这就是一种RubricLLM Evaluation 中同样如此。与其问这个答案好吗不如明确告诉评审模型请检查以下几个方面 ① 是否只根据提供的资料回答 ② 有没有加入资料中不存在的信息 ③ 有没有和资料发生矛盾 ④ 用户提出了多少个问题 ⑤ 每个问题是否都有回答这就是使用明确 Rubric 评价 LLM 输出。十、为什么不能只问“这个答案好不好”假如 Prompt 是请评价这个答案好不好。这个问题太模糊。模型可能从语法 文风 礼貌程度 长度 表达方式 事实准确性任何一个角度评价。不同运行结果也可能侧重点不同。所以Evaluation Prompt需要比普通 Prompt 更明确。应该告诉模型评价什么 按照什么标准评价 输出什么格式这样评价结果才更加稳定。十一、eval_with_rubric() 中的 system_message课程中system_message 你是一位助理 通过查看客户服务代理使用的上下文 来评估客户服务代理回答用户问题的情况。 这句话实际上完成了告诉 LLM你现在不是客服而是Evaluator 评审员所以同一个 LLM第一次调用 Generator 答案生成器第二次调用Evaluator 答案评审器这就是LLM-as-a-Judge最基本的实现方式。十二、Evaluator 到底拿到了哪些信息user_message中大概组织成[用户问题] ... [使用的上下文] ... [客户代理的回答] ...即Question Context Answer评审模型同时看到这三个东西。因此可以判断用户问了什么 ↓ 资料实际上说了什么 ↓ 助手最终回答了什么然后检查回答是否受到资料支持十三、第一个评价标准回答是否只基于 Context评价问题助手的回应是否只基于所提供的上下文本质是在检查Groundedness即回答是否有依据。例如 Context价格899.99美元 支持5G模型回答价格为899.99美元 支持5G。那么✅ 有 Context 支持但是如果模型回答它还支持卫星通信。而 Context 完全没写卫星通信那么就说明回答不是完全基于 Context十四、第二个评价标准是否包含 Context 中不存在的信息课程还问回答中是否包含上下文中未提供的信息这个问题主要就是在检查Hallucination即幻觉 / 无依据生成。例如Context SmartX ProPhone 价格899.99美元模型回答价格为899.99美元 目前购买还赠送免费耳机。但是免费耳机并不存在于 Context 中。那么模型自己编造了额外事实这就是需要检测的问题。十五、第三个评价标准有没有和 Context 冲突课程还检查回应与上下文之间是否存在任何不一致之处例如Context 128GB 存储模型该手机拥有256GB存储空间。这里不是缺少信息而是直接和事实冲突所以这类错误属于Contradiction即事实矛盾。十六、第四个评价标准用户到底问了多少个问题课程还要求评审模型计算用户提出了多少个问题。例如告诉我 SmartX ProPhone 的信息。 FotoSnap DSLR Camera 怎么样 你们有哪些电视可以理解成问题1手机 问题2相机 问题3电视然后模型应该判断三个问题是不是都回答了这实际上是在检查Completeness即回答完整性。十七、正确但不完整同样可能是质量问题例如用户问介绍一下 SmartX ProPhone FotoSnap DSLR Camera 还有你们有哪些电视模型只回答SmartX ProPhone 拥有6.1英寸显示屏、 128GB存储和5G功能。这一段本身没有任何事实错误但是相机没有回答 电视没有回答所以整个回答仍然不完整因此评价 LLM 输出不能只检查“说出来的内容有没有错”还要检查“应该回答的内容有没有全部回答”可以简单总结为Correctness Completeness十八、第一次评估结果怎么看课程中的评价结果大致是回答只基于提供的上下文是 是否包含上下文不存在的信息否 是否和上下文存在冲突否 用户问题都得到了回答是因此可以认为assistant_answer从事实依据 完整程度 幻觉问题几个角度来看质量是合格的十九、第一种评估方法的完整逻辑可以把eval_with_rubric()浓缩成用户问题 │ ↓ ┌─────────────────┐ │ Reference │ │ Context │ └────────┬────────┘ │ ↓ 模型生成回答 │ ↓ ┌─────────────────┐ │ Evaluator LLM │ └────────┬────────┘ │ ┌────────────┼────────────┐ ↓ ↓ ↓ 有依据吗 有幻觉吗 完整吗 │ │ │ └────────────┴────────────┘ ↓ 评价结果这里不需要唯一标准答案只需要可靠的参考资料 明确的评价标准就可以评价。二十、第二种方法与人工标准答案进行比较接下来课程又介绍第二种方法。虽然自由文本没有唯一正确表达但是我们仍然可以让领域专家写一个高质量答案作为Ideal Answer例如test_set_ideal { customer_msg: ..., ideal_answer: SmartX ProPhone... FotoSnap DSLR Camera... CineView TV... }注意这里的ideal_answer和第九节有所不同。二十一、第九节和第十节的 ideal_answer 有什么不同第九节的ideal_answer通常是{ 游戏机和配件: { GameSphere X, GameSphere Y } }非常结构化。可以直接比较。而第十节ideal_answer是一整段自然语言SmartX ProPhone 是一款…… FotoSnap DSLR Camera 是一款…… 我们有以下电视……我们不能要求assistant_answer ideal_answer而是要判断两个回答在事实内容上是否基本一致。二十二、定义 eval_vs_ideal()课程定义def eval_vs_ideal( test_set, assistant_answer ):其中cust_msg test_set[customer_msg]得到用户问题然后ideal test_set[ideal_answer]得到专家答案 / 理想答案最后completion assistant_answer得到模型实际生成的答案于是评审模型得到问题 专家答案 模型答案然后判断模型答案和专家答案在事实上有多一致二十三、为什么这里还是要使用 LLM 比较因为专家答案可能写该手机售价899.99美元并支持5G。而模型回答SmartX ProPhone 支持5G网络 售价为899.99美元。字符串不一样但是语义一样因此需要Semantic Comparison即语义比较而不是String Comparison字符串比较。二十四、A~E 五级评价标准这一节一个非常重要的地方是定义A B C D E五种评价结果。A模型答案是标准答案的子集并且没有冲突例如专家答案A B C D模型回答A B C模型少说了一部分但说出来的内容都是对的所以属于A可以理解成不完整但是正确。二十五、B模型答案是标准答案的超集而且额外内容也是正确的专家答案A B C模型回答A B C D如果D虽然专家答案没写但是D 也是正确事实那么就是Superset也就是B二十六、C模型答案与专家答案内容一致即模型包含的主要事实 ≈ 专家答案包含的主要事实可能语言不同 顺序不同 句式不同但是事实内容基本一致因此C可以理解成内容等价。课程中的正常客服回答最终被评价为C也就是生成回答和专家答案事实内容一致二十七、D模型答案和专家答案存在事实冲突例如专家答案价格为899.99美元模型价格为499.99美元这种情况就是事实不一致因此D表示存在实质性的事实分歧。二十八、E存在差异但差异在事实层面不重要这是最容易理解错的一项。例如专家答案SmartX ProPhone 是一款功能强大的智能手机。模型SmartX ProPhone 是一款智能手机。可能表达有所不同。但是从真正需要评价的核心事实来看差异可能并不重要这时可以E也就是文字存在差异但不影响事实正确性。二十九、为什么 Prompt 特别要求忽略风格和语法课程评价 Prompt 中特别强调关注事实内容 忽略 样式 语法 标点这是很重要的。因为 Evaluation 的目标是Content Quality而不是文字长得像不像专家答案例如专家 价格为899.99美元。模型售价是899.99美元。不应该因为“价格为”变成“售价是”就判错。所以评价模型必须区分Surface Form 表面表达和Semantic Content 实际语义三十、为什么要求 Evaluator 只输出 A~Esystem message 中要求只输出一个字母 A B C D E而不是让模型写一篇评价报告原因和前面课程完全一样程序需要稳定、容易解析的输出。如果模型输出总体来说回答很好 大部分信息与专家答案一致……程序后续不好处理。但C就非常简单if score C:即可执行后续逻辑。因此再次体现Structured Evaluation Output即评价结果也应该尽量结构化。三十一、正常回答为什么得到 C课程运行eval_vs_ideal( test_set_ideal, assistant_answer )得到C这表示生成答案和专家答案虽然表达方式存在一些差异但是核心事实内容一致因此评审模型认为C 包含基本相同的事实细节三十二、用一个明显错误回答测试 Evaluator课程又故意构造assistant_answer_2 \ life is like a box of chocolates意思生活就像一盒巧克力。而用户明明问的是SmartX ProPhone FotoSnap DSLR Camera 电视显然完全答非所问然后运行eval_vs_ideal( test_set_ideal, assistant_answer_2 )Evaluator 得到D也就是模型答案与专家答案存在明显分歧课程正是通过这个极端例子验证评价函数能够识别明显异常答案。三十三、为什么要故意构造一个特别错误的答案这其实也是一种测试思想。我们写好了eval_vs_ideal()之后不能默认评价函数肯定没问题还应该测试Evaluator 本身能不能正常工作所以可以分别构造一个明显正确答案 一个明显错误答案如果正确答案 → C 错误答案 → D说明Evaluator 至少具备基本区分能力这其实就是Evaluation 也需要被 Evaluation。也就是说不是只测试 Generator还应该考虑Evaluator 本身可靠吗三十四、Generator 和 Evaluator 的关系到这一节以后一个典型 LLM 系统可以变成用户问题 │ ↓ ┌────────────┐ │ Generator │ │ 生成模型 │ └─────┬──────┘ │ ↓ assistant_answer │ ┌────────┴────────┐ │ │ ↓ ↓ Context Ideal Answer │ │ └────────┬────────┘ ↓ ┌────────────┐ │ Evaluator │ │ 评审模型 │ └─────┬──────┘ │ ↓ Evaluation这就形成Generate ↓ Evaluate ↓ Improve三十五、Rubric Evaluation 和 Ideal Answer Evaluation 有什么区别本节介绍的两种方法需要区分清楚。方法给 Evaluator 什么信息主要检查eval_with_rubric()用户问题 Context 模型回答是否有依据、是否幻觉、是否完整eval_vs_ideal()用户问题 专家答案 模型回答与专家答案是否一致第一种Question Context Answer重点回答有没有忠实依据资料第二种Question Ideal Answer Answer重点回答和专家答案相比质量如何三十六、什么时候适合使用 Context Rubric如果你有可靠资料但是没有人工写好的标准答案那么特别适合eval_with_rubric()例如 RAG 系统用户问题 ↓ 检索文档 ↓ LLM 回答你已经拥有Retrieved Context所以可以直接问 Evaluator回答是否受到检索文档支持 有没有使用文档中不存在的信息 有没有漏回答用户问题三十七、什么时候适合使用 Ideal Answer如果任务比较重要并且能够让专家提前写一些高质量标准回答就可以建立Question Ideal Answer测试集。以后每次修改Prompt 模型 RAG Agent都可以自动重新运行再让 Evaluator模型答案 VS 专家答案进行比较。三十八、这和第九节的 Development Set 怎么连接起来第九节我们建立msg_ideal_pairs_set里面保存问题 明确标准答案到了第十节可以建立类似test_set_ideal { customer_msg: ..., ideal_answer: ... }区别只是第九节 ideal_answer 结构化答案第十节ideal_answer 专家编写的自然语言回答但是核心思想仍然一样把重要测试问题保存下来并给它配上评价依据。三十九、为什么 LLM-as-a-Judge 很适合开放式任务因为开放式文本最困难的地方就是同一个意思 可以有无数种表达例如5G is supported.和The phone supports 5G connectivity.字符串完全不同。但是 LLM 能理解语义基本一样所以它可以进行Semantic Evaluation而不是Exact Match这也是第十节相比第九节最大的升级。四十、但是 LLM Evaluator 是不是绝对可靠不是。这是实际使用中一定需要知道的。如果Generator 是 LLM而Evaluator 也是 LLM那么 Evaluator 自己也可能理解错误 判断错误 受 Prompt 影响 输出不稳定所以LLM-as-a-Judge 是一种实用的自动化评估工具但不能理解成绝对正确的“真理机器”。对于高风险任务仍然可能需要人工评估 专家审核 多指标评估 抽样复查尤其在建立评估体系初期最好人工评价 VS LLM评价抽取一些案例进行对比。四十一、好的 Evaluation Prompt 应该包含什么根据这一节可以总结一个比较通用的 Evaluation Prompt 结构① 定义 Evaluator 的角色 ② 给出用户问题 ③ 给出参考资料或者专家答案 ④ 给出模型生成答案 ⑤ 明确评价维度 ⑥ 明确忽略哪些因素 ⑦ 规定输出格式例如你是一名回答质量评审员。 用户问题 ... 参考资料 ... 模型回答 ... 请评价 1. 是否回答了用户问题 2. 是否有事实错误 3. 是否包含资料之外的信息 4. 是否遗漏关键信息 请输出 PASS 或 FAIL这其实就是一个完整的Evaluation Prompt四十二、Evaluation Prompt 本身也需要迭代这里还有一个很重要的工程思想。可能最开始 Rubric只检查事实正确性后来发现系统经常回答正确 但是遗漏问题那么就增加Completeness如果后来又发现引用资料之外的信息那么增加Groundedness所以 Evaluator 的 Prompt 也会经历发现问题 ↓ 修改 Rubric ↓ 重新测试和 Generator Prompt 的优化方式非常类似。四十三、可以把 Evaluation 拆成多个维度相比只给总分8分更加实用的方法可能是Correctness1 Groundedness1 Completeness0 Relevance1也就是事实正确性 依据充分性 回答完整性 问题相关性分别评价。这样一旦系统效果不好就容易知道到底哪里不好而不是只有一个最终得分四十四、结合 RAG 理解第十节这一节对 RAG 特别重要。典型 RAG用户问题 ↓ Retrieval ↓ 检索 Context ↓ LLM ↓ Answer这时候至少可以评估① Answer 是否根据 Context ② Answer 是否包含 Context 不支持的信息 ③ Answer 有没有和 Context 冲突 ④ Answer 有没有回答完整也就是说Question Retrieved Context Generated Answer恰好就是eval_with_rubric()所需要的数据。因此第十节实际上已经开始接近RAG Evaluation中的Faithfulness Groundedness Answer Relevance Completeness这些概念。四十五、结合自己的项目理解例如需要从芯片 Datasheet 中回答该芯片的 VDD 工作电压范围是多少检索得到Recommended Operating Conditions VDD: Min 3.0 V Typ 3.3 V Max 3.6 VLLM 回答该芯片推荐的 VDD 工作范围为 3.0V~3.6V典型值为3.3V。这时候 Evaluator 可以检查是否根据 Datasheet 3.0V 是否正确 3.6V 是否正确 3.3V 是否正确 有没有额外编造参数如果模型回答工作范围为3.0V~5.0VEvaluator 就应该发现5.0V和 ContextMax 3.6V发生冲突。这就是Context-based Evaluation在实际技术文档问答中的应用。四十六、如果是生成测试项也可以怎么评价例如 DatasheetVDD Recommended Operating Range: 3.0V ~ 3.6VLLM 自动生成测试项Test Item: VDD Operating Voltage Test Conditions: 3.0V, 3.3V, 3.6V这时候可能没有唯一标准句子因为人工可以写Supply Voltage Range Test也可以写VDD Recommended Operating Condition Verification名字不同没有关系。真正应该评价测试参数是否来自 Datasheet 范围是否正确 测试是否覆盖关键边界 有没有编造测试条件这就不能使用字符串完全一致而应该使用Rubric LLM Evaluator进行语义级评价。四十七、第九节和第十节可以组成一个完整 Evaluation 思路现在把两章结合LLM Output │ ↓ 是否存在明确标准答案 ┌─────┴─────┐ │ │ 是 否 │ │ ↓ ↓ Exact / Set Rubric Comparison │ LLM Judge │ │ ↓ ↓ 第九节 第十节例如分类任务 信息抽取 商品识别通常可以直接比较标准答案而问答 总结 解释 客服回复 RAG回答通常不存在唯一文字答案就更适合Rubric LLM Evaluator四十八、本节几个重要变量总结变量 / 函数含义customer_msg用户提出的问题products_by_category从问题中识别出的商品category_and_product_list转换后的商品列表product_info检索得到的商品详细资料assistant_answerLLM 最终生成的回答context回答所依据的参考信息cust_prod_info用户问题 Contexteval_with_rubric()按评价标准检查模型回答test_set_ideal用户问题 专家标准回答ideal_answer专家编写的理想回答eval_vs_ideal()比较模型答案与专家答案completion当前需要评价的模型答案assistant_answer_2故意构造的错误回答五十、这一节真正解决了什么问题第九节解决“模型输出是不是标准答案”第十节进一步解决“虽然模型的文字和标准答案不一样 但是它表达的内容到底对不对”所以 Evaluation 开始从Exact Match升级到Semantic Evaluation也就是字符串级比较 ↓ 语义级评价这是一个非常重要的转变。五十一、本节完整流程总结这一节可以总结成下面的流程用户问题 │ ↓ 检索相关资料 │ ↓ LLM 生成答案 │ ↓ ┌─────────────────┐ │ Evaluation │ └────────┬────────┘ │ ┌───────────┴───────────┐ │ │ ↓ ↓ Context-based Ideal-based Evaluation Evaluation │ │ ↓ ↓ Question Question Context Expert Answer Answer Model Answer │ │ ↓ ↓ LLM Evaluator LLM Evaluator │ │ ↓ ↓ 是否有依据 A / B / C / D / E 是否幻觉 是否冲突 是否完整五十二、本节学习总结第十节主要学习的是当 LLM 的输出是开放式自然语言、不存在唯一标准答案时不能再简单使用字符串或者集合进行比较而应该从事实和语义层面对回答进行评价。第一种方法用户问题 Context 模型回答 Rubric交给 Evaluator检查 Groundedness 检查 Hallucination 检查 Contradiction 检查 Completeness第二种方法用户问题 Expert Answer 模型回答交给 Evaluator比较两者事实内容并返回A B C D E这种方法充分利用了 LLM 的自然语言理解能力 语义比较能力使我们可以评价文字不同 但语义正确的开放式回答。
返回列表