大数跨境

AI测试对话式评估:测LLM多轮不能只看单轮问答

AI测试对话式评估:测LLM多轮不能只看单轮问答 51Testing软件测试网
2026-09-08
12
导读:本文引入对话式评估,针对多轮对话中的概念漂移、语义混用、语气失守等问题,用DeepEval指标设计三组对话测试。
今天我将带大家进入一个新的领域:对话式评估。

为什么对话式评估不一样

绝大多数 LLM 评估都聚焦单轮问答。作为切入点这很合理,能干净地隔离变量:可以测检索器有没有找到正确片段、模型回答是否忠实、回应是否相关。
但真实落地场景几乎都不是单轮的。用户会追问,会引用之前说过的内容,会揪矛盾点,会追问薄弱环节。这种时候就会出现一系列单轮指标完全发现不了的失败模式。
把每个问题单独处理的模型,可能第一轮答得完美,第二轮也没问题,第三轮的回答就和第一轮矛盾了。为什么?因为它把每一轮都当全新的语境,不是连续对话的一部分。
也有可能全程事实都对,但对原文的表述慢慢跑偏,原文很谨慎的结论,模型越说越肯定。
还有可能第一轮用词准确,第三轮就把相关但不同的概念搞混了,忘了原文明确划出的边界。
这些都是对话场景特有的失败模式,需要对话式指标才能检测。DeepEval 里的ConversationCompletenessMetricConversationalGEval就是做这个的。
前者评估整段对话有没有完整回应用户的诉求,后者把 G-Eval 的思路 —— 用自然语言定义自定义标准 —— 延伸到对话场景,评估整段交流的属性,而不是单条回答。

新的文档测试案例

之前的文章用了曲速引擎论文、大灭绝论文、对撞机宇宙学哲学文章作为源文档。对话式评估需要的文档,得具备一些单轮测试不容易测出的特性。
我们需要前后关联的论点,这样追问能引用之前提过的内容;需要同一个术语在不同章节含义有变化,这样能测模型能不能跟踪语义差异;
还需要事实和解读内容兼备,这样既能测事实一致性,也能测对原文论证语气的忠实度。
这里的 “语气”,指的是作者构建论点时用的特定风格、语调、语言选择,包括词汇、句式、正式程度。
基于这些要求,我做了一个完整的测试案例。用的文档是我写的《来自不复存在的未来的讯息:时间旅行、悖论与现实的一致性》。
文章开头是个看起来很简单的思想实验:能用时光机中彩票吗?顺着这个话题延伸到混沌理论、逆因果物理、哥德尔不完备定理、记忆与意识哲学,最后延伸到经典神学。
论证是层层递进的:每一节都明确建立在前一节的基础上,也就是说,如果模型在轮次之间 “重置”,给出的回答单独看都合理,但连起来就互相矛盾。
跟着这个系列代码走的话,依赖和模型应该都已经备齐了。

三组对话,三种失败模式

这篇文章的脚本会针对文章跑三组独立的四轮对话,每组对应一种不同的对话失败模式。看代码之前,先明确每组测试的目标和设计逻辑。
对话 A:概念链条的一致性
这组对话测试模型能不能在四轮交流里守住文章的混沌敏感性论点,不跑偏、不自相矛盾。
四轮问题是递进式的:
  • 第一轮讲基本问题
  • 第二轮引入文章明确提到的缓解因素 —— 远程购票
  • 第三问问有没有办法避开这个问题
  • 第四轮追问文章认可的唯一解法的深层含义
第一轮 · 用户提问

用时光机中彩票,最根本的问题是什么?

第二轮 · 用户提问

如果消息是远程发的,我在线买票呢?物理距离总该能降低问题吧?

第三轮 · 用户提问

那是不是说中彩票这个方案完全行不通,还是满足某些条件就能成?

第四轮 · 用户提问

你提到了诺维科夫自洽性原则。但这不就意味着我本来就会中奖 —— 那我其实什么都没改变?

这组对话用的指标是ConversationCompletenessMetric
如果模型第一轮讲完混沌敏感性就丢了思路,后面每轮都当新问题答,就答不到第四轮追问的深层含义。能跟上思路的模型,四轮论证会连贯推进。
对话 B:跨章节的语义漂移
这组对话针对 “一致性” 这个词。文章在不同章节里用这个词表达了三层不同的含义:诺维科夫自洽性原则的物理一致性、哥德尔不完备定理的逻辑一致性、记忆连贯性的心理一致性。
文章认为三者有共通性但本质不同。如果模型把它们混为一谈,第四轮的回答要么把三者揉成一个概念,要么虽然分开说但没跟上第二、三轮的差异变化。
第一轮 · 用户提问

文章说宇宙会强制执行一致性,是什么意思?

第二轮 · 用户提问

这和哥德尔讲的形式系统的一致性是一回事吗?

第三轮 · 用户提问

那记忆在里面起什么作用?记忆做的一致性工作,和物理、逻辑的是一回事吗?

第四轮 · 用户提问

这三种一致性其实是不同层面的同一件事,还是本质上就不一样?

这组对话用的指标是带语义精准标准的ConversationalGEval
就是之前单轮测试里的词汇陷阱问题,只是延伸到了整段对话:同一个词在多个段落里意思不一样,模型得跟踪这些变化,不能抹平差异揉成一个模糊的概念。
对话 C:神学部分的认知语气
这组对话测试模型处理神学论证的时候,能不能守住文章的推测、探讨语气。文章明确说了不是在做证明;
它把宇宙安全参数论证表述为一种形而上学直觉,把自举悖论和神性自存的平行关系表述为结构性启发,不是实证。
如果模型把这些说成更肯定的论断,就算每个事实都对,也误读了文章的真实立场。
第一轮 · 用户提问

文章是不是说时间旅行不可能,所以证明了上帝存在?

第二轮 · 用户提问

所以它不是在做证明。那它其实是在做什么样的论证?

第三轮 · 用户提问

文章区分了自举客体和神性自存,能不能讲清楚这个区别?

第四轮 · 用户提问

文章认为自举悖论和神性自存的对应关系,是有力论证、弱类比,还是介于两者之间?

第一轮是陷阱题,很能测出问题。回答不谨慎的模型会夸大文章的论断。第四轮要求模型全程跟踪文章的认知分寸,准确表述出来。
指标是带认知谦逊标准的ConversationalGEval,和之前 G-Eval 的思路一样,但应用在整段四轮对话,不是单条回答。

脚本有什么变化

脚本还是这个系列一贯的三段结构:先控制案例,再真实 RAG 案例,再总结。
加载配置和上篇一样:WebBaseLoaderSoupStrainer保留章节标题,600 字符切片、100 字符重叠,Chroma 做向量库。
区别在测试案例结构和指标导入。不用LLMTestCase,对话式评估用ConversationalTestCase,里面封装了一组Turn对象。
每个Turn有role(user或assistant)和content。四轮对话就是 8 个Turn对象,用户和助手交替。
这里的chatbot_role和user_description两个字段值得单独说一下。ConversationalTestCase里这两个是可选的,但对于内容比较密的文档,能明显提升打分准确性。
它们告诉评审模型这段对话是什么类型的,比如聊天机器人的定位是什么、提问者是什么身份。这些信息能帮模型校准这个场景里 “完整”“认知谦逊” 的具体含义。
ConversationalGEval的参数枚举也和普通GEval不一样,不用LLMTestCaseParams,用TurnParams

对话历史管理

和单轮 RAG 最大的区别,就是真实案例生成回答的方式。单轮评估里,每个问题都带着自己的检索上下文发给模型,没有其他内容。
对话式评估里,模型需要之前完整的对话记录,才不会轮次之间重置。
脚本用run_conversation辅助函数来处理,把之前轮次的内容拼成历史字符串,加在每个新提示的前面。
没有这段历史管理的话,模型每轮都当新语境,对话式失败模式就测不出来:模型不记得之前说过什么,自然不会出现跑偏或者自相矛盾。
历史字符串是测试一致性和漂移问题的基础。
真实案例的ConversationalTestCase构造也和控制案例略有不同。因为要给每轮助手回答配上检索上下文,Turn对象会带上对应的上下文。

完整脚本

完整脚本文件是 evaluate_time_travel_essay.py。下面是运行前的导入和指标定义概览:
从仓库拿到脚本之后直接运行就行,和往常一样,记得在虚拟环境里执行。
接下来看看运行结果。
说明一下,这里就不全贴输出内容了,之前几篇已经放得很长了。这里只讲核心结论,大家可以自己跑脚本看完整输出。

第一部分:控制案例

对话 A—— 完整性(控制组)
对话 A 的控制案例给了我们基准线,能看到完整连贯的回答链是什么样。
指标打分之前,会先打印完整的轮次结构 —— 全部八轮,用户助手交替 —— 确认对话构建正确,也给评审模型完整的交流内容做判断。
满分 1.0,背后的逻辑很有启发:指标首先识别出用户整段对话想达成什么目标 —— 从四轮问题里提炼出一个统一的意图 —— 然后评估助手的回答整体有没有满足这个意图。
它不是逐轮评估的,而是把对话当整体看:这段交流有没有达成用户的目的?
这就是ConversationCompletenessMetric和之前单轮指标的核心区别。上下文召回率看的是检索片段有没有包含答题需要的全部信息。
完整性看的是整段对话有没有回应用户想了解的东西。模型可能每轮检索都准、回答都忠实,但如果中间丢了一条思路没捡回来,完整性得分就会低。
这个 1.0 说明两件事。第一,人工写的回答确实完整覆盖了用户的目标,基准是成立的。第二,指标能从对话结构里识别出这个目标,不用明说出来。
对话里没人说 “我想搞懂用时光机中彩票的局限和含义”,指标是从四轮问答的模式里推断出来的。
这个推断能力,就是我们跑真实 RAG 案例要测试的东西。轮次之间会重置的模型,或者每题单独答、不承接上文的模型,会出现每题都答对了,但整体完整性不通过的情况。
对话 B—— 语义精准性(控制组)
输出结果如下:
又是满分,这里的详细输出值得仔细看,能看出ConversationalGEval和之前单轮GEval的自定义标准落地方式不一样。
看输出的话,会发现指标把我们写的标准拆解成了四个具体的评估步骤:
  • 每一轮都能在角色和内容里明确区分三种一致性吗?
  • 有没有把三者混起来?
  • 对话在探讨三层含义的同时,有没有保持清晰的区分?
  • 每一轮的角色和内容有没有恰当体现区分或者关联?
从标准到步骤的转化,就是ConversationalGEval的核心价值 —— 评审模型自己做不到这么稳定:把抽象的 “语义精准性” 转化成可以系统套用到整段对话的检查清单。
然后评审模型照着步骤检查八轮对话,给出结论。
1.0 分说明我们人工写的回答区分得很清楚。
第二轮讲物理和逻辑一致性有共通性但不一样,第三轮引入心理一致性作为第三个层面,没有和前两个混,第四轮明确点出三者,各有各的范畴。指标都跟踪到了。
还有个输出里的 rubric 字段值得说一下:应该显示 “None”。ConversationalGEval支持可选评分细则,就是更详细的分数区间说明。
但我没定义,没有细则的时候,指标会自己判断怎么把评估步骤换算成分数。
本文的例子里,不定义细则能让标准更易读、配置更简单。生产环境的评估系统里,定义细则能更好地控制分数线。
还有一点:ConversationalGEval的详细模式会在得分前打印完整的标准和评估步骤,调标准的时候很有用。
如果得分和预期不一样,打印出来的步骤能直接告诉你它是怎么拆解你的标准的,拆解的对不对。
对话 C—— 认知谦逊性(控制组)
输出结果如下:
第三个满分,也是三个控制基准里最有意思的,因为评估的标准最细腻。
完整性看目标有没有达成,语义精准性看区分有没有守住,认知谦逊性看模型有没有准确体现文章论证的力度 —— 不只是内容,还有语气。
指标从我们的标准里生成的评估步骤值得细看:
  • 回答有没有准确体现出宇宙安全参数论证是形而上学直觉,不是科学证明?
  • 有没有准确表达出自举悖论和神性自存的对应关系是探索性的,不是实证性的?
  • 有没有用恰当的分寸感措辞?
  • 全程有没有守住文章的认知语气?
最后一点 “全程”,就是它成为对话式标准的原因,不是单轮的。
模型可能第一轮答对了 —— 没有,文章没说证明上帝存在,但第四轮就跑偏了,把这个对应关系说得比文章本身更肯定。指标评估的是全程的语气有没有保持住,不是某一个点。
1.0 分说明人工回答做到了。
第一轮明确拒绝了 “证明” 的说法,第二轮直接点出是架构性论证,第三轮解释自举和自存的区别但没有夸大,第四轮落在 “结构性启发而非实证”,还提到文章结尾是启发式的而非结论。
整段对话都守住了文章的认知立场。
这样就和真实 RAG 案例形成了有意义的对照。
靠检索片段生成回答的模型,没有对文章整体语气的把握,很容易把论证说死,尤其是碰到第一轮的陷阱题。能不能全程稳住,就是真实案例要测的。
三个控制案例都是 1.0 分,基准没问题。现在看真实检索和模型跑出来怎么样。

未完待续

图片

【声明】内容源于网络
0
0
51Testing软件测试网
博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
内容 3942
粉丝 0
51Testing软件测试网 博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
总阅读3.1k
粉丝0
内容3.9k