用 LangSmith 理解 RAG 量化评估:从 DocResearch 到面试回答

0 阅读5分钟

用 LangSmith 理解 RAG 量化评估:从 DocResearch 到面试回答

你已经能解释“检索、重排、补查、生成”怎么运行,接下来还要回答一个问题:加了这些步骤,答案真的更好了吗?

LangSmith 的价值不是给技术栈再加一个名字,而是帮助你用同一组问题重复比较,并找到效果变差的具体原因。

本文结合学习仓库的 2e6d82a 提交和 DocResearch 的真实结构讲解。学习仓库已编写 LangSmith + OpenEvals 评估示例;本文为 DocResearch 定义评估方案,没有给本项目接入 SDK、执行新实验或产生质量提升数据。下面的资料、评分示意和实验分组均用于理解方法,不是实测结论。

1. 先把“离线”这个容易误解的词说清楚

离线评估不等于断网,也不等于使用本地模型。

它指的是:准备一组固定问题,在实验中批量运行系统并打分,不依赖正在发生的真实用户请求。过程中完全可以调用云端生成模型、评委模型,并把实验记录上传到 LangSmith。

在线评估则面向实际使用中的请求,例如抽取用户当天的问答评分,观察质量是否下降。两者都可以用 LangSmith;区别是评估对象和触发方式,不是有没有网络。

本文说“固定测试集评估”,就是前一种。简历也使用这个更直白的说法。

2. 用一道题看懂:为什么一个分数不够

假设用户问:

对已经使用 PostgreSQL 的小团队,pgvector 和 Milvus 的部署维护有什么区别?能否确定哪一个每月便宜 30%?

为便于演示,假设资料只包含:

  • 片段 A:pgvector 是 PostgreSQL 扩展,可沿用已有数据库的部分管理流程。

  • 片段 B:Milvus 是独立的向量数据库服务,需要按部署方式管理相应服务组件。

  • 两份资料都没有相同负载下的费用测试。

这是教学设定,不是对具体部署成本的测量。理想回答应当比较部署方式,同时说明:缺少规模、负载、资源配置和费用数据,不能确认“便宜 30%”。

| 发生了什么 | 问题出在哪里 | 该看什么 |

| --- | --- | --- |

| 只找回一篇 PostgreSQL SQL 语法教程 | 没找到回答问题需要的资料 | 检索相关性、带人工标签的召回指标 |

| 找回 A、B,却说“pgvector 每月便宜 30%” | 答案添加了资料没有支持的结论 | 回答忠实度 |

| 找回 A、B,答案只说“两者都是数据库” | 没明显编造,但没有完成比较 | 回答帮助性 |

| 比较部署方式,并明确费用信息不足 | 回答了能回答的部分,也保留了缺口 | 三项指标共同观察,再人工复核 |

所以,“程序没报错”“引用 ID 合法”“评委给了高分”是三件不同的事,也都不能单独证明答案正确。

3. 你最新的学习代码究竟做了什么

把代码里的名字翻译成一次考试:

| 名称 | 白话含义 | 学习代码中的对应内容 |

| --- | --- | --- |

| Dataset | 一套试题 | rag_eval_v1,定义了 12 条问题及参考答案 |

| Example | 其中一道题 | inputs.question 与参考 outputs.answer |

| Target | 接受考试的程序 | runRagAgent(inputs),内部调用 RAG 的 ask() |

| Target outputs | 程序这次交的答案 | { answer, context },context 是检索段落文本数组 |

| Evaluator | 按规则评分的函数 | 三个 OpenEvals createLLMAsJudge 评估器 |

| Experiment | 某套配置完成整套题的记录 | evaluate(...) 指定数据集、评估器和实验名前缀 |


Dataset 中取一道 question

|

v

Target: Milvus 检索 -> 生成回答

|

v

outputs: answer + context

|

+--> 检索相关性评委

+--> 回答忠实度评委

+--> 回答帮助性评委

|

v

实验记录:本题输出、各项评分与评语

学习示例中,Milvus 检索取 k=4,LangGraph 编排 retrieve -> generate;evaluate 的 maxConcurrency=2 控制评估样例的并发数。它不是 DocResearch 的子 Agent 并发限制,两者不要混讲。

最容易说错的地方:数据集有参考答案,不代表评委真的使用了参考答案。

当前三个 evaluator 没有接收 referenceOutputs。其中的 outputs.answer 是 Target 当次生成的答案,不是 Dataset 保存的标准答案。是否做“答案与参考答案比较”,取决于评估函数实际拿了哪些参数,而不是数据集有没有那个字段。

这些代码说明你已经编写评估练习。提交里没有实验链接、分数导出或运行日志,因此本文不把“定义了 12 条样例”写成“已成功上传并完成 12 题实验”。

4. 三个指标分别看哪两样东西

4.1 检索相关性:问题与找回的资料是否有关

输入是 question + context。

例如,问题在问部署维护,找回的段落却全是 SQL 函数用法,即使都出现 PostgreSQL,也不算很好地服务这个问题。

学习代码使用 RAG_RETRIEVAL_RELEVANCE_PROMPT,将问题放入 inputs,将检索文本放入 context.documents。

它不自动等于 Recall@K。评委只能评价“送给它的片段是否相关”,不知道资料库里还有多少相关片段没有找回来。要测遗漏多少,必须另外标注应命中的证据集合。

4.2 回答忠实度:答案是否有给定资料支持

输入是 answer + context。

如果 A、B 都没有费用数据,答案却给出“便宜 30%”,忠实度应当受到质疑。即使引用的是存在的 Source ID,也不能替这个数字提供依据。