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 的示例,您可以在此处找到支持框架的完整列表 here。若要使此示例适用于其他框架,您只需更改仪器以匹配相应的框架即可。

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. 设置仪器化

在运行任何应用程序代码之前,让我们先设置我们的仪器化器(你可以用支持的任何框架替换它,这里

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 上