」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 RAG 掌握查詢應答:克服大規模會議資料中的關鍵挑戰

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

發佈於2025-01-14
瀏覽:687

在信息过载的数字时代,从大型数据集中提取可行的见解比以往任何时候都更加重要。最近,我踏上了利用检索增强生成 (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 挑战的经验,我希望为实施类似解决方案提供指导。战略技术与迭代细化相结合,不仅解决了眼前的问题,而且为查询应答系统的未来进步奠定了坚实的基础。

版本聲明 本文轉載於:https://dev.to/cognilium_ai/mastering-query-answering-with-rag-overcoming-key-challenges-in-large-scale-meeting-data-33ji?1如有侵犯,請聯絡study_golang @163.com刪除
最新教學 更多>
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此在JS中它們也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index pa...
    程式設計 發佈於2025-01-15
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-01-15
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2025-01-15
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2025-01-15
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2025-01-15
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2025-01-15
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2025-01-15
  • 使用 RAG 掌握查詢應答:克服大規模會議資料中的關鍵挑戰
    使用 RAG 掌握查詢應答:克服大規模會議資料中的關鍵挑戰
    在信息过载的数字时代,从大型数据集中提取可行的见解比以往任何时候都更加重要。最近,我踏上了利用检索增强生成 (RAG) 来解决一项重大挑战的旅程——从大量会议记录中提供准确的答案。本博客探讨了将我的基于 RAG 的查询应答系统转变为从非结构化会议数据中提取见解的强大工具的障碍、解决方案和成就。 问题...
    程式設計 發佈於2025-01-14
  • 如何準確地確定自訂程式碼和函式庫函數的閏年相容性?
    如何準確地確定自訂程式碼和函式庫函數的閏年相容性?
    使用自訂程式碼和函式庫函數來確定閏年相容性問題:發展一個考慮到複雜的閏年,準確地確定給定年份是否為閏年的函數criteria.背景:閏年的典型特徵是能被4 整除。但是,此規則有例外:能被 100 整除的年份不被視為閏年,除非它們能被 400 整除。 自訂程式碼分析:提供的自訂程式碼似乎遵循閏年標準,...
    程式設計 發佈於2025-01-14
  • 如何在 Go 測試中可靠地列印調試訊息?
    如何在 Go 測試中可靠地列印調試訊息?
    如何在 Go 測試中有效列印訊息在 Go 中進行測試期間,出於調試目的列印訊息可能很有用。但是,使用 fmt.Println 並不總是產生預期的輸出。相反,以下方法在使用測試時提供更可靠的列印選項。 Testing.T 和 Testing.B 日誌記錄方法:testing.T 和測試。 B結構體提供...
    程式設計 發佈於2025-01-14
  • 如何使用基本 PHP 指令合併兩個映像?
    如何使用基本 PHP 指令合併兩個映像?
    使用 PHP 合併映像:詳細指南問題我們如何使用基本的 PHP 指令無縫合併兩個影像?請考慮以下範例:圖片一:[圖片一 URL]圖片二:[圖片二 URL ]所需結果:[合併圖像URL]解決方案要在PHP中合併兩個圖像,我們可以利用以下方法:創建圖像資源:使用imagecreatefrompng() ...
    程式設計 發佈於2025-01-14
  • Go Map 迭代順序取決於鍵插入順序嗎?
    Go Map 迭代順序取決於鍵插入順序嗎?
    Go Maps 中的賦值順序考慮以下 Go 碼:package main import "fmt" type Vertex struct { Lat, Long float64 } var m map[string]Vertex func main() { m =...
    程式設計 發佈於2025-01-14
  • 如何在 JDBC 資料庫中插入和檢索 java.time.LocalDate 物件?
    如何在 JDBC 資料庫中插入和檢索 java.time.LocalDate 物件?
    在SQL 資料庫中插入和取得java.time.LocalDate 物件(如H2)問題: 如何處理java.time 類型類似於透過JDBC 使用SQL 資料庫的LocalDate,例如H2? Legacy方法: 使用PreparedStatement::setDate 和ResultSet::ge...
    程式設計 發佈於2025-01-14
  • 如何在 MySQL 中儲存 Unicode 資料?
    如何在 MySQL 中儲存 Unicode 資料?
    MySQL 中的 Unicode 儲存在 MySQL 中,透過使用適當的字元集來容納 Unicode 儲存。與 SQL Server 的 nvarchar 類型不同,MySQL 使用不同的字元集來編碼資料。值得注意的是,MySQL 的免費版本提供了對 Unicode 的支援。 要在MySQL 中儲存...
    程式設計 發佈於2025-01-14
  • 為什麼將 Const 物件傳遞給非常量成員函數會導致 C++ 中的限定符取消資格錯誤?
    為什麼將 Const 物件傳遞給非常量成員函數會導致 C++ 中的限定符取消資格錯誤?
    將常數物件作為“this”參數傳遞:限定符取消資格錯誤在C 中,將常數物件作為“this”參數傳遞給成員函數可能會導致「將'const xxx'作為成員函數的'this'參數傳遞會丟棄限定符」錯誤。出現這種情況是因為編譯器考慮到非常量成員函數可能修改物件的可能性,而對...
    程式設計 發佈於2025-01-14

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3