首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >langchain源码分析:langsmith

langchain源码分析:langsmith

作者头像
golangLeetcode
发布2026-03-18 18:14:19
发布2026-03-18 18:14:19
1220
举报

LangSmith 是 LangChain 官方推出的 ‌LLM 应用全生命周期开发平台‌,专注于开发、协作、测试、部署和监控基于大型语言模型的应用程序。‌核心功能‌如下:

  • 一键将应用部署至生产环境,支持 Docker 等容器化技术。
  • 实时监控线上应用的性能、错误率及资源消耗。
  • 构建回归测试集,批量运行提示(Prompts)或链,评估模型输出质量与稳定性。
  • 支持非技术人员通过协作工具参与提示词优化与测试。
  • 可视化展示 LLM 调用链的每一步输入/输出,帮助开发者定位性能问题和逻辑错误。
  • 支持追踪多组件交互细节(如 Chain、Agent、Tool 的协作过程

下面我们结合一个例子看下如何使用它:官方文档介绍有两种方式私有化部署和使用官方的功能。私有化部署可以使用docker compose,其脚本定义如下:

代码语言:javascript
复制
services:
  langchain-playground:
    image: ${_REGISTRY:-docker.io}/langchain/langsmith-playground:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    ports:
      - 3001:3001
    environment:
      - PORT=3001
      - LANGCHAIN_ENV=local_docker
      - LOG_LEVEL=${LOG_LEVEL:-info}
      - GO_ENDPOINT=http://langchain-platform-backend:1986
      - SMITH_BACKEND_ENDPOINT=${SMITH_BACKEND_ENDPOINT:-http://langchain-backend:1984}
  langchain-frontend:
    image: langchain/langsmith-frontend:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    environment:
      - VITE_BACKEND_AUTH_TYPE=${AUTH_TYPE:-none}
      - VITE_BASIC_AUTH_ENABLED=${BASIC_AUTH_ENABLED:-false}
      - VITE_OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
      - VITE_OAUTH_ISSUER_URL=${OAUTH_ISSUER_URL}
    ports:
      - 1980:1980
    depends_on:
      - langchain-backend
      - langchain-playground
  langchain-ace-backend:
    image: ${_REGISTRY:-docker.io}/langchain/langsmith-ace-backend:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    ports:
      - 1987:1987
    environment:
      - PORT=1987
    command:
      - "deno"
      - "run"
      - "--unstable-worker-options"
      - "--allow-env"
      - "--allow-net=0.0.0.0:1987"
      - "--node-modules-dir"
      - "-R"
      - "src/main.ts"
      - "-R"
      - "src/python_worker.ts"
  langchain-backend:
    image: ${_REGISTRY:-docker.io}/langchain/langsmith-backend:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    environment:
      - PORT=1984
      - LANGCHAIN_ENV=local_docker
      - LANGSMITH_URL=${LANGSMITH_URL:-http://langchain-frontend:1980}
      - GO_ENDPOINT=http://langchain-platform-backend:1986
      - SMITH_BACKEND_ENDPOINT=${SMITH_BACKEND_ENDPOINT:-http://langchain-backend:1984}
      - LANGSMITH_LICENSE_KEY=${LANGSMITH_LICENSE_KEY}
      - LOG_LEVEL=${LOG_LEVEL:-info}
      - AUTH_TYPE=${AUTH_TYPE:-none}
      - OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
      - OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}
      - OAUTH_ISSUER_URL=${OAUTH_ISSUER_URL}
      - API_KEY_SALT=${API_KEY_SALT}
      - X_SERVICE_AUTH_JWT_SECRET=${API_KEY_SALT}
      - POSTGRES_DATABASE_URI=${POSTGRES_DATABASE_URI:-postgres:postgres@langchain-db:5432/postgres}
      - REDIS_DATABASE_URI=${REDIS_DATABASE_URI:-redis://langchain-redis:6379}
      - CLICKHOUSE_HOST=${CLICKHOUSE_HOST:-langchain-clickhouse}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER:-default}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-password}
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-default}
      - CLICKHOUSE_PORT=${CLICKHOUSE_PORT:-8123}
      - CLICKHOUSE_TLS=${CLICKHOUSE_TLS:-false}
      - FF_ORG_CREATION_DISABLED=${ORG_CREATION_DISABLED:-false}
      - FF_TRACE_TIERS_ENABLED=${TTL_ENABLED:-true}
      - FF_UPGRADE_TRACE_TIER_ENABLED=${TTL_ENABLED:-true}
      - FF_S3_STORAGE_ENABLED=${BLOB_STORAGE_ENABLED:-false}
      - S3_BUCKET_NAME=${BLOB_STORAGE_BUCKET_NAME:-langsmith-s3-assets}
      - S3_RUN_MANIFEST_BUCKET_NAME=${BLOB_STORAGE_BUCKET_NAME:-langsmith-s3-assets}
      - S3_API_URL=${BLOB_STORAGE_API_URL:-https://s3.us-west-2.amazonaws.com}
      - S3_ACCESS_KEY=${BLOB_STORAGE_ACCESS_KEY}
      - S3_ACCESS_KEY_SECRET=${BLOB_STORAGE_ACCESS_KEY_SECRET}
      - FF_CH_SEARCH_ENABLED=${CH_SEARCH_ENABLED:-true}
      - BASIC_AUTH_ENABLED=${BASIC_AUTH_ENABLED:-false}
      - BASIC_AUTH_JWT_SECRET=${BASIC_AUTH_JWT_SECRET}
      - INITIAL_ORG_ADMIN_EMAIL=${INITIAL_ORG_ADMIN_EMAIL}
      - INITIAL_ORG_ADMIN_PASSWORD=${INITIAL_ORG_ADMIN_PASSWORD}
      - TRACE_TIER_TTL_DURATION_SEC_MAP=${TRACE_TIER_TTL_DURATION_SEC_MAP}
    ports:
      - 1984:1984
    depends_on:
      langchain-db:
        condition: service_healthy
      langchain-redis:
        condition: service_healthy
      clickhouse-setup:
        condition: service_completed_successfully
      postgres-setup:
        condition: service_completed_successfully
    restart: always
  langchain-platform-backend:
    image: ${_REGISTRY:-docker.io}/langchain/langsmith-go-backend:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    environment:
      - PORT=1986
      - LANGCHAIN_ENV=local_docker
      - LANGSMITH_URL=${LANGSMITH_URL:-http://langchain-frontend:1980}
      - SMITH_BACKEND_ENDPOINT=${SMITH_BACKEND_ENDPOINT:-http://langchain-backend:1984}
      - LANGSMITH_LICENSE_KEY=${LANGSMITH_LICENSE_KEY}
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - LOG_LEVEL=${LOG_LEVEL:-warning}
      - AUTH_TYPE=${AUTH_TYPE:-none}
      - OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
      - OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}
      - OAUTH_ISSUER_URL=${OAUTH_ISSUER_URL}
      - API_KEY_SALT=${API_KEY_SALT}
      - X_SERVICE_AUTH_JWT_SECRET=${API_KEY_SALT}
      - POSTGRES_DATABASE_URI=${POSTGRES_DATABASE_URI:-postgres:postgres@langchain-db:5432/postgres}
      - REDIS_DATABASE_URI=${REDIS_DATABASE_URI:-redis://langchain-redis:6379}
      - BASIC_AUTH_ENABLED=${BASIC_AUTH_ENABLED:-false}
      - BASIC_AUTH_JWT_SECRET=${BASIC_AUTH_JWT_SECRET}
      - CLICKHOUSE_HOST=${CLICKHOUSE_HOST:-langchain-clickhouse}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER:-default}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-password}
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-default}
      - CLICKHOUSE_PORT=${CLICKHOUSE_PORT:-8123}
      - CLICKHOUSE_TLS=${CLICKHOUSE_TLS:-false}
      - FF_ORG_CREATION_DISABLED=${ORG_CREATION_DISABLED:-false}
      - FF_TRACE_TIERS_ENABLED=${TTL_ENABLED:-true}
      - FF_UPGRADE_TRACE_TIER_ENABLED=${TTL_ENABLED:-true}
      - FF_S3_STORAGE_ENABLED=${BLOB_STORAGE_ENABLED:-false}
      - S3_BUCKET_NAME=${BLOB_STORAGE_BUCKET_NAME:-langsmith-s3-assets}
      - S3_RUN_MANIFEST_BUCKET_NAME=${BLOB_STORAGE_BUCKET_NAME:-langsmith-s3-assets}
      - S3_API_URL=${BLOB_STORAGE_API_URL:-https://s3.us-west-2.amazonaws.com}
      - S3_ACCESS_KEY=${BLOB_STORAGE_ACCESS_KEY}
      - S3_ACCESS_KEY_SECRET=${BLOB_STORAGE_ACCESS_KEY_SECRET}
      - FF_CH_SEARCH_ENABLED=${CH_SEARCH_ENABLED:-true}
      - TRACE_TIER_TTL_DURATION_SEC_MAP=${TRACE_TIER_TTL_DURATION_SEC_MAP}
    ports:
      - 1986:1986
    depends_on:
      langchain-db:
        condition: service_healthy
      langchain-redis:
        condition: service_healthy
      clickhouse-setup:
        condition: service_completed_successfully
      postgres-setup:
        condition: service_completed_successfully
    restart: always
  langchain-queue:
    image: ${_REGISTRY:-docker.io}/langchain/langsmith-backend:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    environment:
      - LANGCHAIN_ENV=local_docker
      - GO_ENDPOINT=http://langchain-platform-backend:1986
      - SMITH_BACKEND_ENDPOINT=http://langchain-backend:1984
      - LANGSMITH_LICENSE_KEY=${LANGSMITH_LICENSE_KEY}
      - LOG_LEVEL=${LOG_LEVEL:-info}
      - AUTH_TYPE=${AUTH_TYPE:-none}
      - OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
      - OAUTH_ISSUER_URL=${OAUTH_ISSUER_URL}
      - API_KEY_SALT=${API_KEY_SALT}
      - X_SERVICE_AUTH_JWT_SECRET=${API_KEY_SALT}
      - POSTGRES_DATABASE_URI=${POSTGRES_DATABASE_URI:-postgres:postgres@langchain-db:5432/postgres}
      - REDIS_DATABASE_URI=${REDIS_DATABASE_URI:-redis://langchain-redis:6379}
      - CLICKHOUSE_HOST=${CLICKHOUSE_HOST:-langchain-clickhouse}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER:-default}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-password}
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-default}
      - CLICKHOUSE_PORT=${CLICKHOUSE_PORT:-8123}
      - CLICKHOUSE_TLS=${CLICKHOUSE_TLS:-false}
      - FF_ORG_CREATION_DISABLED=${ORG_CREATION_DISABLED:-false}
      - FF_TRACE_TIERS_ENABLED=${TTL_ENABLED:-true}
      - FF_UPGRADE_TRACE_TIER_ENABLED=${TTL_ENABLED:-true}
      - FF_S3_STORAGE_ENABLED=${BLOB_STORAGE_ENABLED:-false}
      - S3_BUCKET_NAME=${BLOB_STORAGE_BUCKET_NAME:-langsmith-s3-assets}
      - S3_RUN_MANIFEST_BUCKET_NAME=${BLOB_STORAGE_BUCKET_NAME:-langsmith-s3-assets}
      - S3_API_URL=${BLOB_STORAGE_API_URL:-https://s3.us-west-2.amazonaws.com}
      - S3_ACCESS_KEY=${BLOB_STORAGE_ACCESS_KEY}
      - S3_ACCESS_KEY_SECRET=${BLOB_STORAGE_ACCESS_KEY_SECRET}
      - FF_CH_SEARCH_ENABLED=${CH_SEARCH_ENABLED:-true}
      - BASIC_AUTH_ENABLED=${BASIC_AUTH_ENABLED:-false}
      - BASIC_AUTH_JWT_SECRET=${BASIC_AUTH_JWT_SECRET}
      - TRACE_TIER_TTL_DURATION_SEC_MAP=${TRACE_TIER_TTL_DURATION_SEC_MAP}
    command:
      - "saq"
      - "app.workers.queues.single_queue_worker.settings"
      - "--quiet"
    depends_on:
      langchain-db:
        condition: service_healthy
      langchain-redis:
        condition: service_healthy
      clickhouse-setup:
        condition: service_completed_successfully
      postgres-setup:
        condition: service_completed_successfully
    restart: always
  langchain-db:
    image: ${_REGISTRY:-docker.io}/postgres:14.7
    command:
      [
        "postgres",
        "-c",
        "log_min_messages=WARNING",
        "-c",
        "client_min_messages=WARNING",
      ]
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_DB=postgres
    volumes:
      - langchain-db-data:/var/lib/postgresql/data
    ports:
      - 5433:5432
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres"]
      interval: 2s
      timeout: 2s
      retries: 30
  langchain-redis:
    image: ${_REGISTRY:-docker.io}/redis:7
    ports:
      - 63791:6379
    volumes:
      - langchain-redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 2s
      timeout: 2s
      retries: 30
  langchain-clickhouse:
    image: ${_REGISTRY:-docker.io}/clickhouse/clickhouse-server:24.8
    user: "101:101"
    restart: always
    environment:
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-default}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER:-default}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-password}
    volumes:
      - ./langchain-clickhouse-data:/var/lib/clickhouse
      - ./users.d:/etc/clickhouse-server/users.d
    ports:
      - 8124:8123
      - 9001:9000
    healthcheck:
      test: ["CMD", "clickhouse-client", "--query", "SELECT 1"]
      interval: 2s
      timeout: 2s
      retries: 30
  clickhouse-setup:
    image: ${_REGISTRY:-docker.io}/langchain/langsmith-backend:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    depends_on:
      langchain-clickhouse:
        condition: service_healthy
    restart: "on-failure:10"
    environment:
      - CLICKHOUSE_HOST=${CLICKHOUSE_HOST:-langchain-clickhouse}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER:-default}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-password}
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-default}
      - CLICKHOUSE_PORT=${CLICKHOUSE_PORT:-8123}
      - CLICKHOUSE_NATIVE_PORT=${CLICKHOUSE_NATIVE_PORT:-9000}
      - CLICKHOUSE_TLS=${CLICKHOUSE_TLS:-false}
    command:
      [
        "bash",
        "scripts/wait_for_clickhouse_and_migrate.sh"
      ]
  postgres-setup:
    image: ${_REGISTRY:-docker.io}/langchain/langsmith-backend:${_LANGSMITH_IMAGE_VERSION:-0.10.25}
    depends_on:
      langchain-db:
        condition: service_healthy
    environment:
      - LANGCHAIN_ENV=local_docker
      - LANGSMITH_LICENSE_KEY=${LANGSMITH_LICENSE_KEY}
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - LOG_LEVEL=${LOG_LEVEL:-warning}
      - AUTH_TYPE=${AUTH_TYPE:-none}
      - OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
      - OAUTH_ISSUER_URL=${OAUTH_ISSUER_URL}
      - API_KEY_SALT=${API_KEY_SALT}
      - POSTGRES_DATABASE_URI=${POSTGRES_DATABASE_URI:-postgres:postgres@langchain-db:5432/postgres}
      - REDIS_DATABASE_URI=${REDIS_DATABASE_URI:-redis://langchain-redis:6379}
      - MAX_ASYNC_JOBS_PER_WORKER=${MAX_ASYNC_JOBS_PER_WORKER:-10}
      - ASYNCPG_POOL_MAX_SIZE=${ASYNCPG_POOL_MAX_SIZE:-3}
      - CLICKHOUSE_HOST=${CLICKHOUSE_HOST:-langchain-clickhouse}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER:-default}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD:-password}
      - CLICKHOUSE_DB=${CLICKHOUSE_DB:-default}
      - CLICKHOUSE_PORT=${CLICKHOUSE_PORT:-8123}
      - CLICKHOUSE_NATIVE_PORT=${CLICKHOUSE_NATIVE_PORT:-9000}
      - CLICKHOUSE_TLS=${CLICKHOUSE_TLS:-false}
    restart: "on-failure:10"
    command:
      [
        "bash",
        "-c",
        "alembic upgrade head",
      ]
volumes:
  langchain-db-data:
  langchain-redis-data:
  langchain-clickhouse-data:

尝试过很多方法后发现,它始终报一个错误,最终放弃了,改用官方的功能。

代码语言:javascript
复制
 clickhouse-setup-1            | error: Dirty database version 3. Fix and force version.
Gracefully stopping... (press Ctrl+C again to force)
service "clickhouse-setup" didn't complete successfully: exit 1

官方需要注册账号,我直接使用github账号,注册地址如下:https://smith.langchain.com/o/e6ee08fb-8bc0-46ca-bf14-ddeefa82fc13,注册成功后按照提示可以申请一个token

接着我们在应用中使用它

代码语言:javascript
复制
from langchain_openai import OpenAI
from langchain_openai import ChatOpenAI
import os
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "your-key" 
def LLM():
    chat_model = ChatOpenAI(
        model="model-name",
        temperature=0.3,
        max_tokens=200,
        api_key='apikey',
        base_url='/pi/paas/'
    )
    return chat_model

然后起一个langgraph应用

代码语言:javascript
复制
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, base_dir)
from init.openai import LLM
model = LLM()
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
    SystemMessage("Translate the following from English into Italian"),
    HumanMessage("hi!"),
]
responses = model.invoke(messages)
for response in responses:
    print(response)

执行后我们到平台上看下

点记录进去可以看到运行的详细信息

点monitor可以看到各种监控指标,包括token使用量等

当然还有一些其他功能,暂时没有使用。整体来说langsmith实现了日志和监控的前后端,类似一个运维平台。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档