跳到主要内容

利用 AI 可观测性与治理功能掌控您的 OpenHands 智能体

·8 分钟阅读
Yuki Watanabe
Databricks 软件工程师

OpenHands 是一款领先的开源 AI Agent 框架,在 SWE-bench 基准测试中表现卓越。AI 编码 Agent 功能非常强大,但往往也是“黑盒”。你交给它一项任务,它会编辑文件、运行终端命令、浏览网页,但你却无法获得结构化的记录来了解发生了什么,或者结果是否理想。在这篇文章中,我们将展示 MLflow 如何通过追踪每一步操作并评估每一次输出,以极简的设置为您提供对 OpenHands Agent 的全面可观测性与治理能力。

什么是 OpenHands?

OpenHands 是一个用于构建 AI Agent 的开源平台,能够与代码、终端、文件系统和网络进行交互。它同时提供 Python SDK 和 CLI,使得编写超越传统聊天式代码助手的自动化工作流变得非常容易。

关键能力包括

  • 终端访问 - Agent 在沙盒环境中运行 shell 命令
  • 文件编辑 - Agent 可以读取、创建和修改项目文件
  • 网页浏览 - Agent 可以导航网页并从中提取信息
  • MCP 集成 - Agent 通过模型上下文协议 (Model Context Protocol) 连接外部工具
  • 模型无关 - 适用于 Claude、OpenAI 以及开源模型

由于 OpenHands Agent 是自主运行的,没有人类会实时监控每一个步骤。这使得可观测性和治理变得至关重要。你需要了解发生了什么、触发了哪些工具、消耗了多少 token,以及输出是否达到了你的标准。这就是 MLflow 发挥作用的地方。

通过 OpenTelemetry 追踪 OpenHands Agent

当 Agent 自主运行时,了解其操作过程非常重要。哪些工具被触发了?调用了多少次 LLM?Token 花在哪里了?如果没有这些信息,调试故障和优化性能只能靠猜测。

MLflow Tracing 是一个功能强大的工具,只需极简设置即可为任何 Agent 增加可观测性。OpenHands 原生支持发送 OpenTelemetry 追踪数据,而 MLflow 开箱即用地支持这些数据。要连接 OpenHands 和 MLflow,请首先启动您的 MLflow 服务器(如果尚未启动)。

uvx mlflow server
信息

如需使用 pipdocker compose 等其他工具,请参阅 设置 MLflow 服务器

然后,在您的 OpenHands 脚本中设置以下三个环境变量,以连接两者:

import os

# Point OpenTelemetry traces to your MLflow server
os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "https://:5000"
os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = "x-mlflow-experiment-id=123" # Replace "123" with your MLflow experiment ID
os.environ["OTEL_EXPORTER_OTLP_TRACES_PROTOCOL"] = "http/protobuf"

设置完成后,下面这个脚本将创建一个 OpenHands Agent,给它分配一个简单任务,并将所有追踪数据发送到 MLflow:

from openhands.sdk import LLM, Agent, Conversation, Tool
from openhands.tools.file_editor import FileEditorTool
from openhands.tools.task_tracker import TaskTrackerTool
from openhands.tools.terminal import TerminalTool

llm = LLM("openai/gpt-5")


agent = Agent(
llm=llm,
tools=[
Tool(name=TerminalTool.name),
Tool(name=FileEditorTool.name),
Tool(name=TaskTrackerTool.name),
],
)

cwd = os.getcwd()
conversation = Conversation(agent=agent, workspace=cwd)

conversation.send_message("Write 3 facts about the current project into FACTS.txt.")
conversation.run()
print("All done!")

一旦 Agent 完成任务,每一次 LLM 调用、工具调用和 Agent 步骤都会以结构化 Span 的形式显示在 MLflow 中。导航至 MLflow UI(例如 https://:5000),选择在环境变量中设置的实验,然后打开“Traces”选项卡查看记录的追踪数据。

点击追踪记录的 ID,将打开一个包含更多详细信息的新窗格,如下所示。

MLflow trace detail showing OpenHands traces

通过该视图,您可以查看关于 OpenHands Agent 的详细信息,例如:

  • 来自 LLM 的 Prompt 和响应
  • 给予 Agent 的工具和系统 Prompt
  • Agent 实际调用的工具及其输入和输出
  • 每个步骤的延迟
  • Token 使用情况分解及相应的成本

这些信息对于调试和优化 OpenHands Agent 非常有帮助。

评估 OpenHands Agent 的运行结果

追踪可以告诉您*发生了什么*。评估则可以告诉您结果是否*良好*。这是两个互补的角度:可观测性与质量保证。Agent 产生的结果对吗?生成的代码正确吗?输出与原始请求相关吗?是否存在效率低下的工具调用?

MLflow Evaluation 是一个综合工具包,供 Agent 开发者系统地评估其 Agent 的质量。它提供了 60 多种内置评分器和 LLM 裁判,并集成了 RAGAS、DeepEval 等流行库。

评估 OpenHands Agent 运行结果的最快方法是直接从 MLflow UI 运行内置的 LLM 裁判。

  1. 从“Traces”选项卡中选择要评估的追踪记录。
  2. 点击操作菜单中的“Run Judges”按钮。
  3. 选择要运行的裁判并提交。
  4. 裁判运行完成后,MLflow 会在同一页面上显示结果,并在表格中添加新列。
MLflow evaluation results table showing OpenHands evaluation results

在以下示例中,我们使用三个评分器来评估输出质量。

  • RelevanceToQuery:输出是否与原始请求相关
  • Correctness:输出是否正确
  • ToolCallEfficiency:工具调用是否高效
信息

有关内置裁判的完整列表,请参阅 内置 LLM 裁判

每个追踪记录都会根据评分标准进行评估,产生明确的通过/失败指标以及来自 LLM 裁判的详细依据。这对于无人值守运行的 Agent 尤为强大。您定义质量标准,MLflow 会告诉您 Agent 是否达标。

MLflow evaluation results table showing OpenHands evaluation results

或者,您也可以通过 mlflow.genai.evaluate() API 以编程方式运行评估,如下所示。

import mlflow
from mlflow.genai.scorers import RelevanceToQuery, Correctness, ToolCallEfficiency

# Load OpenHands traces from MLflow
traces = mlflow.search_traces(locations=["123"], max_results=10) # substitute "123" with your experiment ID

# Evaluate output quality
results = mlflow.genai.evaluate(
data=traces,
scorers=[
RelevanceToQuery(),
Correctness(),
ToolCallEfficiency(),
],
)

评估结果的链接将显示在控制台中。

使用 AI Gateway 进行 LLM 流量治理

高度自主的 Agent(如 OpenHands)的一个隐患在于它们自带风险。它们可能会在长时间运行的任务中消耗过多的 Token、向 LLM 提供商泄露敏感数据,或遭到 Prompt 注入攻击。

AI Gateway 是一个中心化的代理层,位于您的应用程序和 LLM 提供商之间。它通过统一的 API 路由请求,同时管理凭据、追踪使用情况、执行治理策略,并提供跨所有 LLM 调用的完整可观测性。无需在脚本和环境中散布 API 密钥,您只需在网关中配置一次凭据,即可由它处理所有请求的身份验证、成本追踪和策略执行。

将 MLflow AI Gateway 与 OpenHands 配合使用非常简单。只需将 base_url 设置为 AI Gateway 的端点 URL(可以在 MLflow AI Gateway UI -> Endpoints -> Use 中找到)。

llm = LLM(
base_url="https://:5000/gateway/mlflow/v1", # MLflow AI Gateway endpoint URL
model="my-openai-endpoint", # Set the model to the name of the endpoint you want to use
)

就是这样!现在,来自 OpenHands 的所有 LLM 流量都会通过 MLflow AI Gateway 路由。您可以免费获得治理和可观测性,例如:

  • 预算控制 - 设置预算策略,在支出超过阈值时发出警报或拒绝请求
  • 使用追踪 - 每一项 LLM 调用都会自动记录,并具有 Token 级的成本可见性
  • 密钥管理 - 将 API 密钥安全地存储在中心化网关中,绝不将其暴露在脚本中
  • 回退路由 - 定义回退链,当主提供商不可用时,将请求路由到备份提供商
MLflow AI Gateway usage tracking dashboard

总结

OpenHands Agent 虽然强大但具有自主性,这意味着您需要强大的可观测性来信任和改进它们。MLflow 作为 AI 平台,从三个层面提供了这一点:

  1. 追踪 (Trace) 每一个 Agent 的运行。通过三个环境变量,以结构化、可搜索的 Span 形式查看工具调用、LLM 交互和 Token 计数。
  2. 评估 (Evaluate) 使用内置和自定义评分器来评估输出质量和工具有效性。在进入生产环境之前捕获回归问题。
  3. 治理 (Govern) 通过 AI Gateway 管理 LLM 流量,实现成本控制、使用追踪和集中式凭据管理。

这两个项目都是完全开源的,随着生态系统的成熟,我们期待更深入的整合。

如果您觉得这些内容有用,请在 GitHub 上为我们点个星:github.com/mlflow/mlflow⭐️

有任何问题或反馈?请 提交 Issue 或加入我们的 Slack 频道