首頁 >後端開發 >Python教學 >使用 RAG 掌握查詢應答:克服大規模會議資料中的關鍵挑戰

使用 RAG 掌握查詢應答:克服大規模會議資料中的關鍵挑戰

DDD
DDD原創
2024-11-27 03:25:11184瀏覽

在資訊過載的數位時代,從大型資料集中提取可行的見解比以往任何時候都更加重要。最近,我踏上了利用檢索增強生成 (RAG) 來解決一項重大挑戰的旅程——從大量會議記錄中提供準確的答案。本部落格探討了將我的基於 RAG 的查詢應答系統轉變為從非結構化會議資料中提取見解的強大工具的障礙、解決方案和成就。

問題陳述:使用 RAG 進行查詢應答的挑戰
主要挑戰之一是建立一個能夠在龐大的會議記錄儲存庫中處理複雜的、特定於意圖的查詢的系統。傳統的 RAG 查詢應答模型經常傳回不相關或不完整的訊息,無法捕捉使用者意圖。會議資料的非結構化性質與多樣化的查詢類型結合,需要更精細的解決方案。

初步方法:為有效的查詢應答奠定基礎
我從一個基礎 RAG 模型開始,該模型旨在將檢索和回應生成結合起來。最初使用的兩種技術是:

  1. 分塊:以句子邊界將大文檔分成較小的片段,透過縮小搜尋範圍來改善檢索。

  2. 嵌入和向量儲存:分塊後,每個片段都被嵌入並儲存在向量資料庫中,從而實現高效搜尋。

但是,這種設定有其限制。最初的分塊方法通常會導致檢索不相關的信息,並且生成的答案缺乏精度以及與每個查詢的意圖的一致性。

大規模 RAG 查詢應答的挑戰

  • 處理複雜查詢:某些複雜問題需要超越基本語意搜尋的更深入的語意理解。
  • 上下文不符:檢索到的區塊通常在上下文上相似,但不夠精確,無法滿足查詢的要求。
  • 檢索精確度限制:檢索一小組文件(例如五到十個)通常會導致缺乏相關性的有限結果。

這些挑戰強調需要更先進的方法來提高 RAG 查詢應答的準確性。

增強查詢準確性的高級 RAG 技術(解決方案)
為了解決這些問題,我應用了幾個先進的方法,迭代地完善系統:
語意分塊
與傳統分塊不同,語意分塊優先考慮每個片段中的意義,透過將檢索到的資訊與查詢的意圖對齊來增強相關性。

Mastering Query Answering with RAG: Overcoming Key Challenges in Large-Scale Meeting Data

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain.schema import Document

# Initialize OpenAI Embeddings with API key
openai_api_key = ""
embedder = OpenAIEmbeddings(openai_api_key=openai_api_key)
text_splitter = SemanticChunker(embedder)

def prepare_docs_for_indexing(videos):
    all_docs = []

    for video in videos:
        video_id = video.get('video_id')
        title = video.get('video_name')
        transcript_info = video.get('details', {}).get('transcript_info', {})
        summary = video.get('details', {}).get('summary')
        created_at = transcript_info.get('created_at')  # Getting the created_at timestamp

        # Get the full transcription text
        transcription_text = transcript_info.get('transcription_text', '')

        # Create documents using semantic chunking
        docs = text_splitter.create_documents([transcription_text])

        for doc in docs:
            # Add metadata to each document
            doc.metadata = {
                "created_at": created_at,
                "title": title,
                "video_id": video_id,
                "summary": summary
            }
            all_docs.append(doc)

    return all_docs


docs = prepare_docs_for_indexing(videos)

# Output the created documents
for doc in docs:
    print("____________")
    print(doc.page_content)

最大保證金檢索
此方法透過區分相關資料和不相關資料來提高檢索精度,確保只檢索最匹配的資料塊。

Lambda 評分
使用 Lambda 評分,我可以根據相關性對結果進行排名,優先考慮與查詢意圖更一致的回應,以獲得更好的答案品質。

from langchain_community.vectorstores import OpenSearchVectorSearch
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

docsearch = OpenSearchVectorSearch.from_documents(
    docs, embeddings, opensearch_url="http://localhost:9200"
)

query = "your query"
docs = docsearch.max_marginal_relevance_search(query, k=2, fetch_k=10, lambda_param=0.25)

多查詢與 RAG 融合
對於複雜的問題,系統會產生多個子查詢。然後,RAG Fusion 將不同的答案整合為一個統一的、有凝聚力的反應,從而提高回應品質並減少錯誤。

def generate_multi_queries(question: str):
    # Template to generate multiple queries
    template = """You are an AI language model assistant. Your task is to generate five 
    different versions of the given user question to retrieve relevant documents from a vector 
    database. By generating multiple perspectives on the user question, your goal is to help
    the user overcome some of the limitations of the distance-based similarity search. 
    Provide these alternative questions separated by newlines. Original question: {question}"""

    # Creating a prompt template for query generation
    prompt_perspectives = ChatPromptTemplate.from_template(template)

    # Generate the queries using ChatOpenAI and output parser
    generate_queries = (
        prompt_perspectives 
        | ChatOpenAI(temperature=0, openai_api_key=openai_api_key) 
        | StrOutputParser() 
        | (lambda x: x.split("\n"))
    )

    # Invoke the chain to generate queries
    multi_queries = generate_queries.invoke({"question": question})

    return multi_queries
def reciprocal_rank_fusion(results: list[list], k=60):
    """Applies Reciprocal Rank Fusion (RRF) to fuse ranked document lists."""
    fused_scores = {}
    for docs in results:
        for rank, doc in enumerate(docs):
            doc_str = dumps(doc)  # Convert to a serializable format
            if doc_str not in fused_scores:
                fused_scores[doc_str] = 0
            fused_scores[doc_str] += 1 / (rank + k)  # RRF formula

    # Sort documents by the fused score
    reranked_results = [
        (loads(doc), score)
        for doc, score in sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
    ]
    return reranked_result

Mastering Query Answering with RAG: Overcoming Key Challenges in Large-Scale Meeting Data

增強的索引和最佳化的向量搜尋
改進索引機制並細化向量搜尋參數使檢索更快、更準確,尤其是對於大型資料集。

結果:RAG 查詢回應方面的主要成就
實施這些技術帶來了顯著的改進:

  • 提高檢索精度:語義分塊和最大邊距檢索等技術改進了資料檢索,確保只返回最相關的區塊。
  • 增強相關性:Lambda 評分有效地優先考慮相關結果,使回應與查詢意圖緊密結合。
  • 改進了複雜查詢的處理:多查詢產生和 RAG Fusion 使系統能夠管理複雜的問題,提供全面的答案。
  • 更高的系統穩健性:這些改進將系統從基本模型提升為複雜、可靠的查詢應答工具,適用於大規模、非結構化會議資料。

主要重點與經驗教訓
透過這趟旅程,我確定了幾個核心見解:

  1. 適應性是關鍵:第一次嘗試很少會出現有效的解決方案;迭代改進和靈活性至關重要。
  2. 分層方法提高穩健性:整合多種方法—語意分塊、最大裕度檢索、Lambda 評分—創造了一個更強大、更有效的系統。
  3. 徹底的查詢處理:多重查詢產生和 RAG Fusion 強調了從多個角度解決問題的重要性。
  4. 專注於語義:強調資料內的含義而不是僅僅強調結構,可以顯著提高檢索準確性。

結論:基於 RAG 的系統的未來前景
利用先進技術增強 RAG 模型,將簡單的檢索系統轉變為用於回答複雜、細緻入微的查詢的強大工具。展望未來,我的目標是融入即時學習功能,讓系統能夠動態適應新數據。這段經驗加深了我的技術技能,並強調了資料檢索系統中靈活性、語義焦點和迭代改進的重要性。

最終想法:實施高階 RAG 系統的指南
透過分享我克服 RAG 挑戰的經驗,我希望為實施類似解決方案提供指導。策略技術與迭代細化結合,不僅解決了眼前的問題,也為查詢應答系統的未來進步奠定了堅實的基礎。

以上是使用 RAG 掌握查詢應答:克服大規模會議資料中的關鍵挑戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Python Day-循環下一篇:Python Day-循環