”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 RAG 掌握查询应答:克服大规模会议数据中的关键挑战

使用 RAG 掌握查询应答:克服大规模会议数据中的关键挑战

发布于2025-01-14
浏览:500

在信息过载的数字时代,从大型数据集中提取可行的见解比以往任何时候都更加重要。最近,我踏上了利用检索增强生成 (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如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 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
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于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
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2025-01-15
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此在JS中它们也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index pas...
    编程 发布于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 和Result...
    编程 发布于2025-01-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3