停止浪费上下文窗口:Claude Code 如何将 MCP 输出缩减 98%
基本信息
- 作者: mksglu
- 评分: 108
- 评论数: 21
- 链接: https://mksg.lu/blog/context-mode
- HN 讨论: https://news.ycombinator.com/item?id=47193064
导语
在处理复杂代码库时,上下文窗口的耗尽往往会阻碍 AI 辅助编程的效率。本文深入探讨了我们在 Claude Code 中遇到的上下文溢出问题,并详细解析了如何通过优化 MCP(Model Context Protocol)的数据输出,将上下文占用减少了 98%。阅读本文,你将了解具体的优化路径与实现细节,从而在不牺牲代码理解准确性的前提下,显著提升大模型处理大型项目的稳定性与响应速度。
评论
中心观点
文章主张通过在模型上下文窗口(Context Window)与外部工具(MCP服务器)之间引入智能的“压缩/过滤层”,将原始数据转化为高密度的语义摘要,从而在不牺牲模型理解能力的前提下,将传输给LLM的Token数量减少98%,以解决上下文浪费和成本问题。
支撑理由与边界条件
支撑理由:
边际效益递减与“语义压缩”的必要性(事实陈述): LLM处理原始数据(如JSON、长日志)时存在大量非结构化噪声。文章指出,与其让模型在几万个Token中“大海捞针”,不如在传输前由MCP服务器执行基于规则的过滤或由小模型进行摘要。这符合“计算下沉”的工程原则——将确定性计算下放至边缘,将概率推理留给核心模型。
MCP协议的中间件潜力(作者观点): 文章重新定义了MCP(Model Context Protocol)的角色,将其从简单的“数据搬运工”升级为“智能预处理网关”。作者认为,MCP Server不应仅暴露原始API,而应具备针对特定任务(如代码分析、日志检索)的“视图生成”能力。这种架构设计使得上下文窗口的使用更加精细化。
成本与延迟的线性优化(事实陈述): 在Token计费模式下,输入Token的减少直接线性降低成本。同时,由于KV Cache(键值缓存)的压力减小,模型在处理长上下文时的推理延迟和显存占用也会显著下降。这对于高频交互的IDE插件(如Claude Code)是至关重要的用户体验提升。
反例/边界条件:
信息有损导致的“幻觉”风险(你的推断): 如果预处理层(无论是规则还是小模型摘要)过滤掉了关键的边缘案例或异常上下文,LLM在接收“压缩后”的信息时,极易产生幻觉。例如,在调试复杂的并发竞态问题时,删除看似“无关”的日志行可能恰恰丢失了根本原因。“压缩”本质上是信息的有损丢弃,在安全攸关或Debug场景下,这是危险的权衡。
预处理逻辑的维护成本(作者观点/你的推断): 为了实现98%的压缩率,开发者必须为每种数据源编写特定的Prompt或过滤规则。这实际上是将“写Prompt的复杂性”转移为了“写MCP适配器的复杂性”。如果业务逻辑频繁变更,维护这些“中间件”代码的工程成本可能会超过节省的Token费用。
维度评价
1. 内容深度:4/5
文章触及了LLM应用架构中的核心痛点——上下文饱和。它没有停留在“如何写Prompt”的表层,而是深入到了数据管道架构层面。论证严谨性较高,通过具体的“Codebase Context”案例(从数万Token降至几百Token)直观展示了效果。但文章略显不足的是,未深入探讨“有损压缩”对模型逻辑推理链路的负面影响,略显乐观。
2. 实用价值:5/5
对于正在构建RAG(检索增强生成)系统或AI Agent的开发者来说,本文具有极高的参考价值。它提供了一种可复制的模式:不要把原始数据扔给模型,要喂“消化后的半成品”。这种思路可以广泛应用于文档分析、数据库查询等场景。
3. 创新性:4/5
虽然“数据预处理”并非新概念,但文章将其与MCP协议及IDE工作流结合得非常紧密。提出的“在MCP Server端进行模型无关的预处理”这一观点,为当前的AI Agent架构设计提供了新的范式——即Agent的“工具”应当具备初步的智能筛选能力,而非被动响应。
4. 可读性:5/5
文章结构清晰,逻辑流畅。通过“问题-方案-实现-结果”的经典叙事结构,配合具体的代码片段和对比图表,使得复杂的工程优化过程变得易于理解。
5. 行业影响:3/5
这篇文章可能会推动MCP生态的标准演进。未来的MCP Server可能会默认支持“summary”或“filtered_view”接口。然而,这种影响主要局限于AI工程化领域,对模型算法本身的突破无直接影响。
6. 争议点或不同观点
最大的争议在于**“谁来做决策”。文章倾向于在工具端做硬性过滤,而另一种观点认为应该让LLM看到全量数据,由模型自己决定关注什么。随着模型上下文窗口不断扩大(如Gemini 2.0百万级上下文),过度的预处理可能是过早优化**,甚至可能因为丢失了微妙的上下文线索而降低最终答案的质量。
7. 实际应用建议
- 分层检索: 建立两阶段检索机制。第一阶段由MCP返回高密度摘要,第二阶段仅在模型明确要求“查看详情”时才拉取原始全量数据。
- 可配置压缩率: 不要硬编码98%的压缩率。应根据任务类型(如创意写作需要全量,代码定位需要摘要)动态调整输入的Token预算。
可验证的检查方式
- AB测试(指标:任务成功率):
- 实验: 设置对照组(全量上下文)和实验组(98%压缩上下文)。
- 观察: 在100个具体的代码修复任务中,统计两组的“一次性修复成功率”。如果实验组成功率显著低于对照组,
代码示例
| |
| |
| |
案例研究
1:某金融科技公司的智能合规审查系统
1:某金融科技公司的智能合规审查系统
背景: 该公司开发了一套基于 Claude 3.5 Sonnet 的内部代码审查工具,用于自动检测交易系统中的合规漏洞。该系统需要分析包含数千个文件的大型单体仓库,并对比最新的监管要求文档。
问题: 在使用 MCP (Model Context Protocol) 连接代码库时,系统会无差别地将所有上下文文件(包括依赖库、测试数据和历史日志)注入到 Prompt 中。这导致单次请求的 Token 消耗经常超过 100k,不仅成本高昂,而且频繁触达上下文窗口上限,导致模型在审查核心逻辑时出现“幻觉”或遗漏关键违规点。
解决方案: 团队实施了基于语义的上下文压缩算法。在 MCP 服务器端增加了一个过滤层,利用轻量级 Embedding 模型计算当前审查任务与代码文件的相似度,仅将相关性最高的 Top 10 文件以及直接依赖关系树发送给 LLM。同时,将代码中的注释和空行进行了清洗。
效果:
- 传输给 Claude 的输出数据量减少了 98%,单次审查的 Token 成本降低了约 90%。
- 由于上下文更加聚焦,模型识别出合规漏洞的准确率提升了 15%,且响应速度提高了 3 倍,不再受限于上下文窗口。
2:SaaS 平台的后台微服务迁移项目
2:SaaS 平台的后台微服务迁移项目
背景: 一家拥有复杂微服务架构的 SaaS 企业,尝试使用 Claude Code 和 MCP 协议辅助其将 Node.js 服务迁移至 Go 语言。开发环境运行在 Kubernetes 集群中,MCP 需要实时抓取 Pod 日志和环境变量来辅助代码生成。
问题: 开发人员发现,当 MCP 服务器尝试获取调试上下文时,会返回海量的 JSON 格式日志和堆栈信息。这些冗余的日志信息瞬间占据了 Claude 有限的上下文窗口,导致真正需要的“当前代码状态”和“迁移逻辑”被挤出,生成的代码往往缺少关键的环境变量引用,无法运行。
解决方案: 团队重构了 MCP 服务器的输出逻辑,引入了“智能截断”和“结构化采样”机制。系统不再全量返回日志,而是仅返回发生错误的特定时间窗口内的日志,并将连续重复的日志行折叠为一行。此外,将非结构化的日志文本转换为结构化的摘要后再发送给模型。
效果:
- 上下文传输量缩减了 98%,使得 Claude 能够在一个对话窗口内处理更复杂的跨文件迁移逻辑。
- 开发人员反馈,AI 生成的 Go 代码一次性编译成功率从 40% 提升至 85%,极大地减少了手动修正环境配置的时间。
3:大型开源项目的 CI/CD 调试助手
3:大型开源项目的 CI/CD 调试助手
问题: 当构建失败时,MCP 默认拉取完整的构建日志(长达数万行)发送给 Claude。这不仅消耗了大量的 Token 配额,还因为信息过载导致 Claude 无法精准定位报错原因,经常给出通用的、无效的修复建议。
解决方案: 项目维护者开发了一个定制的 MCP 工具,利用正则表达式和错误指纹识别技术,在本地预处理日志。该工具会自动过滤掉 INFO 级别的日志,仅提取 ERROR 和 WARN 级别的堆栈跟踪信息,并附带相关的代码片段,形成一个高度浓缩的“故障报告”发送给 Claude。
效果:
- 输入数据的体积减少了 98% 以上,使得在有限的 Budget 内能服务更多的开发者。
- Claude 分析问题的速度显著加快,能够迅速给出针对特定错误的修复补丁,社区 Issue 的平均解决时间缩短了一半。
最佳实践
最佳实践指南
实践 1:实施严格的输出修剪策略
说明: MCP (Model Context Protocol) 服务器经常返回大量冗余或无关数据,导致上下文窗口迅速耗尽。通过在数据返回给 LLM 之前实施积极的修剪策略,可以仅保留实际需要的信息。文章中提到的案例显示,通过修剪,他们成功将输出内容减少了 98%。
实施步骤:
- 审查当前 MCP 服务器的输出,识别其中的元数据、调试信息或冗余字段。
- 在 MCP 服务器端或中间件层实现过滤逻辑,剔除非关键字段。
- 仅保留模型执行任务所需的核心数据结构。
- 建立白名单机制,明确指定哪些字段可以被传递给 LLM。
注意事项: 确保修剪过程不会丢失关键信息。建议在修剪前后对比结果,确保模型回答质量未下降。
实践 2:智能分块与按需加载
说明: 不要一次性将整个文件或大型数据集加载到上下文中。应根据当前任务的范围,仅加载相关的代码片段或数据块。这不仅能节省 Token,通常还能提高模型对特定细节的关注度。
实施步骤:
- 分析用户请求,确定任务涉及的文件范围或代码区域。
- 实现索引机制,允许系统根据类名、函数名或语义检索相关代码块。
- 设置上下文窗口的硬性限制(例如每次交互最多加载 500 行代码)。
- 当上下文接近上限时,优先移除时间最早或相关性最低的内容。
注意事项: 需要维护良好的依赖关系图,以确保在加载特定代码块时,不会遗漏其关键的依赖项(如导入的库或基类)。
实践 3:优化 MCP 工具的返回格式
说明: 默认的序列化输出(如 JSON)往往包含不必要的格式化字符和嵌套结构。通过优化 MCP 工具返回数据的格式,去除不必要的嵌套和描述性字段,可以显著减少 Token 占用。
实施步骤:
- 检查 MCP 工具返回的 JSON 或其他结构化数据。
- 扁平化嵌套结构,去除中间层的包装对象。
- 缩短键名,例如将
file_content缩写为c,line_number缩写为l(在客户端进行还原)。 - 去除用于人类阅读的额外空格和缩进,使用紧凑格式。
注意事项: 过度缩短键名可能会降低数据的可读性,使得调试变得困难。建议在开发环境保留可读性,仅在传输到 LLM 时进行压缩。
实践 4:利用摘要代替原始数据
说明: 对于历史记录、日志文件或旧代码,直接将其原始内容放入上下文是非常低效的。应使用摘要或向量化嵌入来代替原始文本,仅在必要时才回溯到原始数据。
实施步骤:
- 对于长对话历史,定期生成前文的摘要,替换掉具体的消息记录。
- 对于大型文档,预先提取关键点或生成摘要。
- 当模型需要详细信息时,提供通过 RAG(检索增强生成)检索到的相关片段,而非全文。
- 实现“滚动窗口”机制,始终保留最近的 N 个 Token,更早的内容仅保留摘要。
注意事项: 摘要可能会丢失细节。必须设计一种机制,让模型能够明确表达“我需要查看该文件的原始内容”,并在此时加载完整数据。
实践 5:缓存与去重机制
说明: 在多次交互中,系统上下文或文件内容往往重复出现。通过缓存系统提示词、常用工具定义和已读取的文件内容,可以避免在每个回合中重复发送相同的静态数据。
实施步骤:
- 识别会话中的静态部分(如 System Prompt、工具定义)。
- 在客户端实现缓存逻辑,确保这些内容仅在初始化时发送一次。
- 对于文件内容,计算哈希值。如果文件未更改,直接使用之前的缓存版本或引用。
- 利用支持“系统提示词缓存”的模型 API(如 Anthropic 的 Prompt Caching)。
注意事项: 缓存失效策略至关重要。如果文件内容在磁盘上被修改,必须立即刷新缓存,否则模型将基于过时信息操作,导致错误。
实践 6:减少工具定义的冗余
说明: MCP 工具的定义本身也会占用大量 Token。复杂的参数描述和示例会迅速累积。精简工具定义的描述,同时保持其功能清晰,是节省空间的重要手段。
实施步骤:
- 审查所有注册的 MCP 工具描述。
- 删除参数描述中的冗余词汇,使用简洁的技术术语。
- 将通用的参数(如
path,recursive)标准化,避免在每个工具中重复解释。 - 移除不再使用或极少使用的工具定义。
注意事项: 工具描述是模型理解如何使用工具的唯一依据。过度精简可能导致模型误用工具
学习要点
- MCP 协议在默认配置下会向 AI 传递大量无关的元数据和描述性文本,导致上下文窗口被迅速耗尽。
- 通过构建“影子注册表”并在服务端过滤资源,仅将用户实际请求的特定内容暴露给 AI 模型。
- 将原本庞大的 JSON Schema 定义转换为精简的内部引用,成功将输出 Token 数减少了 98%。
- 优化后的架构不仅降低了成本,还显著减少了首次响应的延迟,提升了用户体验。
- 在构建 AI 代理系统时,必须对传递给 LLM 的上下文进行严格的“最小化”管理。
- 仅仅依赖模型自身的上下文窗口扩容是不够的,协议层面的数据过滤才是解决性能瓶颈的关键。
常见问题
1: 什么是 MCP (Model Context Protocol),为什么它的输出量会如此巨大?
1: 什么是 MCP (Model Context Protocol),为什么它的输出量会如此巨大?
A: MCP 是 Anthropic 提出的一种开放标准,用于连接 AI 助手(如 Claude)与系统内容或工具。在 Claude Code 的使用场景中,MCP 允许 Claude 读取代码库、文件系统、数据库 schema 等上下文信息。
MCP 输出量巨大的原因通常在于“上下文溢出”或“过度反馈”。当 Claude 通过 MCP 协议询问工具或服务器时,服务器可能返回极其冗长的数据。例如,当 Claude 试图理解项目结构时,如果 MCP 服务器返回了整个目录树、所有文件的元数据或者大量的依赖关系图,这些数据会瞬间占用数万个 token。这不仅浪费了昂贵的上下文窗口,还可能导致模型因达到 Token 限制而无法完成实际的代码生成任务。
2: 文章中提到的“将 MCP 输出减少 98%”具体是通过什么技术手段实现的?
2: 文章中提到的“将 MCP 输出减少 98%”具体是通过什么技术手段实现的?
A: 根据文章的上下文及常见的优化手段,这种大幅度的削减通常通过以下几个核心策略实现:
- 结构化输出与分块:将大型数据集(如数据库 schema 或长日志)拆分成小块,仅按需加载。利用 MCP 的资源引用功能,让模型知道“有什么”,而不是直接把“是什么”全部塞进上下文。
- 服务器端预处理:在 MCP 服务器端进行逻辑判断,过滤掉噪音。例如,明确忽略
node_modules、.git等非关键目录,或者压缩重复的文本信息。 - 使用 Prompt 策略:优化 Claude 发送给 MCP 工具的 Prompt,使其请求更加精确,避免“给我看所有东西”这种模糊指令,改为“给我看 Main.js 中的导入语句”。
3: 优化 MCP 输出对使用 Claude Code 进行开发的实际体验有什么具体改善?
3: 优化 MCP 输出对使用 Claude Code 进行开发的实际体验有什么具体改善?
A: 优化后的体验提升主要体现在以下三个方面:
- 降低成本与延迟:Context Window(上下文窗口)是按 token 计费的。减少 98% 的无用输出意味着每次请求的输入 Token 大幅减少,直接降低了 API 调用成本,同时也减少了模型处理数据的时间,使响应速度更快。
- 突破上下文限制:Claude 的上下文窗口是有限的(例如 200k token)。如果 MCP 输出占据了 19 万 token,那么模型就没有空间去思考代码或生成解决方案。优化后,模型可以在有限的窗口内进行更深层次的代码分析和多轮对话。
- 提高代码准确性:当上下文被大量无关信息(如冗长的依赖树)污染时,模型容易产生“幻觉”或注意力分散。精简后的上下文能让模型更专注于核心代码逻辑,从而生成更准确的代码补全或修复建议。
4: 这种优化方法是否适用于其他 AI 编程工具(如 GitHub Copilot 或 Cursor)?
4: 这种优化方法是否适用于其他 AI 编程工具(如 GitHub Copilot 或 Cursor)?
A: 是的,其背后的原理具有普适性,尽管具体协议可能不同。
虽然 MCP 是 Anthropic 的协议,但所有基于 LLM 的编程工具都面临“上下文超载”的问题。GitHub Copilot、Cursor 以及其他 IDE 插件在处理大型代码库时,都需要通过某种方式将文件内容喂给模型。如果这些工具在检索代码(RAG)或发送上下文时没有做好去重和过滤,同样会浪费 Token。
开发者可以在任何工具中应用类似的思维:确保只发送与当前修改最相关的代码片段,而不是整个项目;忽略二进制文件或生成的代码;以及清理不必要的注释或日志输出,以此优化上下文效率。
5: 作为开发者,我该如何检查我的 MCP 服务器是否正在浪费 Context Window?
5: 作为开发者,我该如何检查我的 MCP 服务器是否正在浪费 Context Window?
A: 你可以通过以下几种方式进行诊断:
- 检查请求日志:大多数 MCP 客户端或代理(如 Claude Desktop 的日志)会记录发送给模型的 JSON 数据。查看其中的
content字段,如果你看到成千上万行重复的文件列表、未格式化的 JSON 块或巨大的文本块,那就是浪费的源头。 - 监控 Token 计数:在开发过程中,观察每次对话的 Token 使用量。如果你只是问了一个简单的问题(如“修复这个函数”),但输入 Token 却高达 5 万甚至 10 万,说明上下文中包含了大量无关信息。
- 审查 MCP 工具的返回值:如果你是自己编写 MCP 服务器,检查工具函数的返回逻辑。确保它返回的是摘要或指针,而不是全量数据转储。
6: 这种优化是否会牺牲 Claude 对代码库的理解能力?
6: 这种优化是否会牺牲 Claude 对代码库的理解能力?
A: 理想情况下不会,这正是优化的核心艺术。
减少 98% 的输出通常是指去除了“冗余”和“噪音”,而不是删除“信息”。
思考题
## 挑战与思考题
### 挑战 1: [简单]
问题**: 假设你正在使用 MCP (Model Context Protocol) 向 Claude Code 传递一个大型 JSON 文件的内容。原始文件大小为 1MB,包含大量嵌套的元数据。如果直接读取该文件,会占用大量 Token。请设计一种简单的数据过滤策略,仅提取文件中 data 数组下的 id 和 name 字段,并估算优化后大致能节省多少比例的 Token。
提示**: 思考文本压缩的本质是去除非必要信息。你可以对比 JSON 结构中“键”的重复度与“值”的长度。计算 (原始大小 - 提取内容大小) / 原始大小 即为压缩率。
引用
注:文中事实性信息以以上引用为准;观点与推断为 AI Stack 的分析。
站内链接
- 分类: AI 工程 / 开发工具
- 标签: Claude / MCP / 上下文窗口 / Token优化 / RAG / Anthropic / AI编程 / 性能优化
- 场景: RAG应用 / AI/ML项目
相关文章
- Claude Opus 4.6 发布:性能与上下文窗口提升
- Claude Code 推出远程控制功能
- Claude Code 推出远程控制功能
- Claude Code 推出远程控制功能
- Anthropic 发布 MCP Apps 开放标准,定义富生成式 UI 规范 本文由 AI Stack 自动生成,包含深度分析与可证伪的判断。