惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
有赞技术团队
有赞技术团队
H
Help Net Security
V
Visual Studio Blog
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 司徒正美
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LangChain Blog
N
Netflix TechBlog - Medium
罗磊的独立博客
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements

博客园 - work hard work smart

Java 面试1 Java 常见面试问题 手撕java常用代码 WebStorm 创建react工程 构建企业级 Text-to-SQL Agent:基于 LangGraph 的智能数据查询系统设计 Harness 工程:驾驭 AI Agent 的工程化艺术 DeepAgents 多智能体架构实战:从设计模式到后端选型 Vue 自定义组件完全指南:从零构建待办事项应用 使用 LangChain + Hugging Face 构建文本向量化服务 SQLAlchemy 使用详解 Python 中使用 Elasticsearch 的完整指南 Qdrant 向量数据库使用指南 OpenEvals 快速入门:LLM 评估指南 DeepEval 快速入门:LLM 应用评估指南 Qwen-Agent 入门指南:快速构建智能体应用 LangSmith 集成实战:从追踪到评估的完整指南 初识 go-zero:一款让你写后端更规范、更高效的 Go 微服务框架 RAG 中为什么需要 Rerank,以及如何使用 Rerank LangChain4j RAG 核心组件与组合方式 如何使用 Elasticsearch 进行全文检索和向量检索 MinerU Docker 部署指南 5 分钟上手:为 Cline 配置一个免费的 MCP 天气服务 Neo4j 图数据库安装与 Spring Boot 集成实战指南 LangFuse 实战指南:用 @observe 三行代码给 LLM 应用加上全链路追踪 Function Call 深度解析:让大模型从"嘴炮"到"实干"的技术革命 Spring AI 提示词模板实战:告别硬编码,实现提示词工程化管理 LangChain4j 实战指南:用 Java 轻松构建 AI 应用 Spring AI 对话短期记忆实战:让大模型拥有"记忆力" Spring AI 提示词工程实战:让大模型更懂你的意图 Spring AI ChatClient 深度解析:优雅构建大模型应用的利器
LangSmith 批量评估完全指南
work hard work smart · 2026-06-25 · via 博客园 - work hard work smart

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 批量评估之旅!🚀