Skip to main content

标注代码以进行追踪

注意

如果您已决定不再跟踪您的运行,您可以移除 LANGSMITH_TRACING 环境变量。 请注意,这不会影响 RunTree 对象或 API 用户,因为这些是低级功能,不应受跟踪切换的影响。

有几种方法可以将追踪记录到 LangSmith。

提示

如果您正在使用 LangChain(无论是 Python 还是 JS/TS),您可以跳过本节,直接前往 LangChain 特定说明

使用 @traceable / traceable

LangSmith 让您能够以最小的代码改动,通过 Python 中的 @traceable 装饰器和 TypeScript 中的 traceable 函数轻松记录追踪信息。

注意

必须在环境变量中设置LANGSMITH_TRACING'true',以便将追踪记录到 LangSmith,即使在使用@traceabletraceable时也是如此。这允许您在不更改代码的情况下开启或关闭追踪功能。

此外,您还需要将 LANGSMITH_API_KEY 环境变量设置为您 API 的密钥(有关更多信息,请参阅 设置)。

默认情况下,跟踪信息将记录到一个名为 default 的项目中。 若要记录到不同的项目,请参阅 本节

The @traceable 装饰器是记录 LangSmith Python SDK 跟踪的简单方法。只需使用 @traceable 装饰任何函数即可。

from langsmith import traceable
from openai import Client

openai = Client()

@traceable
def format_prompt(subject):
return [
{
"role": "system",
"content": "You are a helpful assistant.",
},
{
"role": "user",
"content": f"What's a good name for a store that sells {subject}?"
}
]

@traceable(run_type="llm")
def invoke_llm(messages):
return openai.chat.completions.create(
messages=messages, model="gpt-4o-mini", temperature=0
)

@traceable
def parse_output(response):
return response.choices[0].message.content

@traceable
def run_pipeline():
messages = format_prompt("colorful socks")
response = invoke_llm(messages)
return parse_output(response)

run_pipeline()

使用 trace 上下文管理器(仅限 Python)

在 Python 中,您可以使用 trace 上下文管理器将追踪记录到 LangSmith。这在以下场景中非常有用:

  1. 您希望为特定代码块记录追踪信息。
  2. 您希望控制追踪的输入、输出及其他属性。
  3. 使用装饰器或包装器是不可行的。
  4. 上述任意一项或全部。

上下文管理器与 traceable 装饰器和 wrap_openai 包装器无缝集成,因此您可以在同一个应用程序中一起使用它们。

import openai
import langsmith as ls
from langsmith.wrappers import wrap_openai

client = wrap_openai(openai.Client())

@ls.traceable(run_type="tool", name="Retrieve Context")
def my_tool(question: str) -> str:
return "During this morning's meeting, we solved all world conflict."

def chat_pipeline(question: str):
context = my_tool(question)
messages = [
{ "role": "system", "content": "You are a helpful assistant. Please respond to the user's request only based on the given context." },
{ "role": "user", "content": f"Question: {question}\nContext: {context}"}
]
chat_completion = client.chat.completions.create(
model="gpt-4o-mini", messages=messages
)
return chat_completion.choices[0].message.content

app_inputs = {"input": "Can you summarize this morning's meetings?"}

with ls.trace("Chat Pipeline", "chain", project_name="my_test", inputs=app_inputs) as rt:
output = chat_pipeline("Can you summarize this morning's meetings?")
rt.end(outputs={"output": output})

包装 OpenAI 客户端

The wrap_openai/wrapOpenAI 方法在 Python/TypeScript 中允许您包装您的 OpenAI 客户端,以便自动记录跟踪——无需装饰器或函数包装! The 包装器与 @traceable 装饰器或 traceable 函数无缝配合工作,您可以在同一个应用程序中同时使用两者。

工具调用会自动渲染

注意

必须在环境变量中设置LANGSMITH_TRACING'true',以便将追踪记录到 LangSmith,即使在使用wrap_openaiwrapOpenAI时也是如此。这允许您在不更改代码的情况下开启或关闭追踪功能。

此外,您还需要将 LANGSMITH_API_KEY 环境变量设置为您 API 的密钥(有关更多信息,请参阅 设置)。

默认情况下,跟踪信息将记录到一个名为 default 的项目中。 若要记录到不同的项目,请参阅 本节

import openai
from langsmith import traceable
from langsmith.wrappers import wrap_openai

client = wrap_openai(openai.Client())

@traceable(run_type="tool", name="Retrieve Context")
def my_tool(question: str) -> str:
return "During this morning's meeting, we solved all world conflict."

@traceable(name="Chat Pipeline")
def chat_pipeline(question: str):
context = my_tool(question)
messages = [
{ "role": "system", "content": "You are a helpful assistant. Please respond to the user's request only based on the given context." },
{ "role": "user", "content": f"Question: {question}\nContext: {context}"}
]
chat_completion = client.chat.completions.create(
model="gpt-4o-mini", messages=messages
)
return chat_completion.choices[0].message.content

chat_pipeline("Can you summarize this morning's meetings?")

使用 RunTree API

记录追踪到 LangSmith 的另一种更明确的方式是通过 RunTree API。此 API 允许您对追踪拥有更多控制权——您可以手动创建运行(runs)和子运行以组装您的追踪。您仍然需要设置 LANGSMITH_API_KEY,但使用此方法时不需要 LANGSMITH_TRACING

此方法不推荐,因为它更容易在传播跟踪上下文时出错。

import openai
from langsmith.run_trees import RunTree
# This can be a user input to your app
question = "Can you summarize this morning's meetings?"
# Create a top-level run
pipeline = RunTree(
name="Chat Pipeline",
run_type="chain",
inputs={"question": question}
)
pipeline.post()
# This can be retrieved in a retrieval step
context = "During this morning's meeting, we solved all world conflict."
messages = [
{ "role": "system", "content": "You are a helpful assistant. Please respond to the user's request only based on the given context." },
{ "role": "user", "content": f"Question: {question}\nContext: {context}"}
]
# Create a child run
child_llm_run = pipeline.create_child(
name="OpenAI Call",
run_type="llm",
inputs={"messages": messages},
)
child_llm_run.post()
# Generate a completion
client = openai.Client()
chat_completion = client.chat.completions.create(
model="gpt-4o-mini", messages=messages
)
# End the runs and log them
child_llm_run.end(outputs=chat_completion)
child_llm_run.patch()
pipeline.end(outputs={"answer": chat_completion.choices[0].message.content})
pipeline.patch()

示例用法

您可以扩展上述工具,以便方便地追踪任何代码。以下是一些示例扩展:

追踪类中的任何公共方法:

from typing import Any, Callable, Type, TypeVar

T = TypeVar("T")


def traceable_cls(cls: Type[T]) -> Type[T]:
"""Instrument all public methods in a class."""

def wrap_method(name: str, method: Any) -> Any:
if callable(method) and not name.startswith("__"):
return traceable(name=f"{cls.__name__}.{name}")(method)
return method

# Handle __dict__ case
for name in dir(cls):
if not name.startswith("_"):
try:
method = getattr(cls, name)
setattr(cls, name, wrap_method(name, method))
except AttributeError:
# Skip attributes that can't be set (e.g., some descriptors)
pass

# Handle __slots__ case
if hasattr(cls, "__slots__"):
for slot in cls.__slots__: # type: ignore[attr-defined]
if not slot.startswith("__"):
try:
method = getattr(cls, slot)
setattr(cls, slot, wrap_method(slot, method))
except AttributeError:
# Skip slots that don't have a value yet
pass

return cls



@traceable_cls
class MyClass:
def __init__(self, some_val: int):
self.some_val = some_val

def combine(self, other_val: int):
return self.some_val + other_val

# See trace: https://smith.langchain.com/public/882f9ecf-5057-426a-ae98-0edf84fdcaf9/r
MyClass(13).combine(29)

在退出前请确保已提交所有跟踪记录

LangSmith 的追踪在后台线程中完成,以避免阻碍您的生产应用程序。这意味着您的进程可能在所有追踪成功提交到 LangSmith 之前结束。 以下是一些确保在退出应用程序之前提交所有追踪的选项。

使用 LangSmith SDK

如果您单独使用 LangSmith SDK,可以在退出前使用 flush 方法:

from langsmith import Client

client = Client()

@traceable(client=client)
async def my_traced_func():
# Your code here...
pass

try:
await my_traced_func()
finally:
await client.flush()

使用 LangChain

如果您正在使用 LangChain,请参阅我们的 LangChain 追踪指南

如果您更喜欢视频教程,请查看LangSmith 入门课程中的跟踪基础视频


此页面有帮助吗?


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