精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇? 原創 精華

發布于 2025-3-25 09:44
瀏覽
0收藏

在當今信息爆炸的時代,如何從海量數據中快速準確地獲取所需信息,是人工智能領域的一大挑戰。Retrieval-Augmented Generation(RAG,檢索增強生成)技術應運而生,它結合了檢索和生成的優勢,通過從大量文檔中檢索相關信息,再利用這些信息生成高質量的回答。然而,RAG 的實現方式多種多樣,不同的技術路徑有著不同的優勢和局限。今天,我們就來深入探討一下這些 RAG 技術,看看誰才是真正的“最佳選手”。

1. Simple RAG:基礎而不失經典

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在探索各種復雜的 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_size=1000, overlap=200)

# 打印文本塊數量
print("Number of text chunks:", len(text_chunks))

這種方法雖然簡單,但卻為后續更復雜的技術奠定了基礎。它就像是一個“新手村”,讓我們能夠初步了解 RAG 的工作原理。然而,簡單 RAG 也有它的局限性。由于文本塊是按照固定大小分割的,可能會導致一些句子被拆分開,或者將不相關的句子組合在一起,從而影響檢索的準確性。

2. Semantic Chunking語義分塊:讓文本塊更有意義

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

為了解決簡單 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, method="percentile", threshold=90)

# 根據斷點將句子分組成語義塊
text_chunks = split_into_chunks(sentences, breakpoints)

這種方法聽起來很完美,但在實際測試中,它的表現卻不盡如人意。語義分塊的評分甚至低于簡單 RAG,這說明僅僅改變文本塊的分割策略,并不能保證檢索效果的提升。這也提醒我們,技術的改進并非一蹴而就,需要更多的思考和嘗試。

3. 上下文增強檢索:鄰居也能提供幫助

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

既然語義分塊沒有達到預期的效果,我們不妨換個思路。簡單 RAG 的問題在于文本塊過于孤立,缺乏上下文信息。那么,如果我們能夠為每個文本塊添加一些上下文信息,是不是就能提高檢索的準確性呢?上下文增強檢索(Context Enriched Retrieval)正是基于這樣的想法。

# 定義上下文增強檢索函數
def context_enriched_search(query, text_chunks, embeddings, k=1, context_size=1):
    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(key=lambda x: x[1], reverse=True)
    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. 上下文塊頭:給文本塊加上“標簽”

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

上下文增強檢索雖然有效,但仍然存在一個問題:即使有了上下文信息,文本塊本身可能仍然缺乏足夠的語義信息。例如,一個文檔可能包含多個主題,每個主題都對應著不同的文本塊。在這種情況下,如何快速準確地找到與查詢最相關的文本塊呢?

上下文塊頭(Contextual Chunk Headers)技術為我們提供了一個解決方案。它在每個文本塊的前面添加了一個描述性的標題(header),這個標題就像是一個“標簽”,能夠概括文本塊的主要內容。

# 為每個文本塊生成描述性標題
text_chunks_with_headers = chunk_text_with_headers(extracted_text, chunk_size=1000, overlap=200)

# 打印一個樣本以查看效果
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. 文檔增強:從文本塊到問題

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

上下文塊頭雖然能夠提供更多的語義信息,但仍然存在局限性。在某些情況下,文本塊的內容可能過于復雜,難以用一個簡單的標題來概括。那么,有沒有一種方法能夠讓文本塊更容易被檢索到呢?

文檔增強(Document Augmentation)技術為我們提供了一個新的思路。它不僅將文本塊轉換為嵌入向量,還會為每個文本塊生成一些相關的問題,并將這些問題也轉換為嵌入向量。

# 處理文檔,提取文本、創建文本塊、生成問題并構建向量庫
text_chunks, vector_store = process_document(
    pdf_path,
    chunk_size=1000,
    chunk_overlap=200,
    questions_per_chunk=3
)

這樣一來,在檢索過程中,系統不僅能夠匹配文本塊的內容,還能夠匹配與查詢相關的問題,從而提高檢索的準確性。經過測試,文檔增強的評分達到了 0.8,這是一個非常高的分數,表明文檔增強技術能夠顯著提高檢索的準確性。這也說明,通過為文本塊生成相關問題,我們能夠為檢索提供更多的入口,從而更容易找到與查詢相關的文本塊。

6. 查詢轉換:讓查詢更“友好”

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略。然而,我們忽略了一個重要的因素:用戶提出的查詢可能并不總是能夠很好地匹配文檔中的內容,這可能會導致檢索結果不準確。那么,有沒有一種方法能夠讓查詢更“友好”,更容易被檢索到呢?

查詢轉換(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_subqueries=4)

查詢重寫是將查詢變得更加具體和詳細;后退提示是創建一個更廣泛的查詢,以檢索有用的背景信息;子查詢分解則是將一個復雜的查詢分解為多個簡單的子查詢。經過測試,查詢轉換的評分達到了 0.5。雖然這個分數并不高,但它仍然表明查詢轉換技術在某些情況下能夠提高檢索的準確性。這也提醒我們,在 RAG 系統中,不僅需要關注文本塊的表示和檢索策略,還需要關注查詢的質量。

7. 重排序:讓檢索結果更有條理

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量。然而,我們忽略了一個重要的環節:檢索結果的排序。簡單相似性搜索通常會返回一組相關性和不相關性混雜的結果,這可能會導致生成的回答不夠準確。那么,有沒有一種方法能夠讓檢索結果更有條理,更容易被利用呢?

重排序(Reranker)技術為我們提供了一個解決方案。它在初始檢索的基礎上,通過一個額外的步驟對檢索結果進行重新排序,將最相關的文本塊放在最前面。重排序可以使用不同的方法,例如基于關鍵詞的重排序或基于 LLM 的重排序。

# 定義重排序函數
def rag_with_reranking(query, vector_store, reranking_method="llm", top_n=3, model="meta-llama/Llama-3.2-3B-Instruct"):
    query_embedding = create_embeddings(query)
    initial_results = vector_store.similarity_search(query_embedding, k=10)

    if reranking_method == "llm":
        reranked_results = rerank_with_llm(query, initial_results, top_n=top_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):尋找連續的相關文本

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序。然而,我們忽略了一個重要的問題:有時候,最佳的信息可能分散在多個連續的文本塊中。那么,有沒有一種方法能夠讓系統自動識別并提取這些連續的相關文本呢?

相關段落提取(Relevant Segment Extraction,RSE)技術為我們提供了一個解決方案。它不是簡單地檢索最相關的文本塊,而是嘗試識別并提取整個相關段落。

# 運行 RAG 并應用相關段落提取
rse_result = rag_with_rse(pdf_path, query)

這種方法能夠為生成回答提供更連貫和完整的上下文信息,從而提高回答的質量。經過測試,相關段落提取的評分達到了 0.8。這個分數表明,相關段落提取技術能夠顯著提高檢索結果的質量,從而提高生成回答的準確性。這也說明,識別并提取連續的相關文本是一個非常重要的步驟,能夠幫助我們更好地利用檢索到的信息。

9. 上下文壓縮:讓信息更精煉

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本。然而,我們忽略了一個重要的問題:有時候,檢索到的信息可能過于冗長,包含了大量與查詢不相關的內容。這不僅會浪費計算資源,還可能會影響生成回答的質量。那么,有沒有一種方法能夠讓檢索到的信息更精煉,只保留與查詢最相關的內容呢?

上下文壓縮(Contextual Compression)技術為我們提供了一個解決方案。它在檢索到文本塊之后,通過一個額外的步驟對文本塊進行壓縮,只保留與查詢最相關的內容。

# 定義上下文壓縮函數
def rag_with_compression(pdf_path, query, k=10, compression_type="selective", model="meta-llama/Llama-3.2-3B-Instruct"):
    vector_store = process_document(pdf_path)
    results = vector_store.similarity_search(create_embeddings(query), k=k)
    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. 反饋循環:讓系統不斷學習

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮。然而,我們忽略了一個重要的問題:這些改進都是基于預先設定的策略,系統無法根據實際的使用情況進行自我調整。那么,有沒有一種方法能夠讓系統根據用戶的反饋不斷學習和調整呢?

反饋循環(Feedback Loop)技術為我們提供了一個解決方案。它允許用戶對系統的回答進行評價,并將這些評價作為反饋信息存儲起來。在后續的檢索過程中,系統會根據這些反饋信息對檢索策略進行調整,從而提高檢索結果的質量。

# 定義完整的 RAG 流程,包含反饋機制
def full_rag_workflow(pdf_path, query, feedback_data=None, feedback_file="feedback_data.json", fine_tune=False):
    if feedback_data isNone:
        feedback_data = load_feedback_data(feedback_file)
        print(f"Loaded {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(
        query=query,
        respnotallow=result["response"],
        relevance=int(relevance),
        quality=int(quality),
        comments=comments
    )

    store_feedback(feedback, feedback_file)
    print("Feedback recorded. Thank you!")

    return result

這種方法的效果如何呢?經過測試,反饋循環的評分達到了 0.7。雖然這個分數并不高,但它仍然表明反饋循環技術能夠讓系統不斷學習和調整,從而提高檢索結果的質量。這也說明,用戶反饋是一個非常重要的資源,能夠幫助系統更好地滿足用戶的需求。

11. Adaptive RAG:智能選擇檢索策略

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整。然而,我們忽略了一個重要的問題:不同的查詢可能需要不同的檢索策略。那么,有沒有一種方法能夠讓系統根據查詢的類型自動選擇最合適的檢索策略呢?

自適應 RAG(Adaptive RAG)技術為我們提供了一個解決方案。它根據查詢的類型,自動選擇最合適的檢索策略。例如,對于事實性查詢,系統會選擇事實檢索策略;對于分析性查詢,系統會選擇分析檢索策略;對于觀點性查詢,系統會選擇觀點檢索策略;對于上下文相關查詢,系統會選擇上下文檢索策略。

# 定義自適應 RAG 函數
def rag_with_adaptive_retrieval(pdf_path, query, k=4, user_cnotallow=None):
    chunks, vector_store = process_document(pdf_path)
    query_type = classify_query(query)
    print(f"Query 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:讓系統自我反思

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整,以及如何根據查詢的類型自動選擇檢索策略。然而,我們忽略了一個重要的問題:系統是否能夠自我反思,判斷是否需要檢索,以及如何利用檢索到的信息呢?

自我 RAG(Self RAG)技術為我們提供了一個解決方案。它不僅能夠檢索和生成回答,還能夠自我反思,判斷是否需要檢索,以及如何利用檢索到的信息。

# 運行自我 RAG
result = self_rag(query, vector_store)

這種方法的效果如何呢?經過測試,自我 RAG 的評分達到了 0.65。雖然這個分數并不高,但它仍然表明自我 RAG 技術能夠讓系統更加智能和靈活。這也說明,自我反思是一個非常重要的能力,能夠幫助系統更好地適應不同的查詢需求。

13. Knowledge Graph:構建知識網絡

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整,以及如何根據查詢的類型自動選擇檢索策略,以及如何讓系統自我反思。然而,我們忽略了一個重要的問題:文檔中的信息可能是相互關聯的,如何構建一個知識網絡,將這些信息有機地結合起來呢?

知識圖譜 RAG(Knowledge 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, text=chunk["text"], cnotallow=extract_concepts(chunk["text"]), embedding=emb)

    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, weight=weight, similarity=sim, shared_cnotallow=list(shared_concepts))

    print(f"Graph built: {graph.number_of_nodes()} nodes, {graph.number_of_edges()} edges")
    return graph, embeddings

在檢索過程中,系統不僅能夠檢索與查詢直接相關的節點,還能夠通過遍歷知識圖譜找到間接相關的節點,從而為生成回答提供更全面的上下文信息。經過測試,知識圖譜 RAG 的評分達到了 0.78。這個分數表明,知識圖譜 RAG 技術能夠顯著提高檢索結果的質量,從而提高生成回答的準確性。這也說明,構建知識圖譜是一個非常重要的步驟,能夠幫助我們更好地利用文檔中的信息。

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

14. 層次化索引:平衡上下文和精確性

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整,以及如何根據查詢的類型自動選擇檢索策略,以及如何讓系統自我反思,以及如何構建知識圖譜。然而,我們忽略了一個重要的問題:如何平衡上下文信息和檢索的精確性呢?

層次化索引(Hierarchical Indices)技術為我們提供了一個解決方案。它創建了兩個層次的表示:摘要和詳細文本塊。首先,系統在摘要層次進行檢索,快速縮小相關文檔的范圍;然后,在詳細文本塊層次進行檢索,提供精確的檢索結果。

# 定義層次化 RAG 函數
def hierarchical_rag(query, pdf_path, chunk_size=1000, chunk_overlap=200, k_summaries=3, k_chunks=5, regenerate=False):
    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:從假設文檔出發

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整,以及如何根據查詢的類型自動選擇檢索策略,以及如何讓系統自我反思,以及如何構建知識圖譜,以及如何平衡上下文信息和檢索精確性。然而,我們忽略了一個重要的問題:如何更好地表示查詢,以便更準確地檢索到相關信息呢?

HyDE(Hypothetical Document Embedding)技術為我們提供了一個解決方案。它不是直接對查詢進行嵌入,而是先生成一個假設文檔,這個文檔是查詢的理想答案。然后,系統對這個假設文檔進行嵌入,并利用這個嵌入進行檢索。

# 定義 HyDE RAG 函數
def hyde_rag(query, vector_store, k=5, should_generate_respnotallow=True):
    print(f"\n=== Processing query with HyDE: {query} ===\n")

    print("Generating hypothetical document...")
    hypothetical_doc = generate_hypothetical_document(query)
    print(f"Generated hypothetical document of {len(hypothetical_doc)} characters")

    print("Creating embedding for hypothetical document...")
    hypothetical_embedding = create_embeddings([hypothetical_doc])[0]

    print(f"Retrieving {k} most similar chunks...")
    retrieved_chunks = vector_store.similarity_search(hypothetical_embedding, k=k)

    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:結合多種檢索方法

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整,以及如何根據查詢的類型自動選擇檢索策略,以及如何讓系統自我反思,以及如何構建知識圖譜,以及如何平衡上下文信息和檢索精確性,以及如何從假設文檔出發。然而,我們忽略了一個重要的問題:不同的檢索方法有各自的優缺點,如何將它們結合起來,發揮各自的優點呢?

融合 RAG(Fusion RAG)技術為我們提供了一個解決方案。它結合了向量檢索和關鍵詞檢索兩種方法,取兩者的優點,為檢索結果提供更全面的語義信息和精確的關鍵詞匹配。

# 定義融合檢索函數
def fusion_retrieval(query, chunks, vector_store, bm25_index, k=5, alpha=0.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, key=lambda x: x[1], reverse=True)[: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:解鎖圖像信息

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整,以及如何根據查詢的類型自動選擇檢索策略,以及如何讓系統自我反思,以及如何構建知識圖譜,以及如何平衡上下文信息和檢索精確性,以及如何從假設文檔出發,以及如何結合多種檢索方法。然而,我們忽略了一個重要的問題:文檔中的信息不僅包含文本,還可能包含圖像、圖表等其他形式的信息,如何將這些信息也納入檢索范圍呢?

多模態 RAG(Multi Model RAG)技術為我們提供了一個解決方案。它不僅從文檔中提取文本,還會提取圖像,并為圖像生成描述性的標題。然后,系統將文本和圖像的嵌入向量一起存儲在向量庫中,從而實現對文本和圖像的聯合檢索。

# 處理多模態文檔
def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):
    image_dir = "extracted_images"
    os.makedirs(image_dir, exist_ok=True)

    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(f"Added {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:動態調整檢索策略

18種RAG技術大比拼:誰才是檢索增強生成的最佳選擇?-AI.x社區

在前面的討論中,我們主要關注了如何改進文本塊的表示和檢索策略,以及如何改進查詢的質量和檢索結果的排序,以及如何識別并提取連續的相關文本,以及如何對檢索到的信息進行壓縮,以及如何根據用戶的反饋不斷學習和調整,以及如何根據查詢的類型自動選擇檢索策略,以及如何讓系統自我反思,以及如何構建知識圖譜,以及如何平衡上下文信息和檢索精確性,以及如何從假設文檔出發,以及如何結合多種檢索方法,以及如何將圖像信息納入檢索范圍。然而,我們忽略了一個重要的問題:檢索到的信息可能并不總是理想的,如何動態調整檢索策略,以應對不同的情況呢?

糾正性 RAG(Corrective RAG,CRAG)技術為我們提供了一個解決方案。它在檢索之后,對檢索到的信息進行評估,根據評估結果動態調整檢索策略。如果檢索到的信息質量高,系統會直接利用這些信息生成回答;如果檢索到的信息質量低,系統會轉而進行網絡搜索;如果檢索到的信息質量中等,系統會結合文檔信息和網絡搜索結果生成回答。

# 運行糾正性 RAG
crag_result = rag_with_compression(pdf_path, query, compression_type="selective")

這種方法能夠更好地應對不同的情況,提高檢索的準確性和可靠性。經過測試,糾正性 RAG 的評分達到了 0.824。這個分數表明,糾正性 RAG 技術能夠顯著提高檢索結果的質量,從而提高生成回答的準確性。這也說明,動態調整檢索策略是一個非常重要的步驟,能夠幫助我們更好地利用檢索到的信息。

結論:選擇最適合的 RAG 技術

通過上述對 18 種 RAG 技術的測試和分析,我們可以看到,不同的技術有各自的優缺點,適用于不同的場景和需求。簡單 RAG 提供了一個基礎的框架,但其檢索效果有限;語義分塊、上下文增強檢索、上下文塊頭、文檔增強等技術通過改進文本塊的表示和檢索策略,提高了檢索的準確性;查詢轉換、重排序、相關段落提取、上下文壓縮等技術通過改進查詢的質量和檢索結果的排序,進一步提高了檢索的效果;反饋循環、自適應 RAG、自我 RAG 等技術通過引入反饋機制和動態調整檢索策略,讓系統能夠更好地適應不同的查詢需求;知識圖譜 RAG、層次化索引、HyDE、融合 RAG、多模態 RAG、糾正性 RAG 等技術通過結合多種方法和信息源,顯著提高了檢索的準確性和可靠性。

在這些技術中,自適應 RAG 以 0.86 的評分脫穎而出,成為表現最佳的 RAG 技術。它通過根據查詢的類型自動選擇最合適的檢索策略,能夠更好地滿足不同用戶的需求,生成更準確的回答。然而,這并不意味著其他技術沒有價值。實際上,不同的技術可以在不同的場景下發揮重要作用,關鍵在于根據具體的需求和場景選擇最適合的技術。

未來,隨著人工智能技術的不斷發展,RAG 技術也將不斷進化。我們可以預見,結合多種技術的優點,開發出更加智能、高效、可靠的 RAG 系統,將為信息檢索和自然語言處理領域帶來更多的可能性和突破。


以上就是對 18 種 RAG 技術的詳細分析和代碼示例。希望這篇文章能夠幫助你更好地了解 RAG 技術的多樣性和潛力。如果你對某一種技術特別感興趣,或者有其他問題,歡迎在評論區留言,我們一起探討!


本文轉載自公眾號Halo咯咯    作者:基咯咯

原文鏈接:??https://mp.weixin.qq.com/s/16Ra_wrH1igwiySPV9KkNA??


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
免费高清在线观看| 亚洲免费黄色网址| 国产福利一区二区精品秒拍| 亚洲午夜一区二区三区| 精品不卡在线| 中文文字幕一区二区三三| 亚洲电影在线一区二区三区| 亚洲国产精品视频在线观看 | 亚洲久久在线| 在线视频欧美日韩精品| 亚洲911精品成人18网站| 亚洲色图官网| 亚洲免费观看视频| 奇米视频888战线精品播放| 国产手机av在线| 欧美亚洲三级| 久精品免费视频| 69视频在线观看免费| 成人搞黄视频| 91精品国产综合久久福利 | 超薄肉色丝袜一二三| 麻豆精品久久| 欧美影视一区在线| 人人妻人人添人人爽欧美一区| 一区二区三区国产福利| 国产探花视频在线| 欧美在线关看| 日韩欧美久久久| 日本www.色| 久草在线资源福利站| 亚洲卡通动漫在线| 亚洲欧美日韩另类精品一区二区三区| 欧美一级做性受免费大片免费| 免费在线成人网| 2018日韩中文字幕| 国产亚洲第一页| 99久久夜色精品国产亚洲1000部| 亚洲欧美一区二区三区四区| 野战少妇38p| 国产精一区二区| 欧美丝袜丝nylons| 欧美一级黄色影院| 欧美舌奴丨vk视频| 欧美性精品220| 国产 日韩 亚洲 欧美| 欧美xxxx黑人又粗又长| 18涩涩午夜精品.www| 伊人久久av导航| 国产午夜在线视频| 五月婷婷久久久| 日韩视频中文| 欧美激情综合色综合啪啪五月| 中文乱码字幕高清一区二区| 清纯唯美综合亚洲| 最近2019中文字幕第三页视频| 国产综合精品在线| 国产一区二区三区网| 亚洲美女又黄又爽在线观看| 欧美一区二区三区成人精品| 亚洲国产欧美日韩在线观看第一区 | 久久精品国产精品国产精品污| 国产 日韩 欧美 综合| 国产精品123区| 成人自拍视频网站| 亚洲精品一区二区三区四区| 成人一级视频在线观看| 精品国产区在线| 同心难改在线观看| av一二三不卡影片| 欧美一区二区三区四区夜夜大片 | 一区二区三区视频免费| 在线观看免费小视频| 日韩大片在线| 日韩三级成人av网| 亚洲色婷婷一区二区三区| 欧美在线视屏| 亚洲91av视频| 中文字幕人妻精品一区| 日韩福利片在线观看| 国产精品mm| 国模精品视频一区二区三区| 自拍偷拍欧美亚洲| 日韩在线卡一卡二| 成人黄色片网站| 午夜久久久久久久久久| 99久久99久久综合| 色综合久久久久久久久五月| 九七电影韩国女主播在线观看| 亚洲精品综合在线| 久久久久久久久久久福利| 国产精品久久久久久久久免费高清| 在线成人小视频| 精品人妻一区二区免费| 久久99高清| 美日韩在线视频| 国产成人愉拍精品久久| 日韩电影在线观看网站| 99国产视频| 国产中文字幕在线播放| 一区二区三区不卡视频在线观看| 男人操女人免费软件| 999精品嫩草久久久久久99| 亚洲国产精品va在线| 青青青视频在线播放| 黑人一区二区| 国产欧美一区二区三区久久人妖| 国产91免费在线观看| 中文字幕av不卡| 成人性免费视频| 亚洲ww精品| 亚洲女人被黑人巨大进入al| 侵犯稚嫩小箩莉h文系列小说| 99视频一区| 亚洲在线视频福利| jizz在线观看| 欧美日韩国产一区中文午夜| 香蕉视频xxxx| 日韩精品一区二区三区免费观看| 高清欧美性猛交| 国产精品久久久久久无人区| 久久久综合网站| 亚洲精品国产精华液| 欧美韩国日本精品一区二区三区| 午夜伦理在线视频| 欧美性猛交xxxx乱大交退制版 | jizz欧美| 日韩电影网在线| 永久免费看黄网站| 久久国产精品露脸对白| 日本不卡一区| 亚洲精品永久免费视频| 欧美成人精精品一区二区频| 欧美一区二区三区粗大| 麻豆久久精品| 玛丽玛丽电影原版免费观看1977 | 成人久久综合| 人九九综合九九宗合| 无码精品人妻一区二区三区影院| 一区二区三区在线高清| 国产性生活一级片| 91久久国产| 国产精品美女午夜av| 国产大学生校花援交在线播放| 欧美日韩国产综合新一区 | 视频精品国内| 久久视频在线看| 国产乱人乱偷精品视频a人人澡| 欧美国产丝袜视频| 一区二区三区韩国| 欧美日韩在线二区| 国产精品综合不卡av| 91社区在线观看| 欧美男生操女生| 国产在线观看免费视频软件| 狠狠色综合播放一区二区| 亚洲一区影院| 国产精品视频一区二区三区| 久久天天躁日日躁| 国产aⅴ爽av久久久久成人| 一区二区三区四区乱视频| 青青草精品在线| 亚洲国产专区校园欧美| 久久大香伊蕉在人线观看热2| 欧美freesex黑人又粗又大| 精品一区二区电影| 国产精品久久久久久久久夜色| 久久久国产精品麻豆| 亚洲不卡视频在线| 亚洲欧洲日韩| 国产欧美日韩一区二区三区| 偷拍自拍在线看| 在线日韩第一页| 99久久精品国产一区二区成人| 亚洲激情在线激情| 捆绑裸体绳奴bdsm亚洲| 视频一区在线播放| 最新精品视频| 加勒比久久高清| 国产精品久久久久久久美男 | 国产又粗又猛视频免费| 亚洲女子a中天字幕| 亚洲av成人精品一区二区三区| 性色av一区二区怡红| 亚洲一卡二卡三卡| 亚洲精品a区| 人人爽久久涩噜噜噜网站| 男人和女人做事情在线视频网站免费观看| 69堂国产成人免费视频| 99热只有这里有精品| 欧美国产日韩一二三区| 亚洲精品乱码久久久久久9色| 亚洲一级在线| 裸体裸乳免费看| 精品一区三区| 91成人在线看| 韩日精品一区| 97人人做人人爱| 日本在线人成| 亚洲精品国产suv| 97视频免费在线| 欧美日韩亚洲视频| 久草综合在线视频| 国产亚洲精品久| 第一页在线视频| 蜜桃在线一区二区三区| 男女视频网站在线观看| 亚洲成人av| 欧洲精品久久| 黄色免费大全亚洲| 成人免费观看a| 超碰国产一区| 久久久久久久成人| 国产三区在线观看| 亚洲人成在线观看| 日韩一级片免费在线观看| 91精品国产色综合久久久蜜香臀| 99精品人妻国产毛片| 亚洲成人精品在线观看| 亚洲国产123| 中文字幕av一区二区三区免费看| 中文字幕免费在线播放| 国产.欧美.日韩| 国产女同无遮挡互慰高潮91| 久久久蜜桃一区二区人| 国产 日韩 欧美在线| 欧美一区二区三区另类| 一区二区三区在线观看www| 欧美男gay| 欧美日韩电影一区二区三区| 豆花视频一区二区| 97超碰资源| 国产精品美女久久久久| 成人免费在线视频网址| 久久久加勒比| 国产精品丝袜视频| 亚洲天堂1区| 国产精品成人aaaaa网站| 在线天堂新版最新版在线8| 久久久久久这里只有精品| 少妇视频在线| 欧美日韩爱爱视频| 在线观看中文| 欧美xxxx做受欧美.88| 超碰人人在线| 免费av在线一区| 中文字幕有码在线视频| 欧美大成色www永久网站婷| 二区三区四区高清视频在线观看| 日韩在线观看免费高清完整版| 在线免费观看黄色网址| 久久精品国产欧美亚洲人人爽| 欧美三级黄网| 麻豆国产va免费精品高清在线| 黄网站免费在线播放| 久久综合久久八八| 午夜小视频在线观看| 久久久久久久久国产| 国模精品视频| 国产精品99久久久久久久久久久久| 成人软件在线观看| 国产精品啪视频| 欧美电影院免费观看| 国产成人女人毛片视频在线| 久久99国产精品久久99大师| 麻豆av一区二区三区| heyzo久久| 亚洲成人动漫在线| 亚洲高清二区| 黄色成人免费看| 精品一区二区三区在线播放| 俄罗斯女人裸体性做爰| 99精品欧美一区二区蜜桃免费| 久久成人激情视频| 中文字幕制服丝袜成人av| 激情五月少妇a| 欧美色欧美亚洲高清在线视频| www.久久精品视频| 欧美老年两性高潮| 亚洲AV无码成人片在线观看| 日韩国产在线播放| 午夜在线小视频| 欧美精品videossex性护士| 性欧美xxx69hd高清| 成人黄色av网| 韩国女主播一区二区三区| 色噜噜色狠狠狠狠狠综合色一| 亚洲最大av| 黄色免费视频大全| 精品一区二区三区在线观看国产| 国产xxxx视频| 亚洲欧洲日韩在线| 日韩欧美亚洲视频| 777xxx欧美| 亚洲av毛片成人精品| 精品国偷自产在线视频| 午夜影院在线播放| 91视频免费在线| 伊人久久大香线蕉av不卡| 国产免费xxx| 久久久久久久波多野高潮日日| 欧美体内she精高潮| 国产三区在线成人av| 黄页网站免费观看| 欧美日韩不卡一区| 青青青手机在线视频观看| 麻豆乱码国产一区二区三区| 26uuu亚洲电影| 91成人免费看| 999久久久精品国产| 日韩av资源在线| 成人午夜短视频| 国产在线免费看| 色综合久久中文综合久久牛| 性中国xxx极品hd| 在线视频中文亚洲| 伊人网在线播放| av资源一区二区| 久久蜜桃av| 91看片就是不一样| 成av人片一区二区| 劲爆欧美第一页| 欧美剧情片在线观看| 欧美精品少妇| 午夜精品久久久久久久男人的天堂 | 亚洲自拍第三页| 国产清纯在线一区二区www| 黄色一级片免费看| 亚洲成人精品视频| 少妇视频在线| av成人观看| 欧美精品啪啪| 国内精品国产三级国产aⅴ久| 国产精品家庭影院| 国产精品无码粉嫩小泬| 亚洲男人天堂古典| 东京一区二区| 欧美一区视久久| 三级在线观看一区二区| 麻豆国产精品一区| 欧美日韩中文字幕综合视频| 六月丁香综合网| 国内精品久久久久久影视8| 欧美日韩黄色| 国产精品日韩三级| 丁香六月综合激情| 久久精品性爱视频| 精品国产乱子伦一区| 成人超碰在线| 久久99精品久久久久久久久久| 99综合视频| 3d动漫精品啪啪一区二区下载| 欧美视频在线观看 亚洲欧| 日韩欧美电影在线观看| 国产va免费精品高清在线观看| 九色精品国产蝌蚪| 国产精品igao| 中文字幕中文字幕在线一区 | 欧美不卡视频一区| 丁香花在线电影小说观看| 激情视频在线观看一区二区三区| 国产精品嫩草99av在线| av黄色免费网站| 欧美亚洲国产一区二区三区| 永久免费av片在线观看全网站| 国产综合久久久久久| 欧美1区视频| www.88av| 日本精品视频一区二区| 超碰国产在线| 95av在线视频| 国产一区二区精品| 最新中文字幕av| 欧美一级二级三级乱码| 国产欧洲在线| 亚洲欧美一区二区原创| 国产乱人伦偷精品视频不卡| 久久伊人成人网| 精品伊人久久97| 啪啪av大全导航福利综合导航 | 香蕉国产精品偷在线观看不卡| 无码 人妻 在线 视频| 欧美久久久久久久久久| 福利在线导航136| 性欧美videosex高清少妇| 国产一区二区美女| 99精品在线播放| 成年人精品视频| 午夜先锋成人动漫在线| 嫩草视频免费在线观看| 午夜精品一区二区三区免费视频| 九色视频成人自拍| 99re视频在线| 日韩精品亚洲专区| 免费在线黄色片| 一色桃子一区二区| 国产精品久久久久av蜜臀| 热久久精品免费视频| 亚洲一区二区高清| 在线观看a视频| 久久久久久国产精品一区|