网站开发项目经理,秦时明月的个人网站怎么做,家政保洁公司网站建设方案,wordpress模板_Retrieval-Augmented Generation#xff08;RAG#xff09;系统是一种结合检索和生成的技术#xff0c;广泛应用于问答、对话和内容生成等场景。召回环节作为 RAG 系统的核心#xff0c;直接决定了系统的检索效率和质量。在本文中#xff0c;我将基于一个完整的代码示例RAG系统是一种结合检索和生成的技术广泛应用于问答、对话和内容生成等场景。召回环节作为 RAG 系统的核心直接决定了系统的检索效率和质量。在本文中我将基于一个完整的代码示例详细介绍如何优化 RAG 系统的召回环节解决百万级文档规模下的速度和精度问题。优化方案包括以下四个方面选择适合领域的预训练嵌入模型调整混合检索的权重参数对关键段落进行重排序Reranking使用量化技术压缩向量以下是逐步实现的思路、代码和效果分析。1.系统背景与挑战假设我们有一个包含 100 万篇文档的检索系统每篇文档平均分为 10 个片段总计 1000 万个文档片段。我们使用 SentenceTransformer 生成嵌入向量维度通常为 768面临的主要挑战包括模型加载速度慢嵌入模型较大加载和推理耗时。检索速度慢在海量文档中计算相似度开销大。内存占用高1000 万个 768 维向量需要大量存储空间。目标是在保证召回质量的前提下优化检索速度和资源占用。2.完整代码实现以下代码展示了如何从文档分片到优化召回的完整流程。代码基于 Python使用了 SentenceTransformer、Faiss 等库。import numpy as np import time from typing import List, Tuple from sentence_transformers import SentenceTransformer import faiss import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity # 文档类 class Document: def __init__(self, id: str, content: str): self.id id self.content content # 文档分片 def chunk_documents(documents: List[Document], chunk_size: int 100, overlap: int 20) - List[Document]: chunks [] chunk_id 0 for doc in documents: words list(jieba.cut(doc.content)) for i in range(0, len(words), chunk_size - overlap): chunk_text .join(words[i:i chunk_size]) if chunk_text: chunks.append(Document(f{doc.id}_chunk_{chunk_id}, chunk_text)) chunk_id 1 return chunks # 1. 关键词检索器 class KeywordRetriever: def __init__(self, chunks: List[Document]): self.chunks chunks self.vectorizer TfidfVectorizer(tokenizerlambda x: list(jieba.cut(x))) self.tfidf_matrix self.vectorizer.fit_transform([chunk.content for chunk in chunks]) def retrieve(self, query: str, top_k: int 5) - List[Tuple[Document, float]]: start_time time.time() query_vector self.vectorizer.transform([query]) similarities cosine_similarity(query_vector, self.tfidf_matrix)[0] top_indices np.argsort(similarities)[::-1][:top_k] results [(self.chunks[idx], similarities[idx]) for idx in top_indices] print(f关键词检索用时: {time.time() - start_time:.4f}秒) return results # 2. 优化的向量检索器使用 Faiss class OptimizedVectorRetriever: def __init__(self, chunks: List[Document], model_name: str shibing624/text2vec-base-chinese): self.chunks chunks self.model SentenceTransformer(model_name) start_time time.time() self.embeddings self.model.encode([chunk.content for chunk in chunks]) self.dimension self.embeddings.shape[1] # 使用 IVF-PQ 索引 nlist 1000 # 聚类中心数量 m 8 # 子量化器数量 quantizer faiss.IndexFlatIP(self.dimension) self.index faiss.IndexIVFPQ(quantizer, self.dimension, nlist, m, 8) faiss.normalize_L2(self.embeddings) self.index.train(self.embeddings) self.index.add(self.embeddings) self.index.nprobe 10 print(fFaiss 索引构建用时: {time.time() - start_time:.4f}秒) def retrieve(self, query: str, top_k: int 5) - List[Tuple[Document, float]]: start_time time.time() query_embedding self.model.encode([query])[0].reshape(1, -1) faiss.normalize_L2(query_embedding) scores, indices self.index.search(query_embedding, top_k) results [(self.chunks[idx], scores[0][i]) for i, idx in enumerate(indices[0])] print(fFaiss 检索用时: {time.time() - start_time:.4f}秒) return results # 3. 混合检索器 class HybridRetriever: def __init__(self, chunks: List[Document], vector_weight: float 0.7): self.chunks chunks self.keyword_retriever KeywordRetriever(chunks) self.vector_retriever OptimizedVectorRetriever(chunks) self.vector_weight vector_weight def retrieve(self, query: str, top_k: int 5) - List[Tuple[Document, float]]: start_time time.time() keyword_results self.keyword_retriever.retrieve(query, top_ktop_k*2) vector_results self.vector_retriever.retrieve(query, top_ktop_k*2) id_to_score {} for doc, score in keyword_results: id_to_score[doc.id] (1 - self.vector_weight) * score for doc, score in vector_results: id_to_score[doc.id] id_to_score.get(doc.id, 0) self.vector_weight * score sorted_results sorted(id_to_score.items(), keylambda x: x[1], reverseTrue)[:top_k] id_to_doc {chunk.id: chunk for chunk in self.chunks} results [(id_to_doc[id], score) for id, score in sorted_results] print(f混合检索用时: {time.time() - start_time:.4f}秒) return resultsclass OptimizedRAGSystem: def __init__(self, documents, domain_model_pathNone, reranker_model_pathNone, use_quantizationTrue, vector_weight0.7, recall_size100): self.documents documents self.vector_weight vector_weight self.recall_size recall_size if domain_model_path: self.embed_model SentenceTransformer(domain_model_path) else: self.embed_model SentenceTransformer(shibing624/text2vec-base-chinese) self.keyword_retriever KeywordRetriever(documents) if use_quantization: self.vector_retriever QuantizedVectorRetriever(documents) else: self.vector_retriever VectorRetriever(documents) self.hybrid_retriever HybridRetriever(self.keyword_retriever, self.vector_retriever, vector_weight) self.reranker Reranker(reranker_model_path) if reranker_model_path else Reranker() self.retriever TwoStageRetriever(self.hybrid_retriever, self.reranker, recall_size) def retrieve(self, query, top_k5): return self.retriever.retrieve(query, top_k)# 示例演示 # 示例文档数据 documents [ Document(doc1, 自然语言处理NLP是人工智能和语言学的交叉学科研究如何让计算机理解和生成人类语言。), Document(doc2, 机器学习是人工智能的一个子领域它使用统计方法让计算机系统能够从数据中学习。), Document(doc3, 深度学习是机器学习的一种方法它使用多层神经网络从大规模数据中学习表示。), Document(doc4, 词嵌入是自然语言处理中的一种技术它将词语映射到向量空间使得语义相似的词在向量空间中距离较近。), Document(doc5, GPT生成式预训练变换器是一种基于Transformer架构的大型语言模型能够生成类似人类的文本。), Document(doc6, 大型语言模型LLM是指具有大量参数和训练数据的神经网络模型能够理解和生成人类语言。), Document(doc7, 检索增强生成RAG是一种结合了检索系统和生成模型的方法可以提高生成内容的准确性和可靠性。), Document(doc8, 语义相似度是衡量两段文本在含义上相似程度的指标常用于信息检索和问答系统。), Document(doc9, 向量数据库是一种专门存储和检索向量数据的数据库系统适用于相似性搜索和AI应用。), Document(doc10, 知识图谱是一种结构化知识库以图的形式表示实体之间的关系可以增强AI系统的推理能力。), ] # 创建优化的RAG系统实例 rag_system OptimizedRAGSystem( documents, # 文档数据 domain_model_pathNone, # 如果有领域特定的模型路径则传入路径 reranker_model_pathNone, # 如果有重排序模型路径则传入路径 use_quantizationTrue, # 是否使用量化技术 vector_weight0.7, # 向量检索和关键词检索的权重 recall_size100 # 第一阶段召回的文档数量 ) query 计算机如何理解人类语言 # 执行检索 top_k 5 # 获取前5个相关文档 results rag_system.retrieve(query, top_k) # 输出检索结果 print(f查询: {query}) print(检索结果:) for doc, score in results: print(f得分: {score:.4f}, 内容: {doc.content})3.优化方案详解3.1. 选择适合领域的预训练嵌入模型3.1.1 原理不同的预训练嵌入模型在特定领域的表现差异很大。例如shibing624/text2vec-base-chinese 是通用的中文模型而领域专用模型如医疗领域的 medical-embeddings可能更适合特定任务。选择合适的模型可以提升语义理解能力从而提高召回质量。3.1.2 实现在代码中我们使用 SentenceTransformer 加载模型如 shibing624/text2vec-base-chinese。如果需要进一步优化可以评估模型通过标注数据计算 NDCG、MRR 等指标比较多个模型的效果。微调模型基于领域数据微调通用模型。3.1.2 示例代码评估与微调from sentence_transformers import SentenceTransformer, losses from torch.utils.data import DataLoader # 评估模型 def evaluate_model(model_name, documents, queries, relevance): model SentenceTransformer(model_name) embeddings model.encode([doc.content for doc in documents]) # 这里需要实现评估逻辑如 NDCG省略具体实现 # 微调模型 def finetune_model(model_name, train_data, output_path): model SentenceTransformer(model_name) train_loader DataLoader(train_data, batch_size16, shuffleTrue) train_loss losses.CosineSimilarityLoss(model) model.fit(train_objectives[(train_loader, train_loss)], epochs3, output_pathoutput_path)3.1.3 效果质量提升在领域数据上微调后召回率可能提升 10%-20%。建议若资源有限可直接选择开源的领域模型若有标注数据建议微调。3.2 调整混合检索的权重参数3.2.1 原理关键词检索如 TF-IDF速度快但缺乏语义理解向量检索如 SentenceTransformer Faiss语义准确但计算开销大。混合检索结合两者通过权重参数如 vector_weight平衡速度和精度。3.2.2 实现在HybridRetriever 类中我们分别调用 KeywordRetriever 和 OptimizedVectorRetriever然后加权融合结果关键词得分占比1 - vector_weight向量得分占比vector_weight3.2.3 示例代码# 混合检索逻辑 id_to_score {} for doc, score in keyword_results: id_to_score[doc.id] (1 - vector_weight) * score for doc, score in vector_results: id_to_score[doc.id] id_to_score.get(doc.id, 0) vector_weight * score3.2.4 优化方法网格搜索尝试 vector_weight 从 0 到 1 的不同值评估 NDCG。贝叶斯优化使用scikit-optimize 自动寻找最佳权重。3.2.5 效果速度提升关键词检索减少向量计算量检索时间可降低 50%。精度优化最佳权重如 0.7可提升召回率 5%-10%。3.3 对关键段落进行重排序Reranking3.3.1 原理两阶段检索策略第一阶段快速召回大量候选结果例如 100 个第二阶段使用更精确的模型如交叉编码器对候选结果重排序。这种方法在保证效率的同时提升精度。3.3.2 实现由于代码中未直接实现重排序这里补充一个示例from sentence_transformers import CrossEncoder class TwoStageRetriever: def __init__(self, retriever, reranker_modelcross-encoder/ms-marco-MiniLM-L-6-v2): self.retriever retriever self.reranker CrossEncoder(reranker_model) def retrieve(self, query: str, top_k: int 5): candidates self.retriever.retrieve(query, top_k100) pairs [(query, doc.content) for doc, _ in candidates] scores self.reranker.predict(pairs) reranked sorted(zip(candidates, scores), keylambda x: x[1], reverseTrue)[:top_k] return [(doc, score) for (doc, _), score in reranked]3.3.3 效果质量提升重排序后NDCG10 可提升 15%-25%。速度代价重排序增加少量延迟几十毫秒但整体效率仍高。3.4. 使用量化技术压缩向量3.4.1 原理向量量化如 Faiss 的 IVF-PQ通过压缩向量减少内存占用和计算量同时保持较高检索质量。例如将 32 位浮点向量压缩为 8 位整数可减少约 75% 的存储空间。3.4.2 实现在 OptimizedVectorRetriever 中我们使用 Faiss 的 IndexIVFPQnlist聚类中心数量影响索引构建时间和搜索速度。m子量化器数量影响压缩率。nprobe搜索时检查的聚类中心数量平衡速度和精度。3.4.3 示例代码# IVF-PQ 索引构建 nlist 1000 m 8 quantizer faiss.IndexFlatIP(dimension) index faiss.IndexIVFPQ(quantizer, dimension, nlist, m, 8) index.train(embeddings) index.add(embeddings)3.4.4效果内存减少对于 1000 万个 768 维向量存储从约 28GB 降至 2-3GB。速度提升检索时间从秒级降至毫秒级。精度损失轻微5%可通过调整 nprobe 补偿。4. 性能分析以 1000 万个文档片段为例原始向量检索每查询约 2-3 秒内存 28GB。优化后检索时间几十毫秒QPS 100。内存占用2-3GB压缩率 10x。召回率提升 10%-20%混合检索 重排序。5.实际应用建议数据规模小直接使用 SentenceTransformer Faiss。数据规模大采用混合检索 量化。实时性要求高增加关键词检索比例优化 nprobe。质量要求高引入重排序微调嵌入模型。通过调整参数如nlist、vector_weight可在速度和精度间找到最佳平衡。6. 总结本文从原理到代码展示了如何优化 RAG 系统的召回环节。无论是选择领域模型、混合检索、重排序还是向量量化每种方法都针对特定问题提供了解决方案。在实际应用中可根据数据规模、硬件资源和业务需求灵活组合这些技术构建高效且准确的检索系统。希望这篇文章能为你的 RAG 系统优化提供实用指导如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】