返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

成本降到 2% 的 Agent 方案:把工具调用搬进执行环境

[复制链接]
链载Ai 显示全部楼层 发表于 1 小时前 |阅读模式 打印 上一主题 下一主题


现阶段企业级 Agent 的实现及弊端

目前我正在开发一款 AI Sales Agent,它是基于 langgraph 、langchain 构建,在现有的架构设计上,我们采取了一种较为简洁的实现方式:LLM + Tool 的模式。它最大的好处就是 langgraph 的链路非常简单,不会出现多个分支的情况,LLM 会根据上下文自行判断是否需要调用 tool,不需要的话则直接返回。

在项目代码中定义了好几个 tool,比如数据格式校验、提取信息、设置表单等等,每一个 tool 的功能非常单一,但是也存在一个明显的问题,有的 tool 是存在依赖关系,虽然在 prompt 里明确约束了,但 LLM 并不会一直如你所愿的执行,所以在产品端会偶现不是期望的功能。另外一个问题是随着 tool 越来越多上下文管理变得十分困难,会出现聊天工具记忆丢失的情况。

总体来说,上下文窗口占用过多会加剧第一个问题出现的频率,所以如何管理上下文才是当下 Agent 开发的核心难点。

解决方案 — 使用 MCP 执行代码

它是由 Claude code 的母公司 Anthropic 提出,一旦你理解了 Anthropic 的解决方案,它就会很简单。

随着代码执行环境对于 Agent 来说变得越来越普遍,解决方案是将 MCP 服务器呈现为代码 API,而不是直接工具调用。

Agent 编写代码与 MCP 服务器交互。

这种方法解决了这两个挑战:Agent 只能加载他们需要的工具,并在将结果传递回模型之前在执行环境中处理数据。

主要区别如下:
目前的做法:Agent 使用工具调用API→模型加载所有工具定义→模型直接调用工具→结果通过上下文返回。

代码执行方式:Agent编写代码→代码仅导入需要的工具→代码执行并处理数据→仅最终结果返回模型。

你的 MCP 服务器成为代码 API。无需将工具注册为模型直接调用的函数调用,而是将它们呈现为 Agent 可以以编程方式导入和使用的模块。

它在实践中是如何运作的

需求:假设你的 Agent 需要搜索 Salesforce 记录、筛选结果并创建摘要。

目前做法

按照我们现有的设计大概是这样一个链路设计:

  1. 1. 将所有 Salesforce 工具定义加载到上下文中
  2. 2. Agent 调用搜索工具
  3. 3. 完整结果通过上下文返回(可能有几十上百个结果)
  4. 4. Agent 调用过滤工具
  5. 5. Agent 获得上下文过滤结果
  6. 6. Agent 调用汇总工具
  7. 7. 返回总结结果给到 LLM
  8. 8. LLM 输出最后的结果

代码如下:

# Traditional approach - each step is a separate tool call

# Step 1: Search (tool call 1)
search_results = agent.call_tool("search_salesforce", {
"query":"active accounts",
"fields": ["name","revenue","status"]
})
# Returns 1000 records, all flow through context
# Step 2: Filter (tool call 2)
filtered_results = agent.call_tool("filter_records", {
"data": search_results, # Passing large dataset through context
"condition":"revenue > 1000000"
})
# Filtered data flows back through context
# Step 3: Summarize (tool call 3)
summary = agent.call_tool("create_summary", {
"data": filtered_results # More data through context
})
# Total: 3 separate tool calls, all intermediate data through context

改进方案

代码执行方式:

  1. 1. Agent 编写导入 Salesforce 模块的代码
  2. 2. 代码在一次执行中搜索、过滤和汇总
  3. 3. 仅最终摘要返回给代理(可能是 500 个token)

以下是代理通过代码执行编写的内容:

// Code execution approach - single execution,allprocessinginenvironment

import{ salesforce }from'mcp-servers';

// Everything happensinthe execution environment
asyncfunction getSalesforceSummary() {
// Search
const results =awaitsalesforce.search({
query:"active accounts",
fields: ["name","revenue","status"]
});
//1000records - but they never touch the model's context

// Filter (happens right here in code)
const filtered = results.filter(record => record.revenue > 1000000);
// Filtered to 50 records - still in execution environment

// Summarize (still in code)
const summary = {
total_accounts: filtered.length,
total_revenue: filtered.reduce((sum, r) => sum + r.revenue, 0),
top_account: filtered.sort((a, b) => b.revenue - a.revenue)[0]
};

return summary; // Only this small object goes back to the model
}
// Agent gets back just the summary - maybe 100 tokens

中间数据永远不会触及模型的上下文。这一切都发生在代码执行环境中。

当 Anthropic 测试这种方法时,之前消耗 150,000 个 token 的工作流程减少到 2,000 个 token。

token 节省并不是唯一的好处;由于执行代码而不是工具调用,因此一切运行得更快。

Agent 可以通过本机代码构造使用循环、条件和错误处理,而不是进行顺序 API 调用。

实现代码执行的成本与收益

这种方法增加了复杂性,因为现在需要一个具有适当沙箱、资源限制和监控的安全代码执行环境,而直接工具调用不需要这些。

但对于需要可扩展的 Agent 来说,其好处远远超过了开发成本。

它可以获得更便宜的操作、更快的响应,并且能够将 Agent 连接到数百种工具而无需达到上下文限制。

方案的 7 个主要优点:

1.大量节省 token
将工作流程从 150,000 个 token 减少到 2,000 个 token 意味着 API 成本下降了 98% 以上。

2.渐进式工具发现
Agent 可以浏览可用工具、搜索特定功能或仅在需要时阅读文档。它不需要在开始工作之前记住整个工具目录。

3. 中间数据处理
Agent 可以在代码执行环境中过滤、转换和聚合数据,然后再到达 LLM。

4. 更好的流程控制
编写代码使 Agent 能够访问正确的编程结构。这减少了延迟和 token 消耗。Agent 无需编写 50 个单独的工具调用和 50 个模型往返调用,而是编写在单次执行中处理所有 50 个操作的代码。

5. 隐私保护
敏感数据可以在您的工作流程中流动,而无需进入模型的上下文。只有显式记录或返回的值才对模型可见。其他一切都保留在执行环境中。您可以处理机密信息,据此做出决策,并仅返回最终结果。

6. 状态持久化
Agent 可以将中间结果保存到文件中并稍后恢复工作。

这使得跨多个会话的长时间运行任务成为可能。Agent 不需要将所有内容都放在上下文中或每次都从头开始。它可以检查进度、保存状态并从中断处继续。

7. 可重复使用的技能
随着时间的推移,你将构建一个更高级别的功能库。需要多个步骤的复杂操作变成单个函数调用。随着这些技能的发展,你的 Agent 会变得更加有能力。

"Anthropic 甚至建议使用 SKILL.MD 文件记录这些内容,以便 Agent 可以参考其自己以前的工作。"

最后的想法

这种方法改变了构建 Agent 的成本,使得 Agent 更加高效和聪明。

当构建需要以下功能的代理时,使用 MCP 执行代码很有意义:

1. 访问许多工具
如果 Agent 连接到数十个服务,那么这种方法就变得至关重要。传统方法在规模化时就失效了。

2.复杂的工作流程
具有数据转换、过滤和聚合的多步骤流程从环境内处理中获益匪浅。

3.长时间运行的任务
任何需要状态持久性或跨越多个会话的内容都可以更好地与代码执行配合。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ