跳到主要内容

使用 OpenTelemetry 进行追踪

LangSmith 可以接受来自基于 OpenTelemetry 的客户端的追踪。本指南将引导您完成如何实现这一点的示例。

使用基本的 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 tracer 和 exporter,它将追踪发送到 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.name运行名称覆盖运行的 span 名称
langsmith.span.kind运行类型值:llmchaintoolretrieverembeddingpromptparser
langsmith.span.id运行 IDspan 的唯一标识符
langsmith.trace.id追踪 ID追踪的唯一标识符
langsmith.span.dotted_order点状顺序在执行树中的位置
langsmith.span.parent_id父运行 ID父 span 的 ID
langsmith.trace.session_id会话 ID相关追踪的会话标识符
langsmith.trace.session_name会话名称会话的名称
langsmith.span.tags标签附加到 span 的自定义标签
gen_ai.systemmetadata.ls_providerGenAI 系统 (例如, "openai", "anthropic")
gen_ai.promptinputs发送到模型的输入 prompt
gen_ai.completionoutputs模型生成的输出
gen_ai.prompt.{n}.roleinputs.messages[n].role第 n 个输入消息的角色
gen_ai.prompt.{n}.contentinputs.messages[n].content第 n 个输入消息的内容
gen_ai.completion.{n}.roleoutputs.messages[n].role第 n 个输出消息的角色
gen_ai.completion.{n}.contentoutputs.messages[n].content第 n 个输出消息的内容
gen_ai.request.modelinvocation_params.model请求使用的模型名称
gen_ai.response.modelinvocation_params.model响应中返回的模型名称
gen_ai.request.temperatureinvocation_params.temperature温度设置
gen_ai.request.top_pinvocation_params.top_pTop-p 采样设置
gen_ai.request.max_tokensinvocation_params.max_tokens最大 tokens 设置
gen_ai.request.frequency_penaltyinvocation_params.frequency_penalty频率惩罚设置
gen_ai.request.presence_penaltyinvocation_params.presence_penalty存在惩罚设置
gen_ai.request.seedinvocation_params.seed用于生成的随机种子
gen_ai.request.stop_sequencesinvocation_params.stop停止生成的序列
gen_ai.request.top_kinvocation_params.top_kTop-k 采样参数
gen_ai.request.encoding_formatsinvocation_params.encoding_formats输出编码格式
gen_ai.usage.input_tokensusage_metadata.input_tokens使用的输入 tokens 数量
gen_ai.usage.output_tokensusage_metadata.output_tokens使用的输出 tokens 数量
gen_ai.usage.total_tokensusage_metadata.total_tokens使用的 tokens 总数
gen_ai.usage.prompt_tokensusage_metadata.input_tokens使用的输入 tokens 数量 (已弃用)
gen_ai.usage.completion_tokensusage_metadata.output_tokens使用的输出 tokens 数量 (已弃用)
input.valueinputs完整输入值,可以是字符串或 JSON
output.valueoutputs完整输出值,可以是字符串或 JSON
langsmith.metadata.{key}metadata.{key}自定义元数据

使用 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

在运行任何应用程序代码之前,让我们设置我们的 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 上.