掘金 人工智能 18小时前
RAG系列(四):RAG系统性能优化技巧
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了RAG(Retrieval-Augmented Generation)系统的性能优化,强调了检索模块和生成模块同等重要性。检索模块的优化包括选择更优的Embedding模型、查询重写/扩展、重排阶段、混合检索以及优化文本分块策略。生成模块的优化则侧重于精细化Prompt调优、LLM参数调整以及选择更适合的LLM模型。此外,还介绍了系统整体的优化方法,如结果缓存、流水线异步化与批处理、知识库的持续更新与维护,以及针对中文场景的特定优化。

🔍**检索模块优化**: 详细阐述了如何通过选择更优的Embedding模型来提高文本语义表示的准确性,包括参考MTEB榜单、权衡模型大小与性能、考虑领域适应性以及及时更新模型。此外,还介绍了查询重写/扩展技术,利用LLM对原始查询进行预处理,生成更适合向量检索的查询。

🥇**重排与混合检索**: 深入探讨了重排阶段的重要性,引入Cross-Encoder模型对初步检索的候选文档块进行二次排序,提升上下文质量。同时,强调了混合检索的优势,结合向量检索和关键词检索,以获得更鲁棒的检索效果。LangChain提供了集成重排器的组件,并支持构建混合检索器。

✂️**优化文本分块策略**: 强调了文本分块是RAG流程的起点,详细介绍了语义分块、父文档检索/小块嵌入-大块检索以及RAPTOR等高级分块和检索策略。父文档检索通过将文档分割成较小的子块用于检索,而将较大的父块提供给LLM,从而在检索时利用小块的精确性,生成时利用大块的上下文完整性。

⚙️**生成模块与系统优化**: 详细介绍了Prompt调优、LLM参数调整(如temperature、top_p、max_tokens)以及选择更适合的LLM模型的重要性。此外,还探讨了结果缓存、流水线异步化与批处理等系统整体优化方法,以加快响应速度并降低成本。针对中文场景,特别强调了中文分词/分块、中文字符友好的Embedding模型和LLM的重要性。

搭建基础的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)

生成模块优化 (Optimizing Generator)

即使检索到了高质量的上下文,LLM生成答案的环节也同样需要优化,以确保最终输出满足用户期望。

技巧1:精细化Prompt调优 (Advanced Prompt Engineering)

... (其他部分同前) ...【上下文信息】:---{context_str}---【用户问题】: {user_query}【你的思考过程】: (请你在这里一步步思考如何回答问题,例如:1. 理解用户问题的核心。2. 在上下文中寻找相关信息。3. 如果找到,如何组织答案。如果没找到,如何回应。)【你的回答】:

技巧2:LLM参数调整 (LLM Parameter Tuning)

技巧3:选择更适合的LLM模型

系统整体优化 (Overall System Optimization)

技巧1:结果缓存 (Caching)

# import langchain# from langchain.cache import InMemoryCache# langchain.llm_cache = InMemoryCache() # 设置全局LLM缓存 (示例)# # 之后,对同一个 prompt 的 LLM 调用结果会被缓存# # llm.invoke("相同的prompt") # 第二次调用会从缓存读取 (如果provider和参数不变)                    

技巧2:流水线异步化与批处理 (Asynchronous Pipeline & Batching)

技巧3:知识库的持续更新与维护

技巧4:针对中文场景的特定优化

通过上述优化技巧的组合应用,并结合持续的监控和评估,可以显著提升RAG系统的性能、稳定性和用户体验。

Fish AI Reader

Fish AI Reader

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

FishAI

FishAI

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

联系邮箱 441953276@qq.com

相关标签

RAG 性能优化 Embedding模型 LLM 检索
相关文章