突破大模型Prompt上下文限制方案
本文提出了一种突破大模型token限制的方案,通过MapReduce式任务分解与递归摘要处理海量数据。核心包括:1)数据预处理(去HTML标签、识别主体内容);2)递归摘要(将长文本切分后逐步摘要);3)文件系统作为外部记忆体;4)任务分解执行(Map阶段拆分任务并行处理,Reduce阶段汇总结果)。该方案参考了阿里JManus设计,通过智能调度和缓存优化,在保证内容完整性的同时降低计算成本,有效
思路启发来源:参考了阿里开源的JManus以及大数据处理技术MapReduce
最后实现效果可以达到”无限上下文"的能力,突破大模型输入token数量限制的局限性
方案核心思想,将一个复杂的、需要处理大量信息的任务进行分解和聚合。
首先,我们在获取到大量数据来源后,会先进行初步的数据清洗。
-
HTML标签剥离:针对网页爬取数据,可以使用专门的库直接移除所有HTML标签、脚本、样式代码,只留下纯文本。这一步通常能瞬间去掉80%-90%的冗余字符。
-
内容区块检测:智能识别网页的主体内容区域(如
<article>,<main>标签,或通过启发式算法),并过滤掉页头、页脚、侧边栏、广告、评论等无关噪音。 -
文本预处理:移除多余的空白符、压缩格式等。
接着,判断内容是否超过大模型上下文限制,如果超过就采用递归摘要的方式进一步压缩内容。
简单来说就是,根据模型上下文限制对内容进行切分,通常会预留40%左右的空间。ps:切片时可适当保留开头结尾一定字数重复(上下保留200字),尽量保证内容完整性。
如:初始文本3万字,我切分成每段10000字。
第一轮:对10000字片段调用大模型生成摘要,得到1000字总结1
第二轮:将总结1与第二段10000字合并,生成摘要,得到1200字总结2
第三轮:将总结2与第三段合并,生成摘要,最终得到1500字的精炼摘要。
通过这种方式,确保了无论上游的数据多么庞大和混乱,最后都会变成被高度提纯的模型上下文。也可保证内容不会超过大模型限制。
在流程编排智能体中,可能还涉及到上下文的追加等操作,这时候我们就需要将大量上下文保存为临时文件,在流程中不断对内容进行追加,每次调用在采用同样的方式提炼摘要。
拓展:
此类做法,我们公司因为业务场景原因,暂时未使用到,但是参考了JManus的设计思路,发现也能够很好的解决了智能体长上下文的理解能力差异大的问题。大概思路是这样的。
文件系统作为外部记忆体
为了突破模型上下文长度的限制,我们将将文件系统当作智能体的无限外部记忆来使用
1、在处理任务时,智能体需要将中间结果、重要信息(例如从网页获取的内容、文档数据、RAG私有知识)写入到文件系统中
2、当后续步骤需要这些信息时,智能体通过读取文件来获取,而不是在对话历史中保留所有细节。这种方法实现了可恢复的压缩,只要保留文件的路径或来源URL,内容本身可以从上下文中移除,需要时再重新读取,从而极大地节省了宝贵的上下文空间
MapReduce式任务分解与执行
相比于我们的方案更加的精细化,复杂度也提升一个档次。
1、规划与拆分(Map):首先会有一个Agent为用户问题生成一个执行计划,将用户问题拆解为一系列精准的关键词搜索子任务。
如:帮我搜索小米旗下产品的所有信息。
子任务1:搜索小米手机产品信息。
子任务2:搜索小米汽车产品信息。
子任务3:搜索小米家电产品信息。
.... 以此类推,生成N个搜索任务
2、并行搜索与摘要 (Map):做完了任务规划以后,并行为每个子任务分配一个Agent执行,分别生成简洁的摘要内容,保存文件存储到文件系统中。
3、汇总 (Reduce):当所有子任务执行完毕后,会将所有摘要中的信息拼接整合起来;并识别合并重复的信息,修正可能存在的矛盾点;最终根据优化后的摘要生成一份全面、结构化、没有冗余信息的结果回复。
ps: 每中类型智能体执行都有大量的流程链路和工具调用,这里需要根据企业场景进行设计。
tips:一次智能体执行调用中会存在循环多次工具调用,这可能会导致模型调用费用飙升,所以我们要合理利用大模型的缓存机制,每次调用时,上下文保持提示前缀稳定、让上下文保持追加式,而不要修改上下文的内容,这会导致缓存失效,增加调用成本。
研究完JManus的底层源码后,对智能体调度设计也有了新的理解😂,不愧是阿里开源的。
~都是文字干货,笔者没有画流程图,建议细细品读哈。
更多推荐



所有评论(0)