mcpField
L
langsmith-observability

langsmith-observability

github.com/orchestra-research测试与质量14.1k952 次安装19 周前更新
代码仓库

关于 langsmith-observability

LangSmith 是面向 LLM 应用开发与运维的调试、评估和监控平台。它通过追踪记录运行过程,并支持基于数据集的评估、生产监控和回归测试。

主要功能

  1. 01记录 LLM 调用追踪
  2. 02基于数据集运行评估
  3. 03监控生产指标、错误和成本
  4. 04收集运行反馈
  5. 05支持 CI/CD 回归评估

适用场景

  1. 01排查提示词、链和 Agent 的问题
  2. 02比较模型输出并运行系统化评估
  3. 03监控生产应用的延迟与成本
  4. 04在 CI/CD 中执行 AI 功能回归测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill langsmith-observability

安装后在 Claude Code 中输入/langsmith-observability确认已加载。

附带文件references/advanced-usage.mdreferences/troubleshooting.md

详细介绍

LangSmith - 大模型可观测性平台

用于调试、评估和监控语言模型与 AI 应用的开发平台。

何时使用 LangSmith

在以下情况下使用 LangSmith:

  • 调试大模型应用问题(提示词、链、Agent)
  • 基于数据集系统地评估模型输出
  • 监控生产环境的大模型系统
  • 为 AI 功能构建回归测试
  • 分析延迟、Token 用量和成本
  • 协作进行提示词工程

核心功能:

  • 追踪:捕获所有大模型调用的输入、输出和延迟
  • 评估:使用内置和自定义评估器进行系统化测试
  • 数据集:从生产追踪记录或手动创建测试集
  • 监控:跟踪生产环境中的指标、错误和成本
  • 集成:兼容 OpenAI、Anthropic、LangChain、LlamaIndex

在以下情况下改用替代方案:

  • Weights & Biases:深度学习实验跟踪、模型训练
  • MLflow:通用机器学习生命周期、以模型注册为中心
  • Arize/WhyLabs:机器学习监控、数据漂移检测

快速开始

安装
pip install langsmith

# Set environment variables
export LANGSMITH_API_KEY="your-api-key"
export LANGSMITH_TRACING=true
使用 @traceable 进行基本追踪
from langsmith import traceable
from openai import OpenAI

client = OpenAI()

@traceable
def generate_response(prompt: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

# Automatically traced to LangSmith
result = generate_response("What is machine learning?")
OpenAI 封装(自动追踪)
from langsmith.wrappers import wrap_openai
from openai import OpenAI

# Wrap client for automatic tracing
client = wrap_openai(OpenAI())

# All calls automatically traced
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}]
)

核心概念

运行与追踪

一次运行是单个执行单元(大模型调用、链、工具)。运行构成层次化的追踪,展示完整的执行流程。

from langsmith import traceable

@traceable(run_type="chain")
def process_query(query: str) -> str:
    # Parent run
    context = retrieve_context(query)  # Child run
    response = generate_answer(query, context)  # Child run
    return response

@traceable(run_type="retriever")
def retrieve_context(query: str) -> list:
    return vector_store.search(query)

@traceable(run_type="llm")
def generate_answer(query: str, context: list) -> str:
    return llm.invoke(f"Context: {context}\n\nQuestion: {query}")
项目

项目用于组织相关的运行。通过环境变量或代码设置:

import os
os.environ["LANGSMITH_PROJECT"] = "my-project"

# Or per-function
@traceable(project_name="my-project")
def my_function():
    pass

客户端 API

from langsmith import Client

client = Client()

# List runs
runs = list(client.list_runs(
    project_name="my-project",
    filter='eq(status, "success")',
    limit=100
))

# Get run details
run = client.read_run(run_id="...")

# Create feedback
client.create_feedback(
    run_id="...",
    key="correctness",
    score=0.9,
    comment="Good answer"
)

数据集与评估

创建数据集
from langsmith import Client

client = Client()

# Create dataset
dataset = client.create_dataset("qa-test-set", description="QA evaluation")

# Add examples
client.create_examples(
    inputs=[
        {"question": "What is Python?"},
        {"question": "What is ML?"}
    ],
    outputs=[
        {"answer": "A programming language"},
        {"answer": "Machine learning"}
    ],
    dataset_id=dataset.id
)
运行评估
from langsmith import evaluate

def my_model(inputs: dict) -> dict:
    # Your model logic
    return {"answer": generate_answer(inputs["question"])}

def correctness_evaluator(run, example):
    prediction = run.outputs["answer"]
    reference = example.outputs["answer"]
    score = 1.0 if reference.lower() in prediction.lower() else 0.0
    return {"key": "correctness", "score": score}

results = evaluate(
    my_model,
    data="qa-test-set",
    evaluators=[correctness_evaluator],
    experiment_prefix="v1"
)

print(f"Average score: {results.aggregate_metrics['correctness']}")
内置评估器
from langsmith.evaluation import LangChainStringEvaluator

# Use LangChain evaluators
results = evaluate(
    my_model,
    data="qa-test-set",
    evaluators=[
        LangChainStringEvaluator("qa"),
        LangChainStringEvaluator("cot_qa")
    ]
)

高级追踪

追踪上下文
from langsmith import tracing_context

with tracing_context(
    project_name="experiment-1",
    tags=["production", "v2"],
    metadata={"version": "2.0"}
):
    # All traceable calls inherit context
    result = my_function()
手动运行
from langsmith import trace

with trace(
    name="custom_operation",
    run_type="tool",
    inputs={"query": "test"}
) as run:
    result = do_something()
    run.end(outputs={"result": result})
处理输入/输出
def sanitize_inputs(inputs: dict) -> dict:
    if "password" in inputs:
        inputs["password"] = "***"
    return inputs

@traceable(process_inputs=sanitize_inputs)
def login(username: str, password: str):
    return authenticate(username, password)
采样
import os
os.environ["LANGSMITH_TRACING_SAMPLING_RATE"] = "0.1"  # 10% sampling

LangChain 集成

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# Tracing enabled automatically with LANGSMITH_TRACING=true
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant."),
    ("user", "{input}")
])

chain = prompt | llm

# All chain runs traced automatically
response = chain.invoke({"input": "Hello!"})

生产监控

Hub 提示词
from langsmith import Client

client = Client()

# Pull prompt from hub
prompt = client.pull_prompt("my-org/qa-prompt")

# Use in application
result = prompt.invoke({"question": "What is AI?"})
异步客户端
from langsmith import AsyncClient

async def main():
    client = AsyncClient()

    runs = []
    async for run in client.list_runs(project_name="my-project"):
        runs.append(run)

    return runs
反馈收集
from langsmith import Client

client = Client()

# Collect user feedback
def record_feedback(run_id: str, user_rating: int, comment: str = None):
    client.create_feedback(
        run_id=run_id,
        key="user_rating",
        score=user_rating / 5.0,  # Normalize to 0-1
        comment=comment
    )

# In your application
record_feedback(run_id="...", user_rating=4, comment="Helpful response")

测试集成

Pytest 集成
from langsmith import test

@test
def test_qa_accuracy():
    result = my_qa_function("What is Python?")
    assert "programming" in result.lower()
CI/CD 中的评估
from langsmith import evaluate

def run_evaluation():
    results = evaluate(
        my_model,
        data="regression-test-set",
        evaluators=[accuracy_evaluator]
    )

    # Fail CI if accuracy drops
    assert results.aggregate_metrics["accuracy"] >= 0.9, \
        f"Accuracy {results.aggregate_metrics['accuracy']} below threshold"

最佳实践

  1. 结构化命名 - 使用一致的项目/运行命名规范
  2. 添加元数据 - 包含版本、环境、用户信息
  3. 生产环境采样 - 使用采样率控制数据量
  4. 创建数据集 - 从有意义的生产案例构建测试集
  5. 自动化评估 - 在 CI/CD 流水线中运行评估
  6. 监控成本 - 跟踪 Token 用量和延迟趋势

常见问题

追踪未显示:

import os
# Ensure tracing is enabled
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "your-key"

# Verify connection
from langsmith import Client
client = Client()
print(client.list_projects())  # Should work

追踪导致高延迟:

# Enable background batching (default)
from langsmith import Client
client = Client(auto_batch_tracing=True)

# Or use sampling
os.environ["LANGSMITH_TRACING_SAMPLING_RATE"] = "0.1"

大型载荷:

# Hide sensitive/large fields
@traceable(
    process_inputs=lambda x: {k: v for k, v in x.items() if k != "large_field"}
)
def my_function(data):
    pass

参考资料

资源

评论

支持 Markdown