动态上下文加载是一种按需激活工具的技术,在LLM和MCP中使用,通过仅在需要时加载工具来防止上下文膨胀。
在开发Moncoder(一个简单的编码代理)时,我注意到上下文中充斥着许多很少使用的工具定义。这种低效性启发了loader工具的创建,该工具包含工具的简要概述,并且仅在需要时动态加载完整的细节。
这种方法适用于MCP,其中多个服务器可能会占用大量的上下文空间。实现多层次加载,类似于缓存层次结构:服务器描述、工具概述以及完整定义。
LLM具有有限的上下文窗口。在每次交互中都包括所有工具会导致更高的成本、更慢的响应时间、降低的准确性以及令牌限制错误。此方法通过动态激活工具来保持精简的上下文。
查看dcl_function_calling.py以了解实现情况。使用litellm(根据.env.example设置.env文件)。
示例交互:
用户:计算15乘以7的结果并获取纽约的天气。
激活的工具:计算器,获取天气
15乘以7等于105
纽约的天气:多云,8°C。
与MCP服务器(例如通过stdio连接GitHub)集成,采用多层次加载(先从第1级开始,仅在需要时进行第2级和第3级):
这种逐步加载方式保持了高效的上下文。
运行uv run dcl_mcp.py(需要.env文件中包含GITHUB_PERSONAL_ACCESS_TOKEN以完成演示)。详情见下方扩展示例。
# 运行脚本(假设设置了包含GITHUB_PERSONAL_ACCESS_TOKEN的.env文件)
uv run dcl_mcp.py
# 输出显示MCP服务器初始化并列出工具
加载mcp工具 github ['add_comment_to_pending_review', 'add_issue_comment', ...]
加载mcp工具 figma ['get_figma_data', 'download_figma_images']
# 初始加载器描述:仅加载服务器级别的信息
生成的加载器工具描述:用于管理MCP工具的动态工具加载器...
'github' MCP:GitHub MCP服务器提供全面的GitHub管理工具...
'figma' MCP:此MCP服务器允许获取详细的Figma文件数据...
# 用户查询触发加载器激活
用户:提供我的5个公开GitHub仓库列表
# LLM使用加载器加载GitHub工具概述(第2级)
工具调用:{"action":"load_tool_summaries","servers":["github"]}
加载器结果:已加载服务器工具概述:github。
# 现在上下文包括GitHub的工具概述
已加载的工具概述:
- get_me:检索认证的GitHub用户的详细信息。
- search_repositories:通过名称、主题或元数据搜索仓库。
[...其他工具...]
# LLM激活特定工具(第3级)
工具调用:{"action":"load_tools","tools":["get_me","search_repositories"],"server":"github"}
加载器结果:已激活来自github的工具:get_me, search_repositories。
# 工具现在处于活动状态并可调用
活跃工具:加载器,get_me,search_repositories
# LLM调用get_me以获取用户信息
工具调用:{}(针对get_me)
get_me结果:{"login":"CefBoud", ...}
# 然后调用search_repositories并传入查询
工具调用:{"query":"user:CefBoud","sort":"updated"}(针对search_repositories)
search_repositories结果:5个公开仓库列表(例如,MonCoder,cefboud.github.io等)
# LLM最终响应
助手:这是您5个公开GitHub仓库的列表...
</details>