首页 / 资讯中心 / 文章详情

在检索增强生成(RAG)系统中,用户查询通常较短、歧义较多,而向量检索又依赖语义相似度进行召回

在检索增强生成(RAG)系统中,用户查询通常较短、歧义较多,而向量检索又依赖语义相似度进行召回 ★ FEATURED ARTICLE
在检索增强生成RAG系统中用户查询通常较短、歧义较多而向量检索又依赖语义相似度进行召回。这会导致一种典型问题检索结果中既包含真正相关的文档也包含“看起来相似但实际不相关”的噪声文档。传统伪相关反馈Pseudo-Relevance Feedback, PRF通常假设 top-k 检索结果大多是相关的并直接利用它们扩展查询但在真实业务场景中这一假设经常不成立。“伪负向量增强查询”可以理解为在向量检索过程中利用大模型或检索日志识别出疑似不相关但语义接近的文档将其作为“伪负向量”用于修正查询表示、过滤噪声结果并进一步提升召回质量。它不同于简单删除低分结果而是把“形似神不似”的伪负样本转化为增强信号使查询向量更贴近真实意图。这一思路与近年来的查询增强、伪相关反馈、负样本学习、难负样本挖掘等方向密切相关。二、技术原理伪负向量增强查询的核心流程可以分为五步初始检索对用户原始查询进行向量检索得到 top-k 候选文档。伪负判定利用大模型、规则或日志反馈判断哪些候选文档属于“伪负样本”。伪负向量聚合将伪负文档的向量聚合为“负方向信号”。查询向量修正从原始查询向量中减去伪负方向得到增强后的查询向量。二次检索与融合使用增强查询向量重新检索并与原始结果融合得到最终文档集合。用公式化方式表达可以写作q_enhanced normalize(q - α * pseudo_negative_direction)其中q是原始查询向量α是负向抑制系数pseudo_negative_direction由伪负文档向量加权平均得到。这样做的直观含义是让查询向量远离那些“容易误导检索”的语义区域从而提升后续召回的纯度。三、Python 实现下面给出一套可运行的 Python 示例。为便于理解示例使用随机向量模拟嵌入模型和向量库实际工程中可以替换为sentence-transformers、BGE、GTE等嵌入模型以及 FAISS、Milvus、Weaviate 等向量数据库。importnumpyasnpfromtypingimportList,Dict,TupleclassPseudoNegativeQueryEnhancer:伪负向量增强查询器def__init__(self,alpha:float0.3,pseudo_negative_threshold:float0.5,max_pseudo_negatives:int5,dim:int128,):self.alphaalpha self.pseudo_negative_thresholdpseudo_negative_threshold self.max_pseudo_negativesmax_pseudo_negatives self.dimdim# 模拟文档库实际应替换为向量数据库self.documents:List[Dict][]self.doc_vectors:np.ndarraynp.array([])defbuild_index(self,documents:List[Dict]):构建向量索引self.documentsdocuments vectors[doc[vector]fordocindocuments]self.doc_vectorsnp.array(vectors,dtypenp.float32)defcosine_similarity(self,a:np.ndarray,b:np.ndarray)-float:计算余弦相似度norm_anp.linalg.norm(a)norm_bnp.linalg.norm(b)ifnorm_a0ornorm_b0:return0.0returnfloat(np.dot(a,b)/(norm_a*norm_b))definitial_search(self,query_vector:np.ndarray,k:int10)-List[Tuple[int,float]]:初始向量检索返回 (doc_index, similarity)simsself.doc_vectors query_vector/(np.linalg.norm(self.doc_vectors,axis1)*np.linalg.norm(query_vector)1e-8)top_k_idxnp.argsort(-sims)[:k]return[(int(idx),float(sims[idx]))foridxintop_k_idx]defidentify_pseudo_negatives(self,query:str,candidates:List[Tuple[int,float]],)-List[Tuple[int,float]]: 伪负样本识别 实际工程中可替换为 LLM 判断、点击日志、用户反馈或重排模型打分。 这里采用简化规则相似度处于中间区间且文本不包含查询关键词。 pseudo_negatives[]query_lowerquery.lower()fordoc_idx,simincandidates:doc_textself.documents[doc_idx][text].lower()# 简化判定相似度不低但缺乏关键语义重叠is_semantically_weakquery_lowernotindoc_text in_ambiguous_zoneself.pseudo_negative_thresholdsim0.85ifis_semantically_weakandin_ambiguous_zone:pseudo_negatives.append((doc_idx,sim))# 限制伪负样本数量避免噪声过大pseudo_negatives.sort(keylambdax:-x[1])returnpseudo_negatives[:self.max_pseudo_negatives]defenhance_query(self,query_vector:np.ndarray,pseudo_negatives:List[Tuple[int,float]],)-np.ndarray:利用伪负向量修正查询向量ifnotpseudo_negatives:returnquery_vector/(np.linalg.norm(query_vector)1e-8)negative_vectors[]weights[]fordoc_idx,siminpseudo_negatives:negative_vectors.append(self.doc_vectors[doc_idx])weights.append(sim)negative_vectorsnp.array(negative_vectors)weightsnp.array(weights)weightsweights/(weights.sum()1e-8)pseudo_negative_direction(weights[:,None]*negative_vectors).sum(axis0)enhancedquery_vector-self.alpha*pseudo_negative_directionreturnenhanced/(np.linalg.norm(enhanced)1e-8)defsearch_with_enhancement(self,query:str,query_vector:np.ndarray,k:int5,initial_k:int10,)-List[Dict]:伪负向量增强检索主流程# 1. 初始检索candidatesself.initial_search(query_vector,kinitial_k)# 2. 识别伪负样本pseudo_negativesself.identify_pseudo_negatives(query,candidates)# 3. 增强查询向量enhanced_query_vectorself.enhance_query(query_vector,pseudo_negatives)# 4. 二次检索enhanced_candidatesself.initial_search(enhanced_query_vector,kk)# 5. 返回结果results[]fordoc_idx,siminenhanced_candidates:results.append({id:self.documents[doc_idx][id],text:self.documents[doc_idx][text],similarity:round(sim,4),is_pseudo_negative_filtered:any(doc_idxpn_idxforpn_idx,_inpseudo_negatives),})returnresults# ------------------------------# 模拟数据与测试# ------------------------------defnormalize_vector(v:np.ndarray)-np.ndarray:returnv/(np.linalg.norm(v)1e-8)defbuild_mock_documents()-List[Dict]: 构造一组具有语义干扰的模拟文档。 真实项目中应替换为知识库切片、向量嵌入和向量数据库。 docs[{id:doc1,text:Python 异步编程中的 asyncio 事件循环机制},{id:doc2,text:Python 多线程与多进程在 IO 密集型任务中的区别},{id:doc3,text:Java 虚拟机垃圾回收算法与内存管理},{id:doc4,text:Python 装饰器原理与常见应用场景},{id:doc5,text:Python 批量图像处理脚本开发实践},{id:doc6,text:Python 控制台进度条与日志输出优化},{id:doc7,text:大模型 RAG 系统中的向量检索与重排策略},{id:doc8,text:Python 自动化运维中的系统监控脚本设计},{id:doc9,text:软件设计师考试中数据结构与算法高频考点},{id:doc10,text:Python 文件批量重命名与路径处理技巧},]np.random.seed(42)dim128fordocindocs:doc[vector]normalize_vector(np.random.randn(dim))returndocsdefmain():documentsbuild_mock_documents()enhancerPseudoNegativeQueryEnhancer(alpha0.35,pseudo_negative_threshold0.45,max_pseudo_negatives3,dim128,)enhancer.build_index(documents)queryPython 批量图像处理自动化脚本query_vectornormalize_vector(np.random.randn(128))print(f查询{query})print(-*60)resultsenhancer.search_with_enhancement(queryquery,query_vectorquery_vector,k5,initial_k10,)forrinresults:print(f[{r[id]}] sim{r[similarity]}ffiltered{r[is_pseudo_negative_filtered]}|{r[text]})if__name____main__:main()四、代码解析1. 初始检索initial_search使用余弦相似度对查询向量与文档向量进行匹配。这是向量检索系统中最常见的第一阶段召回方式。2. 伪负样本识别identify_pseudo_negatives是整个方法的关键。它从 top-k 候选文档中筛选出“相似度不低但语义匹配较弱”的文档。示例中使用了关键词缺失和相似度区间作为简化判定条件生产环境中可以替换为LLM 判断文档是否与查询真正相关用户点击、跳过、负反馈日志重排模型对相关性的打分历史误召日志挖掘。3. 伪负向量聚合enhance_query将伪负文档向量加权聚合形成“负方向”。权重越高说明该文档越容易误导检索因此对查询向量的修正作用也越强。4. 查询向量修正修正公式为q_enhanced normalize(q - α * pseudo_negative_direction)这里α控制抑制强度。α过大可能导致查询向量偏离原始意图α过小则增强效果不明显。5. 二次检索与结果返回增强后的查询向量会重新参与检索。最终结果可以只返回二次检索结果也可以与原始结果做 RRF 融合以兼顾召回稳定性。五、技术亮点1. 把“噪声”变成“信号”传统做法往往直接丢弃低分文档但伪负向量增强查询会利用那些“看似相关、实际不相关”的文档。它们恰恰反映了查询与文档之间的语义边界能够显著提升模型区分能力。2. 不依赖完整训练流程示例中的增强过程发生在检索阶段不需要重新训练嵌入模型。实际系统中也可以将其作为检索前或检索后增强模块接入现有 RAG 流水线。3. 与混合检索兼容该方法可以与 BM25、向量检索、图谱检索、RRF 融合结合。例如先用多路召回获取候选集再用伪负向量增强进行二次过滤和重排。4. 工程可扩展性强伪负样本识别模块可以替换为多种实现轻量规则关键词、实体、领域标签重排模型Cross-Encoder 打分LLM 判别让模型判断文档是否真正回答查询日志学习利用用户负反馈持续优化伪负识别策略。5. 适合复杂查询场景当查询包含多个意图、专业术语或容易混淆的概念时伪负向量增强能够帮助系统远离错误语义区域。例如查询“Python 批量图像处理”时系统可以抑制与“Java 虚拟机”“软件设计师考试理论”等弱相关文档的干扰。六、实验与评估建议实际落地时建议从以下指标进行评估指标含义关注点RecallKTop-K 召回率是否找到更多相关文档NDCGK排序质量相关文档是否排在前面PrecisionK前 K 条准确率噪声是否减少伪负识别准确率伪负样本判断是否正确是否误伤正样本端到端回答准确率RAG 最终回答质量是否提升生成效果评估时应特别注意避免“过度抑制”。如果伪负识别模块过于激进可能把真正相关的文档也排除掉。因此建议设置alpha、pseudo_negative_threshold、max_pseudo_negatives等参数的消融实验。七、局限与改进方向伪负识别依赖质量如果伪负样本判断错误增强反而会引入噪声。生产环境最好结合 LLM 判别、重排模型和用户反馈。α 参数需要调优不同数据集、不同嵌入模型下负向抑制强度差异较大。建议通过验证集自动搜索。查询漂移风险若伪负方向过强增强后的查询可能偏离原始意图。可以加入原始查询向量残差约束。可与 Query2doc、HyDE、MultiQuery 结合伪负向量增强主要解决“远离错误语义”而 Query2doc、HyDE、多查询扩展则负责“靠近正确语义”。两者结合有望进一步提升召回质量。可引入在线学习长期来看系统可以持续收集用户对检索结果的点击、跳过、差评行为动态更新伪负样本池形成闭环优化。八、总结伪负向量增强查询是一种面向 RAG 检索质量提升的增强策略。它通过识别并抑制“形似神不似”的伪负文档使查询向量更加聚焦真实意图。该方法实现成本较低可与现有向量检索、混合检索、重排和大模型生成模块灵活组合。对于企业内部知识库、工程文档检索、智能问答系统等场景具有较好的实践价值。
阅读完成 · 觉得有帮助?
咨询建站