当前位置: 首页 > article >正文

18种RAG技术大比拼:谁才是检索增强生成的最佳选择?

对于刚入门大模型的小白或是想深耕RAG技术的程序员来说检索增强生成RAG无疑是绕不开的核心技能——它完美解决了大模型“失忆”“ hallucination幻觉”的痛点通过检索海量文档补充上下文让生成的回答更精准、更可靠。但RAG的实现路径五花八门不同技术各有优劣新手很容易陷入“选哪种”的迷茫。今天我们就逐一拆解18种主流RAG技术附完整代码示例帮你快速分清优劣、找准适配场景收藏起来慢慢学在信息爆炸的当下如何从海量数据中快速精准提取有效信息是AI落地的核心难题。Retrieval-Augmented GenerationRAG检索增强生成技术应运而生它融合了“检索”的精准性和“生成”的流畅性先从文档库中检索相关信息再基于这些信息生成高质量回答广泛应用于ChatPDF、智能问答、企业知识库等场景。但RAG的实现方式千差万别不同技术的效果、复杂度、适用场景差异极大今天我们就逐一拆解看看哪一种最适合你上手实践。1.Simple RAG基础而不失经典在探索各种复杂的 RAG 技术之前我们先从最简单的 RAG 方法说起。简单 RAG 的工作流程非常直观从 PDF 文档中提取文本将其分割成小块chunks将这些文本块转换为数值化的嵌入向量embeddings根据查询query搜索最相关的文本块最后利用检索到的文本块生成回答。# 定义 PDF 文件路径 pdf_path data/AI_information.pdf # 提取文本并分割成文本块 extracted_text extract_text_from_pdf(pdf_path) text_chunks chunk_text(extracted_text, chunk_size1000, overlap200) # 打印文本块数量 print(Number of text chunks:, len(text_chunks))这种方法虽然简单但却为后续更复杂的技术奠定了基础。它就像是一个“新手村”让我们能够初步了解 RAG 的工作原理。然而简单 RAG 也有它的局限性。由于文本块是按照固定大小分割的可能会导致一些句子被拆分开或者将不相关的句子组合在一起从而影响检索的准确性。2.Semantic Chunking语义分块让文本块更有意义为了解决简单 RAG 中文本块分割不够合理的问题语义分块Semantic Chunking应运而生。与简单 RAG 不同语义分块不再是按照固定大小来分割文本而是尝试根据文本的语义来划分将语义相关的句子组合在一起形成文本块。# 将提取的文本分割成句子 sentences extracted_text.split(. ) # 为每个句子生成嵌入向量 embeddings [get_embedding(sentence) for sentence in sentences] # 计算连续句子之间的相似度 similarities [cosine_similarity(embeddings[i], embeddings[i 1]) for i in range(len(embeddings) - 1)] # 使用百分位法计算断点 breakpoints compute_breakpoints(similarities, methodpercentile, threshold90) # 根据断点将句子分组成语义块 text_chunks split_into_chunks(sentences, breakpoints)这种方法听起来很完美但在实际测试中它的表现却不尽如人意。语义分块的评分甚至低于简单 RAG这说明仅仅改变文本块的分割策略并不能保证检索效果的提升。这也提醒我们技术的改进并非一蹴而就需要更多的思考和尝试。3.上下文增强检索邻居也能提供帮助既然语义分块没有达到预期的效果我们不妨换个思路。简单 RAG 的问题在于文本块过于孤立缺乏上下文信息。那么如果我们能够为每个文本块添加一些上下文信息是不是就能提高检索的准确性呢上下文增强检索Context Enriched Retrieval正是基于这样的想法。# 定义上下文增强检索函数 def context_enriched_search(query, text_chunks, embeddings, k1, context_size1): query_embedding create_embeddings(query).data[0].embedding similarity_scores [] for i, chunk_embedding in enumerate(embeddings): similarity_score cosine_similarity(np.array(query_embedding), np.array(chunk_embedding.embedding)) similarity_scores.append((i, similarity_score)) similarity_scores.sort(keylambda x: x[1], reverseTrue) top_index similarity_scores[0][0] start max(0, top_index - context_size) end min(len(text_chunks), top_index context_size 1) return [text_chunks[i] for i in range(start, end)]在上下文增强检索中我们不仅检索与查询最相关的文本块还会检索其周围的文本块作为上下文信息。这些“邻居”文本块能够为检索提供更多的背景信息帮助生成更准确的回答。经过测试上下文增强检索的评分达到了 0.6相较于简单 RAG 和语义分块有了显著的提升。这表明上下文信息在检索过程中确实起到了关键作用。4.上下文块头给文本块加上“标签”上下文增强检索虽然有效但仍然存在一个问题即使有了上下文信息文本块本身可能仍然缺乏足够的语义信息。例如一个文档可能包含多个主题每个主题都对应着不同的文本块。在这种情况下如何快速准确地找到与查询最相关的文本块呢上下文块头Contextual Chunk Headers技术为我们提供了一个解决方案。它在每个文本块的前面添加了一个描述性的标题header这个标题就像是一个“标签”能够概括文本块的主要内容。# 为每个文本块生成描述性标题 text_chunks_with_headers chunk_text_with_headers(extracted_text, chunk_size1000, overlap200) # 打印一个样本以查看效果 print(Sample Chunk with Header:) print(Header:, text_chunks_with_headers[0][header]) print(Content:, text_chunks_with_headers[0][text])在检索过程中系统不仅会考虑文本块的内容还会参考其标题从而更准确地找到与查询相关的文本块。经过测试上下文块头的评分达到了 0.5虽然没有上下文增强检索高但也比简单 RAG 和语义分块有了明显的提升。这说明通过给文本块添加标题我们能够为检索提供更多的语义信息从而提高检索的准确性。5.文档增强从文本块到问题上下文块头虽然能够提供更多的语义信息但仍然存在局限性。在某些情况下文本块的内容可能过于复杂难以用一个简单的标题来概括。那么有没有一种方法能够让文本块更容易被检索到呢文档增强Document Augmentation技术为我们提供了一个新的思路。它不仅将文本块转换为嵌入向量还会为每个文本块生成一些相关的问题并将这些问题也转换为嵌入向量。# 处理文档提取文本、创建文本块、生成问题并构建向量库 text_chunks, vector_store process_document( pdf_path, chunk_size1000, chunk_overlap200, questions_per_chunk3 )这样一来在检索过程中系统不仅能够匹配文本块的内容还能够匹配与查询相关的问题从而提高检索的准确性。经过测试文档增强的评分达到了 0.8这是一个非常高的分数表明文档增强技术能够显著提高检索的准确性。这也说明通过为文本块生成相关问题我们能够为检索提供更多的入口从而更容易找到与查询相关的文本块。6.查询转换让查询更“友好”在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略。然而我们忽略了一个重要的因素用户提出的查询可能并不总是能够很好地匹配文档中的内容这可能会导致检索结果不准确。那么有没有一种方法能够让查询更“友好”更容易被检索到呢查询转换Query Transformation技术为我们提供了一个解决方案。它通过三种不同的方法来改进查询查询重写Query Rewriting、后退提示Step-back Prompting和子查询分解Sub-query Decomposition。# 查询重写 rewritten_query rewrite_query(query) # 后退提示 step_back_query generate_step_back_query(query) # 子查询分解 sub_queries decompose_query(query, num_subqueries4)查询重写是将查询变得更加具体和详细后退提示是创建一个更广泛的查询以检索有用的背景信息子查询分解则是将一个复杂的查询分解为多个简单的子查询。经过测试查询转换的评分达到了 0.5。虽然这个分数并不高但它仍然表明查询转换技术在某些情况下能够提高检索的准确性。这也提醒我们在 RAG 系统中不仅需要关注文本块的表示和检索策略还需要关注查询的质量。7.重排序让检索结果更有条理在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量。然而我们忽略了一个重要的环节检索结果的排序。简单相似性搜索通常会返回一组相关性和不相关性混杂的结果这可能会导致生成的回答不够准确。那么有没有一种方法能够让检索结果更有条理更容易被利用呢重排序Reranker技术为我们提供了一个解决方案。它在初始检索的基础上通过一个额外的步骤对检索结果进行重新排序将最相关的文本块放在最前面。重排序可以使用不同的方法例如基于关键词的重排序或基于 LLM 的重排序。# 定义重排序函数 def rag_with_reranking(query, vector_store, reranking_methodllm, top_n3, modelmeta-llama/Llama-3.2-3B-Instruct): query_embedding create_embeddings(query) initial_results vector_store.similarity_search(query_embedding, k10) if reranking_method llm: reranked_results rerank_with_llm(query, initial_results, top_ntop_n) else: reranked_results initial_results[:top_n] context /n/n/n/n.join([result[text] for result in reranked_results]) response generate_response(query, context, model) return { query: query, reranking_method: reranking_method, initial_results: initial_results[:top_n], reranked_results: reranked_results, context: context, response: response }这种方法的效果如何呢经过测试重排序的评分达到了 0.7。这个分数表明重排序技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明对检索结果进行重新排序是一个非常重要的步骤能够帮助我们更好地利用检索到的信息。8.相关段落提取RSE寻找连续的相关文本在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序。然而我们忽略了一个重要的问题有时候最佳的信息可能分散在多个连续的文本块中。那么有没有一种方法能够让系统自动识别并提取这些连续的相关文本呢相关段落提取Relevant Segment ExtractionRSE技术为我们提供了一个解决方案。它不是简单地检索最相关的文本块而是尝试识别并提取整个相关段落。# 运行 RAG 并应用相关段落提取 rse_result rag_with_rse(pdf_path, query)这种方法能够为生成回答提供更连贯和完整的上下文信息从而提高回答的质量。经过测试相关段落提取的评分达到了 0.8。这个分数表明相关段落提取技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明识别并提取连续的相关文本是一个非常重要的步骤能够帮助我们更好地利用检索到的信息。9.上下文压缩让信息更精炼在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本。然而我们忽略了一个重要的问题有时候检索到的信息可能过于冗长包含了大量与查询不相关的内容。这不仅会浪费计算资源还可能会影响生成回答的质量。那么有没有一种方法能够让检索到的信息更精炼只保留与查询最相关的内容呢上下文压缩Contextual Compression技术为我们提供了一个解决方案。它在检索到文本块之后通过一个额外的步骤对文本块进行压缩只保留与查询最相关的内容。# 定义上下文压缩函数 def rag_with_compression(pdf_path, query, k10, compression_typeselective, modelmeta-llama/Llama-3.2-3B-Instruct): vector_store process_document(pdf_path) results vector_store.similarity_search(create_embeddings(query), kk) retrieved_chunks [r[text] for r in results] compressed batch_compress_chunks(retrieved_chunks, query, compression_type, model) compressed_chunks, compression_ratios zip([(c, r) for c, r in compressed if c.strip()] or [(chunk, 0.0) for chunk in retrieved_chunks]) context /n/n---/n/n.join(compressed_chunks) response generate_response(query, context, model) return { query: query, original_chunks: retrieved_chunks, compressed_chunks: compressed_chunks, compression_ratios: compression_ratios, context_length_reduction: f{sum(compression_ratios)/len(compression_ratios):.2f}%, response: response }这种方法的效果如何呢经过测试上下文压缩的评分达到了 0.75。这个分数表明上下文压缩技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明对检索到的信息进行压缩是一个非常重要的步骤能够帮助我们更好地利用检索到的信息。10.反馈循环让系统不断学习在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩。然而我们忽略了一个重要的问题这些改进都是基于预先设定的策略系统无法根据实际的使用情况进行自我调整。那么有没有一种方法能够让系统根据用户的反馈不断学习和调整呢反馈循环Feedback Loop技术为我们提供了一个解决方案。它允许用户对系统的回答进行评价并将这些评价作为反馈信息存储起来。在后续的检索过程中系统会根据这些反馈信息对检索策略进行调整从而提高检索结果的质量。# 定义完整的 RAG 流程包含反馈机制 def full_rag_workflow(pdf_path, query, feedback_dataNone, feedback_filefeedback_data.json, fine_tuneFalse): if feedback_data isNone: feedback_data load_feedback_data(feedback_file) print(fLoaded {len(feedback_data)} feedback entries from {feedback_file}) chunks, vector_store process_document(pdf_path) if fine_tune and feedback_data: vector_store fine_tune_index(vector_store, chunks, feedback_data) result rag_with_feedback_loop(query, vector_store, feedback_data) print(/n Would you like to provide feedback on this response? ) print(Rate relevance (1-5, with 5 being most relevant):) relevance input() print(Rate quality (1-5, with 5 being highest quality):) quality input() print(Any comments? (optional, press Enter to skip)) comments input() feedback get_user_feedback( queryquery, responseresult[response], relevanceint(relevance), qualityint(quality), commentscomments ) store_feedback(feedback, feedback_file) print(Feedback recorded. Thank you!) return result这种方法的效果如何呢经过测试反馈循环的评分达到了 0.7。虽然这个分数并不高但它仍然表明反馈循环技术能够让系统不断学习和调整从而提高检索结果的质量。这也说明用户反馈是一个非常重要的资源能够帮助系统更好地满足用户的需求。11.Adaptive RAG智能选择检索策略在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整。然而我们忽略了一个重要的问题不同的查询可能需要不同的检索策略。那么有没有一种方法能够让系统根据查询的类型自动选择最合适的检索策略呢自适应 RAGAdaptive RAG技术为我们提供了一个解决方案。它根据查询的类型自动选择最合适的检索策略。例如对于事实性查询系统会选择事实检索策略对于分析性查询系统会选择分析检索策略对于观点性查询系统会选择观点检索策略对于上下文相关查询系统会选择上下文检索策略。# 定义自适应 RAG 函数 def rag_with_adaptive_retrieval(pdf_path, query, k4, user_contextNone): chunks, vector_store process_document(pdf_path) query_type classify_query(query) print(fQuery classified as: {query_type}) retrieved_docs adaptive_retrieval(query, vector_store, k, user_context) response generate_response(query, retrieved_docs, query_type) return { query: query, query_type: query_type, retrieved_documents: retrieved_docs, response: response }这种方法的效果如何呢经过测试自适应 RAG 的评分达到了 0.86这是所有方法中最高的分数。这个分数表明自适应 RAG 技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明根据查询的类型自动选择检索策略是一个非常重要的步骤能够帮助我们更好地利用检索到的信息。12.Self RAG让系统自我反思在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整以及如何根据查询的类型自动选择检索策略。然而我们忽略了一个重要的问题系统是否能够自我反思判断是否需要检索以及如何利用检索到的信息呢自我 RAGSelf RAG技术为我们提供了一个解决方案。它不仅能够检索和生成回答还能够自我反思判断是否需要检索以及如何利用检索到的信息。# 运行自我 RAG result self_rag(query, vector_store)这种方法的效果如何呢经过测试自我 RAG 的评分达到了 0.65。虽然这个分数并不高但它仍然表明自我 RAG 技术能够让系统更加智能和灵活。这也说明自我反思是一个非常重要的能力能够帮助系统更好地适应不同的查询需求。13.Knowledge Graph构建知识网络在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整以及如何根据查询的类型自动选择检索策略以及如何让系统自我反思。然而我们忽略了一个重要的问题文档中的信息可能是相互关联的如何构建一个知识网络将这些信息有机地结合起来呢知识图谱 RAGKnowledge Graph RAG技术为我们提供了一个解决方案。它将文档中的信息构建成一个知识图谱其中节点代表概念、实体或信息片段边代表这些节点之间的关系。# 构建知识图谱 def build_knowledge_graph(chunks): graph, texts nx.Graph(), [c[text] for c in chunks] embeddings create_embeddings(texts) for i, (chunk, emb) in enumerate(zip(chunks, embeddings)): graph.add_node(i, textchunk[text], conceptsextract_concepts(chunk[text]), embeddingemb) for i, j in ((i, j) for i in range(len(chunks)) for j in range(i 1, len(chunks))): if shared_concepts : set(graph.nodes[i][concepts]) set(graph.nodes[j][concepts]): sim np.dot(embeddings[i], embeddings[j]) / (np.linalg.norm(embeddings[i]) * np.linalg.norm(embeddings[j])) weight 0.7 * sim 0.3 * (len(shared_concepts) / min(len(graph.nodes[i][concepts]), len(graph.nodes[j][concepts]))) if weight 0.6: graph.add_edge(i, j, weightweight, similaritysim, shared_conceptslist(shared_concepts)) print(fGraph built: {graph.number_of_nodes()} nodes, {graph.number_of_edges()} edges) return graph, embeddings在检索过程中系统不仅能够检索与查询直接相关的节点还能够通过遍历知识图谱找到间接相关的节点从而为生成回答提供更全面的上下文信息。经过测试知识图谱 RAG 的评分达到了 0.78。这个分数表明知识图谱 RAG 技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明构建知识图谱是一个非常重要的步骤能够帮助我们更好地利用文档中的信息。14.层次化索引平衡上下文和精确性在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整以及如何根据查询的类型自动选择检索策略以及如何让系统自我反思以及如何构建知识图谱。然而我们忽略了一个重要的问题如何平衡上下文信息和检索的精确性呢层次化索引Hierarchical Indices技术为我们提供了一个解决方案。它创建了两个层次的表示摘要和详细文本块。首先系统在摘要层次进行检索快速缩小相关文档的范围然后在详细文本块层次进行检索提供精确的检索结果。# 定义层次化 RAG 函数 def hierarchical_rag(query, pdf_path, chunk_size1000, chunk_overlap200, k_summaries3, k_chunks5, regenerateFalse): summary_store_file f{os.path.basename(pdf_path)}_summary_store.pkl detailed_store_file f{os.path.basename(pdf_path)}_detailed_store.pkl if regenerate ornot os.path.exists(summary_store_file) ornot os.path.exists(detailed_store_file): print(Processing document and creating vector stores...) summary_store, detailed_store process_document_hierarchically(pdf_path, chunk_size, chunk_overlap) with open(summary_store_file, wb) as f: pickle.dump(summary_store, f) with open(detailed_store_file, wb) as f: pickle.dump(detailed_store, f) else: print(Loading existing vector stores...) with open(summary_store_file, rb) as f: summary_store pickle.load(f) with open(detailed_store_file, rb) as f: detailed_store pickle.load(f) retrieved_chunks retrieve_hierarchically(query, summary_store, detailed_store, k_summaries, k_chunks) response generate_response(query, retrieved_chunks) return { query: query, response: response, retrieved_chunks: retrieved_chunks, summary_count: len(summary_store.texts), detailed_count: len(detailed_store.texts) }这种方法既保留了上下文信息又提高了检索的精确性。经过测试层次化索引的评分达到了 0.84。这个分数表明层次化索引技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明平衡上下文信息和检索精确性是一个非常重要的步骤能够帮助我们更好地利用检索到的信息。15.HyDE从假设文档出发在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整以及如何根据查询的类型自动选择检索策略以及如何让系统自我反思以及如何构建知识图谱以及如何平衡上下文信息和检索精确性。然而我们忽略了一个重要的问题如何更好地表示查询以便更准确地检索到相关信息呢HyDEHypothetical Document Embedding技术为我们提供了一个解决方案。它不是直接对查询进行嵌入而是先生成一个假设文档这个文档是查询的理想答案。然后系统对这个假设文档进行嵌入并利用这个嵌入进行检索。# 定义 HyDE RAG 函数 def hyde_rag(query, vector_store, k5, should_generate_responseTrue): print(f/n Processing query with HyDE: {query} /n) print(Generating hypothetical document...) hypothetical_doc generate_hypothetical_document(query) print(fGenerated hypothetical document of {len(hypothetical_doc)} characters) print(Creating embedding for hypothetical document...) hypothetical_embedding create_embeddings([hypothetical_doc])[0] print(fRetrieving {k} most similar chunks...) retrieved_chunks vector_store.similarity_search(hypothetical_embedding, kk) results { query: query, hypothetical_document: hypothetical_doc, retrieved_chunks: retrieved_chunks } if should_generate_response: print(Generating final response...) response generate_response(query, retrieved_chunks) results[response] response return results这种方法能够更好地捕捉查询的语义信息从而提高检索的准确性。经过测试HyDE 的评分达到了 0.5。虽然这个分数并不高但它仍然表明 HyDE 技术在某些情况下能够提高检索的准确性。这也说明从假设文档出发是一个非常有趣的思路能够帮助我们更好地表示查询。16.融合 RAG结合多种检索方法在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整以及如何根据查询的类型自动选择检索策略以及如何让系统自我反思以及如何构建知识图谱以及如何平衡上下文信息和检索精确性以及如何从假设文档出发。然而我们忽略了一个重要的问题不同的检索方法有各自的优缺点如何将它们结合起来发挥各自的优点呢融合 RAGFusion RAG技术为我们提供了一个解决方案。它结合了向量检索和关键词检索两种方法取两者的优点为检索结果提供更全面的语义信息和精确的关键词匹配。# 定义融合检索函数 def fusion_retrieval(query, chunks, vector_store, bm25_index, k5, alpha0.5): query_embedding create_embeddings(query) vector_results {r[metadata][index]: r[similarity] for r in vector_store.similarity_search_with_scores(query_embedding, len(chunks))} bm25_results {r[metadata][index]: r[bm25_score] for r in bm25_search(bm25_index, chunks, query, len(chunks))} all_docs vector_store.get_all_documents() scores [(i, alpha * vector_results.get(i, 0) (1 - alpha) * bm25_results.get(i, 0)) for i in range(len(all_docs))] top_docs sorted(scores, keylambda x: x[1], reverseTrue)[:k] return [{text: all_docs[i][text], metadata: all_docs[i][metadata], score: s} for i, s in top_docs]这种方法能够更好地满足不同查询的需求提高检索的准确性。经过测试融合 RAG 的评分达到了 0.83。这个分数表明融合 RAG 技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明结合多种检索方法是一个非常有效的策略能够帮助我们更好地利用检索到的信息。17.多模态RAG解锁图像信息在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整以及如何根据查询的类型自动选择检索策略以及如何让系统自我反思以及如何构建知识图谱以及如何平衡上下文信息和检索精确性以及如何从假设文档出发以及如何结合多种检索方法。然而我们忽略了一个重要的问题文档中的信息不仅包含文本还可能包含图像、图表等其他形式的信息如何将这些信息也纳入检索范围呢多模态 RAGMulti Model RAG技术为我们提供了一个解决方案。它不仅从文档中提取文本还会提取图像并为图像生成描述性的标题。然后系统将文本和图像的嵌入向量一起存储在向量库中从而实现对文本和图像的联合检索。# 处理多模态文档 def process_document(pdf_path, chunk_size1000, chunk_overlap200): image_dir extracted_images os.makedirs(image_dir, exist_okTrue) text_data, image_paths extract_content_from_pdf(pdf_path, image_dir) chunked_text chunk_text(text_data, chunk_size, chunk_overlap) image_data process_images(image_paths) all_items chunked_text image_data contents [item[content] for item in all_items] embeddings create_embeddings(contents) vector_store MultiModalVectorStore() vector_store.add_items(all_items, embeddings) doc_info { text_count: len(chunked_text), image_count: len(image_data), total_items: len(all_items), } print(fAdded {len(all_items)} items to vector store ({len(chunked_text)} text chunks, {len(image_data)} image captions)) return vector_store, doc_info这种方法能够更好地利用文档中的信息提高检索的准确性。经过测试多模态 RAG 的评分达到了 0.79。这个分数表明多模态 RAG 技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明将图像信息纳入检索范围是一个非常重要的步骤能够帮助我们更好地利用文档中的信息。18.CRAG动态调整检索策略在前面的讨论中我们主要关注了如何改进文本块的表示和检索策略以及如何改进查询的质量和检索结果的排序以及如何识别并提取连续的相关文本以及如何对检索到的信息进行压缩以及如何根据用户的反馈不断学习和调整以及如何根据查询的类型自动选择检索策略以及如何让系统自我反思以及如何构建知识图谱以及如何平衡上下文信息和检索精确性以及如何从假设文档出发以及如何结合多种检索方法以及如何将图像信息纳入检索范围。然而我们忽略了一个重要的问题检索到的信息可能并不总是理想的如何动态调整检索策略以应对不同的情况呢纠正性 RAGCorrective RAGCRAG技术为我们提供了一个解决方案。它在检索之后对检索到的信息进行评估根据评估结果动态调整检索策略。如果检索到的信息质量高系统会直接利用这些信息生成回答如果检索到的信息质量低系统会转而进行网络搜索如果检索到的信息质量中等系统会结合文档信息和网络搜索结果生成回答。# 运行纠正性 RAG crag_result rag_with_compression(pdf_path, query, compression_typeselective)这种方法能够更好地应对不同的情况提高检索的准确性和可靠性。经过测试纠正性 RAG 的评分达到了 0.824。这个分数表明纠正性 RAG 技术能够显著提高检索结果的质量从而提高生成回答的准确性。这也说明动态调整检索策略是一个非常重要的步骤能够帮助我们更好地利用检索到的信息。结论选择最适合的 RAG 技术通过上述对 18 种 RAG 技术的测试和分析我们可以看到不同的技术有各自的优缺点适用于不同的场景和需求。简单 RAG 提供了一个基础的框架但其检索效果有限语义分块、上下文增强检索、上下文块头、文档增强等技术通过改进文本块的表示和检索策略提高了检索的准确性查询转换、重排序、相关段落提取、上下文压缩等技术通过改进查询的质量和检索结果的排序进一步提高了检索的效果反馈循环、自适应 RAG、自我 RAG 等技术通过引入反馈机制和动态调整检索策略让系统能够更好地适应不同的查询需求知识图谱 RAG、层次化索引、HyDE、融合 RAG、多模态 RAG、纠正性 RAG 等技术通过结合多种方法和信息源显著提高了检索的准确性和可靠性。在这些技术中自适应 RAG 以 0.86 的评分脱颖而出成为表现最佳的 RAG 技术。它通过根据查询的类型自动选择最合适的检索策略能够更好地满足不同用户的需求生成更准确的回答。然而这并不意味着其他技术没有价值。实际上不同的技术可以在不同的场景下发挥重要作用关键在于根据具体的需求和场景选择最适合的技术。未来随着人工智能技术的不断发展RAG 技术也将不断进化。我们可以预见结合多种技术的优点开发出更加智能、高效、可靠的 RAG 系统将为信息检索和自然语言处理领域带来更多的可能性和突破。最后对于正在迷茫择业、想转行提升或是刚入门的程序员、编程小白来说有一个问题几乎人人都在问未来10年什么领域的职业发展潜力最大答案只有一个人工智能尤其是大模型方向当下人工智能行业正处于爆发式增长期其中大模型相关岗位更是供不应求薪资待遇直接拉满——字节跳动作为AI领域的头部玩家给硕士毕业的优质AI人才含大模型相关方向开出的月基础工资高达5万—6万元即便是非“人才计划”的普通应聘者月基础工资也能稳定在4万元左右。再看阿里、腾讯两大互联网大厂非“人才计划”的AI相关岗位应聘者月基础工资也约有3万元远超其他行业同资历岗位的薪资水平对于程序员、小白来说无疑是绝佳的转型和提升赛道。对于想入局大模型、抢占未来10年行业红利的程序员和小白来说现在正是最好的学习时机行业缺口大、大厂需求旺、薪资天花板高只要找准学习方向稳步提升技能就能轻松摆脱“低薪困境”抓住AI时代的职业机遇。如果你还不知道从何开始我自己整理一套全网最全最细的大模型零基础教程我也是一路自学走过来的很清楚小白前期学习的痛楚你要是没有方向还没有好的资源根本学不到东西下面是我整理的大模型学习资源希望能帮到你。扫码免费领取全部内容最后1、大模型学习路线2、从0到进阶大模型学习视频教程从入门到进阶这里都有跟着老师学习事半功倍。3、 入门必看大模型学习书籍文档.pdf书面上的技术书籍确实太多了这些是我精选出来的还有很多不在图里4、AI大模型最新行业报告2026最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5、面试试题/经验【大厂 AI 岗位面经分享107 道】【AI 大模型面试真题102 道】【LLMs 面试真题97 道】6、大模型项目实战配套源码适用人群四阶段学习规划共90天可落地执行第一阶段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 项目内容安全互联网信息服务算法备案…扫码免费领取全部内容3、这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关文章:

18种RAG技术大比拼:谁才是检索增强生成的最佳选择?

对于刚入门大模型的小白,或是想深耕RAG技术的程序员来说,检索增强生成(RAG)无疑是绕不开的核心技能——它完美解决了大模型“失忆”“ hallucination(幻觉)”的痛点,通过检索海量文档补充上下文…...

Windows平台OpenClaw安装指南:对接ollama GLM-4.7-Flash

Windows平台OpenClaw安装指南:对接ollama GLM-4.7-Flash 1. 为什么选择OpenClawGLM-4.7-Flash组合 去年我在帮一个研究团队搭建自动化文献处理系统时,第一次接触到OpenClaw这个工具。当时我们需要一个能在本地处理敏感数据的方案,而OpenCla…...

Local Moondream2智能助手:为设计师提供AI绘图灵感支持

Local Moondream2智能助手:为设计师提供AI绘图灵感支持 1. 引言:当你的电脑学会“看图说话” 想象一下,你正在为一个新项目寻找设计灵感。你找到了一张非常棒的参考图,但说不清它到底好在哪里,更不知道如何用文字描述…...

千问3.5-27B效果展示:建筑图纸要素识别+材料清单生成+施工风险提示案例

千问3.5-27B效果展示:建筑图纸要素识别材料清单生成施工风险提示案例 1. 模型能力概览 Qwen3.5-27B是一款强大的视觉多模态理解模型,特别擅长处理建筑行业相关的图纸和文档。在4张RTX 4090 D 24GB显卡的支持下,它能够: 精准识别…...

手把手教你用PyTorch复现MobileNetV2:从Inverted Residuals到完整模型搭建

MobileNetV2实战指南:从零构建高效轻量级卷积网络 1. 为什么选择MobileNetV2? 在移动端和嵌入式设备上部署深度学习模型时,我们常常面临计算资源有限、功耗受限的挑战。MobileNetV2作为谷歌团队2018年提出的轻量级网络架构,通过一…...

C#开发者必看:如何用VTK和ActiViz快速搭建医学影像3D重建环境(附完整代码)

C#医学影像3D重建实战:从VTK环境配置到血管模型生成全流程 在医疗数字化浪潮中,三维影像重建技术正成为辅助诊断的重要工具。想象一下,当医生能够360度旋转观察患者颅内的血管网络,或是逐层剥离组织查看肿瘤边界时,诊断…...

【KingbaseES】高效管理数据库存储:查询数据库、模式及表大小的实用指南

1. 为什么需要关注数据库存储空间 数据库存储空间管理是DBA日常工作中最基础也最重要的任务之一。想象一下,你的数据库就像一个仓库,表就是货架,数据就是货物。如果不定期盘点货架上的货物,仓库很快就会变得杂乱无章,找…...

DAMOYOLO-S从零部署教程:10分钟完成Ubuntu20.04环境配置与模型测试

DAMOYOLO-S从零部署教程:10分钟完成Ubuntu20.04环境配置与模型测试 你是不是也对目标检测模型感兴趣,想自己动手部署一个来玩玩?但一看到复杂的依赖、繁琐的环境配置就头疼,感觉无从下手?别担心,今天我就带…...

VibeVoice WebUI性能调优:前端加载速度+WebSocket连接稳定性提升

VibeVoice WebUI性能调优:前端加载速度WebSocket连接稳定性提升 1. 项目背景与性能挑战 VibeVoice实时语音合成系统基于微软开源的VibeVoice-Realtime-0.5B模型,为用户提供流畅的文本转语音体验。但在实际部署中,许多用户反映Web界面加载缓…...

避坑指南:STM32G0开发必备的HALLL库中文手册到底怎么选?

STM32G0开发实战:HAL与LL库技术文档深度评测与高效使用指南 当第一次拿到STM32G0开发板时,我盯着官方提供的英文参考手册发了半小时呆——密密麻麻的寄存器描述和晦涩的专业术语让我这个英语六级选手也倍感压力。这就是大多数嵌入式工程师面临的现实困境…...

Qwen3-VL-8B多模态交互实战:Python爬虫数据可视化分析

Qwen3-VL-8B多模态交互实战:Python爬虫数据可视化分析 你有没有遇到过这种情况?辛辛苦苦用Python爬虫抓了一大堆数据,有文字、有图片、有链接,结果面对这些杂乱无章的信息,却不知道从何下手分析。传统的分析工具要么只…...

三菱 Q 系列 PLC(Q03UDE)通过以太网通讯处理器连接扫码枪的硬件配置

一、项目背景某重型机电配件厂年产 200 万套精密轴承,装配线共 12 个工位,采用三菱 Q03UDE PLC 作为核心逻辑控制单元。2025 年初新增 “全流程物料追溯” 需求:当轴承套圈、滚子等物料随料车进入装配工位时,得利捷工业扫码枪读取…...

老王-时光匆匆且行且从容

时光匆匆,且行且从容 ——人生是减法,来日并不方长“走着走着,已经是秋天了。”🍂 一眨眼就是一天, 一回头就是一年, 一转身—— 就是一辈子。🌬️ 一、我们都在慌慌张张地赶路 生活在山东&…...

GitHub_Trending/ms/MS-DOS文件复制算法:数据块读写优化详解

GitHub_Trending/ms/MS-DOS文件复制算法:数据块读写优化详解 【免费下载链接】MS-DOS MS-DOS 1.25和2.0的原始源代码,供参考使用 项目地址: https://gitcode.com/GitHub_Trending/ms/MS-DOS MS-DOS作为早期个人计算机的主流操作系统,其…...

基于51单片机与查表法的智能流水灯系统设计

1. 智能流水灯系统设计概述 第一次接触51单片机时,我就被它强大的控制能力所吸引。特别是用它来做流水灯实验,简直是每个嵌入式开发者的"Hello World"。但普通的流水灯只能实现简单的左右移动效果,想要玩出花样还得靠查表法。这种编…...

【国家级工控固件审计标准】:基于ISO/IEC 19770-2与NIST SP 800-161的C语言检测流程实战落地

第一章:国家级工控固件审计标准的合规性框架演进随着工业控制系统(ICS)与OT网络日益深度融入关键基础设施,固件层安全已成为国家网络安全战略的核心防线。近年来,《GB/T 39276-2020 工业控制系统信息安全防护指南》《G…...

基于Docker容器化部署的ROS2 Gazebo导航仿真环境搭建

1. 为什么选择Docker部署ROS2导航仿真环境 第一次接触机器人导航仿真时,我花了整整三天时间在Ubuntu系统上折腾各种依赖库。ROS2的版本冲突、Gazebo的插件缺失、Nav2的编译错误...这些坑让我深刻体会到环境配置的痛苦。直到尝试用Docker容器化方案,才发…...

文墨共鸣多场景:同时支持短文本比对(标题)、中长文本(段落)、长文本(章节)

文墨共鸣多场景:同时支持短文本比对(标题)、中长文本(段落)、长文本(章节) "夫文心者,言为心声,义为神合。" 文墨共鸣将深度学习算法与传统水墨美学完美融合&a…...

避开亚稳态陷阱:用生活案例讲透建立/保持时间对FPGA设计的影响

避开亚稳态陷阱:用生活案例讲透建立/保持时间对FPGA设计的影响 想象一下,你正在参加一场重要的线上会议,主持人规定每个发言者必须在"发言窗口"内完成陈述——这个窗口从主持人点名后3秒开始,持续10秒。如果你说得太早&…...

3D高斯泼溅新突破:Student t分布如何让渲染质量飙升(附实战代码)

3D高斯泼溅新突破:Student t分布如何让渲染质量飙升(附实战代码) 在3D渲染领域,追求更高质量的图像输出一直是技术演进的核心驱动力。最近,一种基于Student t分布的新型3D高斯泼溅技术(SSS)正在…...

深入解析NVRAM Editor工具:新旧版本操作对比与常见问题排查

1. NVRAM Editor工具基础认知 第一次接触NVRAM Editor时,我对着两个版本的工具包(ModemMETA和SP_META)发懵——它们就像双胞胎兄弟,长得像但性格迥异。简单来说,这是专为调试手机底层参数设计的瑞士军刀,能…...

软件工程必备技能:用StartUML轻松理解类图中的4种关系(关联/泛化/聚合/组合)

软件工程师的UML实战指南:StartUML类图四大关系深度解析 在面向对象设计与系统建模领域,类图作为UML(统一建模语言)的核心组成部分,其重要性不言而喻。一个精准的类图能够清晰展现系统的静态结构,而类之间的…...

技术人戒断中心:治疗对ChatGPT的依赖症

ChatGPT在软件测试中的崛起与隐忧随着人工智能技术的飞速发展,ChatGPT已成为软件测试领域的革命性工具,其自然语言处理能力显著提升了测试效率。例如,它能自动化生成测试用例、编写测试脚本和分析测试结果,帮助测试人员节省高达40…...

低代码老司机揭秘:JNPF微服务架构下如何优雅处理复杂业务逻辑(含代码片段)

低代码老司机揭秘:JNPF微服务架构下如何优雅处理复杂业务逻辑(含代码片段) 在数字化转型浪潮中,企业面临的核心矛盾是日益复杂的业务需求与有限的技术资源之间的鸿沟。传统开发模式下,一个供应链金融系统的开发周期往往…...

信号发生器新手必看:从验电器到安全帽检测的5个实用场景详解

信号发生器实战指南:5大工业场景深度解析与设备操作技巧 电力检修现场的安全防护设备性能测试,往往决定着作业人员的生命安全。作为工业领域的基础测试工具,信号发生器在设备维护、安全检测等环节扮演着关键角色。本文将聚焦验电器校验、安全…...

wordpress配置网店

早上8点开始配置的,现在是11:30,除了支付接口还在申请,基本上网页端已经可以用了。...

告别 root 账户:Ubuntu 24.04 多用户管理保姆级教程(含权限分配技巧)

Ubuntu 24.04 多用户权限管理实战:从基础配置到企业级安全实践 在团队协作的开发环境中,合理的用户权限管理是保障系统安全的第一道防线。Ubuntu 24.04 LTS作为长期支持版本,其用户管理机制既保持了Linux系统的灵活性,又通过Sudo等…...

Kimi-VL-A3B-Thinking开源可部署:零依赖镜像支持A10/A100/V100多卡GPU适配

Kimi-VL-A3B-Thinking开源可部署:零依赖镜像支持A10/A100/V100多卡GPU适配 1. 模型简介 Kimi-VL-A3B-Thinking是一款高效的开源混合专家(MoE)视觉语言模型(VLM),具备以下核心特点: 高效架构&…...

Mac上3款数据库管理神器对比:VS Code插件、Sequel Pro和Navicat破解版实测

Mac平台数据库管理工具深度评测:从轻量到专业的全场景解决方案 在数据驱动的时代,数据库管理工具已成为开发者、数据分析师乃至产品经理的日常必需品。Mac用户在选择这类工具时往往面临两难:既希望获得专业级功能,又追求macOS特有…...

TrustedInstaller权限实战完全指南:突破系统限制的终极方案

TrustedInstaller权限实战完全指南:突破系统限制的终极方案 【免费下载链接】RunAsTI Launch processes with TrustedInstaller privilege 项目地址: https://gitcode.com/gh_mirrors/ru/RunAsTI 在Windows系统维护中,管理员权限常被视为最高权限…...