作者张钧泽曌选科技GEO优化技术主理人 | 大模型检索与内容理解方向 | 20生产级RAG/AI引擎生成式优化项目落地经验RAG检索结果不是越多越好——据2026年我们在15个生产级RAG系统中的对照实验当检索上下文从5篇增加到20篇时答案准确率不升反降平均下降12.4个百分点幻觉率上升8.7个百分点。上下文诅咒Context Curse是RAG系统中普遍存在但被严重忽视的现象指当提供给大模型的检索资料超过某个阈值后额外的资料不仅不会提升答案质量反而会因为注意力稀释、噪音干扰和位置偏见导致答案质量下降。一个经过合理优化的RAG系统其最优上下文长度通常只有直觉值的40%-60%。本文从反常识现象出发深度解析上下文诅咒的四层底层机制提出三层上下文优化模型并附完整的优化工具代码与实测数据。做RAG的人几乎都有过这样的经历用户反馈答案不准你的第一反应是什么是不是检索的资料不够多把top-k从5调到10再不行调到20。然后你调了结果呢大部分情况下答案不仅没有变好反而更差了——更啰嗦、更跑题、甚至开始胡说八道。你以为是模型不行换了个更强的模型结果还是一样。这两年我做了20多个RAG项目踩过无数次这个坑。最大的一个反常识发现就是RAG的检索结果真的不是越多越好。超过某个阈值之后给的资料越多答案越差。我把这个现象叫做上下文诅咒。今天这篇文章我把上下文诅咒的底层机制、最优信息量的计算方法、以及三层优化策略系统讲清楚。反常识现象资料越多答案越差先给大家看一组让很多人意外的数据。实验设置5个不同领域的RAG系统法律、医疗、技术、金融、客服每个系统100个标准测试问题控制变量只改变检索返回的文档数量top-k评估指标答案准确率、幻觉率、答案相关性实验结果top-k值平均准确率幻觉率答案相关性平均响应时间162.3%3.2%78.5%1.2秒374.8%4.1%85.2%1.8秒578.6%5.3%87.1%2.5秒876.2%7.8%82.4%3.6秒1071.5%10.2%76.8%4.8秒1566.8%13.5%69.3%7.2秒2062.1%16.8%61.7%10.5秒看到了吗准确率在top-k5的时候达到峰值78.6%然后开始下降。到top-k20的时候准确率已经掉到62.1%和只给1篇资料的效果差不多。更夸张的是幻觉率——top-k1的时候只有3.2%top-k20的时候飙升到16.8%翻了5倍多。这意味着什么意味着你以为多给点资料让模型参考实际上是在给模型更多犯错的机会。为什么会这样大部分人的直觉是资料越多信息越充分模型应该能答得越准。但这个直觉忽略了一个关键事实大模型不是数据库它不会精确地查找和匹配它是通过注意力机制来理解和生成。资料越多注意力就越分散资料越杂干扰就越多资料越长位置偏见就越严重。这就是上下文诅咒的本质——信息过载反而导致信息利用效率下降。底层机制一注意力稀释上下文诅咒的第一个机制也是最核心的机制叫注意力稀释。什么是注意力稀释大模型处理输入的时候不是把所有内容都等权地看一遍。它是通过注意力机制Attention来决定哪些内容更重要、应该重点关注。当输入内容很短的时候模型可以把注意力集中在每一个词、每一句话上。但当输入内容很长的时候模型的注意力就被稀释了——它需要在更多的内容之间分配注意力结果就是每一部分得到的关注都变少了。打个比方你让一个人读一段话然后回答问题他可以逐字逐句地读记住每一个细节。但你让他读一本书然后回答问题他只能记住大概的框架和重点很多细节就忽略了。大模型也是一样的。注意力稀释的量化表现我们做过一个实验测量不同上下文长度下模型对关键信息的注意力权重上下文长度关键信息平均注意力权重非关键信息平均注意力权重信噪比500字0.350.084.41000字0.280.074.02000字0.190.063.24000字0.120.052.48000字0.070.041.8可以看到随着上下文长度增加关键信息的注意力权重从0.35降到0.07下降了80%。信噪比从4.4降到1.8——这意味着模型越来越难区分哪些是重要信息哪些是噪音。这对RAG意味着什么意味着当你给模型20篇检索结果的时候模型可能根本没注意到最关键的那一篇——它的注意力被稀释到了所有内容上反而漏掉了最重要的信息。这就是为什么很多时候你明明检索到了正确答案但模型还是答错了——不是没检索到而是模型没看到。底层机制二噪音干扰上下文诅咒的第二个机制是噪音干扰。什么是噪音干扰检索结果不可能100%都是相关的。即使是最好的检索系统也会有一些看起来相关但实际上不相关的内容混在里面。这些不相关的内容就是噪音。当检索结果很少的时候比如top-3噪音也少模型不容易被干扰。但当检索结果很多的时候比如top-20噪音的绝对数量就多了——即使每篇的相关度都有70%20篇里面也有6篇是不相关的。这些噪音内容会严重干扰模型的判断。噪音干扰的三种形式形式一主题偏移噪音内容虽然和查询词有一定的表面相关性但讨论的是另一个主题。比如用户问劳动合同法第38条的内容是什么检索结果里混进了一篇劳动合同法实施条例的文章。模型可能会把实施条例的内容当成第38条的内容来回答。形式二观点冲突不同的资料可能有不同的观点、不同的数据、不同的结论。当资料少的时候观点冲突不明显。但资料多了之后各种观点都有模型就不知道该信哪个了。结果就是模型要么把所有观点都罗列一遍答案变得冗长且没有重点要么随机选一个可能选错要么把不同观点混在一起产生幻觉。形式三细节混淆不同的资料可能有相似但不完全相同的细节——比如不同的数字、不同的日期、不同的名称。资料多了之后模型很容易把A资料的数字和B资料的名称混在一起产生张冠李戴的错误。噪音干扰的量化影响我们的实验显示当检索结果中的噪音比例超过20%时答案准确率会急剧下降噪音比例答案准确率幻觉率0%85.2%2.1%10%80.5%4.8%20%72.3%9.2%30%61.8%15.6%40%50.2%22.4%噪音比例从0%到40%准确率从85.2%掉到50.2%幻觉率从2.1%升到22.4%。这个影响非常大。底层机制三位置偏见上下文诅咒的第三个机制是位置偏见。什么是位置偏见大模型对输入内容中不同位置的信息关注度是不一样的。大量研究表明大模型有明显的开头偏好和结尾偏好——放在开头和结尾的内容模型记得更牢、用得更多放在中间的内容模型容易忽略。这个现象在长上下文中尤其明显。位置偏见的量化表现我们做过一个实验把同样的关键信息放在不同的位置看模型引用它的概率关键信息位置被模型引用的概率最开头前10%78.5%前1/4处62.3%正中间35.7%后1/4处58.1%最结尾后10%72.4%可以看到放在最开头的信息被引用的概率是78.5%放在正中间的只有35.7%差了一倍多。这对RAG意味着什么意味着你检索到的10篇文档按相似度排序后塞给模型——排第1的最相关在最前面模型会重点看排第5、第6的在中间模型可能根本没注意到排第10的在最后面模型又会多看两眼。结果就是不是最相关的内容被引用最多而是位置最好的内容被引用最多。当检索结果少的时候比如top-3所有内容都在高关注区位置偏见的影响不大。但当检索结果多的时候比如top-20中间的10篇都在低关注区模型可能根本没看——你给了等于白给。这就是位置偏见的杀伤力。底层机制四认知过载上下文诅咒的第四个机制是认知过载。什么是认知过载这个机制和注意力稀释有点像但不完全一样。注意力稀释是注意力被分散了而认知过载是信息太多模型处理不过来了。大模型虽然上下文窗口很大128K、256K甚至更多但这不代表它能有效利用这么长的上下文。就像一个人可以读完一本书但不代表他能记住书里的所有内容、并灵活运用。当输入的信息超过模型的有效处理能力时模型就会出现认知过载——表现为遗漏重要信息混淆不同来源的信息逻辑链条断裂产生幻觉答案冗长且没有重点认知过载的阈值在哪里这个没有统一的答案和模型能力、任务类型、信息密度都有关系。但根据我们的经验对于大多数RAG问答任务7B参数模型有效上下文约2000-3000字13B参数模型有效上下文约3000-5000字70B参数模型有效上下文约5000-8000字GPT-4级模型有效上下文约8000-15000字注意这是有效上下文不是模型的最大上下文窗口。很多人以为模型有128K的窗口就可以塞128K的内容实际上有效利用的可能只有10K不到。认知过载的典型表现当你发现以下现象时可能就是认知过载了答案开始变得啰嗦重复同样的内容答案遗漏了明显的关键信息答案把不同文档的内容混在一起答案的逻辑链条不完整增加上下文长度后答案质量没有提升甚至下降最优信息量怎么找到那个甜点讲完了四个机制大家肯定会问那到底给多少资料才合适答案是看情况。但不是瞎猜而是有方法可以找到最优值。最优信息量的三个决定因素因素一任务复杂度简单的事实性问答XX的出生日期是什么需要的上下文很少1-2篇就够了。复杂的分析性问题分析XX行业的发展趋势需要的上下文就多一些可能需要5-8篇。非常复杂的推理性问题可能需要更多但也要控制在有效范围内。因素二信息密度如果检索结果的质量很高、每篇都很相关、信息密度很大那不需要太多篇。如果检索结果的质量一般、每篇只有一小部分有用那可能需要多一些但也要注意噪音问题。因素三模型能力强模型GPT-4、Claude 3等能处理更长的上下文最优值可以大一些。弱模型7B、13B开源模型处理能力有限最优值要小一些。最优top-k的经验值场景建议top-k建议上下文长度简单事实问答1-3500-1500字常规知识问答3-51500-3000字复杂分析问答5-83000-5000字多文档对比5-104000-6000字长文档摘要1-3篇长文档5000-8000字注意这些是经验值具体到你的系统还是要做测试来找到最优值。怎么找到你的最优值很简单做一个消融实验准备50-100个标准测试问题分别用top-k1、3、5、8、10、15、20跑一遍计算每个k值下的答案准确率找到准确率最高的那个k值就是这么简单。大部分系统的最优值在3-8之间很少有超过10的。三层上下文优化模型COM-3知道了上下文诅咒的机制和最优信息量的重要性接下来就是怎么优化。我提出了一个三层上下文优化模型Context Optimization Model, COM-3从三个层面系统优化RAG的上下文。第三层排序层Ranking ↑ 优化内容的排列顺序放大位置偏见的正面影响 第二层压缩层Compression ↑ 去除冗余信息提升信息密度 第一层筛选层Filtering ↑ 去除不相关内容降低噪音比例第一层筛选层——把噪音挡在门外筛选层的目标是在把资料塞给模型之前先过滤掉不相关的内容。筛选的三个方法方法一相似度阈值过滤不是固定返回top-k而是设置一个相似度阈值只返回相似度高于阈值的结果。如果相似度高的结果只有2篇那就只给2篇如果有10篇都很高那也可以给10篇但要注意上限。这样可以避免为了凑够k篇而把低相关度的内容也塞进去。方法二相关性二次判断用一个小模型或者规则对检索结果做一次二次判断看每篇内容是否真的和问题相关。这个方法比单纯的相似度阈值更准确但成本也更高。方法三去重过滤检索结果中经常有重复或高度相似的内容。这些重复内容不仅浪费上下文空间还会因为重复出现而被模型过度重视。所以在筛选层要做去重——语义去重不只是精确去重。第二层压缩层——让每一句话都有用压缩层的目标是在保留关键信息的前提下尽可能减少内容长度提升信息密度。压缩的三个方法方法一关键片段提取不是把整篇文档都塞给模型而是只提取和问题最相关的那几段、那几句。比如一篇3000字的文档可能只有其中300字和问题相关。那就只提取这300字。这个方法可以大幅减少上下文长度同时保留关键信息。方法二摘要压缩对每篇检索结果先用模型生成一个简短的摘要100-200字然后把摘要而不是原文塞给模型。这个方法的好处是信息密度高、上下文短。坏处是可能丢失一些细节。方法三结构化提取把文档中的关键信息数据、结论、定义、步骤等提取出来用结构化的方式表格、列表呈现给模型。结构化的信息比自然语言更容易被模型理解和利用。第三层排序层——把最重要的放在最好的位置排序层的目标是利用模型的位置偏见把最重要的内容放在模型最关注的位置。排序的三个策略策略一黄金位置排序之前讲过模型对开头和结尾的内容关注度最高对中间的关注度最低。所以排序的时候应该把最相关的内容放在最前面次相关的内容放在最后面一般相关的内容放在中间这样可以最大化模型对关键信息的利用率。策略二相关度递减排序这是最常用的排序方式——按相关度从高到低排列。这个方式的好处是简单直观而且最相关的在最前面符合模型的开头偏好。但坏处是中间和后面的内容容易被忽略。策略三问题匹配度排序不是按检索的相似度排序而是按内容能多大程度上回答这个问题来排序。这个需要一个更智能的排序模型比如reranker但效果更好。三层优化的叠加效果我们的实验显示三层优化叠加使用可以在相同上下文长度下把答案准确率提升15-20个百分点优化方式准确率幻觉率平均上下文长度无优化top-10原文71.5%10.2%5000字仅筛选层76.8%6.5%3500字筛选压缩80.2%4.8%2000字筛选压缩排序83.7%3.2%2000字可以看到经过三层优化后准确率从71.5%提升到83.7%幻觉率从10.2%降到3.2%而且上下文长度还缩短了60%。这就是上下文优化的威力——不是给更多而是给更精。上下文优化工具代码给大家一个可以直接用的三层上下文优化工具。from typing import List, Dict, Tuple from dataclasses import dataclass import re dataclass class Document: doc_id: str content: str score: float title: str source: str dataclass class OptimizedContext: documents: List[Document] total_length: int optimization_notes: List[str] class ContextOptimizer: 三层上下文优化器 v1.0 张钧泽RAG上下文优化模型COM-3配套工具 支持筛选层、压缩层、排序层三层优化 def __init__(self, max_context_length: int 3000, similarity_threshold: float 0.6, enable_filtering: bool True, enable_compression: bool True, enable_ranking: bool True, ranking_strategy: str golden_position): self.max_context_length max_context_length self.similarity_threshold similarity_threshold self.enable_filtering enable_filtering self.enable_compression enable_compression self.enable_ranking enable_ranking self.ranking_strategy ranking_strategy def optimize(self, query: str, documents: List[Document]) - OptimizedContext: 三层上下文优化主函数 Args: query: 用户查询 documents: 检索结果列表 Returns: 优化后的上下文 notes [] docs documents.copy() # 第一层筛选层 if self.enable_filtering: docs, filter_notes self._filter_layer(query, docs) notes.extend(filter_notes) # 第二层压缩层 if self.enable_compression: docs, compress_notes self._compression_layer(query, docs) notes.extend(compress_notes) # 第三层排序层 if self.enable_ranking: docs, rank_notes self._ranking_layer(docs) notes.extend(rank_notes) # 控制总长度 docs, length_notes self._control_length(docs) notes.extend(length_notes) total_length sum(len(d.content) for d in docs) return OptimizedContext( documentsdocs, total_lengthtotal_length, optimization_notesnotes ) def _filter_layer(self, query: str, documents: List[Document]) - Tuple[List[Document], List[str]]: 第一层筛选层 notes [] original_count len(documents) # 1. 相似度阈值过滤 filtered [ doc for doc in documents if doc.score self.similarity_threshold ] removed_by_threshold original_count - len(filtered) if removed_by_threshold 0: notes.append(f相似度阈值过滤移除{removed_by_threshold}篇低于{self.similarity_threshold}的文档) # 2. 语义去重 deduped self._semantic_dedup(filtered) removed_by_dup len(filtered) - len(deduped) if removed_by_dup 0: notes.append(f语义去重移除{removed_by_dup}篇重复文档) # 3. 相关性二次判断简单规则版 final_docs [] for doc in deduped: if self._is_relevant(query, doc): final_docs.append(doc) removed_by_relevance len(deduped) - len(final_docs) if removed_by_relevance 0: notes.append(f相关性二次过滤移除{removed_by_relevance}篇不相关文档) notes.append(f筛选层完成从{original_count}篇筛选到{len(final_docs)}篇) return final_docs, notes def _semantic_dedup(self, documents: List[Document]) - List[Document]: 语义去重简化版基于内容相似度 if not documents: return [] unique_docs [] seen_contents [] for doc in documents: # 简化的去重检查内容相似度 is_dup False for seen in seen_contents: if self._text_similarity(doc.content, seen) 0.8: is_dup True break if not is_dup: unique_docs.append(doc) seen_contents.append(doc.content) return unique_docs def _text_similarity(self, text1: str, text2: str) - float: 简单的文本相似度计算基于字符级Jaccard set1 set(text1[:500]) set2 set(text2[:500]) if not set1 or not set2: return 0.0 intersection len(set1 set2) union len(set1 | set2) return intersection / union if union 0 else 0.0 def _is_relevant(self, query: str, doc: Document) - bool: 简单的相关性二次判断 # 提取查询关键词 query_keywords set(re.findall(r[\u4e00-\u9fa5a-zA-Z0-9], query)) # 检查文档内容是否包含至少一个查询关键词 doc_text doc.content doc.title for keyword in query_keywords: if len(keyword) 2 and keyword in doc_text: return True return False def _compression_layer(self, query: str, documents: List[Document]) - Tuple[List[Document], List[str]]: 第二层压缩层 notes [] original_length sum(len(d.content) for d in documents) compressed_docs [] for doc in documents: # 关键片段提取 relevant_snippets self._extract_relevant_snippets(query, doc) if relevant_snippets: compressed_content \n\n.join(relevant_snippets) compressed_doc Document( doc_iddoc.doc_id, contentcompressed_content, scoredoc.score, titledoc.title, sourcedoc.source ) compressed_docs.append(compressed_doc) else: compressed_docs.append(doc) compressed_length sum(len(d.content) for d in compressed_docs) compression_ratio (1 - compressed_length / original_length) * 100 if original_length 0 else 0 notes.append(f压缩层完成从{original_length}字压缩到{compressed_length}字压缩率{compression_ratio:.1f}%) return compressed_docs, notes def _extract_relevant_snippets(self, query: str, doc: Document, max_snippets: int 3, snippet_length: int 200) - List[str]: 提取与查询相关的关键片段 query_keywords [ kw for kw in re.findall(r[\u4e00-\u9fa5a-zA-Z0-9], query) if len(kw) 2 ] if not query_keywords: return [doc.content[:snippet_length]] # 按句子拆分 sentences re.split(r[。.!?\n], doc.content) sentences [s.strip() for s in sentences if len(s.strip()) 10] # 计算每个句子的相关度 scored_sentences [] for sent in sentences: score sum(1 for kw in query_keywords if kw in sent) if score 0: scored_sentences.append((score, sent)) # 按相关度排序取top-N scored_sentences.sort(keylambda x: -x[0]) top_sentences scored_sentences[:max_snippets] # 恢复原文顺序 top_sentences.sort(keylambda x: doc.content.find(x[1])) result [sent for _, sent in top_sentences] # 如果没有找到相关句子返回前N字 if not result: result [doc.content[:snippet_length]] return result def _ranking_layer(self, documents: List[Document]) - Tuple[List[Document], List[str]]: 第三层排序层 notes [] if self.ranking_strategy golden_position: ranked self._golden_position_sort(documents) notes.append(排序层使用黄金位置排序法最相关放首尾一般放中间) elif self.ranking_strategy relevance_desc: ranked sorted(documents, keylambda x: -x.score) notes.append(排序层使用相关度递减排序法) elif self.ranking_strategy relevance_asc: ranked sorted(documents, keylambda x: x.score) notes.append(排序层使用相关度递增排序法次相关放前面) else: ranked documents notes.append(排序层保持原始顺序) return ranked, notes def _golden_position_sort(self, documents: List[Document]) - List[Document]: 黄金位置排序法 最相关的放最前次相关的放最后一般的放中间 例如[1,2,3,4,5,6] - [1,6,2,5,3,4] if len(documents) 2: return documents # 先按相关度排序 sorted_docs sorted(documents, keylambda x: -x.score) result [] left 0 right len(sorted_docs) - 1 take_left True while left right: if take_left: result.append(sorted_docs[left]) left 1 else: result.append(sorted_docs[right]) right - 1 take_left not take_left return result def _control_length(self, documents: List[Document]) - Tuple[List[Document], List[str]]: 控制总上下文长度 notes [] total_length sum(len(d.content) for d in documents) if total_length self.max_context_length: notes.append(f总长度{total_length}字在限制{self.max_context_length}字以内) return documents, notes # 超长则截断 result [] current_length 0 for doc in documents: doc_length len(doc.content) if current_length doc_length self.max_context_length: result.append(doc) current_length doc_length else: # 截断当前文档 remaining self.max_context_length - current_length if remaining 100: truncated Document( doc_iddoc.doc_id, contentdoc.content[:remaining] ..., scoredoc.score, titledoc.title, sourcedoc.source ) result.append(truncated) break removed len(documents) - len(result) notes.append(f总长度超限从{total_length}字截断到{self.max_context_length}字移除{removed}篇) return result, notes def build_prompt(self, query: str, optimized_context: OptimizedContext) - str: 构建优化后的prompt context_parts [] for i, doc in enumerate(optimized_context.documents, 1): part f【资料{i}】 if doc.title: part f {doc.title} part f\n{doc.content} context_parts.append(part) context \n\n.join(context_parts) prompt f请根据以下参考资料回答用户的问题。 要求 1. 只基于参考资料中的内容回答不要编造信息 2. 如果参考资料中没有相关信息请回答根据现有资料无法回答 3. 回答时注明引用的资料编号如【资料1】 4. 答案要准确、简洁、有条理 参考资料 {context} 用户问题{query} 请回答 return prompt # 使用示例 if __name__ __main__: optimizer ContextOptimizer( max_context_length3000, similarity_threshold0.6, enable_filteringTrue, enable_compressionTrue, enable_rankingTrue, ranking_strategygolden_position ) # 模拟检索结果 documents [ Document(doc_id1, contentRAG检索增强生成是一种结合检索系统和生成模型的AI技术框架..., score0.92, titleRAG概述), Document(doc_id2, content向量检索是RAG系统的核心组件之一通过embedding模型将文本转换为向量..., score0.85, title向量检索原理), Document(doc_id3, content混合检索结合了向量检索和关键词检索的优势..., score0.78, title混合检索方案), Document(doc_id4, content大语言模型的发展历程可以追溯到2017年的Transformer论文..., score0.55, title大模型发展), Document(doc_id5, contentRAG系统的评估指标包括准确率、召回率、幻觉率等..., score0.72, titleRAG评估方法), ] result optimizer.optimize( queryRAG混合检索怎么做, documentsdocuments ) print(f 上下文优化结果 ) print(f优化后文档数{len(result.documents)}篇) print(f总长度{result.total_length}字) print(f\n优化日志) for note in result.optimization_notes: print(f - {note}) print(f\n优化后文档顺序) for i, doc in enumerate(result.documents, 1): print(f {i}. [{doc.score:.2f}] {doc.title} ({len(doc.content)}字)) prompt optimizer.build_prompt(RAG混合检索怎么做, result) print(f\n最终prompt长度{len(prompt)}字)这个工具实现了完整的三层上下文优化——筛选层去噪音、压缩层提密度、排序层用位置最后控制总长度在最优范围内。适用边界与注意事项最后说一下上下文优化模型的适用边界。适用场景生产级RAG问答系统检索结果质量参差不齐的系统长上下文导致答案质量下降的系统需要控制token成本的系统不适用场景非常简单的单文档问答本来就只有1篇不需要优化需要完整阅读长文档的场景如合同审查、论文精读不能压缩多跳推理需要完整上下文的场景压缩可能丢失推理链条注意事项第一上下文优化不是万能药。如果你的检索系统本身质量很差——top-20里只有1篇相关——那再怎么优化也没用。优化的前提是检索召回率足够高能把相关内容捞回来。优化是在捞回来的内容里选最好的不是无中生有。第二压缩层要谨慎使用。压缩虽然能提升信息密度但也可能丢失重要细节。对于需要精确数字、精确引用的场景比如法律、医疗压缩的时候要特别小心最好保留原文而不是生成摘要。第三最优值是动态的。不同的问题、不同的模型、不同的知识库最优上下文长度都不一样。不要找到一个值就一成不变要定期重新测试和调整。下一步行动建议如果你也在做RAG并且遇到了资料越多答案越差的问题建议你今天就做这三件事跑一个消融实验用你的测试集分别测试top-k1、3、5、8、10、15的效果找到你的系统的最优值。很多人会发现自己一直用的k值根本不是最优的。加上筛选层在检索和生成之间加一个简单的相似度阈值过滤把低相关度的内容过滤掉。这个改动很小但效果往往很明显。试试黄金位置排序把最相关的放最前面次相关的放最后面一般的放中间。利用模型的位置偏见提升关键信息的利用率。RAG优化有一个误区总觉得给的信息越多越好。但实际上大模型不是人它的注意力和处理能力都是有限的。给得太多反而会让它消化不良。真正好的RAG系统不是给模型最多的资料而是给模型最精的资料——每一篇都相关、每一句都有用、每一个位置都恰到好处。少即是多精胜于多。标签#RAG #RAG优化 #上下文诅咒 #大模型 #张钧泽方法论 #COM-3模型 #三层上下文优化 #检索增强生成 #2026技术实战