搜索
首页后端开发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中的循环加入列表吗?您可以使用Python中的循环加入列表吗?May 10, 2025 am 12:14 AM

是的,YouCanconCatenatElistsusingAloopInpyThon.1)使用eparateLoopsForeachListToAppendIteMstoaresultList.2)useanestedlooptoiterateOverMultipliplipliplipliplipliplipliplipliplipliplistforamoreConciseApprace.3)

condenate列表python:使用,扩展()等condenate列表python:使用,扩展()等May 10, 2025 am 12:12 AM

ThemostefficientmethodsforconcatenatinglistsinPythonare:1)theextend()methodforin-placemodification,2)itertools.chain()formemoryefficiencywithlargedatasets.Theextend()methodmodifiestheoriginallist,makingitmemory-efficientbutrequirescautionifpreserving

Python循环:示例和最佳实践Python循环:示例和最佳实践May 10, 2025 am 12:05 AM

pythonboopsincludeforandwhileloops,with forloopsidealforequencessand and whileloopsforcondition repetition.bestpracticesinvolve:1)使用listComprehensionsforshensionsforsimpletranspletransformations,2)obseringEnumerateForIndex-valuepairs,3)optingftingftingfortermornemoremoremoremore

Python的执行模型:编译,解释还是两者?Python的执行模型:编译,解释还是两者?May 10, 2025 am 12:04 AM

pythonisbothCompileDIntered。

Python是按线执行的吗?Python是按线执行的吗?May 10, 2025 am 12:03 AM

Python不是严格的逐行执行,而是基于解释器的机制进行优化和条件执行。解释器将代码转换为字节码,由PVM执行,可能会预编译常量表达式或优化循环。理解这些机制有助于优化代码和提高效率。

python中两个列表的串联替代方案是什么?python中两个列表的串联替代方案是什么?May 09, 2025 am 12:16 AM

可以使用多种方法在Python中连接两个列表:1.使用 操作符,简单但在大列表中效率低;2.使用extend方法,效率高但会修改原列表;3.使用 =操作符,兼具效率和可读性;4.使用itertools.chain函数,内存效率高但需额外导入;5.使用列表解析,优雅但可能过于复杂。选择方法应根据代码上下文和需求。

Python:合并两个列表的有效方法Python:合并两个列表的有效方法May 09, 2025 am 12:15 AM

有多种方法可以合并Python列表:1.使用 操作符,简单但对大列表不内存高效;2.使用extend方法,内存高效但会修改原列表;3.使用itertools.chain,适用于大数据集;4.使用*操作符,一行代码合并小到中型列表;5.使用numpy.concatenate,适用于大数据集和性能要求高的场景;6.使用append方法,适用于小列表但效率低。选择方法时需考虑列表大小和应用场景。

编译的与解释的语言:优点和缺点编译的与解释的语言:优点和缺点May 09, 2025 am 12:06 AM

CompiledLanguagesOffersPeedAndSecurity,而interneterpretledlanguages provideeaseafuseanDoctability.1)commiledlanguageslikec arefasterandSecureButhOnderDevevelmendeclementCyclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesandentency.2)cransportedeplatectentysenty

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脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境