接入 LangChain & LangGraph 应用

更新时间:
复制为 MD 格式

大模型可观测支持通过Python探针对LangChain/LangGraph应用进行可观测,Python探针是阿里云可观测产品自研的Python语言的可观测采集探针,其基于OpenTelemetry标准实现了自动化埋点能力。本文介绍如何将LangChain/LangGraph应用接入云监控2.0,以帮助用户实时了解 AI 应用运行状态。

框架介绍

LangChain 是一个面向大语言模型应用开发的框架,提供了模型调用、Prompt 组织、工具接入、检索增强生成(RAG)、Agent 构建等能力,帮助开发者快速搭建复杂的 LLM 应用。

LangGraph 是 LangChain 生态中的 Agent 编排框架,基于图结构构建多步推理和多 Agent 协作的 LLM 应用,支持循环控制流、状态管理和工具调用。

接入后,以下能力将被自动监控:

  • LangChain Chain / Agent 的执行链路

  • LLM 调用(模型名称、Token 用量、输入/输出内容)

  • 工具调用(Tool name、参数、返回结果)

  • Retriever / RAG 相关调用链路

  • LangGraph 图节点执行和状态流转

接入方式

容器服务 ACK 和容器计算服务 ACS 接入

步骤一:探针接入助手(ack-onepilot)安装

  1. 登录容器服务管理控制台,在集群列表页面单击目标集群名称。

  2. 在左侧导航栏单击组件管理,然后在右上角通过关键字搜索ack-onepilot

  3. ack-onepilot卡片上单击安装。配置相关的参数,建议使用默认值,单击确认

    说明

    需要保证ack-onepilot组件版本大于等于5.1.1版本,在上述步骤3中会展示当前安装的ack-onepilot版本。如果已经安装较低版本ack-onepilot,可重复上述步骤1、2,在步骤3中点击升级即可

步骤二:修改配置以启动 AI 应用监控

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 切换命名空间,找到待监控的工作负载,点击最右侧操作列的更多图标p1029481后,在弹出的对话框中点击YAML编辑

  4. YAML文件中将以下labels添加到spec > template > metadata层级下。添加完成后点击 更新

    labels:
      aliyun.com/app-language: python # Python应用必填,标明此应用是Python应用。
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "deployment-name"    # 应用在ARMS中的展示名称
      armsPilotAppWorkspace: "workspace"    # 替换为当前workspace名称,如未指定则使用默认工作空间。

    image

手动接入探针

步骤一:下载探针安装器 aliyun-bootstrap

PyPI仓库下载探针安装器。

pip3 install aliyun-bootstrap

步骤二:配置环境变量

您需要手动为Python应用添加以下环境变量:

# 方式一:为本SHELL中所有进程添加环境变量
export ARMS_APP_NAME=xxx   # 应用名称。
export ARMS_WORKSPACE=xxx   # 替换为当前Workspace名称。
export ARMS_REGION_ID=xxx   # 对应的阿里云账号的RegionID。
export ARMS_LICENSE_KEY=xxx   # 阿里云 LicenseKey。
# 方式二:为某个进程单独添加环境变量
ARMS_APP_NAME=xxx ARMS_WORKSPACE=xxx ARMS_REGION_ID=xxx ARMS_LICENSE_KEY=xxx aliyun-instrument xxx.py

其中LicenseKey可以通过OpenAPI获取,具体参见获取应用可观测接口返回值中的authToken字段。

(可选)Docker环境安装参考

对于Docker环境,可以参考以下Dockerfile示例修改您的Dockerfile文件。

# 添加环境变量
ENV ARMS_APP_NAME={AppName}
ENV ARMS_REGION_ID={regionId}
ENV ARMS_LICENSE_KEY={licenseKey}
ENV ARMS_WORKSPACE={worksapce}

## 原有环境

步骤三:使用aliyun-bootstrap安装Python探针

  1. 为了加快安装,建议您使用如下命令先配置镜像仓库。

    pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && pip config set install.trusted-host mirrors.aliyun.com
  2. 安装探针。

    aliyun-bootstrap -a install

步骤四:启动应用

通过ARMS Python探针启动应用

aliyun-instrument python app.py

示例代码

import os
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """Get weather information for a specified city"""
    weather_data = {"Beijing": "Sunny 25°C", "Shanghai": "Cloudy 22°C", "Hangzhou": "Light rain 20°C"}
    return weather_data.get(city, f"{city}: No weather data available")

@tool
def search_product(keyword: str) -> str:
    """Search product information by keyword"""
    products = {
        "ECS": "Elastic Compute Service, providing secure and reliable cloud servers",
        "RDS": "Relational Database Service, supports MySQL/PostgreSQL/SQL Server",
        "OSS": "Object Storage Service, massive, secure, and highly reliable cloud storage",
    }
    return products.get(keyword, f"No product found for '{keyword}'")

llm = ChatOpenAI(
    model="qwen-plus",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=os.environ.get("DASHSCOPE_API_KEY"),
    streaming=True,
    stream_usage=True,  # When enabled, streamed responses include token usage
)
agent = create_react_agent(llm, tools=[get_weather, search_product])
result = agent.invoke({"messages": [{"role": "user", "content": "What's the weather like in Beijing today? Also look up what ECS is as a product"}]})
for msg in result["messages"]:
    if msg.content:
        print(msg.content)

查看监控详情

  1. 登录云监控2.0控制台,选择目标工作空间,在左侧导航栏选择所有功能 > AI应用可观测

  2. AI应用列表页面可以看到已接入的应用,单击应用名称可以查看详细的应用监控数据。

p1061008

更多参考

流式场景下采集 Token 用量

使用 ChatOpenAI 的流式调用时,需要开启 stream_usage 才能采集到 Token 用量信息:

llm = ChatOpenAI(
    model="qwen-plus",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=os.environ.get("DASHSCOPE_API_KEY"),
    streaming=True,
    stream_usage=True,  # 开启后流式响应中会包含 token 用量
)

传递 session_id 与 user_id

在调用 agent.invoke 时,可通过 config 的 metadata 传入 session_id 和 user_id,用于会话分析、用户分析:

result = agent.invoke(
    {"messages": [{"role": "user", "content": "你好"}]},
    config={
        "metadata": {
            "session_id": "sess_abc123",
            "user_id": "user_456",
        },
    },
)
  • session_id:会话标识,用于关联同一会话内的多轮调用

  • user_id:用户标识,用于按用户维度统计和过滤

常见问题排查

Python探针使用常见问题