用 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,也不能替这个数字提供依据。