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

在資訊過載的數位時代,從大型資料集中提取可行的見解比以往任何時候都更加重要。最近,我踏上了利用檢索增強生成 (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查找文本文件的ZIPF分佈如何使用Python查找文本文件的ZIPF分佈Mar 05, 2025 am 09:58 AM

本教程演示如何使用Python處理Zipf定律這一統計概念,並展示Python在處理該定律時讀取和排序大型文本文件的效率。 您可能想知道Zipf分佈這個術語是什麼意思。要理解這個術語,我們首先需要定義Zipf定律。別擔心,我會盡量簡化說明。 Zipf定律 Zipf定律簡單來說就是:在一個大型自然語言語料庫中,最頻繁出現的詞的出現頻率大約是第二頻繁詞的兩倍,是第三頻繁詞的三倍,是第四頻繁詞的四倍,以此類推。 讓我們來看一個例子。如果您查看美國英語的Brown語料庫,您會注意到最頻繁出現的詞是“th

我如何使用美麗的湯來解析HTML?我如何使用美麗的湯來解析HTML?Mar 10, 2025 pm 06:54 PM

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

python中的圖像過濾python中的圖像過濾Mar 03, 2025 am 09:44 AM

處理嘈雜的圖像是一個常見的問題,尤其是手機或低分辨率攝像頭照片。 本教程使用OpenCV探索Python中的圖像過濾技術來解決此問題。 圖像過濾:功能強大的工具圖像過濾器

如何使用TensorFlow或Pytorch進行深度學習?如何使用TensorFlow或Pytorch進行深度學習?Mar 10, 2025 pm 06:52 PM

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

Python中的平行和並發編程簡介Python中的平行和並發編程簡介Mar 03, 2025 am 10:32 AM

Python是數據科學和處理的最愛,為高性能計算提供了豐富的生態系統。但是,Python中的並行編程提出了獨特的挑戰。本教程探討了這些挑戰,重點是全球解釋

如何在Python中實現自己的數據結構如何在Python中實現自己的數據結構Mar 03, 2025 am 09:28 AM

本教程演示了在Python 3中創建自定義管道數據結構,利用類和操作員超載以增強功能。 管道的靈活性在於它能夠將一系列函數應用於數據集的能力,GE

python對象的序列化和避難所化:第1部分python對象的序列化和避難所化:第1部分Mar 08, 2025 am 09:39 AM

Python 對象的序列化和反序列化是任何非平凡程序的關鍵方面。如果您將某些內容保存到 Python 文件中,如果您讀取配置文件,或者如果您響應 HTTP 請求,您都會進行對象序列化和反序列化。 從某種意義上說,序列化和反序列化是世界上最無聊的事情。誰會在乎所有這些格式和協議?您想持久化或流式傳輸一些 Python 對象,並在以後完整地取回它們。 這是一種在概念層面上看待世界的好方法。但是,在實際層面上,您選擇的序列化方案、格式或協議可能會決定程序運行的速度、安全性、維護狀態的自由度以及與其他系

Python中的數學模塊:統計Python中的數學模塊:統計Mar 09, 2025 am 11:40 AM

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境