work hard work smart

专注于AI+Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LangSmith 批量评估完全指南

Posted on 2026-06-25 15:52  work hard work smart  阅读(3)  评论(0)    收藏  举报

LangSmith 批量评估完全指南

什么是 LangSmith 批量评估?

LangSmith 批量评估是 LangChain 生态系统的核心功能,用于自动化、规模化地测试和评估 LLM 应用的性能

核心概念

将多个测试用例组织成数据集,自动化运行测试,并使用预定义的评估器对结果进行多维度打分。

测试数据集(Dataset)
    ↓
自动化运行(Test Function)
    ↓
多维度评估(Evaluators)
    ↓
结果可视化(Dashboard)

工作流程

  1. 创建测试数据集:定义输入和期望输出
  2. 编写测试函数:调用 Agent/LLM 处理输入
  3. 定义评估器:自定义或使用内置评估标准
  4. 运行批量评估:自动化执行所有测试
  5. 分析结果:在 Web 界面查看评分和对比

为什么使用 LangSmith 批量评估?

解决 LLM 评估的核心痛点

传统方式的问题:

  • ❌ 手动测试效率低,无法规模化
  • ❌ 主观评估标准不一致
  • ❌ 难以追踪历史性能变化
  • ❌ 缺少可视化和对比工具

LangSmith 的优势:

  • ✅ 自动化运行数百个测试用例
  • ✅ 标准化评估流程
  • ✅ 完整的历史记录和版本对比
  • ✅ 可视化 Dashboard
  • ✅ 支持 CI/CD 集成

其它框架对比

框架 批量评估 可视化 自定义评估器 数据集管理 价格
LangSmith ✅ Web UI 付费(有免费额度)
DeepEval ⚠️ 开源免费
Ragas ⚠️ ⚠️ 开源免费
LangFuse ⚠️ ⚠️ ⚠️ 开源+付费

选择建议:

  • 🎯 生产环境 + 团队协作 → LangSmith
  • 🎯 开源优先 → DeepEval / LangFuse
  • 🎯 RAG 专项评估 → Ragas

完整实战示例

场景:智能客服助手评估

假设我们有一个电商客服助手,需要评估其回答质量。

步骤 1:安装和配置

pip install langsmith langchain-openai

配置环境变量:

# Windows PowerShell
$env:LANGSMITH_API_KEY="your-api-key"
$env:LANGCHAIN_TRACING_V2="true"
$env:OPENAI_API_KEY="your-openai-key"

步骤 2:定义应用

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# 定义客服助手
llm = ChatOpenAI(model="gpt-3.5-turbo")

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个电商客服助手,专业、友好地回答用户问题。"),
    ("user", "{question}")
])

chain = prompt | llm

def customer_service_agent(question: str) -> str:
    """客服助手函数"""
    response = chain.invoke({"question": question})
    return response.content

步骤 3:创建测试数据集

from langsmith import Client

client = Client()

# 创建数据集
dataset_name = "customer-service-test"

client.create_dataset(
    dataset_name=dataset_name,
    description="电商客服助手测试数据集"
)

# 定义测试用例
test_cases = [
    {
        "inputs": {"question": "我的订单什么时候能到?"},
        "outputs": {
            "expected_topics": ["物流", "订单"],
            "tone": "professional"
        }
    },
    {
        "inputs": {"question": "这个商品支持退货吗?"},
        "outputs": {
            "expected_topics": ["退货", "售后"],
            "tone": "professional"
        }
    },
    {
        "inputs": {"question": "你们有什么优惠活动?"},
        "outputs": {
            "expected_topics": ["优惠", "活动"],
            "tone": "friendly"
        }
    },
    {
        "inputs": {"question": "商品质量有问题,我要投诉!"},
        "outputs": {
            "expected_topics": ["投诉", "质量"],
            "tone": "empathetic"
        }
    }
]

# 添加测试用例
for case in test_cases:
    client.create_example(
        inputs=case["inputs"],
        outputs=case["outputs"],
        dataset_name=dataset_name
    )

print(f"✓ 测试数据集创建完成: {dataset_name}")

步骤 4:编写测试函数

from langsmith.schemas import Example

def test_function(example: Example) -> dict:
    """测试函数:运行客服助手并返回结果"""
    question = example.inputs["question"]
    
    # 调用客服助手
    response = customer_service_agent(question)
    
    return {
        "response": response,
        "question": question
    }

步骤 5:定义自定义评估器

from langsmith import RunEvaluator
from langsmith.schemas import Run, Example
from typing import Dict, Any

class TopicCoverageEvaluator(RunEvaluator):
    """评估回答是否覆盖期望话题"""
    
    def evaluate_run(self, run: Run, example: Example, **kwargs) -> Dict[str, Any]:
        response = run.outputs.get("response", "").lower()
        expected_topics = example.outputs.get("expected_topics", [])
        
        # 检查话题覆盖
        found_topics = [
            topic for topic in expected_topics 
            if topic in response
        ]
        
        coverage = len(found_topics) / len(expected_topics) if expected_topics else 0
        
        return {
            "key": "topic_coverage",
            "score": coverage,
            "comment": f"覆盖 {len(found_topics)}/{len(expected_topics)} 个话题: {found_topics}"
        }


class ToneEvaluator(RunEvaluator):
    """评估回答语气是否合适"""
    
    def evaluate_run(self, run: Run, example: Example, **kwargs) -> Dict[str, Any]:
        response = run.outputs.get("response", "")
        expected_tone = example.outputs.get("tone", "")
        
        # 简单语气检测(实际应使用更复杂的 NLP 方法)
        tone_indicators = {
            "professional": ["请", "您", "感谢", "抱歉"],
            "friendly": ["亲", "您好", "😊", "欢迎"],
            "empathetic": ["理解", "抱歉", "立即", "帮助"]
        }
        
        indicators = tone_indicators.get(expected_tone, [])
        found = sum(1 for word in indicators if word in response)
        
        score = min(1.0, found / 2) if indicators else 0
        
        return {
            "key": "tone_match",
            "score": score,
            "comment": f"期望语气: {expected_tone}, 找到 {found} 个指标词"
        }

步骤 6:运行批量评估

from langsmith.evaluation import evaluate
from datetime import datetime

# 配置评估器
evaluators = [
    TopicCoverageEvaluator(),
    ToneEvaluator()
]

# 运行评估
experiment_name = f"cs-eval-{datetime.now().strftime('%Y%m%d-%H%M%S')}"

results = evaluate(
    test_function,
    data=dataset_name,
    evaluators=evaluators,
    experiment_prefix=experiment_name,
    max_concurrency=2
)

print(f"✓ 评估完成: {experiment_name}")
print(f"查看结果: https://smith.langchain.com")

步骤 7:查看结果

访问 https://smith.langchain.com

  1. 进入 Experiments 查看评估结果
  2. 点击实验名称查看详细信息
  3. 查看每个测试用例的得分和评估反馈

高级用法

使用内置评估器

from langsmith.evaluation.evaluators import (
    answer_relevance_evaluator,
    hallucination_evaluator
)

results = evaluate(
    test_function,
    data=dataset_name,
    evaluators=[
        answer_relevance_evaluator,
        hallucination_evaluator
    ]
)

并发执行

results = evaluate(
    test_function,
    data=dataset_name,
    evaluators=evaluators,
    max_concurrency=5  # 根据 API 限流调整
)

实验对比

# 运行多个实验
results_v1 = evaluate(test_function_v1, data=dataset_name, evaluators=evaluators)
results_v2 = evaluate(test_function_v2, data=dataset_name, evaluators=evaluators)

# 在 Web 界面中对比两个实验

从文件加载测试数据

import json

# 从 JSON 文件加载
with open("test_cases.json", "r", encoding="utf-8") as f:
    test_cases = json.load(f)

for case in test_cases:
    client.create_example(
        inputs=case["inputs"],
        outputs=case["outputs"],
        dataset_name=dataset_name
    )

优势和局限

✅ 优势

  1. 完整的生态系统

    • 与 LangChain 深度集成
    • 可视化 Dashboard
    • 实验对比和版本管理
  2. 灵活的评估器

    • 支持自定义评估逻辑
    • 可组合多个评估器
    • 提供内置评估器
  3. 企业级功能

    • 团队协作
    • API 和 SDK
    • CI/CD 集成

⚠️ 局限

  1. 付费服务

    • 超出免费额度后需要付费
    • 依赖外部平台
  2. 学习曲线

    • 需要理解 LangSmith 概念
    • 评估器编写需要一定经验
  3. 并发限制

    • API 有速率限制
    • 大规模评估需要控制并发

最佳实践

测试用例设计

# ✅ 好的测试用例
{
    "inputs": {"question": "订单延迟了怎么办?"},
    "outputs": {
        "expected_topics": ["订单", "延迟", "解决方案"],
        "tone": "empathetic",
        "should_contain": ["抱歉", "立即", "联系"]
    }
}

# ❌ 差的测试用例
{
    "inputs": {"question": "你好"},
    "outputs": {"should_contain": ["你好"]}
}

评估器设计

# ✅ 好的评估器(可量化、可复现)
class CoverageEvaluator(RunEvaluator):
    def evaluate_run(self, run, example):
        found = len([kw for kw in expected if kw in response])
        score = found / len(expected)
        return {"key": "coverage", "score": score}

# ❌ 差的评估器(主观判断)
class GoodEvaluator(RunEvaluator):
    def evaluate_run(self, run, example):
        if "感觉不错":
            return {"score": 1.0}

数据集管理

  • 版本化dataset-v1, dataset-v2
  • 分类:冒烟测试、回归测试、边界情况
  • 定期更新:根据用户反馈补充

评估频率

开发阶段:
  - 每次提交前:冒烟测试(5-10 用例)
  - 每天:完整评估(50-100 用例)

生产阶段:
  - 每周:完整评估
  - 每月:大规模回归测试(200+ 用例)

总结

LangSmith 批量评估的价值

维度 价值
效率 节省 80% 测试时间
质量 标准化评估,减少主观偏差
可追溯 完整历史记录,便于对比
可视化 Web Dashboard,一目了然

适用场景

  • ✅ 上线前全面测试
  • ✅ 提示词优化后验证
  • ✅ 更换模型后对比
  • ✅ 重构后回归测试
  • ✅ 持续质量监控

参考资料

开始你的 LangSmith 批量评估之旅!🚀