最近在折腾MCP(Model Context Protocol)服务器,想把自己的RAG检索能力封装成一个工具给Claude用。本地跑通没问题,但一接到Claude Desktop上就翻车:检索回来的文档片段动不动就几千token,加上系统提示词,直接顶爆上下文窗口,经常报错或答非所问。感觉MCP这层好像对工具返回的内容没有截断或压缩机制?我自己在工具里做截断吧,又怕把关键信息切没了,有没有什么最佳实践?还是说应该让MCP工具只返回元数据,让模型自己去调二次接口?求有实战经验的大佬指个路,孩子快被token账单折磨疯了。
楼主
2026-08-18
MCP里挂RAG工具,上下文窗口被撑爆怎么破?
请 登录 后发表回复
全部回复
共 45 条
2楼
2026-09-18
我也踩过这个坑,MCP工具返回的内容确实没有自动截断,全量塞回去就是自杀。后来我改成两段式:工具只返回每条chunk的摘要、来源、相关度分数和id,真正需要细看再让模型调一个fetch_detail工具去拿原文。这样首轮上下文基本控制在几百token,模型也能自己判断哪条值得展开。不过摘要质量很关键,用便宜的小模型跑就行,别指望它多完美,够模型做路由决策就成。另外工具描述里一定写清楚返回格式和token上限,Claude有时候会一次性把所有id都拿去fetch,得在prompt里约束它最多取几条。还有个偏方是把检索结果按相关度排序后只留top3,剩下的告诉模型“还有N条未展示”,实测效果比硬塞十条好很多。
3楼
2026-09-19
可以试试让RAG工具只返回摘要加引用ID,模型需要细节再二次拉取,能省不少token。
4楼
2026-09-20
让MCP只回元数据+摘要,模型按需二次拉取,我这么干token直接降了七成。
5楼
2天前
我现在的做法是在RAG工具里先做一轮粗排+精排,只返回top3片段,并且每个片段硬限制在500 token以内,超出就用句子边界截断。MCP这层确实没有内置压缩,但你可以让工具返回时带上原始文档id和chunk位置,模型觉得不够会再调一次带offset的接口,比一次塞爆强多了。另外系统提示词里加一句“工具返回内容可能被截断,需要完整信息请二次检索”也挺管用。
6楼
1天前
我是在工具层做了两段式返回:第一次只回摘要加文档id和分页游标,模型觉得不够再调detail接口取全文,这样token能压下来一大半。截断的话别按字符切,按段落或句子边界切,再给个相关性分数让模型自己判断要不要深入。你们检索那边有没有做rerank?先rerank再截断比直接截效果好很多。