部分MCP
此存储库用于测试减少LLM上下文被占用的方法 MCP工具说明。
背景
Cloudflare首先提出了这个问题: https://blog.cloudflare.com/code-mode/
问题总结:
- 工具定义始终占据上下文窗口的一部分
即使不使用工具。
- 有时只需要将工具结果传递给另一个工具调用
作为参数,在上下文窗口中不需要。
- 在另一个工具调用后,通常很清楚应该调用哪个工具
在两者之间插入LLM调用会减慢执行速度并浪费令牌
建议的解决方案(称为“代码模式”)是将工具视为函数 LLM可以作为SDK的一部分使用。LLM可以编写包含工具调用的代码 (并执行所述代码),但不能直接访问工具。
然而,代码模式的实现方式各不相同。
无发现代码模式
Pydantic的CodeModeToolset是一个示例实现: https://github.com/pydantic/pydantic-ai/blob/3490542f44368d2c935d725b5bfc0f542890401b/pydantic_ai_slim/pydantic_ai/toolsets/code_mode/__初始化__.py#L89-L128
此实现没有解决占用上下文窗口的第一个问题 使用工具定义,只实现了最后两个问题的解决方案。
发现代码模式
示例实现(utcp代码模式和bitfrost代码模式): https://github.com/universal-tool-calling-protocol/code-mode https://docs.getbifrost.ai/mcp/code-mode#the-四种代码模式工具
这些工具用于工具发现。 第二个实现增加了一个 getToolDocs 进一步减少的工具 工具描述的上下文消费。 然而,这种方法有一个缺点,那就是增加了工具调用的数量 (因为模型现在必须花时间发现工具),如本文所述 博客文章: https://block.github.io/goose/blog/2025/12/21/code-mode-doesnt-replace-mcp/#the-代码模式值
此存储库
此存储库的主要重点是 背景部分.
此存储库中提供的基准的基础是 tau2 基准. 它实现了一个模拟框架,用于跨不同领域评估客户服务代理。
每个域指定:
- 代理人必须遵守的政策
- 代理可以使用的一组工具
- 评估代理性能的一组任务
从该基准中,我们获取与单个域相关的数据(retail), 在该域可用的工具之上添加多个不相关的工具, 并比较代理的性能。
添加的无关工具集仅是定义。 每当代理尝试调用它们时,都会引发异常。
一些无关的工具来自pydantic工具集包,例如:
pydantic-ai-todopydantic-ai-filesystem-sandbox
其他人来自 MCP零点的300多套工具。
建议的解决方案
以下是解决不相关工具存在问题的可能解决方案:
- 外部工具选择器,仅显示带有相关工具的模型
- 带有工具发现的代码模式,让模型选择相关工具。
- 混合方法,其中代码模式没有工具发现
(pydantic的方法)和可用工具由工具选择器选择。
你的目标是实施其中一种方法并对其进行评估。
基线结果
全部:插入基准的基线结果
已知问题
这些是当前版本基准测试的已知问题,很快就会出现 固定。
存储库使用情况
运行基准
步骤0:可观察性
您可以选择首先设置Jaeger服务,以获得更好的可观察性 基准测试的内部运作。这将让你看到什么工具被调用, 代理人的背景和得分低的原因。
为此,请运行:
docker compose -f services/monitoring/compose.yaml up运行此命令后,您可以通过以下方式访问Jaeger的UI http://localhost:16686. 这是一个非常简单的版本,具有内存后端 这意味着停止该过程将删除从中收集的所有数据 它的记忆。
第一步:环境变量
复制 .env.example 进入 .env 并对其进行修改:
- 移除
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT如果你没有使用Observability。 - 填写
MODEL_NAME,API_KEY,BASE_URL.
第二步:运行基准测试
您可以通过以下方式获取帮助消息:
uv run poe --help benchmark要在原始版本中运行基准测试,请执行:
uv run poe benchmark relevant-only要使用不相关的工具运行基准测试,请执行以下三项之一:
uv run poe benchmark double # 15 extra toolsuv run poe benchmark half-mcp-zero # 1334 extra toolsuv run poe benchmark mcp-zero # 2666 extra tools无论哪种情况,如果你愿意,你都可以限制测试的病例数量 运行快速检查(而不是运行所有40个案例):
uv run poe benchmark double --max-cases 1实施您的解决方案版本
将解决方案的实施放在 toolset.py文件. 在那里,您可以重新定义以下方法:
prepare对每个基准工具执行一次预处理get_tools更改代理可用的工具call_tool改变工具的调用方式
代码样式
首先,使用以下命令安装预提交钩子:
uv run pre-commit install这将使它无法在不满足的情况下进行git提交 条件从 .预调试配置.yaml即:
- 格式错误
- 拉夫的门楣坏了
- Pyrefly的类型检查失败
如果要手动运行检查,请执行以下命令
uv run pre-commit run --all-files