讲个真实的故事:就在上周,我在处理一个延迟的货物运输时,花了不少时间与我的专属客服代表 Johnny 发消息。Johnny 人很好,他礼貌且反应迅速,以至于有时我都不好意思已读不回。但随着对话的深入,他不断重复着同样的问题,那些千篇一律的建议毫无帮助。嗯,我暗自思忖,也许这根本不是 Johnny 本人。
我虽不是侦探,但很明显 Johnny 实际上是个LLM聊天机器人。尽管我很欣赏 Johnny 的态度,但他总是忘记我告诉他的事情,回答也常常冗长且机械。这就是为什么部署生产级LLM对话代理时,进行LLM聊天机器人评测至关重要。
在本文中,我将教你如何全面评测LLM聊天机器人,使你能够量化它们是否逼真到足以冒充真人。更重要的是,你能利用这些评测结果来明确如何迭代优化你的LLM聊天机器人,比如采用不同的提示模板或LLM。
作为 DeepEval —开源LLM评测框架的作者,我将分享如何评测LLM聊天机器人,因为我们已为超过 10 万用户构建了评测LLM对话的方法。你将学到:
- 聊天机器人/对话评测与常规LLM评测的区别
- LLM对话评测的不同模式
- LLM聊天机器人评测指标的不同类型
- 如何通过 DeepEval 在代码中实现LLM对话评测
什么是LLM聊天机器人评测,它与LLM评测有何不同?
LLM聊天机器人评测是通过评测大型语言模型(LLMs)在对话中生成回复的质量来衡量LLM对话代理性能的过程。它与常规的LLM(系统)评测不同,因为常规LLM评测针对的是LLM应用在单次输入-输出交互上的表现,而LLM聊天机器人评测则需利用先前的对话历史作为额外上下文来评测LLM输入-输出交互。
LLM 聊天机器人评测与 LLM 系统评测之间的区别
这意味着,尽管 LLM 聊天机器人评测的标准对于非对话型 LLM 代理可能极为相似,但执行这些评测所使用的指标需要全新的实现,以考虑先前的对话历史。
这段“对话历史”实际上有一个更专业的术语,称为轮次(turns)。当你听说多轮对话时,本质上只是描述与LLM聊天机器人之间的消息或用户交流的一种花哨说法。
因此,问题变成了:给定对话中的一系列轮次,我们应该如何评测以及评测什么?是应该将对话视为一个整体,还是关注对话中的单个轮次,或者其他方面?
LLM对话评测的不同模式
事实证明(无意双关),LLM对话评测有两种类型:
- 整体对话评测:这涉及查看整个对话,并根据对话中的所有轮次进行评测。
- 末轮最佳回复评测:这仅涉及评测LLM聊天机器人在对话中生成的最后一条回复。
我们不评测单个回合的原因在于,频繁的冗余闲聊会浪费大量标记进行评测。原则依然不变:无论你决定采用哪种对话评测类型,都应在考虑先前回合上下文的基础上进行。
整体对话评测
对整个对话进行全面评测非常有用,因为某些评测标准需要整个对话作为上下文。例如,假设你正在构建一个对话代理来帮助用户开设银行账户。LLM代理将需要询问用户的姓名、地址、社会安全号码等信息,但你可能会遇到一个常见问题,即LLM对话代理可能忘记用户已提供的先前信息,导致最终提出重复性问题,使交互体验令人沮丧。
这意味着,要定义一个对话指标来量化你的LLM和提示模板能在多大程度上保留用户提供的先前知识,你需要将整个对话视为一个整体来考量。实际上,我想介绍的第一个对话指标正是知识保留指标,它评测LLM聊天机器人能在对话过程中多好地保留呈现给它的信息。你可以在 DeepEval 中访问该指标,别担心,我将在后续部分演示具体方法。
另一个需要评测整个对话的情况是,当你希望利用对话中的所有轮次来构建一个最终的指标分数时。
举例来说,假设你想衡量你的LLM聊天机器人回答的相关性。你可以将最终对话相关性指标分数定义为相关回答数量除以对话中的总轮次。但问题随之而来:如何判定一个回答是否相关?
乍听之下这或许像个愚蠢的问题——毕竟,难道不能直接让LLM评委通过提供完整的对话历史来给出无关回答的数量吗?这种方法的问题在于,当对话变得冗长时,LLM作为评判员很容易产生幻觉。但更关键的问题在于,衡量回答相关性时应该考虑哪些先前的对话轮次。让我来解释。
想象一下一个包含 100 轮对话的场景(我知道,听起来像小学数学题)。你在评测第 50 轮对话时发现,如果仅考虑前两轮(第 48 和 49 轮)作为支持上下文,回答可能不太相关;但若将前 10 轮(第 39 至 49 轮)纳入考量,其相关性实际上极高。
考虑先前轮次的滑动窗口评测方法
但让我们再突破一次极限。如果一个回答仅在考虑前 30 轮对话时才相关呢?100 轮?1000 轮?问题就变成了:在评测某个LLM聊天机器人回应时,应当考虑当前轮次之前的多少轮对话?这就是为什么在评测完整对话时,有时需要确定应纳入多少先前的对话历史。
来自传统软件工程背景的人会认出,这可以通过滑动窗口方法解决。对于每个回应,我们可以考虑前 min(0, 当前轮次数 — 窗口大小)轮对话来确定其相关性。回到对话相关性评分的例子,计算对话相关性分数我们只需:
- 遍历对话中的每一个单独轮次
- 采用滑动窗口方法,获取最近的 min(0, 当前轮次数 — 窗口大小)个轮次,并据此判断当前轮次回应是否相关
- 累加相关回应的数量,然后除以总轮次数
希望以上解释清晰。接下来我们谈谈更简易的对话评测模式。
最终最佳响应评测
有些用户可能更倾向于评测对话中的最后一个最佳回应,而非整个对话。这并不是说对话中的先前轮次不重要,它们仍作为支持性上下文存在,只是我们不再基于整个对话的回应进行评测,而是仅查看对话中的最后一个回应,并根据当前标准确定其指标得分。这也意味着,很多时候最后一个回应是空白的,只有在评测时才会由你的LLM聊天机器人生成以供评测。
最后最佳响应评测方法
对于希望评测对话中最后最佳回复的人来说,好消息是你可以重用所有用于评测单个LLM系统回复的非对话类LLM评测指标。当然,严格来说并非完全如此,你需要稍作调整,将一定数量的先前对话轮次作为额外上下文纳入考量,但这比评测整个对话要直接得多。
LLM 使用 DeepEval 进行对话评测
在开始讨论对话指标之前,我想先介绍一下 DeepEval ,这个开源的LLM评测框架。我之所以要介绍 DeepEval,并非仅仅因为这是我正在参与的项目(好吧,或许有一点这个原因),更重要的是 DeepEval 囊括了我们即将在下一部分探讨的所有对话评测指标,熟悉这个框架会非常有用。
在 DeepEval 中,你可以通过创建对话测试用例来评测LLM对话。一个对话测试用例由一系列轮次组成,这些轮次代表了你的LLM对话内容。
pip install deepeval
from deepeval.test_case import ConversationalTestCase
convo_test_case = ConversationalTestCase(
chatbot_role="You are a happy jolly CS agent",
turns=[
LLMTestCase(input="Hi", actual_output"Hey how can I help?"),
LLMTestCase(input="I just want someone to talk to", actual_output"No problem I'm here to listen!")
]
)
对话轮次是 LLMTestCase
的实例,其中 input
代表用户输入, actual_output
是LLM聊天机器人的响应。还有一个 chatbot_role
参数,仅当你后续想使用角色遵循指标时才需要。
将对话打包成对话测试用例后,剩下的就是导入你想使用的指标并针对测试用例进行测量。以下是一个示例:
from deepeval.metrics import KnowledgeRetentionMetric
...
metric = KnowledgeRetentionMetric(verbose_mode=True)
metric.measure(convo_test_case)
print(metric.score, metric.reason)
不同类型的LLM聊天机器人评测指标
在本节中,我将介绍四种最有用的对话评测指标,用于全面评测对话内容,以及如何通过开源评测框架 DeepEval ,在不到 5 行代码内实现这些指标的应用。
这些指标旨在评测完整的LLM对话过程。若你倾向于采用“最后最佳响应”方法进行对话评测,可参考我撰写的另一篇详尽文章,该文专述LLM评测指标,涵盖所有需了解的LLM评测指标,包括 RAG、LLM智能体乃至微调应用场景,并解释了为何我们采用LLM作为评委来处理所有与LLM评测相关的指标。
(注:DeepEval 还提供了 14 种以上预定义的LLM评测指标及针对最后最佳响应的自定义指标,详情可在此处查看。)
角色遵循
角色遵循度指标评测你的LLM聊天机器人是否能够在整个对话中按照指令行事。它对于角色扮演用例特别有用。该指标的计算方法是逐个遍历每个对话轮次,然后使用LLM结合之前的轮次作为上下文,确定哪些轮次未遵循指定的 chatbot_role 。最终的角色遵循度指标得分,仅是遵循指定聊天机器人角色的对话轮次数除以对话测试案例中的总轮次数。
from deepeval.test_case import ConversationalTestCase, LLMTestCase
from deepeval.metrics import RoleAdherenceMetric
convo_test_case = ConversationalTestCase(
chatbot_role="description of chatbot role goes here",
turns=[
LLMTestCase(
input="user input goes here",
actual_output="LLM chatbot repsonse goes here"
)
]
)
metric = RoleAdherenceMetric(verbose_mode=True)
metric.measure(convo_test_case)
print(metric.score, metric.reason)
对话相关性
之前引入的对话相关性指标用于评测你的LLM聊天机器人是否能在整个对话过程中生成相关回应。该指标通过逐轮循环计算,并采用滑动窗口方法,将最近的 min(0, 当前轮数 — 窗口大小)轮纳入考量以判断其相关性。最终的对话相关性指标得分即为相关回应轮数除以对话测试用例中的总轮数。
与其他指标类似,你只需几行代码即可通过 DeepEval 使用对话相关性指标:
from deepeval.test_case import ConversationalTestCase, LLMTestCase
from deepeval.metrics import ConversationRelevancyMetric
convo_test_case = ConversationalTestCase(
turns=[
LLMTestCase(
input="user input goes here",
actual_output="LLM chatbot repsonse goes here"
)
]
)
metric = ConversationRelevancyMetric(window_size=5, verbose_mode=True)
metric.measure(convo_test_case)
print(metric.score, metric.reason)
知识保留
知识保留指标评测你的LLM聊天机器人是否能在整个对话过程中保留向其呈现的信息。其计算方法是:首先提取对话至特定轮次时已呈现的知识列表,然后判断LLM是否在请求已存在于该轮次响应中的信息。知识保留得分即为无知识流失的轮次数除以总轮次数。
from deepeval.test_case import ConversationalTestCase, LLMTestCase
from deepeval.metrics import KnowledgeRetentionMetric
convo_test_case = ConversationalTestCase(
turns=[
LLMTestCase(
input="user input goes here",
actual_output="LLM chatbot repsonse goes here"
)
]
)
metric = KnowledgeRetentionMetric(verbose_mode=True)
metric.measure(convo_test_case)
print(metric.score, metric.reason)
对话完整性
对话完整性指标评测你的LLM聊天机器人是否能在整个对话过程中满足用户请求。这一指标之所以有用,是因为对话完整性可作为衡量用户满意度和聊天机器人有效性的替代指标。其计算方法是先使用LLM提取对话轮次中发现的用户高层意图列表,再通过相同的LLM判断每个意图是否在对话过程中得到满足和/或实现。
from deepeval.test_case import ConversationalTestCase, LLMTestCase
from deepeval.metrics import ConversationCompletenessMetric
convo_test_case = ConversationalTestCase(
turns=[
LLMTestCase(
input="user input goes here",
actual_output="LLM chatbot repsonse goes here"
)
]
)
metric = ConversationCompletenessMetric(verbose_mode=True)
metric.measure(convo_test_case)
print(metric.score, metric.reason)
使用 DeepEval 与 Confident AI 对LLM聊天机器人进行回归测试
DeepEval 是一个LLM评测框架,而 Confident AI 则是基于 DeepEval 驱动的LLM评测平台。使用 Confident AI 是可选的,但它确实提供了在云端运行 DeepEval 指标的能力,并生成测试报告,帮助你识别多次评测间的LLM回归问题。
可选通过 CLI 使用 DeepEval 登录:
deepeval login
并使用我们上面讨论的相同架构运行评测,以回归测试你的LLM聊天机器人:
from deepeval import evaluate
from deepeval.test_case import ConversationalTestCase, LLMTestCase
from deepeval.metrics import ConversationRelevancyMetric
convo_test_case = ConversationalTestCase(
turns=[
LLMTestCase(
input="user input goes here",
actual_output="LLM chatbot repsonse goes here"
)
]
)
metric = ConversationRelevancyMetric()
evaluate(test_cases=[convo_test_case], metrics=[metric])
运行评测函数后,你将在本地访问结果;若使用 Confident AI,系统将生成一份简洁的测试报告,便于你对比测试结果。
回归测试 LLM 聊天机器人在 Confident AI
结论
希望阅读过程轻松愉快,既然你已至此,意味着你已掌握评测LLM聊天机器人所需的一切知识,以防范破坏性变更或为对话代理识别改进领域。本文中,我们学习了评测LLM对话的方法、可采用的不同技术、需关注的指标,以及如何在 DeepEval 中实施这些评测。