大模型RAG的上下文压缩与过滤

news/2025/10/11 17:45:55/文章来源:https://www.cnblogs.com/ExMan/p/19135643

大模型RAG的上下文压缩与过滤

一、为什么要压缩 & 过滤
检索器一次拉回 top-k 篇文档,其中 80% 的 token 与问题无关 →
  1. 浪费 LLM 上下文窗口
  2. 无关内容引入幻觉
    目标:在“送进 LLM 之前”就把无用段落/句子/ token 丢掉或压成更短的表示。

二、整体两阶段流水线
query


[1. 检索] ─► 原始文档集合 D=[d1,…,dk]


[2. 压缩+过滤] ─► 精炼文档集合 D̂=[d̂1,…,d̂m] (m≤k, |d̂i|≤|di|)


[3. 生成] ──► 答案

三、四种常用压缩/过滤策略
A. FILTER – 保留与 query 相关的句子,其余扔掉
B. SUMMARY – 把长文做抽取/生成式摘要
C. PRECISION– 对结构化字段截断小数位、只保留关键键值
D. HYBRID – 先 A→再 B→必要时 C,兼顾精度与压缩率

四、伪代码实现(单文件即可跑通思路)
Python
复制
# 1. 基础数据结构
@dataclass
class Document:content: strscore: float = 0.0          # 检索得分,可用于重排# 2. 检索器(接口)
class Retriever:def retrieve(self, query:str, top_k:int) -> List[Document]:# 用向量/ES/关键词均可...# 3. 生成器(接口)
class Generator:def generate(self, prompt:str) -> str:# 调用任意 LLM...# 4. 过滤器:句子级相关度
class InformationFilter:def filter_sentences(self, query:str, text:str, keep_ratio:float=0.5) -> str:sentences = split_sentences(text)scores = [sentence_similarity(s, query) for s in sentences]threshold = percentile(scores, (1-keep_ratio)*100)keep = [s for s, sc in zip(sentences, scores) if sc >= threshold]return ' '.join(keep) if keep else ''# 5. 摘要器:超长片段再压一层
class SummaryCompressor:def compress_document(self, query:str, text:str) -> str:prompt = f"请用2句话总结以下文本,保留与问题‘{query}’相关的信息:\n{text}"return Generator().generate(prompt)# 6. 精度压缩器:结构化场景
class PrecisionExtractor:def extract_precise_information(self, query:str, text:str) -> str:# 简单示例:正则抽数字、日期、金额numbers = re.findall(r'\d+(?:\.\d+)?', text)return ' '.join(numbers) if numbers else text[:150]  # 兜底截断# 7. 压缩策略枚举
class Strategy(Enum):FILTER = 'filter'SUMMARY = 'summary'PRECISION = 'precision'HYBRID = 'hybrid'# 8. 核心压缩 RAG 类
class ContextCompressionRAG:def __init__(self, retriever:Retriever, generator:Generator,strategy:Strategy=Strategy.HYBRID):self.retriever = retrieverself.generator = generatorself.strategy = strategyself.filter = InformationFilter()self.summarizer = SummaryCompressor()self.preciser = PrecisionExtractor()def run(self, query:str, top_k:int=5) -> str:docs = self.retriever.retrieve(query, top_k)compressed = self._compress_all(query, docs)if not compressed:return "抱歉,未找到足够信息。"context = '\n'.join(compressed)prompt = f"依据以下上下文回答问题:\n{context}\n问题:{query}\n答案:"return self.generator.generate(prompt)# 统一压缩入口def _compress_all(self, query:str, docs:List[Document]) -> List[str]:if self.strategy == Strategy.FILTER:return [self.filter.filter_sentences(query, d.content) for d in docs]if self.strategy == Strategy.SUMMARY:return [self.summarizer.compress_document(query, d.content) for d in docs]if self.strategy == Strategy.PRECISION:return [self.preciser.extract_precise_information(query, d.content) for d in docs]if self.strategy == Strategy.HYBRID:return self._hybrid(query, docs)return [d.content for d in docs]# HYBRID:先过滤→再摘要/精准提取def _hybrid(self, query:str, docs:List[Document]) -> List[str]:out = []for d in docs:txt = self.filter.filter_sentences(query, d.content, keep_ratio=0.6)if not txt: continueif len(txt) > 500:                       # 仍太长就摘要txt = self.summarizer.compress_document(query, txt)else:                                    # 否则抽关键字段txt = self.preciser.extract_precise_information(query, txt)if txt:out.append(txt)return out# 9. 使用示例
if __name__ == "__main__":rag = ContextCompressionRAG(retriever=YourRetriever(),generator=YourGenerator(),strategy=Strategy.HYBRID)answer = rag.run("大模型RAG的上下文压缩与过滤是什么?")print(answer)
 

五、关键技巧小结
  1. 句子级过滤:用 embedding 相似度或 cross-encoder 重排,速度快。
  2. 摘要失败兜底:摘要模型可能输出空,直接退回到原文截断或关键字段抽取。
  3. 压缩率计算:真实压缩比 = 原始总 token 数 / 精炼后 token 数,可在 _compress_all 里顺手统计。
  4. 并行化:map-reduce 思路,把长文档先切小块,过滤后再合并,能线性加速 。
  5. 训练式压缩:如果数据足,可参考 FlexRAG 用“可学习的摘要向量”做端到端压缩
     
把上面伪代码 copy 下来,把 RetrieverGenerator 换成你的实际实现,即可得到一个带“上下文压缩 + 过滤”的 RAG 原型。祝玩得开心!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 26 设备文件管理实战指南,文件访问、沙盒导出、系统变更与 uni-app 方案适配

iOS 26 设备文件管理实战指南,文件访问、沙盒导出、系统变更与 uni-app 方案适配pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

从“视频孤岛”到“统一视界”:解析视频汇聚平台EasyCVR的核心功能与应用场景

从“视频孤岛”到“统一视界”:解析视频汇聚平台EasyCVR的核心功能与应用场景在物联网和智慧城市高速发展的今天,海量、异构的视频监控设备如何实现统一管理、智能分析与高效应用,成为行业的核心痛点。本文将深入解…

个人博客作业 1:就《现代软件工程》提 5 个问题

个人博客作业 1:就《现代软件工程》提 5 个问题 问题一:如何权衡分析麻痹问题 出处: 第三章《软件工程师的成长》中提到:“想弄清楚所有细节,所有依赖关系之后再动手,分析太多,腿都麻了,没法起步前进,故得名分…

2025 年锅炉优质厂家最新推荐榜单:高效节能与环保性能全方位剖析,助您选到靠谱锅炉供应商

当前,工业生产与民生领域对热能供应的需求持续增长,锅炉作为核心设备,其性能直接影响企业运营成本与环保合规性。但随着国家环保政策不断收紧,氮氧化物、烟尘等排放限值愈发严格,同时能源价格波动加大,传统高能耗…

2025 年商用洗碗机源头厂家最新推荐榜:聚焦实力企业,为餐饮及企事业单位选购提供可靠参考

当前,餐饮行业持续发展,企事业单位后勤也不断升级,洗碗机已成为提升餐具清洁效率、保障卫生安全的关键设备。然而,洗碗机市场源头厂家数量繁杂,产品质量参差不齐,部分厂家缺乏核心技术导致洗净效果差,用劣质材料…

EHOME平台EasyCVR视频诊断功能指南:一文读懂其可识别的所有视频质量问题

EHOME平台EasyCVR视频诊断功能指南:一文读懂其可识别的所有视频质量问题EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。EHOME视频平台EasyCVR不仅具备视频资源管理、设备…

解决FinalShell无法本地连接虚拟机(VMware)中的Linux的问题

解决FinalShell无法本地连接虚拟机(VMware)中的Linux的问题1、系统环境 win10、 VMware Workstation 15、CentOS-7-x86_64-DVD-2003、finalshell2、问题1:无法连接 就是主机和虚拟机的Linux无法通信,解决办法: 来源…

html介绍+运用

一、html介绍 1、定义html是一个超文本标记语语言言,是一种标识性语言。(它不是编程语言) 标记:理解为一个记号或者一个绰号 超文本:页面内包含图片、链接、音乐、视频等素材 2、为什么要学习html? (1)测试要测…

2025 年 氨糖软骨素厂家哪家好?傦力宝产品选购指南,解析研发实力与品质优势

随着人口老龄化进程加快,银发经济成为经济发展新引擎,骨健康作为老年人核心健康需求之一,推动氨糖软骨素等相关产品市场持续扩容。当前,市场对骨健康产品的需求已从基础补充转向精准化、高效化,且随着科技赋能康养…

【SPIE出版】2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025)

2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025) 2025 International Conference on Information Engineering, Intelligent Information Technology and Artificial Intelligence 在这里看会议官网…

go读取二进制文件编译信息

诉求 希望了解二进制文件编译时的信息 本地 可以通过go version -m ./binary查看: $ go version -m ./go-pprof-practice ./go-pprof-practice: go1.24.2path github.com/wolfogre/go-pprof-practicemod github.com/…

2025锯床厂家最新推荐榜:精准切割与高效性能的行业首选!

2025锯床厂家最新推荐榜:精准切割与高效性能的行业首选!在现代制造业中,锯床作为重要的加工设备之一,其性能和稳定性直接影响到生产效率和产品质量。随着技术的不断进步,锯床行业也在不断创新和发展。为了帮助筛选…

基于LangChain 实现 Advanced RAG-后检索优化(下)-上下文压缩与过滤

基于LangChain 实现 Advanced RAG-后检索优化(下)-上下文压缩与过滤摘要 Advanced RAG 的后检索优化,是指在检索环节完成后、最终响应生成前,通过一系列策略与技术对检索结果进行深度处理,旨在显著提升生成内…

2025.10.10 图论

最短路 P5304 [GXOI/GZOI2019] 旅行者 Hint:考虑从暴力优化. 图论建模,路径最短的两个关键点编号一定不同,按照二进制位划分成两个集合跑最短路. 最暴力的方法我们可以枚举关键点对跑最短路,时间复杂度 \(O(k^2m\l…

xshell把界面转发到xming

linux上执行如下命令 sudo apt install x11-apps -y然后xshell设置会话属性: 断开后重新连接 然后linux执行: xclock & windows上应该会打开一个眼睛的窗口 证明转发成功了作者:xuejianxiyang出处:http://xueji…

使用AI创建angular项目

angular环境已安装,版本信息如下: Angular Cl: 16.2.0 node: 18.10.0 Package Manager: npm 8.19.2 OS:win32 x64 1.使用angular cli创建一个项目 2.设计一个登录界面,包含用户名密码登录进系统,有两个功能菜单, …

大模型在软件研发协同演进

大模型在软件研发协同演进大模型在软件研发领域的应用AI时代软件工程变革与智能化发展趋势智能体能力逐渐成熟人机协同办公场景联动研发工作流,人机交互模式变革研发数字员工研发基础建设案例自动CR测试场景研发场景研…

NocoBase 走进德国大学课堂

将 NocoBase 作为课堂工具,带领学生从零搭建应用,完成低代码/无代码从理论到实践的跨越。原文链接:https://www.nocobase.com/cn/blog/university-course 背景 在德国某科技大学的课程《使用低代码平台进行应用开发…

2025青海视频号运营最新推荐:创意内容与高效推广策略的完美

2025青海视频号运营最新推荐:创意内容与高效推广策略的完美结合随着移动互联网的迅猛发展,短视频平台已经成为企业和个人展示自我、传播信息的重要渠道。在青海地区,视频号作为微信生态中的重要一环,其影响力和用户…

【Kotlin】一种基于链表结构的事件传播机制设计与实现 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …