链接:https://docs.ragas.io/en/stable/

改进AI应用获得的一些经验

引言

我们已经发布了AI应用。用户正在使用它。响应没有崩溃,但也不够理想。反馈模糊,满意度评分平庸,每次调整提示词或更换模型都像在黑暗中摸索。

我们尝试不同的工作流程,追逐边缘案例,但仍无法判断是否真正改进。最终,我们停止追踪,开始猜测,然后草率上线。

其实不必如此。读完本文,我们将获得清晰的指南,通过系统化的评估(evals)从零搭建到自动化评估闭环,让AI应用超越用户预期。

这些洞见源于我们在多家企业和初创公司改进LLM应用的经验,以及构建Ragas平台的实践

改进AI应用不是艺术,而是科学。

设定明确指标、构建真实测试集、收集人工反馈、用自动化LLM评估扩展规模。

本指南涵盖从测试数据创建到分析错误、整合用户反馈的全流程,让我们停止猜测,开启系统化改进。


什么是评估?

评估衡量AI系统达成目标的有效性。

AI应用中的评估常与"可观测性"或"安全护栏"混淆。评估的核心是通过明确目标量化系统表现,包含三个关键步骤:

  1. 构建真实测试集:收集或生成系统预期的输入
  2. 明确定义成功:具体说明"优秀"结果的标准及其合理性
  3. 选择精准指标:量化每个结果(通过/失败、分数、排序)

另一个常见误区是将评估与基准测试混为一谈。LLM基准测试侧重用学术指标在公开数据集评估不同模型,而这些数据或指标通常与我们的系统任务无关。

这就是为什么公开基准无法帮助我们评估和改进具体系统


为什么AI工程师需要关注评估?

科学实验是系统化改进AI应用的唯一可靠方法。可能有人问:为什么不快速浏览响应直接部署变更?

评估优于主观检查的三大原因

  1. 规模:人工无法检查数百个边缘案例。现实输入复杂多变,模型失败的方式微妙难察
  2. 客观性:直觉判断因人而异。评估将主观印象转化为可重复的量化指标
  3. 沟通:"感觉更好"无法对齐团队认知。评估提供具体数据:“新提示词使任务完成率从50%提升至70%”

评估不仅是良好实践,更是关键基础设施


如何开始?

在这里插入图片描述

在LLM系统中,迭代快但效果评估慢。与传统机器学习不同,AI应用开发常涉及提示词修改、工具调整或路由逻辑变更——这些变更只需几分钟实现,但评估影响却耗时更久,因为需要人工检查样本响应。

实际上,评估可能占团队迭代时间的30%,特别是涉及多边缘案例测试时。GitHub Copilot、Casetext和Notion等团队的工作流程也印证了评估的重要性。

启动步骤

  1. 端到端评估:类似集成测试,验证完整流程是否产出用户关心的结果
  2. 组件级评估:类似单元测试,调试检索器、重排序器等独立模块

建议从端到端评估开始,确认输出质量后再深入关键组件。


数据集构建

认真改进AI系统的第一步:构建优质测试数据集。

预生产阶段
尚无用户?从编写10-30个代表预期场景的输入开始,关注意图多样性而非数量。初始数据集可通过合成数据生成管道扩展变体。

生产阶段
已有用户?采样30-50个真实系统输入,手动审查质量、多样性和边缘案例。进阶技巧:

  1. 从生产环境采样1000+系统输入
  2. 使用嵌入模型编码输入
  3. 通过KNN或DBSCAN聚类
  4. 从每个簇中采样典型样本加入测试集

关键原则:小步快跑,保持真实,逐步扩展,避免陷入完美主义陷阱。


高质量合成数据生成技巧

当真实数据不足时,可用LLM生成合成数据。以医疗AI助手为例:

# 定义用户画像
personas = [
    "刚开启研究之旅的博士生,需要文献综述和假设形成帮助",
    "寻求跨论文综合分析的资深学者",
    "处理罕见病例的肿瘤科医生"
]

# 生成提示模板
prompt_template = """
你正在构建医疗AI助手的测试数据集。
请根据以下要素生成用户查询:
- 用户画像:{persona}
- 查询复杂度:{complexity}
- 主题:{topic}

要求:
* 生成该画像用户可能提出的真实查询
* 体现指定复杂度并紧扣主题
* 仅输出查询,不要解释或元数据
"""

我们最初用电子表格管理数据集,后迁移至Notion数据库,因其提供更好的UX和API支持。


人工审核与标注

这是多数团队犯错的关键环节。低估人工审核的重要性,高估其实现难度。

核心原则:若要让AI系统符合人类预期,必须先明确定义这些预期

操作步骤

  1. 定义评估维度:如RAG系统关注响应正确性和引用准确性
  2. 选择指标类型
    • 二元指标(通过/失败):适用于明确界限的场景
    • 数值指标(0-1):适用于需区分程度的场景
    • 排序指标:适用于主观性强的输出比较
      在这里插入图片描述
      a simple annotation UI for a RAG use-case

关键技巧

  • 开发定制审核UI(如图形化标注工具)
  • 收集"失败原因"等解释性数据,用于训练LLM评估器

用LLM评估器扩展规模

在这里插入图片描述
An llm as judge with 66.6% agreement

当人工审核成为瓶颈时,引入LLM作为自动评估器

def 评估响应(输入, 响应):
    # 检索相似标注样本
    嵌入 = 嵌入模型.编码(f"{输入} - {响应}")
    样本 = 相似性检索(嵌入, 标注索引)
    
    # 构建小样本提示
    提示 = f"""
    检查响应是否相关。输出:通过/失败。
    
    ### 示例
    {样本}
    
    ### 输入
    {输入}
    
    ### 响应
    {响应}
    """
    
    return LLM.生成(提示)

优化方向:

  1. 小样本提示配合高质量示例
  2. 检索增强提示:自动获取相关标注样本
  3. 使用Spearman等级相关或Cohen’s kappa评估人机一致性

当LLM评估器与人工判断的一致性达80%以上时,可大幅提升迭代效率。


错误分析与实验

评估揭示系统缺陷,错误分析定位根本原因。

错误分类流程

  1. 提出假设:逐条检查失败样本,记录可能原因
  2. 聚类归因:用LLM自动归类(如"检索失败"、"文档付费墙"等)
  3. 优先级排序:按频率解决最高发问题

在这里插入图片描述

实验方法论:

  1. 单变量变更:每次只修改一个组件(如提示词或检索器)
  2. AB测试:并行运行新旧版本,比较核心指标
  3. 决策框架:当指标提升显著时部署,否则尝试其他方案

机器学习反馈闭环

在这里插入图片描述

AI问题的长尾性要求持续学习生产环境中的新边缘案例:

信号捕获管道

  • 显式反馈:用户评分、差评
  • 隐式信号:用户未复制输出、重复尝试相同输入

闭环流程

  1. 识别真实失败案例 → 加入测试集
  2. 针对性实验改进 → 验证指标提升
  3. 部署优化版本 → 监控新边缘案例

在这里插入图片描述


结语

卓越的AI产品源于对评估、实验和持续改进的深度投入。在Ragas,我们正将所有这些经验转化为下一代评估基础设施。如果各位正在探索系统化改进AI应用的方法,欢迎学习。


Ragas 框架

Ragas 是一个开源框架,旨在帮助开发者*评估改进*基于检索增强生成(RAG)的AI应用

通过将各类自动化测试(指标)应用于结构化交互数据(评估样本与数据集)来量化AI性能。

Ragas 还能通过测试集生成组件自动生成多样化测试数据,并通过核心评估协调器管理全流程。所有功能均基于LLM与嵌入模型的核心AI能力实现,并通过精确的提示词引导。


架构

在这里插入图片描述


核心章节

  1. LLM与嵌入模型

    • 大语言模型与向量嵌入技术的基础原理
    • 模型选择与性能优化策略
  2. 提示词工程

    • 评估提示词的设计规范
    • 动态提示模板与上下文注入
  3. 评估样本与数据集

    • 数据采集与清洗流程
    • 多维度数据标注标准
  4. 评估指标体系

    • 准确性/相关性/多样性等核心指标
    • 自定义指标开发指南
  5. 评估协调器

    • 分布式任务调度架构
    • 实验版本控制与结果溯源
  6. 测试集生成组件

    • 合成数据生成算法
    • 边缘案例模拟与压力测试

说明

  1. 架构特性:采用模块化设计,各组件通过标准接口通信,支持第三方工具无缝集成
  2. 性能优化:内置异步处理管道单节点可并行处理 500+ 评估任务
  3. 可视化支持:集成 Jupyter Notebook 插件,支持实时监控评估指标热力图
  4. 扩展能力:提供 Python SDKREST API 两种集成方式,适配云原生环境
🎢Python SDK vs REST API
  • Python SDK 是封装好的工具包,直接调用现成函数即可使用,适合快速开发
  • REST API 是标准化接口,需手动发送HTTP请求并处理返回数据,灵活性更高但代码量稍多。

OpenCV 是用于图像处理的库

OpenGL 是用于图形渲染的 API

两者可以结合使用(比如用 OpenCV 处理图像后通过 OpenGL 显示或进一步渲染)。


第一章:大语言模型与向量嵌入

欢迎来到 Ragas

本章我们将解析两大核心概念——大语言模型(LLMs)向量嵌入(Embeddings),它们是理解AI语言系统工作原理及Ragas评估机制的关键。

假设我们正在构建智能聊天机器人,用于回答类似"《泰坦尼克号》主角是谁?"的问题。如何判断机器人给出的答案是否准确、有用且符合逻辑?这正是 Ragas 的价值所在

Ragas 作为评估工具,帮助量化基于语言的AI系统表现。

要实现这一点,Ragas 自身需要具备理解语言的能力,这便依赖于LLMs 和 Embeddings。它们如同AI语言系统的"大脑"与"翻译器",构成评估体系的基石。


什么是大语言模型(LLMs)?

LLMs 如同博览群书的智能机器人,通过海量文本(书籍、文章、网页等)训练,掌握理解、生成和总结人类语言的复杂能力。

在 Ragas 中,LLMs 承担双重角色:

  1. 被评估系统:我们构建的聊天机器人或AI应用(通常由 GPT-4o、Claude 或 Gemini 等LLM驱动)。Ragas 评估该LLM的表现质量。
  2. AI裁判:Ragas 内部使用高性能LLM作为评估助手。这些"裁判"LLM负责判断响应质量,例如:“该回答是否准确解答问题?” 或 “信息是否源于可靠数据源?”

无论是生成答案还是评估质量,LLMs 都承担着理解与生成类人文本的核心任务。


什么是向量嵌入(Embeddings)?

如果说 LLMs 是理解语言的"大脑",Embeddings 则是将语言转化为计算机可处理形式的"翻译器"。

计算机擅长处理数字,却无法直接理解文字含义。

嵌入模型将文本(单词、句子或段落)转换为数值向量——这些向量构成语义空间的坐标。

例如:"快乐小狗"与"开心幼犬"的向量位置相近,但与"悲伤猫咪"相距甚远~

在 Ragas 中,Embeddings 用于需要衡量文本相似性语义关联的任务。例如评估聊天机器人响应与问题的相关性时,Ragas 将两者转换为向量并计算空间距离,距离越近则语义越相似。


在 Ragas 中配置 LLMs 与 Embeddings

使用 Ragas 需指定其"AI裁判"和"翻译器"的具体模型。Ragas 支持 OpenAI、AWS、Google Cloud 等主流服务商。以下以 OpenAI 为例演示配置流程:

步骤1:安装依赖库

pip install langchain-openai

步骤2:设置API密钥

import os

# 将"your-openai-key"替换为实际密钥(建议通过环境变量读取)
os.environ["OPENAI_API_KEY"] = "your-openai-key"

步骤3:初始化模型

from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

# 初始化LLM(选用gpt-4o作为裁判模型)
evaluator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))

# 初始化Embeddings(选用text-embedding-ada-002)
evaluator_embeddings = LangchainEmbeddingsWrapper(OpenAIEmbeddings(model="text-embedding-ada-002"))

说明:

  • ChatOpenAI 实例化 OpenAI 的 LLM,作为评估决策核心
  • OpenAIEmbeddings 实例化嵌入模型,负责语义向量转换
  • LangchainLLMWrapperLangchainEmbeddingsWrapper 作为适配器,确保不同服务商模型与 Ragas 兼容

原理:Ragas 如何与模型交互

Ragas 通过封装器模式桥接内部评估逻辑与外部模型服务,实现跨平台兼容性。以下为交互流程示意:

在这里插入图片描述

⭕Langchain 封装器

一个简化大模型(如GPT)调用流程的工具,将复杂的技术细节(如API连接、数据处理)打包成易用的接口,让开发者快速集成AI能力到应用中。

类比:像“充电器转换头”一样,让不同型号的充电器(模型)能适配同一插座(应用)。

代码层解析

Ragas 通过抽象基类定义统一接口,具体实现由封装器完成:

LLM 抽象基类(base.py)

# 简化自 ragas/src/ragas/llms/base.py
from abc import ABC, abstractmethod

class BaseRagasLLM(ABC):
    @abstractmethod
    def generate_text(self, prompt, n=1, temperature=1e-8) -> LLMResult: 
        """同步生成文本"""
    
    @abstractmethod
    async def agenerate_text(self, prompt, n=1) -> LLMResult:
        """异步生成文本"""

Langchain 封装器实现

class LangchainLLMWrapper(BaseRagasLLM):
    def __init__(self, langchain_llm):
        self.langchain_llm = langchain_llm  # 如ChatOpenAI实例

    def generate_text(self, prompt, n=1, temperature=None):
        return self.langchain_llm.generate_prompt([prompt], n=n)

同理,Embeddings 抽象类定义向量化接口,封装器将其转发至具体模型服务

该设计使 Ragas 可灵活接入不同服务商,而无需修改核心逻辑。


小结

  • LLMs 作为语言系统的核心,承担内容生成与质量评估双重职责
  • Embeddings 将文本映射至语义空间,实现计算机可处理的语义分析
  • 封装器模式 使 Ragas 兼容多平台模型,保障评估流程的统一性

掌握这些基础后,我们已准备好探索如何通过提示词(Prompts)精确控制模型行为。下一章将深入 提示词工程,揭秘如何通过指令设计优化评估效果。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐