面试官:LangSmith 和 LangFuse 区别?我:先讲 OpenTelemetry 标准,他沉默了

OpenTelemetry 是底层数据标准 ,LangSmith 和 LangFuse 是基于该标准构建的上层可观测性平台。深度使用 LangChain 生态选 LangSmith ,追求商业 SaaS 的便利性与深度集成;重视开源、自托管与数据主权选 LangFuse ,兼顾成本可控与灵活性;已有统一观测平台或想避免供应商锁定,则直接采用 OpenTelemetry 标准,将数据路由到任意后端。

OpenTelemetry、LangSmith 和 LangFuse 三者并非同一层面的竞争关系。OpenTelemetry (OTel) 是底层数据标准,而 LangSmith 和 LangFuse 是基于该标准构建的上层可观测性平台。 它们之间的关系可以理解为"协议"与"应用"的关系。

📊 核心定位对比

维度 OpenTelemetry (OTel) LangSmith LangFuse
本质 开源的可观测性框架与标准,用于生成、采集和导出遥测数据。 专有的商业 SaaS 平台,专注于 LLM 应用的全生命周期管理。 开源的 LLM 工程平台,提供可观测性、评估和提示管理等一体化功能。
核心角色 数据标准的制定者。它定义了遥测数据的格式(如 Traces、Metrics、Logs)和传输协议(OTLP),但不负责存储和可视化。 平台的提供者。它接收(摄取)符合 OTel 标准的数据,并提供存储、分析、评估和可视化界面。 平台的提供者。它原生构建于 OTel 之上,其 SDK 就是 OTel SDK,并作为 OTel 后端接收数据,映射到自己的数据模型。
开源与许可 100% 开源,由 CNCF 托管,厂商中立。 闭源,专有 SaaS。自托管仅限企业版,需要商业许可。 开源(MIT 核心)。核心功能可免费自托管,部分企业级功能(如 SCIM)需商业许可。
数据主权 。你拥有自己的数据,可以发送到任何兼容的后端。 。SaaS 模式数据在云端,企业版提供混合部署选项。 。支持完全自托管(包括离线环境),数据完全由你掌控。
定价模式 免费。 按席位 + 按 Trace 量计费。免费版每月 5,000 条 Trace,付费版 $39/席/月起。 按单元(Unit) 计费。免费版每月 50,000 个单元,付费版 $29/月起。
最佳场景 需要避免供应商锁定,或希望将 LLM 追踪与现有后端(如 Datadog)统一观测的大型组织。 深度使用 LangChain/LangGraph 的团队,需要零配置追踪、生产级评估自动化和托管部署能力。 需要开源、自托管、框架无关的团队,尤其适合初创公司或对成本控制、数据主权有严格要求的场景。

🔗 三者的联系:OpenTelemetry 作为"桥梁"

OpenTelemetry 的核心价值在于标准化,它让 LangSmith 和 LangFuse 能够"听懂"同一种语言。

  • LangFuse 是 OTel 的"原生实现":LangFuse 的 SDK 本身就是基于 OpenTelemetry 构建的,其数据模型直接映射 OTel 的 Span。这意味着任何发出标准 OTel 数据的应用,都可以无缝接入 LangFuse。
  • LangSmith 是 OTel 的"兼容接收端":LangSmith 也支持通过其 OTLP 端点接收标准 OpenTelemetry 追踪数据。这意味着即使你的应用不是用 LangChain 构建的,只要它能发出 OTel 数据,就可以将追踪信息发送到 LangSmith 进行展示和分析。

这种兼容性带来了一个关键好处:避免了供应商锁定。你可以先使用 LangFuse 进行低成本监控,随着规模扩大,再无缝地将数据迁移到 LangSmit而无需修改应用中的任何追踪代码。代码

下面是应用通过 OTel SDK 将追踪数据发送到 LangFuse 和 LangSmith 的架构关系图:
#mermaid-svg-jlowN7kX0j5C6eHN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jlowN7kX0j5C6eHN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jlowN7kX0j5C6eHN .error-icon{fill:#552222;}#mermaid-svg-jlowN7kX0j5C6eHN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jlowN7kX0j5C6eHN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN .marker.cross{stroke:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jlowN7kX0j5C6eHN p{margin:0;}#mermaid-svg-jlowN7kX0j5C6eHN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster-label text{fill:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster-label span{color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster-label span p{background-color:transparent;}#mermaid-svg-jlowN7kX0j5C6eHN .label text,#mermaid-svg-jlowN7kX0j5C6eHN span{fill:#333;color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .node rect,#mermaid-svg-jlowN7kX0j5C6eHN .node circle,#mermaid-svg-jlowN7kX0j5C6eHN .node ellipse,#mermaid-svg-jlowN7kX0j5C6eHN .node polygon,#mermaid-svg-jlowN7kX0j5C6eHN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .rough-node .label text,#mermaid-svg-jlowN7kX0j5C6eHN .node .label text,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape .label,#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape .label{text-anchor:middle;}#mermaid-svg-jlowN7kX0j5C6eHN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .rough-node .label,#mermaid-svg-jlowN7kX0j5C6eHN .node .label,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape .label,#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape .label{text-align:center;}#mermaid-svg-jlowN7kX0j5C6eHN .node.clickable{cursor:pointer;}#mermaid-svg-jlowN7kX0j5C6eHN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN .arrowheadPath{fill:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jlowN7kX0j5C6eHN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jlowN7kX0j5C6eHN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jlowN7kX0j5C6eHN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jlowN7kX0j5C6eHN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jlowN7kX0j5C6eHN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jlowN7kX0j5C6eHN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster text{fill:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster span{color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jlowN7kX0j5C6eHN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jlowN7kX0j5C6eHN rect.text{fill:none;stroke-width:0;}#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape p,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape .label rect,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jlowN7kX0j5C6eHN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jlowN7kX0j5C6eHN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jlowN7kX0j5C6eHN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 应用服务
OTLP 协议
OTLP 端点
OTLP 端点
业务代码
OTel SDK
OpenTelemetry Collector
LangFuse(原生实现)
LangSmith(兼容接收端)
LangFuse 数据模型
LangSmith 存储与分析

💡 如何选择?

  • 如果你深度绑定 LangChain 生态 ,并且需要最原生的集成体验、生产级的评估自动化规则和托管部署能力,LangSmith 是更自然的选择。
  • 如果你重视开源、数据主权和成本控制 ,或者你的技术栈混合了多种框架(如 LangChain + Vercel AI SDK),LangFuse 提供了更大的灵活性和透明度。
  • 如果你是企业级用户 ,已经在使用 Datadog、New Relic 等统一观测平台,并希望避免被单一厂商锁定 ,那么直接采用 OpenTelemetry 并将数据路由到你选择的后端,是最具战略性的方案。的方案

下面是帮助你快速决策的流程图:
#mermaid-svg-AMbpymsDNI0PMGjB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AMbpymsDNI0PMGjB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AMbpymsDNI0PMGjB .error-icon{fill:#552222;}#mermaid-svg-AMbpymsDNI0PMGjB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AMbpymsDNI0PMGjB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB .marker.cross{stroke:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AMbpymsDNI0PMGjB p{margin:0;}#mermaid-svg-AMbpymsDNI0PMGjB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster-label text{fill:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster-label span{color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster-label span p{background-color:transparent;}#mermaid-svg-AMbpymsDNI0PMGjB .label text,#mermaid-svg-AMbpymsDNI0PMGjB span{fill:#333;color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .node rect,#mermaid-svg-AMbpymsDNI0PMGjB .node circle,#mermaid-svg-AMbpymsDNI0PMGjB .node ellipse,#mermaid-svg-AMbpymsDNI0PMGjB .node polygon,#mermaid-svg-AMbpymsDNI0PMGjB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .rough-node .label text,#mermaid-svg-AMbpymsDNI0PMGjB .node .label text,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape .label,#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape .label{text-anchor:middle;}#mermaid-svg-AMbpymsDNI0PMGjB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .rough-node .label,#mermaid-svg-AMbpymsDNI0PMGjB .node .label,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape .label,#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape .label{text-align:center;}#mermaid-svg-AMbpymsDNI0PMGjB .node.clickable{cursor:pointer;}#mermaid-svg-AMbpymsDNI0PMGjB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB .arrowheadPath{fill:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AMbpymsDNI0PMGjB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AMbpymsDNI0PMGjB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AMbpymsDNI0PMGjB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AMbpymsDNI0PMGjB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AMbpymsDNI0PMGjB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AMbpymsDNI0PMGjB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster text{fill:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster span{color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AMbpymsDNI0PMGjB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AMbpymsDNI0PMGjB rect.text{fill:none;stroke-width:0;}#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape p,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape .label rect,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AMbpymsDNI0PMGjB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AMbpymsDNI0PMGjB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AMbpymsDNI0PMGjB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是





开始选择
是否深度使用 LangChain/LangGraph?
LangSmith
是否重视开源、自托管与数据主权?
LangFuse
是否已有统一观测平台(如 Datadog、New Relic)?
纯 OpenTelemetry 标准
LangSmith(商业 SaaS 便利性)

🔧 实战:OTLP 端点配置与数据发送

下面通过 Python 和 Node.js 两个示例,演示如何配置 OTLP 端点并将 LLM 调用追踪数据发送到 LangFuse 或 LangSmit#### 1. Python:使用 OpenTelemetry SDK 发送 LLM 调用追踪调用追踪

首先安装依赖:

bash 复制代码
pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-grpc

然后配置 OTLP 端点并发送一个简单的 LLM 调用追踪:

python 复制代码
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

# 1. 配置 OTLP 端点(以 LangFuse 为例)
#    自托管 LangFuse:http://your-langfuse-host:4317
#    LangSmith:https://api.langsmith.com/otlp
OTLP_ENDPOINT = "http://your-langfuse-host:4317"
API_KEY = "sk-langfuse-your-api-key"  # 替换为你的密钥

# 2. 初始化 TracerProvider 并挂载导出器
provider = TracerProvider()
exporter = OTLPSpanExporter(
    endpoint=OTLP_ENDPOINT,
    headers={"Authorization": f"Bearer {API_KEY}"},
)
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)

tracer = trace.get_tracer("llm-app")

# 3. 记录一次 LLM 调用追踪
with tracer.start_as_current_span("llm.chat.completion") as span:
    span.set_attribute("gen_ai.system", "openai")
    span.set_attribute("gen_ai.request.model", "gpt-4o")
    span.set_attribute("gen_ai.request.prompt", "用一句话介绍 OpenTelemetry")
    span.set_attribute("gen_ai.response.text", "OpenTelemetry 是开源的可观测性标准框架。")
    span.set_attribute("gen_ai.usage.prompt_tokens", 12)
    span.set_attribute("gen_ai.usage.completion_tokens", 1# 运行结果:控制台无输出,但 Span 已异步批量发送到 LangFuse。
# 在 LangFuse 界面中可看到名为 "llm.chat.completion" 的 Trace,
# 包含模型、提示词、响应文本与 Token 用量等属性。等属性。

关键配置说明

  • OTLPSpanExporter 默认使用 gRPC 协议,端口通常为 4317;若使用 HTTP 协议,请改用 opentelemetry-exporter-otlp-proto-http 并指定 http://your-langfuse-host:4318/v1/traces
  • headers 中的 Authorization 用于平台鉴权,LangFuse 与 LangSmith 均要求携带 API Key。
  • BatchSpanProcessor 会批量异步导出,避免阻塞业务线程;应用退出前建议调用 provider.shutdown() 确保数据落#### 2. Node.js:使用 @opentelemetry/sdk-node 发送追踪到 LangFuse 与 LangSmith。mith

首先安装依赖:

bash 复制代码
npm install @opentelemetry/sdk-node @opentelemetry/exporter-trace-otlp-http @opentelemetry/api

然后配置 OTLP 端点并发送追踪数据:

javascript 复制代码
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { trace } = require('@opentelemetry/api'// 1. 配置 OTLP 端点(HTTP 协议)。 协议)
//    LangFuse:https://your-langfuse-host/api/public/otlp
//    LangSmith:https://api.langsmith.com/otlp
const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({
    url: 'https://your-langfuse-host/api/public/otlp/v1/traces',
    headers: {
      Authorization: 'Bearer sk-langfuse-your-api-key',
    },
  }),
  serviceName: 'llm-node-app',
});

sdk.start();

const tracer = trace.getTracer('llm-app'// 2. 记录一次 LLM 调用追踪。调用追踪
const span = tracer.startSpan('llm.chat.completion');
span.setAttribute('gen_ai.system', 'anthropic');
span.setAttribute('gen_ai.request.model', 'claude-3-5-sonnet');
span.setAttribute('gen_ai.request.prompt', '解释 OTLP 协议');
span.setAttribute('gen_ai.response.text', 'OTLP 是 OpenTelemetry 的传输协议。');
span.end(// 运行结果:Span 通过 HTTP 发送到 LangFuse / LangSmith。mith
// 在平台界面中可看到该 Trace 及其属性;若需切换平台,
// 只需修改 url 与 Authorization 头,业务代码无需改// 3. 应用退出前优雅关闭。优雅关闭
process.on('SIGTERM', () => sdk.shutdown());

关键配置说明

  • @opentelemetry/exporter-trace-otlp-http 使用 HTTP/JSON 协议,URL 需以 /v1/traces 结尾;LangFuse 的 OTLP 端点路径为 /api/public/otlp/v1/traces
  • 切换后端时只需修改 urlheaders,这正是 OTel 标准带来的免供应商锁定优势。
  • 生产环境建议将 serviceName 设为有意义的服务名,便于在平台中按服务维度检索 Trace。

🛠️ 常见问题与排查

1. OTLP 端点配置失败

原因分析 :OTLP 端点配置失败通常由三类原因引起:一是端点 URL 拼写错误或缺少协议前缀(如漏写 https://);二是网络不通,目标平台(LangSmith / LangFuse)的 OTLP 端口未开放或被防火墙拦截;三是认证信息(API Key / 密钥)缺失或过期,导致服务端拒绝连接。

解决步骤

  1. 核对端点 URL 是否完整,确保包含协议前缀,例如 https://api.langsmith.com/otlphttps://your-langfuse-host/api/public/otlp
  2. 使用 curltelnet 测试网络连通性,确认目标端口(通常为 4317 或 443)可达。
  3. 检查环境变量中的 API Key 是否正确配置,并确认密钥未过期、权限未变更。
  4. 查看应用日志中的 OTLP 导出错误信息,根据返回的 HTTP 状态码(如 401、403、404)进一步定位问题。
2. Trace 数据未显示

原因分析:Trace 数据未显示通常是因为数据链路中断或采样配置不当。常见OTel SDK 未正确初始化、Span 未导出到目标后端、采样率被设置为 0,或后端的时间范围筛选不正确。选不正确。

解决步骤

  1. 确认 OTel SDK 已在应用启动时完成初始化,且导出器(Exporter)指向正确的 OTLP 端点。
  2. 检查采样配置,确保采样率不为 0,必要时临时设置为 100% 以便调试。
  3. 在目标平台(LangSmith / LangFuse)中检查时间范围筛选,确认查看的时间段与数据产生时间一致。
  4. 使用 OTel 自带的诊断日志或本地 Collector 的调试输出,确认 Span 是否成功到达后端。
3. LangSmith 与 LangFuse 数据迁移

原因分析:数据迁移通常发生在从 LangFuse 切换到 LangSmith(或由于两者都兼容 OTel 标准,迁移本身不需要修改应用代码,但需要注意数据模型映射差异、历史数据导出格式以及迁移期间的 Trace 连续性。踪连续性。

解决步骤

  1. 确认源平台支持数据导出功能,LangFuse 支持通过 API 或 UI 导出 Trace 数据,LangSmith 也提供相应的导出接口。
  2. 在目标平台配置好 OTLP 端点后,先发送少量测试数据验证链路连通,再逐步切换生产流量。
  3. 迁移期间可同时向两个平台发送数据(双写),待目标平台数据完整后再关闭源平台,避免监控空窗期。
  4. 迁移完成后,对比两个平台的关键指标(如 Trace 数量、延迟分布),确认数据一致性。

📋 选型决策速查表

使用场景 推荐方案 核心理由 注意事项
深度使用 LangChain/LangGraph LangSmith 零配置追踪、生产级评估自动化、托管部署能力,与 LangChain 生态集成最原生。 闭源 SaaS,按席位 + Trace 量计费;免费版每月仅 5,000 条 Trace,需评估成本。
重视开源、自托管与数据主权 LangFuse 开源(MIT 核心)、框架无关,支持完全自托管(含离线环境),成本可控、数据完全自主。 部分企业级功能(如 SCIM)需商业许可;自托管需自行维护基础设施。
已有统一观测平台(如 Datadog、New Relic) 纯 OpenTelemetry 标准 避免供应商锁定,将 LLM 追踪与现有后端统一观测,数据可路由到任意兼容后端。 需要自行搭建 Collector 与数据管道,运维成本较高;无开箱即用的 LLM 评估界面。
混合框架技术栈(如 LangChain + Vercel AI SDK) LangFuse 框架无关、原生基于 OTel,任何发出标准 OTel 数据的应用都能无缝接入,灵活性高。 需确认各框架的 OTel 导出配置一致;多框架下需统一 Trace 命名与采样策略。

💎 OpenTelemetry 是标准 ,LangSmith 和 LangFuse 是实现 。选择 LangSmith 还是 LangFuse,本质上是选择商业 SaaS 的便利性与深度集成 ,还是选择开源的自托管、灵活性与成本可控性。而 OpenTelemetry 的存在,确保了无论你选择哪个平台,都不会失去对数据的最终控制权。

相关推荐
ClouGence43 分钟前
从 Prompt 到可复用作业辅导助手:我搭了一个 AI 作业批改工作流
人工智能·aigc·ai编程
m0_734571761 小时前
深入理解人工智能 大语言模型的训练方法
人工智能
小程故事多_801 小时前
从线性建模到网络语义重构,AI本体建模平台技术落地与实践复盘
人工智能
RockChinQ1 小时前
把飞书、QQ 变成翻译助手:n8n + LangBot + GPT-6 实战,保留人名、时间和链接
人工智能
ACP广源盛139246256731 小时前
GSV5600 国产 8K Serdes 视频延长芯片,AI 超高清可视化远距离传输方案解析
大数据·人工智能·ai·硬件架构·国产芯片
奈斯先生Vector1 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
苏苏susuus1 小时前
核密度估计(KDE)与高斯核(概念分享)
人工智能·python·ocr
9i编程1 小时前
1. 把 DDD 开源脚手架化为自己的:先读懂它——Spring Boot 4.1 的四层架构、多数据源与领域事件
人工智能·openai·ai编程
野生技术架构师1 小时前
FastAPI + LangGraph + Milvus + ES + Redis + MySQL 高性能智能体中台方案
人工智能