跳到主要内容
在本教程中,我们将使用 OpenAI SDK 构建一个简单的 RAG 应用程序。我们将从原型设计到生产阶段,为应用程序的每个阶段添加可观测性。
from openai import OpenAI
openai_client = OpenAI()

# This is the retriever we will use in RAG
# This is mocked out, but it could be anything we want
def retriever(query: str):
    results = ["Harrison worked at Kensho"]
    return results

# This is the end-to-end RAG chain.
# It does a retrieval step then calls OpenAI
def rag(question):
    docs = retriever(question)
    system_message = """Answer the users question using only the provided information below:
        {docs}""".format(docs="\n".join(docs))

    return openai_client.chat.completions.create(
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": question},
        ],
        model="gpt-4o-mini",
    )

原型设计

从一开始就设置好可观测性可以帮助您比没有它时更快地进行迭代。它使您在快速迭代提示或更改所使用的数据和模型时,能够很好地了解您的应用程序。在本节中,我们将介绍如何设置可观测性,以便您在原型设计时拥有最大的可观测性。

设置您的环境

首先,通过导航到设置页面创建 API 密钥。 接下来,安装 LangSmith SDK:
pip install langsmith
最后,设置适当的环境变量。这将把追踪记录到 `default` 项目(尽管您可以轻松更改)。
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=<your-api-key>
export LANGSMITH_WORKSPACE_ID=<your-workspace-id>
export LANGSMITH_PROJECT=default
您可能会在其他地方看到这些变量被称为 `LANGCHAIN_*`。它们都是等效的,但最佳实践是使用 `LANGSMITH_TRACING`、`LANGSMITH_API_KEY`、`LANGSMITH_PROJECT`。`LANGSMITH_PROJECT` 标志仅支持 JS SDK 版本 >= 0.2.16,如果您使用的是旧版本,请改用 `LANGCHAIN_PROJECT`。

追踪您的 LLM 调用

您可能想要追踪的第一件事是所有的 OpenAI 调用。毕竟,这是实际调用 LLM 的地方,所以它是最重要的部分!我们通过引入一个极其简单的 OpenAI 包装器,努力使 LangSmith 尽可能简单。您只需修改代码,使其看起来像这样:
from openai import OpenAI
from langsmith.wrappers import wrap_openai
openai_client = wrap_openai(OpenAI())

# This is the retriever we will use in RAG
# This is mocked out, but it could be anything we want
def retriever(query: str):
    results = ["Harrison worked at Kensho"]
    return results

# This is the end-to-end RAG chain.
# It does a retrieval step then calls OpenAI
def rag(question):
    docs = retriever(question)
    system_message = """Answer the users question using only the provided information below:
        {docs}""".format(docs="\n".join(docs))

    return openai_client.chat.completions.create(
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": question},
        ],
        model="gpt-4o-mini",
    )
请注意我们如何从 `langsmith.wrappers import wrap_openai` 导入并使用它来包装 OpenAI 客户端(`openai_client = wrap_openai(OpenAI())`)。 如果您按以下方式调用它,会发生什么?
rag("where did harrison work")
这将生成一个仅包含 OpenAI 调用的追踪——它应该看起来像这样

追踪整个链条

太好了——我们已经追踪了 LLM 调用。但追踪更多内容通常也很有用。LangSmith 专门用于追踪整个 LLM 管道——所以让我们开始吧!我们可以通过修改代码,使其看起来像这样:
from openai import OpenAI
from langsmith import traceable
from langsmith.wrappers import wrap_openai
openai_client = wrap_openai(OpenAI())

def retriever(query: str):
    results = ["Harrison worked at Kensho"]
    return results

@traceable
def rag(question):
    docs = retriever(question)
    system_message = """Answer the users question using only the provided information below:
        {docs}""".format(docs="\n".join(docs))

    return openai_client.chat.completions.create(
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": question},
        ],
        model="gpt-4o-mini",
    )
请注意我们如何导入 `from langsmith import traceable` 并使用它来装饰整个函数(`@traceable`)。 如果您按以下方式调用它,会发生什么?
rag("where did harrison work")
这将生成整个 RAG 管道的追踪——它应该看起来像这样

Beta 测试

LLM 应用程序开发的下一个阶段是 beta 测试您的应用程序。这是您将其发布给一些初始用户的时候。在此处设置良好的可观测性至关重要,因为您通常不完全知道用户将如何实际使用您的应用程序,因此这使您能够深入了解他们的使用方式。这也意味着您可能需要对追踪设置进行一些更改,以更好地适应这种情况。这扩展了您在上一节中设置的可观测性。

收集反馈

在 Beta 测试期间拥有良好可观测性的一个重要部分是收集反馈。您收集的反馈通常是特定于应用程序的——但至少一个简单的点赞/点踩是一个很好的开始。记录该反馈后,您需要能够轻松地将其与导致该反馈的运行相关联。幸运的是,LangSmith 使这变得很容易。 首先,您需要从应用程序记录反馈。一个简单的方法是为每个运行跟踪一个运行 ID,然后使用它来记录反馈。跟踪运行 ID 将如下所示:
import uuid
run_id = str(uuid.uuid4())
rag(
    "where did harrison work",
    langsmith_extra={"run_id": run_id}
)
将反馈与该运行相关联将如下所示:
from langsmith import Client
ls_client = Client()
ls_client.create_feedback(
    run_id,
    key="user-score",
    score=1.0,
)
一旦反馈被记录,您可以通过在检查运行的“元数据”选项卡中点击来查看它与每个运行的关联。它应该看起来像这样 您还可以通过运行表中的过滤逻辑,查询所有带有正面(或负面)反馈的运行。您可以通过创建如下过滤器来实现:

记录元数据

开始记录元数据也是一个好主意。这允许您跟踪应用程序的不同属性。这对于了解使用哪个版本或变体应用程序生成给定结果非常重要。 对于这个例子,我们将记录所使用的 LLM。通常您可能会尝试不同的 LLM,因此将该信息作为元数据对于过滤很有用。为此,我们可以将其添加为:
from openai import OpenAI
from langsmith import traceable
from langsmith.wrappers import wrap_openai
openai_client = wrap_openai(OpenAI())

@traceable(run_type="retriever")
def retriever(query: str):
    results = ["Harrison worked at Kensho"]
    return results

@traceable(metadata={"llm": "gpt-4o-mini"})
def rag(question):
    docs = retriever(question)
    system_message = """Answer the users question using only the provided information below:
    {docs}""".format(docs='\n'.join(docs))
    return openai_client.chat.completions.create(messages = [
        {"role": "system", "content": system_message},
        {"role": "user", "content": question},
    ], model="gpt-4o-mini")
请注意,我们向 `rag` 函数添加了 `@traceable(metadata={"llm": "gpt-4o-mini"})`。 以这种方式跟踪元数据假设它是事先已知的。这对于 LLM 类型来说没问题,但对于其他类型的信息(例如用户 ID)来说不太理想。为了记录此类信息,我们可以在运行时与运行 ID 一起传递它。
import uuid
run_id = str(uuid.uuid4())
rag(
    "where did harrison work",
    langsmith_extra={"run_id": run_id, "metadata": {"user_id": "harrison"}}
)
现在我们已经记录了这两个元数据,我们应该能够在此处看到它们都显示在 UI 中。 我们可以通过构建如下过滤器来过滤这些信息:

生产

太棒了——您已经使用新获得的可观测性快速迭代并获得了对应用程序良好性能的信心。是时候将其发布到生产环境了!您需要添加哪些新的可观测性? 首先,请注意您已经添加的可观测性将继续在生产中提供价值。您将能够继续深入研究特定的运行。 在生产环境中,您可能有大量更多的流量。因此,您可能不想一次只查看一个数据点。幸运的是,LangSmith 拥有一套工具来帮助您在生产中实现可观测性。

监控

如果您点击项目中的“监控”选项卡,您将看到一系列监控图表。在这里,我们跟踪许多 LLM 特定统计数据——追踪数量、反馈、首次令牌时间等。您可以跨不同的时间段查看这些数据。

A/B 测试

A/B 测试的分组功能要求给定元数据键存在至少 2 个不同的值。
您还可以使用此选项卡执行 A/B 测试。在之前的教程中,我们开始跟踪几个不同的元数据属性——其中之一是 `llm`。我们可以根据任何元数据属性对监控图表进行分组,并立即获得按时间分组的图表。这使我们能够试验不同的 LLM(或其他提示或内容)并跟踪它们随时间的变化性能。 为此,我们只需点击顶部的 `Metadata` 按钮。这将为我们提供一个下拉选项,供我们选择分组依据: 一旦我们选择它,我们将开始看到按此属性分组的图表:

深入分析

LangSmith 提供的一项强大功能是能够轻松深入分析您在查看监控图表时发现存在问题的数据点。为此,您只需将鼠标悬停在监控图表中的数据点上。当您这样做时,您将能够点击该数据点。这将带您回到运行表,并显示过滤后的视图:

结论

在本教程中,您了解了如何使用一流的可观测性设置您的 LLM 应用程序。无论您的应用程序处于哪个阶段,您都将受益于可观测性。 如果您对可观测性有更深入的问题,请查看操作指南部分,获取有关测试、提示管理等主题的指南。
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.