Agent 评估与可观测性:LangSmith 与客服 A/B 测试
从评估指标 、LangSmith 轨迹 到提示词 A/B 对比,把「能跑」的 Agent 推进到「可度量、可复现、可迭代」;实战以电商客服双版 system prompt 为例。
阅读建议 :先读第一节指标表,弄清要量什么;第二节打开 LangSmith 看一次完整 trace;第三、四节按「测试集 → 双 Agent → 评估」顺序对照代码。LANGCHAIN_API_KEY 等凭证用环境变量配置。
目录
- 评估指标体系
- [可观测性:LangSmith 快速集成](#可观测性:LangSmith 快速集成 "#heading-4")
- [提示词版本管理与 A/B 测试](#提示词版本管理与 A/B 测试 "#heading-7")
- [实战:客服 Agent A/B 测试平台](#实战:客服 Agent A/B 测试平台 "#heading-10")
- 自测清单
1. 评估指标体系
智能体评估不同于传统模型评估,需要从多个维度衡量:
| 指标类别 | 具体指标 | 含义 |
|---|---|---|
| 任务成功率 | 最终目标达成率 | 用户问题是否得到正确解答(人工或 LLM-as-Judge) |
| 效率 | 步骤数、工具调用次数、Token 消耗 | 是否走了弯路 |
| 准确性 | 工具选择准确率、参数提取准确率 | 是否调用正确工具、参数是否正确 |
| 鲁棒性 | 异常处理率、重试次数 | 遇到错误能否恢复 |
| 用户满意度 | 答案相关性、友好度 | 主观反馈或语义相似度 |
评估方法
- 自动化评估(推荐):LLM-as-Judge 对输出打分,或与标准答案做语义/规则比对。
- 人工评估:小规模测试集人工标注。
- 混合评估:自动化筛出明显正确/错误,其余人工复核。
2. 可观测性:LangSmith 快速集成
LangSmith 是 LangChain 生态的调试、评估与监控平台,可记录每一步:输入、模型调用、工具调用、输出。
阅读提示 :开启 tracing 后,现有 LangChain / LangGraph 调用会自动上报,无需改业务逻辑。
2.1 开启追踪
python
import os
# 运行前在环境中配置 LANGCHAIN_API_KEY
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "customer_service_agent"
# 此后 LangChain / LangGraph 调用会自动写入该项目
在 LangSmith 控制台可查看:每次 LLM 的输入输出、工具参数与结果、耗时与 Token、以及人工或自动 feedback 评分。
2.2 用 LangSmith 跑自动化评估
python
from langsmith.evaluation import evaluate
from langsmith.schemas import Run, Example
def check_answer_correctness(run: Run, example: Example):
actual = run.outputs.get("output", "")
expected = example.outputs["expected_answer"]
# 生产环境可改为 LLM 判语义等价
return {"score": 1 if expected in actual else 0}
test_examples = [
{"inputs": {"question": "如何退货?"}, "outputs": {"expected_answer": "7天无理由"}},
]
results = evaluate(
lambda input: agent_executor.invoke({"input": input["question"]}),
data=test_examples,
evaluators=[check_answer_correctness],
experiment_prefix="ab_test_prompt_v1",
)
易混点 :evaluate 的 data 可以是内存列表,也可以是 LangSmith 上已创建的数据集;实验名 experiment_prefix 便于在控制台对比多次运行。
3. 提示词版本管理与 A/B 测试
生产环境常需并行试验多套 system prompt 或工具配置,要求可复现、可对比。
3.1 Prompt Hub 管理版本
python
from langsmith import Client
client = Client()
client.create_prompt(
"customer_service_v1",
input_variables=["question"],
template="你是一个客服... 问题:{question}",
)
prompt = client.pull_prompt("customer_service_v1")
formatted = prompt.format(question="如何退货?")
3.2 A/B 对比骨架
- 定义两个 Agent 配置(不同 prompt 或工具集)。
- 用同一测试集分别跑完。
- 在 LangSmith 中对比成功率、成本、单条轨迹。
python
import os
import pandas as pd
from langsmith import Client
client = Client()
def run_agent(agent_func, test_questions):
rows = []
for q in test_questions:
output = agent_func(q)
rows.append({"question": q, "output": output})
return pd.DataFrame(rows)
# agent_v1 / agent_v2 为两套 invoke 封装
df_v1 = run_agent(agent_v1, test_questions)
df_v2 = run_agent(agent_v2, test_questions)
client.create_experiment("prompt_v1", results=df_v1)
client.create_experiment("prompt_v2", results=df_v2)
在 LangSmith 界面查看两实验的准确率、Token 与失败样例。
4. 实战:客服 Agent A/B 测试平台
4.1 场景与两套提示词
场景:电商客服,回答退换货、物流、优惠券等问题;对比两套 system prompt。
V1(简洁)
text
你是客服助手,回答用户问题,如果不知道就说不知道。
V2(带步骤)
text
你是客服助手。首先确认用户问题类别(退货/物流/优惠券),然后根据知识库回答。
若知识库无答案,引导用户联系人工。
评估维度
| 维度 | 说明 |
|---|---|
| 正确率 | 输出是否包含标注中的关键信息 |
| 步数 | 平均工具调用次数(越少越好) |
| 拒绝率 | 是否合理转人工或明确「不知道」 |
4.2 准备测试集
python
test_set = [
{
"question": "我买的衣服不合适,能退吗?",
"expected_keywords": ["7天", "无理由", "不影响二次销售"],
},
{
"question": "快递显示签收但我没收到",
"expected_keywords": ["联系物流", "投诉", "查询"],
},
]
可按业务扩充到 20~30 条,并写入 LangSmith Dataset。
4.3 构建双版本 Agent
python
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.prompts import ChatPromptTemplate
# llm、tools 由你方 Week3 检索 + 工具链提供
def create_agent(system_prompt_template: str):
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt_template),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_openai_tools_agent(llm, tools, prompt)
return AgentExecutor(agent=agent, tools=tools, verbose=False)
agent_v1 = create_agent(V1_PROMPT)
agent_v2 = create_agent(V2_PROMPT)
4.4 在 LangSmith 中评估
python
from langsmith import Client
from langsmith.evaluation import evaluate, LangChainStringEvaluator
client = Client()
dataset = client.create_dataset("客服测试集_v1")
for item in test_set:
client.create_example(
inputs={"question": item["question"]},
outputs={"expected": item["expected_keywords"]},
dataset_id=dataset.id,
)
def target(inputs):
return agent_v2.invoke({"input": inputs["question"]})
evaluators = [
LangChainStringEvaluator("criteria", config={"criteria": "correctness"}),
]
results = evaluate(
target,
data=dataset,
evaluators=evaluators,
experiment_prefix="客服AB测试_V2",
metadata={"prompt_version": "v2"},
)
控制台可对比 V1 / V2 实验的准确率、单条 trace 与 Token。
4.5 本地简易评估(不依赖 LangSmith)
python
def evaluate_local(agent_executor, test_set):
correct = 0
details = []
for item in test_set:
output = agent_executor.invoke({"input": item["question"]})["output"]
score = all(kw in output for kw in item["expected_keywords"])
correct += int(score)
details.append({
"question": item["question"],
"output": output,
"score": bool(score),
})
accuracy = correct / len(test_set) if test_set else 0.0
return accuracy, details
acc_v1, _ = evaluate_local(agent_v1, test_set)
acc_v2, _ = evaluate_local(agent_v2, test_set)
print(f"V1 准确率: {acc_v1:.2%}, V2 准确率: {acc_v2:.2%}")
关键词命中适合快速回归;上线前建议叠加 LLM-as-Judge 或人工抽检。
5. 自测清单
| 编号 | 通过标准 |
|---|---|
| T1 | 配置 LANGCHAIN_TRACING_V2 后,LangSmith 中能看到一次完整 Agent 运行 trace |
| T2 | 同一 test_set 上 V1、V2 各跑一遍,本地 evaluate_local 能输出两个准确率 |
| T3 | 至少一条样例在 LangSmith 中可打开轨迹,核对工具调用顺序是否合理 |
| T4 | 测试集含「应转人工」类问题,V2 的拒绝/转人工表现符合 prompt 设计 |