Skip to main content

使用 OpenTelemetry 进行跟踪

LangSmith 可以接受来自基于 OpenTelemetry 的客户端的跟踪。 本指南将介绍如何实现此目的的示例。

适用于自托管和欧盟区域部署

在下面的请求中,为欧盟区域中的自托管安装或组织适当更新 LangSmith URL。对于欧盟区域,请使用eu.api.smith.langchain.com.

使用基本 OpenTelemetry 客户端记录跟踪

第一部分介绍如何使用标准 OpenTelemetry 客户端记录对 LangSmith 的跟踪。

1. 安装

安装 OpenTelemetry SDK、OpenTelemetry 导出器软件包以及 OpenAI 软件包:

pip install openai
pip install opentelemetry-sdk
pip install opentelemetry-exporter-otlp

2. 配置您的环境

为终端节点设置环境变量,替换您的特定值:

OTEL_EXPORTER_OTLP_ENDPOINT=https://api.smith.langchain.com/otel
OTEL_EXPORTER_OTLP_HEADERS="x-api-key=<your langsmith api key>"

可选:指定除 “default” 以外的自定义项目名称

OTEL_EXPORTER_OTLP_ENDPOINT=https://api.smith.langchain.com/otel
OTEL_EXPORTER_OTLP_HEADERS="x-api-key=<your langsmith api key>,Langsmith-Project=<project name>"

3. 记录跟踪记录

此代码设置一个 OTEL 跟踪程序和导出程序,用于将跟踪发送到 LangSmith。然后 调用 OpenAI 并发送所需的 OpenTelemetry 属性。

from openai import OpenAI
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
BatchSpanProcessor,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

otlp_exporter = OTLPSpanExporter(
timeout=10,
)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(otlp_exporter)
)
tracer = trace.get_tracer(__name__)

def call_openai():
model = "gpt-4o-mini"
with tracer.start_as_current_span("call_open_ai") as span:
span.set_attribute("langsmith.span.kind", "LLM")
span.set_attribute("langsmith.metadata.user_id", "user_123")
span.set_attribute("gen_ai.system", "OpenAI")
span.set_attribute("gen_ai.request.model", model)
span.set_attribute("llm.request.type", "chat")
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": "Write a haiku about recursion in programming."
}
]

for i, message in enumerate(messages):
span.set_attribute(f"gen_ai.prompt.{i}.content", str(message["content"]))
span.set_attribute(f"gen_ai.prompt.{i}.role", str(message["role"]))

completion = client.chat.completions.create(
model=model,
messages=messages
)

span.set_attribute("gen_ai.response.model", completion.model)
span.set_attribute("gen_ai.completion.0.content", str(completion.choices[0].message.content))
span.set_attribute("gen_ai.completion.0.role", "assistant")
span.set_attribute("gen_ai.usage.prompt_tokens", completion.usage.prompt_tokens)
span.set_attribute("gen_ai.usage.completion_tokens", completion.usage.completion_tokens)
span.set_attribute("gen_ai.usage.total_tokens", completion.usage.total_tokens)
return completion.choices[0].message

if __name__ == "__main__":
call_openai()

您应该会在 LangSmith 控制面板中看到一条跟踪,如下所示

支持的 OpenTelemetry 属性映射

通过 OpenTelemetry 向 LangSmith 发送跟踪时,以下属性将映射到 LangSmith 字段。

OpenTelemetry 属性LangSmith 球场笔记
langsmith.trace.nameRun NameOverrides the span name for the run
langsmith.span.kindRun TypeValues: llm, chain, tool, retriever, embedding, prompt, parser
langsmith.span.idRun IDUnique identifier for the span
langsmith.trace.idTrace IDUnique identifier for the trace
langsmith.span.dotted_orderDotted OrderPosition in the execution tree
langsmith.span.parent_idParent Run IDID of the parent span
langsmith.trace.session_idSession IDSession identifier for related traces
langsmith.trace.session_nameSession NameName of the session
langsmith.span.tagsTagsCustom tags attached to the span
gen_ai.systemmetadata.ls_providerThe GenAI system (e.g., "openai", "anthropic")
gen_ai.promptinputsThe input prompt sent to the model
gen_ai.completionoutputsThe output generated by the model
gen_ai.prompt.{n}.roleinputs.messages[n].roleRole for the nth input message
gen_ai.prompt.{n}.contentinputs.messages[n].contentContent for the nth input message
gen_ai.completion.{n}.roleoutputs.messages[n].roleRole for the nth output message
gen_ai.completion.{n}.contentoutputs.messages[n].contentContent for the nth output message
gen_ai.request.modelinvocation_params.modelThe model name used for the request
gen_ai.response.modelinvocation_params.modelThe model name returned in the response
gen_ai.request.temperatureinvocation_params.temperatureTemperature setting
gen_ai.request.top_pinvocation_params.top_pTop-p sampling setting
gen_ai.request.max_tokensinvocation_params.max_tokensMaximum tokens setting
gen_ai.request.frequency_penaltyinvocation_params.frequency_penaltyFrequency penalty setting
gen_ai.request.presence_penaltyinvocation_params.presence_penaltyPresence penalty setting
gen_ai.request.seedinvocation_params.seedRandom seed used for generation
gen_ai.request.stop_sequencesinvocation_params.stopSequences that stop generation
gen_ai.request.top_kinvocation_params.top_kTop-k sampling parameter
gen_ai.request.encoding_formatsinvocation_params.encoding_formatsOutput encoding formats
gen_ai.usage.input_tokensusage_metadata.input_tokensNumber of input tokens used
gen_ai.usage.output_tokensusage_metadata.output_tokensNumber of output tokens used
gen_ai.usage.total_tokensusage_metadata.total_tokensTotal number of tokens used
gen_ai.usage.prompt_tokensusage_metadata.input_tokensNumber of input tokens used (deprecated)
gen_ai.usage.completion_tokensusage_metadata.output_tokensNumber of output tokens used (deprecated)
input.valueinputsFull input value, can be string or JSON
output.valueoutputsFull output value, can be string or JSON
langsmith.metadata.{key}metadata.{key}Custom metadata

使用 Traceloop SDK 记录跟踪

Traceloop SDK 是兼容 OpenTelemetry 的 SDK,涵盖一系列模型、矢量数据库和框架。 如果此 SDK 涵盖您感兴趣的检测集成,则 可以将此 SDK 与 OpenTelemetry 结合使用,以记录对 LangSmith 的跟踪。

要查看 Traceloop SDK 支持哪些集成,请参阅 Traceloop SDK 文档

要开始使用,请执行以下步骤:

1. 安装

pip install traceloop-sdk
pip install openai

2. 配置您的环境

设置环境变量:

TRACELOOP_BASE_URL=https://api.smith.langchain.com/otel
TRACELOOP_HEADERS=x-api-key=<your_langsmith_api_key>

可选:指定除 “default” 以外的自定义项目名称

TRACELOOP_HEADERS=x-api-key=<your_langsmith_api_key>,Langsmith-Project=<langsmith_project_name>

3. 初始化 SDK

要使用 SDK,您需要在记录跟踪之前对其进行初始化:

from traceloop.sdk import Traceloop
Traceloop.init()

4. 记录跟踪

以下是使用 OpenAI 聊天补全的完整示例:

import os
from openai import OpenAI
from traceloop.sdk import Traceloop

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
Traceloop.init()

completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": "Write a haiku about recursion in programming."
}
]
)

print(completion.choices[0].message)

您应该会在 LangSmith 控制面板中看到一条跟踪,如下所示

使用 Arize SDK 进行跟踪

使用 Arize SDK 和 OpenTelemetry,您可以将来自多个其他框架的跟踪记录到 LangSmith。 以下是将 CrewAI 追踪到 LangSmith 的示例,您可以找到支持的完整列表 框架制作此示例 使用其他框架时,您只需更改 instrumentor 以匹配框架。

1. 安装

首先,安装所需的软件包:

pip install -qU arize-phoenix-otel openinference-instrumentation-crewai crewai crewai-tools

2. 配置您的环境

接下来,设置以下环境变量:

OPENAI_API_KEY=<your_openai_api_key>
SERPER_API_KEY=<your_serper_api_key>

3. 设置仪器

在运行任何应用程序代码之前,让我们设置我们的 instrumentor(您可以将其替换为此处支持的任何框架)

from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

# Add LangSmith API Key for tracing
LANGSMITH_API_KEY = "YOUR_API_KEY"
# Set the endpoint for OTEL collection
ENDPOINT = "https://api.smith.langchain.com/otel/v1/traces"
# Select the project to trace to
LANGSMITH_PROJECT = "YOUR_PROJECT_NAME"

# Create the OTLP exporter
otlp_exporter = OTLPSpanExporter(
endpoint=ENDPOINT,
headers={"x-api-key": LANGSMITH_API_KEY, "Langsmith-Project": LANGSMITH_PROJECT}
)

# Set up the trace provider
provider = TracerProvider()
processor = BatchSpanProcessor(otlp_exporter)
provider.add_span_processor(processor)

# Now instrument CrewAI
from openinference.instrumentation.crewai import CrewAIInstrumentor
CrewAIInstrumentor().instrument(tracer_provider=provider)

4. 记录跟踪

现在,您可以运行 CrewAI 工作流,跟踪将自动记录到 LangSmith 中

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool

search_tool = SerperDevTool()

# Define your agents with roles and goals
researcher = Agent(
role='Senior Research Analyst',
goal='Uncover cutting-edge developments in AI and data science',
backstory="""You work at a leading tech think tank.
Your expertise lies in identifying emerging trends.
You have a knack for dissecting complex data and presenting actionable insights.""",
verbose=True,
allow_delegation=False,
# You can pass an optional llm attribute specifying what model you wanna use.
# llm=ChatOpenAI(model_name="gpt-3.5", temperature=0.7),
tools=[search_tool]
)
writer = Agent(
role='Tech Content Strategist',
goal='Craft compelling content on tech advancements',
backstory="""You are a renowned Content Strategist, known for your insightful and engaging articles.
You transform complex concepts into compelling narratives.""",
verbose=True,
allow_delegation=True
)

# Create tasks for your agents
task1 = Task(
description="""Conduct a comprehensive analysis of the latest advancements in AI in 2024.
Identify key trends, breakthrough technologies, and potential industry impacts.""",
expected_output="Full analysis report in bullet points",
agent=researcher
)

task2 = Task(
description="""Using the insights provided, develop an engaging blog
post that highlights the most significant AI advancements.
Your post should be informative yet accessible, catering to a tech-savvy audience.
Make it sound cool, avoid complex words so it doesn't sound like AI.""",
expected_output="Full blog post of at least 4 paragraphs",
agent=writer
)

# Instantiate your crew with a sequential process
crew = Crew(
agents=[researcher, writer],
tasks=[task1, task2],
verbose= False,
process = Process.sequential
)

# Get your crew to work!
result = crew.kickoff()

print("######################")
print(result)

您应该会在 LangSmith 项目中看到如下所示的跟踪:


这个页面有帮助吗?


您可以在 GitHub 上留下详细的反馈。