使用 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 | 运行类型 | 值:llm 、chain 、tool 、retriever 、embedding 、prompt 、parser |
langsmith.span.id | 运行 ID | span 的唯一标识符 |
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.system | metadata.ls_provider | GenAI 系统 (例如, "openai", "anthropic") |
gen_ai.prompt | inputs | 发送到模型的输入 prompt |
gen_ai.completion | outputs | 模型生成的输出 |
gen_ai.prompt.{n}.role | inputs.messages[n].role | 第 n 个输入消息的角色 |
gen_ai.prompt.{n}.content | inputs.messages[n].content | 第 n 个输入消息的内容 |
gen_ai.completion.{n}.role | outputs.messages[n].role | 第 n 个输出消息的角色 |
gen_ai.completion.{n}.content | outputs.messages[n].content | 第 n 个输出消息的内容 |
gen_ai.request.model | invocation_params.model | 请求使用的模型名称 |
gen_ai.response.model | invocation_params.model | 响应中返回的模型名称 |
gen_ai.request.temperature | invocation_params.temperature | 温度设置 |
gen_ai.request.top_p | invocation_params.top_p | Top-p 采样设置 |
gen_ai.request.max_tokens | invocation_params.max_tokens | 最大 tokens 设置 |
gen_ai.request.frequency_penalty | invocation_params.frequency_penalty | 频率惩罚设置 |
gen_ai.request.presence_penalty | invocation_params.presence_penalty | 存在惩罚设置 |
gen_ai.request.seed | invocation_params.seed | 用于生成的随机种子 |
gen_ai.request.stop_sequences | invocation_params.stop | 停止生成的序列 |
gen_ai.request.top_k | invocation_params.top_k | Top-k 采样参数 |
gen_ai.request.encoding_formats | invocation_params.encoding_formats | 输出编码格式 |
gen_ai.usage.input_tokens | usage_metadata.input_tokens | 使用的输入 tokens 数量 |
gen_ai.usage.output_tokens | usage_metadata.output_tokens | 使用的输出 tokens 数量 |
gen_ai.usage.total_tokens | usage_metadata.total_tokens | 使用的 tokens 总数 |
gen_ai.usage.prompt_tokens | usage_metadata.input_tokens | 使用的输入 tokens 数量 (已弃用) |
gen_ai.usage.completion_tokens | usage_metadata.output_tokens | 使用的输出 tokens 数量 (已弃用) |
input.value | inputs | 完整输入值,可以是字符串或 JSON |
output.value | outputs | 完整输出值,可以是字符串或 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 项目中看到一个像这样的追踪