返回市场
动态上下文加载

动态上下文加载

作者:CefBoud3 星标更新:2025-10-20

项目介绍

动态上下文加载(DynamicContextLoading)在LLM及MCP中的应用

概述

动态上下文加载是一种按需激活工具的技术,在LLM和MCP中使用,通过仅在需要时加载工具来防止上下文膨胀。

背景

在开发Moncoder(一个简单的编码代理)时,我注意到上下文中充斥着许多很少使用的工具定义。这种低效性启发了loader工具的创建,该工具包含工具的简要概述,并且仅在需要时动态加载完整的细节。

这种方法适用于MCP,其中多个服务器可能会占用大量的上下文空间。实现多层次加载,类似于缓存层次结构:服务器描述、工具概述以及完整定义。

问题

LLM具有有限的上下文窗口。在每次交互中都包括所有工具会导致更高的成本、更慢的响应时间、降低的准确性以及令牌限制错误。此方法通过动态激活工具来保持精简的上下文。

示例:函数调用

查看dcl_function_calling.py以了解实现情况。使用litellm(根据.env.example设置.env文件)。

示例交互:

用户:计算15乘以7的结果并获取纽约的天气。

激活的工具:计算器,获取天气

15乘以7等于105
纽约的天气:多云,8°C。

示例:MCP集成

与MCP服务器(例如通过stdio连接GitHub)集成,采用多层次加载(先从第1级开始,仅在需要时进行第2级和第3级):

  1. 服务器描述:初始加载高级服务器信息。
  2. 工具概述:按需加载特定服务器的简要信息。
  3. 完整工具:仅激活任务所需的工具。

这种逐步加载方式保持了高效的上下文。

运行uv run dcl_mcp.py(需要.env文件中包含GITHUB_PERSONAL_ACCESS_TOKEN以完成演示)。详情见下方扩展示例。

<details> <summary>点击展开压缩示例运行(显示两级加载序列)</summary>
# 运行脚本(假设设置了包含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>