RAG-03查询与检索模块
RAG之查询与检索模块概述检索增强生成(Retrieval-Augmented Generation, RAG)系统的核心在于其查询与检索模块该模块负责准确高效地从知识库中检索出相关信息为后续的生成任务提供上下文支持。本文档将详细介绍RAG系统中的查询变换、排序与后处理、混合检索等关键技术并提供Elasticsearch实现混合检索的实例。1. 查询变换技术查询变换是RAG系统中的关键预处理步骤旨在优化用户查询以提高检索质量。主要包括同义改写、查询分解和HyDE等技术。1.1 同义改写同义改写通过识别和替换查询中的同义词或近义词扩展查询的语义覆盖范围从而提高检索召回率。实现方法基于词典的同义词替换基于预训练语言模型的语义等价变换基于上下文的动态同义词生成优势提高对同一概念不同表达方式的覆盖缓解词汇不匹配问题增强系统对不同用户表达习惯的适应性示例原始查询: 如何提高机器学习模型的准确率 改写查询: 怎样增强机器学习算法的精度1.2 查询分解查询分解将复杂查询拆分为多个简单子查询分别检索后再合并结果适用于多方面或复合型问题。实现方法基于问题类型的分解如比较型、步骤型、原因型基于语义依赖的子句拆分基于意图识别的多查询生成优势提高对复杂问题的理解能力针对不同子问题获取更精准的信息支持多角度信息整合示例原始查询: 比较深度学习和传统机器学习在图像识别中的优缺点 分解查询: 1. 深度学习在图像识别中的优势 2. 传统机器学习在图像识别中的优势 3. 深度学习在图像识别中的局限性 4. 传统机器学习在图像识别中的局限性1.3 HyDE (Hypothetical Document Embeddings)HyDE是一种先进的查询变换技术通过生成假设性文档来增强查询表示提高语义检索效果。工作原理使用语言模型基于原始查询生成假设性答案文档将假设文档编码为向量表示使用该向量在向量数据库中进行相似度检索优势将查询转换为与文档空间更匹配的表示缓解查询-文档语义鸿沟问题提高对隐式意图的捕获能力实现示例defhyde_query_transform(original_query,llm_model,embedding_model):# 1. 生成假设性文档hypothetical_docllm_model.generate(promptf请为以下问题生成一个详细的答案:{original_query})# 2. 编码假设文档query_vectorembedding_model.encode(hypothetical_doc)returnquery_vector,hypothetical_doc2. 排序和后处理检索结果的后处理阶段对提高最终结果质量至关重要主要包括重排序、结果过滤和多样性优化等技术。2.1 重排序(Reranking)重排序对初始检索结果进行更精确的评估和重新排序提高相关性排序的准确性。常用方法基于交叉编码器(Cross-Encoder)的深度重排序基于特征工程的机器学习排序模型多阶段级联排序策略实现示例fromtransformersimportAutoModelForSequenceClassification,AutoTokenizerclassCrossEncoderReranker:def__init__(self,model_name):self.tokenizerAutoTokenizer.from_pretrained(model_name)self.modelAutoModelForSequenceClassification.from_pretrained(model_name)defrerank(self,query,documents,top_k10):scores[]fordocindocuments:inputsself.tokenizer(query,doc,return_tensorspt,truncationTrue)scoreself.model(**inputs).logits.squeeze().item()scores.append((doc,score))# 按分数降序排序ranked_docssorted(scores,keylambdax:x[1],reverseTrue)return[docfordoc,scoreinranked_docs[:top_k]]2.2 结果过滤结果过滤基于特定规则或标准移除不相关或低质量的结果提高检索结果的纯净度。过滤策略基于置信度阈值的过滤基于内容质量指标的过滤基于时效性和权威性的过滤2.3 多样性优化多样性优化确保检索结果覆盖多个相关方面避免结果过于集中或重复。优化方法最大边际相关性(Maximal Marginal Relevance, MMR)聚类多样性选择基于主题覆盖的多样性优化MMR实现示例defmmr_reranking(query_embedding,doc_embeddings,docs,lambda_param0.7,top_k5):selected_indices[]remaining_indiceslist(range(len(docs)))# 选择与查询最相似的文档作为第一个best_idxmax(remaining_indices,keylambdai:cosine_similarity(query_embedding,doc_embeddings[i]))selected_indices.append(best_idx)remaining_indices.remove(best_idx)# 迭代选择后续文档whilelen(selected_indices)top_kandremaining_indices:best_score-float(inf)best_idxNoneforidxinremaining_indices:# 计算与查询的相似度sim_to_querycosine_similarity(query_embedding,doc_embeddings[idx])# 计算与已选文档的最大相似度max_sim_to_selectedmax(cosine_similarity(doc_embeddings[idx],doc_embeddings[s_idx])fors_idxinselected_indices)# 计算MMR分数mmr_scorelambda_param*sim_to_query-(1-lambda_param)*max_sim_to_selectedifmmr_scorebest_score:best_scoremmr_score best_idxidxifbest_idxisnotNone:selected_indices.append(best_idx)remaining_indices.remove(best_idx)return[docs[i]foriinselected_indices]3. 混合检索(Hybrid Search)混合检索结合多种检索策略的优势克服单一方法的局限性实现更全面、准确的信息检索。3.1 混合检索架构混合检索通常结合以下两种主要方法关键词检索基于精确匹配的BM25等算法向量检索基于语义相似度的dense检索架构优势结合词汇匹配和语义匹配的优势提高对不同类型查询的适应性平衡精确召回和语义召回3.2 融合策略混合检索的关键在于如何有效融合不同检索方法的结果分数融合defscore_fusion(bm25_scores,vector_scores,alpha0.5): 分数线性融合 alpha: 控制BM25和向量分数的权重 # 归一化分数bm25_normnormalize_scores(bm25_scores)vector_normnormalize_scores(vector_scores)# 线性组合fused_scores{}all_doc_idsset(bm25_norm.keys()).union(set(vector_norm.keys()))fordoc_idinall_doc_ids:bm25_scorebm25_norm.get(doc_id,0)vector_scorevector_norm.get(doc_id,0)fused_scores[doc_id]alpha*bm25_score(1-alpha)*vector_scorereturnsorted(fused_scores.items(),keylambdax:x[1],reverseTrue)RRF(Reciprocal Rank Fusion)defrrf_fusion(bm25_results,vector_results,k60): 倒数排名融合 k: 平滑参数通常设为60 doc_scores{}# 处理BM25结果forrank,(doc_id,score)inenumerate(bm25_results,1):doc_scores[doc_id]doc_scores.get(doc_id,0)1.0/(krank)# 处理向量检索结果forrank,(doc_id,score)inenumerate(vector_results,1):doc_scores[doc_id]doc_scores.get(doc_id,0)1.0/(krank)returnsorted(doc_scores.items(),keylambdax:x[1],reverseTrue)4. Elasticsearch混合检索实现Elasticsearch提供了强大的混合检索能力结合了传统的BM25关键词检索和现代的kNN向量检索。4.1 环境准备Elasticsearch版本要求Elasticsearch 8.0 (支持原生向量检索)安装必要的向量检索插件索引映射配置{mappings:{properties:{title:{type:text,analyzer:standard},content:{type:text,analyzer:standard},content_vector:{type:dense_vector,dims:768,index:true,similarity:cosine},metadata:{type:object}}}}4.2 数据索引文档索引示例fromelasticsearchimportElasticsearchfromsentence_transformersimportSentenceTransformer# 初始化连接esElasticsearch([http://localhost:9200])embedding_modelSentenceTransformer(all-MiniLM-L6-v2)# 索引文档defindex_document(doc_id,title,content,metadataNone):# 生成向量content_vectorembedding_model.encode(content).tolist()doc{title:title,content:content,content_vector:content_vector,metadata:metadataor{}}es.index(indexdocuments,iddoc_id,bodydoc)# 批量索引示例documents[{id:1,title:机器学习基础,content:机器学习是人工智能的一个分支...},{id:2,title:深度学习入门,content:深度学习是机器学习的一个子领域...},# 更多文档...]fordocindocuments:index_document(doc[id],doc[title],doc[content])4.3 混合检索实现方法一使用script_score查询实现混合检索defhybrid_search_script_score(es_client,query_text,query_vector,size10): 使用script_score实现混合检索 query{size:size,query:{script_score:{query:{match:{content:{query:query_text,operator:and}}},script:{source: double bm25_score _score; double cosine_similarity cosineSimilarity(params.query_vector, content_vector); return params.alpha * bm25_score (1 - params.alpha) * (cosine_similarity 1.0); ,params:{query_vector:query_vector,alpha:0.5# 控制BM25和向量相似度的权重}}}}}responsees_client.search(indexdocuments,bodyquery)return[hit[_source]forhitinresponse[hits][hits]]方法二使用bool查询结合kNN实现混合检索defhybrid_search_bool_knn(es_client,query_text,query_vector,size10): 使用bool查询结合kNN实现混合检索 query{size:size,query:{bool:{should:[{match:{content:{query:query_text,boost:1.0# BM25权重}}},{script_score:{query:{match_all:{}},script:{source:cosineSimilarity(params.query_vector, content_vector) 1.0,params:{query_vector:query_vector}},boost:1.0# 向量检索权重}}],minimum_should_match:1}}}responsees_client.search(indexdocuments,bodyquery)return[hit[_source]forhitinresponse[hits][hits]]方法三使用Elasticsearch 8.0的kNN检索defhybrid_search_knn(es_client,query_text,query_vector,size10): 使用Elasticsearch 8.0的kNN检索实现混合检索 query{size:size,query:{bool:{should:[{match:{content:{query:query_text,boost:1.0}}},{knn:{field:content_vector,query_vector:query_vector,k:size,boost:1.0}}],minimum_should_match:1}}}responsees_client.search(indexdocuments,bodyquery)return[hit[_source]forhitinresponse[hits][hits]]4.4 完整检索流程示例classRAGRetrievalSystem:def__init__(self,es_hosthttp://localhost:9200,index_namedocuments):self.esElasticsearch([es_host])self.index_nameindex_name self.embedding_modelSentenceTransformer(all-MiniLM-L6-v2)defpreprocess_query(self,query):查询预处理可以集成同义改写、HyDE等技术# 示例简单查询扩展expanded_queryf{query}相关信息returnexpanded_querydefsearch(self,query,size10,use_hybridTrue):执行检索# 查询预处理processed_queryself.preprocess_query(query)# 生成查询向量query_vectorself.embedding_model.encode(processed_query).tolist()ifuse_hybrid:# 混合检索resultsself.hybrid_search_knn(processed_query,query_vector,size)else:# 仅向量检索resultsself.vector_search(query_vector,size)returnresultsdefhybrid_search_knn(self,query_text,query_vector,size10):混合检索实现query{size:size,query:{bool:{should:[{match:{content:{query:query_text,boost:1.0}}},{knn:{field:content_vector,query_vector:query_vector,k:size,boost:1.0}}],minimum_should_match:1}}}responseself.es.search(indexself.index_name,bodyquery)return[hit[_source]forhitinresponse[hits][hits]]defvector_search(self,query_vector,size10):纯向量检索query{size:size,query:{knn:{field:content_vector,query_vector:query_vector,k:size}}}responseself.es.search(indexself.index_name,bodyquery)return[hit[_source]forhitinresponse[hits][hits]]# 使用示例rag_systemRAGRetrievalSystem()resultsrag_system.search(如何提高机器学习模型的准确率,size5)forresultinresults:print(f标题:{result[title]})print(f内容:{result[content][:100]}...)print(---)5. 性能优化与最佳实践5.1 索引优化向量索引优化选择合适的相似度度量余弦相似度、点积、欧氏距离调整向量维度平衡精度和性能使用近似最近邻(ANN)算法提高检索速度文本索引优化选择合适的分析器(analyzer)配置合理的字段映射使用自定义评分函数5.2 查询优化混合检索权重调优根据数据特点调整BM25和向量检索的权重针对不同查询类型使用不同融合策略实现动态权重调整机制缓存策略缓存热门查询的向量表示缓存频繁访问的检索结果实现多级缓存架构5.3 评估与监控评估指标召回率(Recall)和精确率(Precision)平均精度均值(MAP)归一化折扣累积增益(NDCG)监控指标查询响应时间索引大小和内存使用查询吞吐量6. 总结RAG系统的查询与检索模块是实现高质量信息检索的关键。通过查询变换、排序后处理和混合检索等技术可以显著提高检索的准确性和效率。Elasticsearch作为强大的检索引擎提供了实现混合检索的理想平台结合了传统关键词检索和现代向量检索的优势。在实际应用中需要根据具体场景和数据特点选择合适的技术组合并通过持续优化和评估来提升系统性能。随着检索技术的不断发展RAG系统的查询与检索模块也将持续演进为更智能的信息检索提供支持。

相关新闻

【微机原理与接口技术】实战解析:8086寻址方式与指令系统的高效应用

【微机原理与接口技术】实战解析:8086寻址方式与指令系统的高效应用

1. 从“纸上谈兵”到“实战编程”:为什么必须吃透8086寻址方式? 很多朋友一听到“微机原理”、“8086”、“寻址方式”,第一反应可能就是枯燥的教科书和复杂的理论。我刚开始学的时候也这么觉得,书上列了七八种寻址方式&#xff0…

2026/5/17 1:12:06 阅读更多 →
Zotero7必装插件:better-notes自定义学术笔记模板全攻略(附代码)

Zotero7必装插件:better-notes自定义学术笔记模板全攻略(附代码)

Zotero 7 学术笔记革命:用 Better Notes 插件打造你的专属文献知识库 作为一名长期与文献打交道的科研人,你是否也曾陷入这样的困境:读过的论文,几个月后只记得一个模糊的印象;辛辛苦苦记下的笔记,散落在各…

2026/7/4 1:37:47 阅读更多 →
反激式电源设计避坑指南:从MATLAB仿真看PID参数对输出电压稳定的影响

反激式电源设计避坑指南:从MATLAB仿真看PID参数对输出电压稳定的影响

反激式电源设计避坑指南:从MATLAB仿真看PID参数对输出电压稳定的影响 作为一名电源工程师,你是否曾为反激式电源的输出电压在轻载或负载跳变时出现的“打嗝”或低频振荡而彻夜难眠?面对示波器上那令人心烦意乱的波形,反复调整补偿…

2026/5/17 12:33:38 阅读更多 →

最新新闻

合同管理系统的实施-开发费用问题

合同管理系统的实施-开发费用问题

此前《从纸质台账到数智中台:合同管理系统的演进与未来》一文,梳理了合同管理系统的发展脉络。从功能迭代角度来看,合同管理系统是依托 OA 无纸化办公、企业信息化的基础需求,逐步拆分独立出来的专业化管理软件。在专业化演变进程…

2026/7/4 20:39:43 阅读更多 →
如何免费获取国家中小学智慧教育平台电子课本PDF:智能解析下载方案

如何免费获取国家中小学智慧教育平台电子课本PDF:智能解析下载方案

如何免费获取国家中小学智慧教育平台电子课本PDF:智能解析下载方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。…

2026/7/4 20:37:42 阅读更多 →
AutoRaise终极指南:3步实现macOS鼠标悬停窗口自动聚焦,提升5倍工作效率

AutoRaise终极指南:3步实现macOS鼠标悬停窗口自动聚焦,提升5倍工作效率

AutoRaise终极指南:3步实现macOS鼠标悬停窗口自动聚焦,提升5倍工作效率 【免费下载链接】AutoRaise AutoRaise (and focus) a window when hovering over it with the mouse 项目地址: https://gitcode.com/gh_mirrors/au/AutoRaise 在macOS多任务…

2026/7/4 20:35:42 阅读更多 →
【强烈推荐收藏】2026网络安全:国家战略支柱与最确定职业红利

【强烈推荐收藏】2026网络安全:国家战略支柱与最确定职业红利

【强烈推荐收藏】2026网络安全:国家战略支柱与最确定职业红利 文章指出2026年网络安全已成为国家战略核心,新《网络安全法》实施加大处罚力度,产业市场规模扩大与人才缺口并存。两会明确网络安全是数字时代的刚需与国家战略支柱,…

2026/7/4 20:31:41 阅读更多 →
基于YOLOv5的道路损坏实时检测系统开发实践

基于YOLOv5的道路损坏实时检测系统开发实践

1. 项目概述:基于YOLOv5的道路损坏识别系统道路损坏检测一直是交通基础设施维护中的痛点问题。传统人工巡检方式效率低下且成本高昂,而基于计算机视觉的自动化检测方案正在逐步改变这一现状。我们开发的这套系统采用YOLOv5目标检测框架,能够实…

2026/7/4 20:29:41 阅读更多 →
Codex 实战 Skills:发生 Bug 时,用 Skill 自动捕获堆栈并格式化推送到群聊的预警技能

Codex 实战 Skills:发生 Bug 时,用 Skill 自动捕获堆栈并格式化推送到群聊的预警技能

Codex 实战 Skills:发生 Bug 时,用 Skill 自动捕获堆栈并格式化推送到群聊的预警技能 在现代软件工程的敏捷开发与运维体系中,故障的发现速度直接决定了系统的恢复时间(MTTR)。当生产环境发生异常时,传统的日志查看方式往往存在滞后性,而基于即时通讯工具(如飞书、钉钉…

2026/7/4 20:27:41 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻