掘金 人工智能 06月11日 10:24
从零开始搭建RAG系统系列(九):RAG系统性能优化技巧-检索模块优化 (Optimizing Retriever)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了RAG(Retrieval-Augmented Generation)系统中的检索模块优化策略,旨在提升RAG系统在实际应用中的性能。文章从Embedding模型选择、查询重写/扩展、重排阶段、混合检索以及文本分块策略等多个层面,提供了详细的优化技巧和实现要点,帮助开发者构建更高效、更准确的RAG系统。

💡 选择更优的Embedding模型是提升检索质量的关键。应该关注MTEB等评测榜单,根据实际需求权衡模型大小与性能,并考虑领域适应性和及时更新。

✍️ 查询重写/扩展能够改善检索效果。通过LLM对原始查询进行预处理,澄清模糊表达、补全关键信息,生成更适合向量检索的查询。

✨ 重排阶段通过二次排序提升上下文质量。Cross-Encoder模型对初步检索结果进行更精细的排序,从而提高最终送入LLM的上下文质量。

🤝 混合检索结合了向量检索和关键词检索的优势。使用向量检索和关键词检索获取两组结果,通过融合策略合并和重排序结果,增强检索的鲁棒性。

🧱 优化文本分块策略对RAG性能至关重要。语义分块、父文档检索和小块嵌入-大块检索等高级策略能够更好地适应不同数据特点,提高检索效果。

搭建基础的RAG系统只是第一步,要使其在实际应用中表现出色,性能优化至关重要。优化可以从检索模块、生成模块以及系统整体等多个层面进行。

检索模块优化 (Optimizing Retriever)

检索质量是RAG系统的基石,所谓“垃圾进,垃圾出”,如果检索不到相关的上下文,LLM也难以生成高质量的答案。

技巧1:选择更优的Embedding模型

技巧2:查询重写/扩展 (Query Rewriting/Expansion)

from langchain.chains import LLMChainfrom langchain_core.prompts import PromptTemplate# rewrite_llm = llm # 可以用与主生成LLM相同的模型,或一个更轻量的模型rewrite_template_str = """你的任务是将用户提出的原始问题改写成一个更清晰、更具体、更适合进行向量数据库检索的版本。请保留原始问题的核心意图,但可以澄清模糊表达、补全省略的关键信息。例如,如果用户问“那个新功能怎么样?”,假设你知道“那个新功能”指的是“智能摘要功能”,你可以改写为“智能摘要功能有哪些优点和缺点?”。原始问题:{original_query}改写后的问题:"""rewrite_prompt = PromptTemplate.from_template(rewrite_template_str)# query_rewriter_chain = LLMChain(llm=rewrite_llm, prompt=rewrite_prompt) # 旧版LLMChain# 使用LCEL风格构建query_rewriter_chain = rewrite_prompt | llm | StrOutputParser()# 假设 user_query 是原始用户输入# original_user_query = "RAGFlow的部署麻烦吗?" # rewritten_query = query_rewriter_chain.invoke({"original_query": original_user_query})# print(f"原始查询: {original_user_query}")# print(f"改写后用于检索的查询: {rewritten_query}")# # 之后,使用 rewritten_query 来调用 retriever.invoke()

查询扩展则可能涉及生成多个相关查询,然后并发检索并将结果合并。

技巧3:重排阶段 (Reranking Stage)

# 示例:使用 sentence-transformers 的 CrossEncoder (概念性)# from sentence_transformers.cross_encoder import CrossEncoder# reranker_model = CrossEncoder('BAAI/bge-reranker-base') # 选择一个合适的reranker模型# # 假设: # # retrieved_docs: List[Document] 是初步检索得到的文档列表# # user_query: str 是用户查询# if retrieved_docs:#     query_doc_pairs = [[user_query, doc.page_content] for doc in retrieved_docs]#     try:#         scores = reranker_model.predict(query_doc_pairs, show_progress_bar=False)        #         # 将分数与文档配对并按分数降序排序#         reranked_docs_with_scores = sorted(#             zip(scores, retrieved_docs), #             key=lambda pair: pair[0], #             reverse=True#         )        #         # 获取重排后的文档列表#         reranked_docs = [doc for score, doc in reranked_docs_with_scores]        #         # print("\n--- 重排后的文档 (Top 3) ---")#         # for i, doc in enumerate(reranked_docs[:3]):#         #     print(f"Rank {i+1} (Score: {reranked_docs_with_scores[i][0]:.4f}): {doc.page_content[:100]}...")#         # # 后续使用 reranked_docs (或其Top-N) 作为LLM的上下文#     except Exception as e:#         print(f"重排失败: {e}. 将使用原始检索结果。")#         # reranked_docs = retrieved_docs # 出错则回退# else:#    reranked_docs = []

技巧4:混合检索 (Hybrid Search)

技巧5:优化文本分块策略 (Chunking Strategy Optimization)

检索模块优化关键点总结

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

RAG 检索模块 Embedding 查询重写 混合检索
相关文章