LangSmith 应用程序运维监控

内容纲要

I 概念

大模型具有不确定性,尤其是构建复杂 AI Agent 应用程序中,中间会涉及非常多的子步骤,如果想要了解每一步的运行状态和结果,一方面可以通过 Debug 来进行实时控制,而另一方面可以借助一些工具来观察和调试中间的交互流程。LangSmith 就是这样一个工具平台,由 LangChain 和 LangGraph 背后的团队创建,主要作用是:为基于大语言模型构建的应用程序提供全面的监控、调试和可观察性。提供强大的跟踪、日志记录和实时分析功能。
LangSmith 官网地址:https://smith.langchain.com/
通常,对于一个项目而言,可以是单个应用程序或服务。该项目将包含多个跟踪,每个跟踪都是运行的集合 – 一个运行代表应用程序中的一个基本操作,例如对 OpenAI 的 API 调用,或检索操作。如下图所示:

file

  • Project (项目):蓝色方块代表整个项目,可能是一个单独的应用程序或服务。
  • Traces (轨迹):绿色方块代表项目在不同条件或配置下的执行路径。每个轨迹可以是一个特定的用户会话、一个功能的执行,或者应用在特定输入下的行为。
  • Runs (运行):每个轨迹下的黄色方块表示特定轨迹的单次执行。这些是执行的实例,每个实例都是轨迹在特定条件下的实际运行。
  • Feedback, Tags, Metadata (反馈、标签、元数据):这部分显示了系统如何利用用户或自动化工具生成的反馈、标签和元数据来增强轨迹的管理和过滤。反馈可以用于改进未来的运行,标签和元数据可用于分类和筛选特定的轨迹或运行,以便在 LangSmith 的用户界面中更容易地管理和审查。

II 注册账户(科学上网)

1、注册账号

LangSmith 官网地址:https://smith.langchain.com/

2、官方配置文档

file

2.1 设置-生成key

file

2.2 安装依赖
uv add langchain langchain-openai
2.3 配置环境变量以连接 LangSmith

项目名称:chat
环境变量配置:

LANGCHAIN_TRACING_V2=true
LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
LANGCHAIN_API_KEY="<your-api-key>"
LANGCHAIN_PROJECT="chat"
2.4 运行任意大语言模型、对话模型或链路,其追踪日志会发送至该项目(业务逻辑)
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
llm.invoke("Hello, world!")

III 使用

1、 LangSmith在编译器中的调用方法

LangSmith 的跟踪不是靠 import langsmith 或显式调用某个 API 启动的,而是靠这几个环境变量:
LANGCHAIN_TRACING_V2 = true
LANGCHAIN_API_KEY = lsv2pt
LANGCHAIN_PROJECT = chat

只要进程(执行py文件)的环境里存在这几个变量,langchain 内部的回调机制会自动拦截每一次 llm.invoke / chain.invoke,把 run 上报到 LangSmith。你完全不需要在代码里写任何 LangSmith 的代码。
文件里环境变量是从哪来的?

from dotenv import load_dotenv
load_dotenv()

load_dotenv() 会把整个 .env 文件全部读进 os.environ 包括 LANGCHAIN_TRACING_V2、LANGCHAIN_API_KEY、LANGCHAIN_PROJECT。

虽然你在这个文件里没有"调用 LangSmith",但 load_dotenv() 已经把跟踪开关打开了。之后第 25 行 chain.invoke(…) 一执行,langchain 的全局回调管理器检测到 LANGCHAIN_TRACING_V2=true,就自动把这次调用上报了。"每个脚本只要 load 了 .env,就会跟踪"。

2、 关闭LangSmith的追踪

想在这个文件里关掉跟踪,两种方法:
1 改 .env(影响所有脚本):把 LANGCHAIN_TRACING_V2 = true 改成 false,或直接注释掉。
2 只在这个脚本里关(不影响别的脚本)——在 load_dotenv() 之后、invoke 之前:
load_dotenv()
import os
os.environ["LANGCHAIN_TRACING_V2"] = "false"

3、代码演示

# 1、配置模型
from dotenv import load_dotenv
load_dotenv()
import os
key = os.environ["OPENAI_API_KEY"]
base_url = os.environ["OPENAI_BASE_URL"]
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o", api_key=key,base_url=base_url,temperature=0,)

# 设置环境变量,开启LangSmith追踪
langchain_tracing_v21 = os.environ["LANGCHAIN_TRACING_V2"]
langchain_api_key1 = os.environ["LANGCHAIN_API_KEY"]
lang_project_name = os.environ["LANGCHAIN_PROJECT"]

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages

class State(TypedDict):
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

def chatbot(state: State):
    # print(state)
    return {"messages": [llm.invoke(state["messages"])]}

graph_builder.add_node("chatbot", chatbot)

graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)

graph = graph_builder.compile()

def stream_graph_updates(user_input: str):
    for event in graph.stream({"messages": [("user", user_input)]}):
        for value in event.values():
            print("模型回复:", value["messages"][-1].content)

while True:
    try:
        user_input = input("用户提问: ")
        if user_input.lower() in ["退出"]:
            print("下次再见!")
            break

        stream_graph_updates(user_input)
    except:
        # fallback if input() is not available
        user_input = "What do you know about LangGraph?"
        print("User: " + user_input)
        stream_graph_updates(user_input)
        break

4、前后对比

file

file

5、监控的内容

file

更详细的内容(点击进入任意一次交互):

file

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部