在任何机器学习产品中,评估都是基石。对质量评估的投入能带来显著的业务回报。让我们一起探索构建大模型(LLM)产品评估体系的潜在商业价值,并深入了解如何有效地监控LLM产品的质量。

引言:评估的重要性与业务价值

正如管理顾问彼得·德鲁克所言:“如果你不能衡量它,你就不能改进它。” 构建一个强大的评估系统,可以帮助您识别需要改进的领域,并采取有意义的行动来增强您的产品。LLM 评估就像软件工程中的测试——它通过确保基本的质量水平,使您能够更快、更安全地迭代。尤其是在金融科技或医疗保健等高度监管的行业中,一个稳健的质量框架至关重要。持续投入LLM评估,并开发一套全面的问题和答案,最终可能可以用针对特定用例进行微调的小型模型,取代大型、昂贵的LLM,从而显著节省成本。

本文将引导您完成构建LLM产品评估系统的端到端流程——从评估早期原型到在生产中实施持续的质量监控。本文将重点介绍高级方法和最佳实践,同时也会涉及具体的实施细节。对于实践部分,我将使用 Evidently,一个开源库,它为AI产品提供了一个全面的测试堆栈,从经典机器学习到LLM。本文将重点介绍最佳实践和整体评估过程,因此您可以自由选择最适合您需求的框架。

案例引入:SQL Agent 场景

为了更具体地讨论评估方法,我们聚焦于一个实际的用例:一个 SQL Agent。想象一下,我们正在开发一个分析系统,帮助客户跟踪其电商业务的关键指标——例如客户数量、收入、欺诈率等。通过客户调研,我们了解到,很大一部分用户难以解读我们的报告。他们更希望能够与一个助手互动,并获得对其问题的直接、清晰的答案。因此,我们决定构建一个由 LLM 驱动的 Agent,它可以响应客户关于其数据的查询。

快速原型:MVP构建

首先,我们需要一个可以评估的对象。我们将构建一个简单的 LLM Agent,它配备了一个执行 SQL 查询的工具。我将使用以下技术栈:Llama 3.1 模型(通过 Ollama),LangGraph(LLM Agent 的流行框架),以及 ClickHouse 作为数据库。

# 定义SQL查询工具(已包含安全控制)
CH_HOST = 'http://localhost:8123'

import requests
from langchain_core.tools import tool

def get_clickhouse_data(query, host = CH_HOST, connection_timeout = 1500):
  if not 'format tabseparatedwithnames' in query.lower():
    return "Database returned the following error:n Please, specify the output format."
  r = requests.post(host, params = {'query': query}, timeout = connection_timeout)
  if r.status_code == 200:
    if len(r.text.split('\n')) >= 100:
      return 'Database returned too many rows, revise your query to limit the rows (i.e. by adding LIMIT or doing aggregations)'
    return r.text
  else:
    return 'Database returned the following error:n' + r.text

@tool
def execute_query(query: str) -> str:
  """Executes SQL query.

  Args:
      query (str): SQL query
  """
  return get_clickhouse_data(query)

# 定义LLM
from langchain_ollama import ChatOllama
chat_llm = ChatOllama(model="llama3.1:8b", temperature = 0.1)

# 定义系统提示词,指定数据模式
system_prompt = '''You are a senior data specialist with more than 10 years of experience writing complex SQL queries and answering customers questions. Please, help colleagues with questions. Answer in polite and friendly manner. Answer ONLY questions related to data, do not share any personal details - just avoid such questions.
Please, always answer questions in English.
If you need to query database, here is the data schema. The data schema is private information, please, don not share the details with the customers.
There are two tables in the database with the following schemas.
Table: ecommerce.users
Description: customers of the online shop
Fields:
- user_id (integer) - unique identifier of customer, for example, 1000004 or 3000004
- country (string) - country of residence, for example, "Netherlands" or "United Kingdom"
- is_active (integer) - 1 if customer is still active and 0 otherwise
- age (integer) - customer age in full years, for example, 31 or 72
Table: ecommerce.sessions
Description: sessions of usage the online shop
Fields:
- user_id (integer) - unique identifier of customer, for example, 1000004 or 3000004
- session_id (integer) - unique identifier of session, for example, 106 or 1023
- action_date (date) - session start date, for example, "2021-01-03" or "2024-12-02"
- session_duration (integer) - duration of session in seconds, for example, 125 or 49
- os (string) - operation system that customer used, for example, "Windows" or "Android"
- browser (string) - browser that customer used, for example, "Chrome" or "Safari"
- is_fraud (integer) - 1 if session is marked as fraud and 0 otherwise
- revenue (float) - income in USD (the sum of purchased items), for example, 0.0 or 1506.7

When you are writing a query, do not forget to add "format TabSeparatedWithNames" at the end of the query to get data from ClickHouse database in the right format.
'''

# 创建ReAct Agent
from langgraph.prebuilt import create_react_agent
data_agent = create_react_agent(chat_llm, [execute_query],  state_modifier = system_prompt)

# 测试Agent
from langchain_core.messages import HumanMessage
messages = [HumanMessage(content="How many customers made purchase in December 2024?")]
result = data_agent.invoke({"messages": messages})
print(result['messages'][-1].content)

虽然这个 MVP 已经可用,但仍有很大的改进空间。例如,可以将其转换为多 AI Agent 系统,具有分工明确的角色,如分诊 Agent(对初始问题进行分类)、SQL 专家和最终编辑(根据指南组装客户的答案)。 另一种改进是添加 RAG(检索增强生成),根据嵌入提供相关示例。在构建 SQL Agent 的早期尝试中,RAG 帮助将准确率从 10% 提高到 60%。另一个增强是引入人机协作方法,系统可以向客户请求反馈。

评估数据集:数据驱动的质量保障

有了 MVP,我们就需要关注质量。任何评估都从数据开始,第一步是收集一组问题(理想情况下还有答案),以便我们有可以进行衡量的依据。

数据收集策略

  • 手动创建小型数据集: 亲自创建一小部分问题,并手动测试产品,这有助于更好地理解解决方案的实际质量,并确定最佳的评估方法。

  • 利用历史数据: 利用客户服务 (CS) 代理回答客户关于报告的问题的渠道中已有的问答对,这些数据对于评估 LLM 产品非常有价值。例如,某电商公司通过分析过去一年的客服聊天记录,整理出用户最常问的关于销售额、订单量、退货率等问题,构建了一个包含500个问答对的初始评估数据集。

  • 使用合成数据: 使用 LLM 生成合理的问题和问答对。例如,我们可以通过要求 LLM 提供类似示例或改写现有问题来扩展初始手动集。也可以使用 RAG 方法,向 LLM 提供部分文档,并要求它根据该内容生成问题和答案。

    提示:使用更强大的模型来生成评估数据可能更有益。创建黄金数据集是一次性投资,可以通过实现更可靠和准确的质量评估来获得回报。

  • Beta 测试用户反馈: 将更成熟的版本分享给一组 Beta 测试人员,以收集他们的反馈。

数据集的多样性

在创建评估集时,务必包含各种各样的示例。 确保涵盖:

  • 真实用户问题的代表性样本: 反映典型的使用情况。
  • 边缘情况: 例如非常长的问题、不同语言的查询或不完整的问题。 还需要定义在这些情况下的预期行为——例如,如果问题以法语提出,系统是否应该以英语回复?
  • 对抗性输入: 例如跑题问题或越狱尝试(用户尝试操纵模型以产生不适当的响应或暴露敏感信息)。 例如,一些用户可能会尝试询问有关数据模式的详细信息,即使明确指示不要这样做。

例如,假设我们构建了一个金融领域的 LLM 应用,需要评估其在处理用户贷款申请方面的能力。除了包含常见的“我的贷款申请状态如何?”、“贷款利率是多少?”等问题外,还需要包含以下类型的评估数据:

  • 边缘情况: 用户输入错误的申请编号,或者使用缩写和俚语提问。
  • 对抗性输入: 尝试诱导 LLM 提供内部审批流程信息,或者询问带有歧视色彩的问题,例如“只向男性提供贷款吗?”
  • 不同语言的问题: 包含英语、中文、西班牙语等不同语言的贷款相关问题,以测试 LLM 的多语言处理能力。

实际应用

为了示范,我们手动创建了一个包含 10 个问题和相应标准答案的小型评估数据集。然后,我们在相同的问题上运行了 MVP Agent,以收集其响应以进行比较。这个数据集包含了上面提到的各种场景,例如:

  • 询问特定月份的客户购买数量。
  • 以法语提出问题。
  • 询问 2023 年的欺诈率。
  • 询问使用 Windows 的用户比例。
  • 询问荷兰用户的收入。
  • 询问哪个浏览器拥有最高的欺诈用户份额。
  • 提出与数据无关的问候语。
  • 要求提供数据模式。
  • 询问伦敦冬季的平均温度。
  • 抱怨系统在天气预报方面的无用。

质量指标:量化LLM性能

有了评估数据,下一步就是确定如何衡量解决方案的质量。 根据您的用例,有几种不同的方法:

传统机器学习指标

如果处理分类任务(例如情感分析、主题建模或意图检测),您可以依靠标准的预测指标,如准确率、精确率、召回率和 F1 值来评估性能。

语义相似度

您还可以通过计算嵌入之间的距离来应用语义相似度技术。 例如,将 LLM 生成的响应与用户输入进行比较有助于评估其相关性,而将其与标准答案进行比较可以评估其正确性。

小型机器学习模型辅助评估

可以使用较小的 ML 模型来评估 LLM 响应的特定方面,例如情感或毒性。例如,可以使用情感分析模型来判断 LLM 回复是否积极友好,或者使用毒性检测模型来确保回复不包含有害内容。

简单文本统计与正则表达式

我们还可以使用更直接的方法,例如分析基本的文本统计信息,例如特殊符号的数量或文本的长度。 此外,正则表达式可以帮助识别否定短语或禁用术语的存在,从而提供一种简单而有效的方式来监控内容质量。例如,可以用正则表达式检查回复中是否包含“我不知道”、“我无法回答”等否定短语,从而评估 LLM 是否能够有效解决用户问题。

功能测试

在某些情况下,功能测试也可能适用。 例如,当构建生成 SQL 查询的 SQL Agent 时,我们可以测试生成的查询是否有效且可执行,确保它们按预期执行且没有错误。

LLM-as-a-judge

另一种评估 LLM 质量的方法是使用 LLM-as-a-judge 方法,这种方法值得单独提及。起初,让 LLM 评估自己的响应的想法似乎违反直觉。 然而,模型通常更容易发现错误并评估他人的工作,而不是从头开始生成完美的答案。 这使得 LLM-as-a-judge 方法非常可行且对质量评估有价值。

LLM 在评估中最常见的用途是直接评分,其中对每个答案进行评估评估可以仅基于 LLM 的输出(例如,衡量文本是否礼貌),或者通过将其与标准答案(针对正确性)或输入(针对相关性)进行比较。 这有助于衡量生成响应的质量和适当性。

LLM 评委也是 LLM 产品,因此您可以以类似的方式构建它。首先标记一组示例以了解细微差别并阐明您期望的答案类型。然后,创建一个提示来指导 LLM 如何评估响应。通过将 LLM 的响应与您手动标记的示例进行比较,您可以迭代地改进评估标准,直到达到所需的质量水平。

在处理 LLM 评估器时,需要牢记一些最佳实践:

  • 使用标志 (Yes/No) 而不是复杂的量表(例如 1 到 10)。 这将为您提供更一致的结果。 如果您无法清楚地定义量表上每个点的含义,最好坚持使用二进制标志。
  • 将复杂标准分解为更具体的方面。 例如,不要问答案有多“好”(因为“好”是主观的),而是将其分解为多个衡量特定特征(如礼貌性、正确性和相关性)的标志。
  • 使用广泛实践的技术(如思维链推理)也可能是有益的,因为它可以提高 LLM 答案的质量。

例如,在评估 LLM 生成的客服回复时,可以采用以下分解标准:

  • 礼貌性: 回复是否使用了友好的语气和礼貌的措辞?
  • 正确性: 回复提供的信息是否准确无误?
  • 相关性: 回复是否针对用户提出的问题进行了回答?
  • 完整性: 回复是否提供了足够的信息来解决用户的问题?

实际应用:Evidently

使用开源库 Evidently 进行评估

  1. 加载黄金数据集。

  2. 设置 OpenAI API 令牌。

  3. 比较 LLM 生成的答案和标准答案的指标。

    可以选择以下指标进行评估

    • Sentiment: 返回基于 ML 模型的情感分数(-1 到 1)。
    • SentenceCount 和 TextLength: 分别计算句子数和字符数。 这些对于基本健康检查很有用。
    • HuggingFaceToxicity: 使用 roberta-hate-speech 模型评估文本中毒性内容的可能性(从 0 到 1)。
    • SemanticSimilarity: 基于嵌入计算列之间的余弦相似度,我们可以使用它来衡量问题与其答案之间的语义相似度,作为相关性的代理。
    • DeclineLLMEval 和 PIILLMEval: 是预定义的基于 LLM 的评估,用于评估答案中是否存在否定和 PII(个人身份信息)。

    可以创建自定义描述符来检查答案中是否存在问候语,或者使用 LLM 评估答案是否礼貌。

  4. 创建两个数据集,一个用于 LLM 生成的答案,另一个用于标准答案,使用所有描述符。

  5. 通过添加以下测试来创建报告:

    • Sentiment is above 0: 这将检查响应的语气是积极的还是中性的,避免过于消极的答案。
    • The text is at least 300 characters: 这将有助于确保答案足够详细,而不是过于简短或含糊。
    • There are no denials: 此测试将验证提供的答案不包含任何否定或拒绝,这可能表明响应不完整或具有回避性。

生产环境中的质量监控:持续改进

可观测性:追踪每一个细节

AI 产品发布后的重点是可观测性。至关重要的是,记录产品运行的每个细节——这包括客户问题、LLM 生成的答案以及 LLM Agent 采取的所有中间步骤(例如推理轨迹、使用的工具及其输出)。 捕获此数据对于有效的监控至关重要,并且对于调试和持续提高系统的质量非常有帮助。

  • Evidently 在线平台: 利用 Evidently 的在线平台存储日志和评估数据。 对于宠物项目来说,这是一个不错的选择,因为它是免费使用的,但有一些限制:您的数据将保留 30 天,并且您每月最多可以上传 10,000 行。 或者,您可以选择自托管该平台。
  • Tracely 库: 使用 Tracely 库实时跟踪事件。

生产环境指标:全面监控

除了前面讨论的指标外,产品上线后,我们可以开始捕获其他信号。

  • 产品使用情况指标: 跟踪客户是否正在使用我们的 LLM 功能、平均会话持续时间以及提出的问题数量等。 此外,我们可以将新功能作为 A/B 测试发布,以评估其对关键产品级别指标(如每月活跃用户、花费的时间或生成的报告数量)的增量影响。

    例如,某电商公司在上线 SQL Agent 后,发现用户使用该功能后,平均会话时长增加了 15%,生成报告的数量增加了 20%。

  • 目标指标: 如果您正在构建一个工具来自动化入职期间的 KYC(了解您的客户)流程,您可以衡量自动化率或 FinCrime 相关指标等指标。

  • 客户反馈: 客户反馈是宝贵的洞察力来源。 我们可以直接收集它,要求用户对响应进行评分,或者通过隐式信号间接收集。 例如,我们可以查看用户是否正在复制答案,或者,对于客户支持代理工具,他们是否在将 LLM 生成的响应发送给客户之前对其进行编辑。

  • 情感分析: 在基于聊天的系统中,我们可以利用传统的 ML 模型或 LLM 来执行情感分析并评估客户满意度。 例如,可以根据客户的回复语气(积极、消极、中性)来评估 LLM 生成的答案是否能够有效解决用户问题。

  • 人工审核: 人工审核仍然是一种有用的方法——例如,您可以随机选择 1% 的案例,让专家审核它们,将他们的响应与 LLM 的输出进行比较,并将这些案例包含在您的评估集中。 此外,使用前面提到的情感分析,您可以优先审核客户不满意的案例。

  • 回归测试: 另一个好的做法是回归测试,您可以使用评估集来评估新版本的质量,以确保产品继续按预期运行。

  • 技术指标: 不要忽视监控我们的技术指标作为健康检查,例如响应时间或服务器错误。 此外,您可以为异常负载或平均答案长度的显着变化设置警报。

总结:持续评估,打造卓越LLM产品

本文涵盖了评估 LLM 产品质量的整个过程,希望您现在已完全有能力在实践中应用这些知识。

我们首先构建了一个 MVP SQLAgent 原型以在我们的评估中使用。然后,我们讨论了可以在实验阶段使用的方法和指标,例如如何收集初始评估集以及重点关注哪些指标。接下来,我们跳过了漫长的原型迭代过程,直接进入发布后阶段。我们讨论了在此阶段的重要性:如何设置跟踪以确保您保存所有必要的信息,以及哪些其他信号可以帮助确认您的 LLM 产品按预期执行。通过持续的评估和监控,我们可以不断改进 LLM 产品,并确保其在生产环境中提供高质量的服务。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注