构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的 PoC(认识考据色狗成人快播影院,Proof of Concept)过程相对粗心,但要将其扩充到坐褥环境中则会濒临多方面的挑战。这主如果因为 RAG 系统触及多个不同的组件,每个组件皆需要经心经营和优化,以确保举座性能达到令东谈主安详的水平。 『RAG 高效应用指南』系列拼集怎样提高 RAG 系统性能进行深入议论,提供一系列具体的方法和建议。同期读者也需要记取,提高 RAG 系统性能是一个执续的过程,需要不停地评估、优化和迭代。 凭据具体应用场景遴选妥当的优化方法过头组合,是优化 RAG 系统的中枢机策。 本文是『RAG 高效应用指南』系列的第 3 篇著作,本文将议论一些主流的 Query 贯穿时代。 在这篇著作中,笔者将斟酌以下几个问题: · 为什么要进行 query 贯穿 · query 贯穿有哪些时代(从 RAG 角度) · 各式 query 贯穿时代的终了(基于 LangChain) 为什么要进行 query 贯穿在 RAG 系统中,进行 query 贯穿曲直常环节的一步。query 贯穿指的是对用户冷漠的问题进行深入分析,索求出环节信息,从而更准确地从常识库中检索出与用户查询最关系的信息,进而生成高质料的回答。 在 RAG 系统中,对用户 query 进行贯穿,包括但不限于以下原因: 1、用户抒发的笼统性 由于当然谈话的复杂性,换取的词汇在不同的坎坷文中可能有不同的含义,query 贯穿不错匡助系统识别独立异这些诞妄,确保准确地贯穿用户的信得过需求。 比如,用户输入「我想知谈子龙是谁?」这里的「子龙」可能指代多种含义,如历史东谈主物赵子龙或者某个昵称。又比如,用户输入 「book」,而 book 有多种含义,可能指一册书,也可能指预订一个座位。 通过 query 贯穿,系统不错分析坎坷文,判断用户的意图,从而检索到关系的正敬佩息。 2、query 和 doc 不在团结个语义空间 用户的 query 频繁曲直结构化的,可能使用非细致或白话化的谈话进行目田抒发,而文档则可能秉承细致的书面抒发。query 贯穿不错匡助将用户的表述调遣为文档中术语,从而提高调回率。 比如,用户输入「手机坏了奈何办」,而文档中可能使用的是「手机维修阵势」这样的表述。又比如,用户可能问「怎样让网站更快」,而文档本质可能是「提高网站性能的方法」。 当用户的 query 和文档不在团结个语义空间时,这增多了检索系统的复杂性,因为它需要在不同的抒发形状、术语使用、坎坷文信息等方面建筑研究。 3、用户的 query 可能比较复杂 用户的 query 偶然可能触及多个子问题或包含多个阵势,需要将复杂的 query 阐明成更易处理的部分,逐个进行处理,以便提供准确和好意思满的谜底。 比如,用户 query:「怎样用 Python 分析数据,并生成展望阐发?」,而文档本质可能是「使用 Python 分析股票数据的方法包括数据获取、数据清洗、特征索求等阵势」、「生成展望阐发的方法包括建筑展望模子、进行模子训导和测试、生成阐发」。在这个例子,用户的 query 触及数据分析和阐发生成两个主要部分。通过 query 贯穿,系统不错将复杂的 query 阐明为两个子问题:「怎样用 Python 分析数据?」和「怎样生成展望阐发?」,然后划分进行处理和回答。 处理复杂 query 时,RAG 系统需要概略识别并阐明用户的查询,将其拆分为更小、更具体的子问题。这样不仅不错提高检索的准确性,还不错使生成的回答愈加精确和关系。 query 贯穿有哪些时代在 RAG 系统中,query 贯穿时代是提高信息检索着力和准确性的环节。我把刻下常用的 query 贯穿时代分为三大类:query 改写、query 增强和 query 阐明,如图所示。虽然,也还有好多其他时代,这里先先容底下这几种。 图片 坎坷文信息补全在多轮对话中,用户确刻下输入通常包含隐含的指代关系和不详的信息。举例,用户在对话中提到的「它」可能指代之前对话中提到的某个具体事物。如果贫窭这些坎坷文信息,系统无法准确贯穿用户意图,从而导致语义缺失,无法有用调回关系信息。 在这种情况下,咱们不错使用坎坷文信息补全,这里的坎坷文不单是是指多轮对话的信息,还包含刻下对话的布景信息,比如时辰、处所等。咱们不错通过使用大型谈话模子(LLM),对刻下的 query 进行重写,将坎坷文中隐含的信息纳入到更生成的 query 中。 底下是一段多轮对话的示例: 厕所 偷拍User:最近有什么排场的电视剧?Bot:最近上映了《庆余年 2》,与范闲再探庙堂江湖的故事User:我想看第一季Bot:在这个例子,用户的问题「我想看第一季」包含了隐含的指代信息,莫得坎坷文信息的补全,系统无法知谈具体指的是哪部电视剧。通过秉承坎坷文信息补全,咱们把前边的对话信息也纳入其中,对 query 进行改写,不错生成雷同「我想看庆余年第一季」的好意思满 query,从而提高后续检索的清楚度和关系性。 坎坷文信息补全不错提高 query 的清楚度,使系统概略更准确地贯穿用户意图,不外,因为需要多调用一次 LLM,会增多举座过程的 latency 问题。因此,咱们也需要量度计算复杂度和蔓延的问题。 RAG-FusionRAG Fusion 旨在进步搜索精度和全面性,它的中枢旨趣是凭据用户的原始 query 生成多个不同角度的 query ,以捕捉 query 的不同方面和轻微隔离。然后通过使用逆向名次交融(Reciprocal Rank Fusion,RRF)时代,将多个 query 的检索限度进行交融,生成一个长入的名次列表,从而增多最关系文档出当今最终 TopK 列表的契机。 图片 RAG Fusion 的举座过程如图所示,责任过程如下 1、多查询生成:径直使用用户输入的 query 进行查询,查询限度可能太窄导致无法产生较为全面的限度。通过使用 LLM 将原始查询推广成种种化的查询,从而增多搜索的视线和深度。 2、逆向名次交融(RRF):RRF 是一种粗心而有用的时代,用于交融多个检索限度的名次,以提高搜索限度的质料。它通过将多个系统的名次限度进行加权概述,生成一个长入的名次列表,使最关系的文档更有可能出当今限度的顶部。这种方法不需要训导数据,适用于多种信息检索任务,且在多个实验中解析优于其他交融方法。 3、生成性输出:将重新名次的文档和查询输入到 LLM ,生成结构化、豪阔洞见的谜底或摘抄。 拓展阅读 · https://towardsdatascience.com/forget-rag-the-future-is-rag-fusion-1147298d8ad1 · https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf · https://github.com/Raudaschl/rag-fusion Multi-Query跟 RAG Fusion 雷同,MultiQuery 是一种通过生成多种视角的查询来检索关系文档的方法。它使用 LLM 从用户输入的查询生成多个不同的查询视角,然后为每个查询检索一组关系文档,并合并这些限度以赢得更全面的文档合股。 跟 RAG Fusion 不同的是,MultiQuery 莫得使用 RRF 来交融多个搜索限度列表的名次,而是将多个搜索限度放到 context 中。这样作念的平正是概略在坎坷文中保留更多的检索限度,提供更丰富的信息源,同期减少了在名次交融上的复杂性。通过这种方法,用户不错赢得愈加种种化和全面的信息合股,有助于更好地贯穿和回回应杂的问题。 图片 拓展阅读 · https://python.langchain.com/v0.2/docs/how_to/MultiQueryRetriever/ · https://github.com/langchain-ai/rag-from-scratch HyDE频繁,RAG 向量检索通过使用内积通常度来度量查询(query)和文档(doc)之间的通常性。事实上,这里存在一个挑战:query 和 doc 不在团结个语义空间(前边还是先容),通过将 query 和 doc 向量化,然后基于向量通常性来检索,检索的精度有限何况噪声可能比较大。为了责罚这个问题,一种可行的方法是通过标注多数的数据来训导 embedding 函数。 而 HyDE(假定性文档镶嵌,Hypothetical Document Embeddings)时代是一种无监督的方法,它基于这样一个假定:与 query 比拟,假定性回答(LLM 径直对 query 生成的谜底)与文档分享更通常的语义空间。 HyDE 具体是奈何责任的呢? 图片 领先,HyDE 针对 query 径直生成一个假定性文档或者说回答(hypo_doc)。然后,对这个假定性回答进行向量化处理。终末,使用向量化的假定性回答去检索通常文档。 经过这样一顿操作,过去的 query - doc 检索就酿成了 query - hypo_doc - doc 的检索,而此时 hypo_doc 和 doc 可能在语义空间上更接近。因此,HyDE 不错在一定进度上进步文档检索的精确度和关系度。 举个例子,假定用户发问「怎样提高寝息质料?」,HyDE 领先生成一个假定性回答,比如「提高寝息质料的方法包括保执规章的寝息时辰、幸免咖啡因和电子诱惑等。」,这个假定回答经过编码后,可能与提供的常识库中的文档本质(如不喝咖啡,不玩手机等电子诱惑)更接近,从而更容易找到关系文档。 图片 HyDE 的中枢上风在于: 1. 幸免了在团结向量空间中学习两个镶嵌函数的复杂性。 2. 垄断无监督学习,径直生成和垄断假定文档。 3. 在贫窭标注数据的情况下,仍能显贵提高检索的准确性和着力。 然而,因为 HyDE 强调问题的假定性回答和查找本质的通常性,因此也存在着不行幸免的问题,即,假定性回答的质料取决于大型谈话模子的生成才智,如果模子生成的回答不准确或不关系,会影响检索着力。举例,如果斟酌的主题对 LLM 来说比较生分,这种方法就无效了,可能会导致生成诞妄信息的次数增多。 拓展阅读 · https://arxiv.org/pdf/2212.10496 · https://docs.llamaindex.ai/en/stable/examples/query_transformations/HyDEQueryTransformDemo/#failure-case-1-hyde-may-mislead-when-query-can-be-mis-interpreted-without-context · https://github.com/langchain-ai/rag-from-scratch Step-back promptingStep-back prompting 时代旨在提高 LLM 进行抽象推理的才智,它指令 LLM 在回答问题前进行深度念念考和抽象处理,将复杂问题阐明为更高头绪的问题。 Step-Back Prompting 包含两个主要阵势: 1. 抽象(Abstraction):不是径直针对问题进行回答,而是领先促使 LLM 冷漠一个更高档别的「回溯问题」(step-back question),这个问题触及更世俗的高档认识或原则,并检索与这些认识或原则关系的关系事实。 2. 推理(Reasoning):在高档认识或原则的基础上,垄断谈话模子的内在推理才智,对原始问题进行推贯穿答。这种方法被称为基于抽象的推理(Abstraction-grounded Reasoning)。 图片 研究者在多个挑战性推理密集型任务上测试了 Step-Back Prompting,包括 STEM、常识问答(Knowledge QA)和多跳推理(Multi-Hop Reasoning)。实验触及 PaLM-2L、GPT-4 和 Llama2-70B 模子,并不雅察到在各式任务上的性能显贵进步。举例,在 MMLU(物理和化学)上,PaLM-2L 的性能划分提高了 7% 和 11%,在 TimeQA 上提高了 27%,在 MuSiQue 上提高了 7%。 Step-Back Prompting 适用于需要复杂推理的鸿沟,如: · STEM 鸿沟:触及物理和化学等科学旨趣的应用问题。 · 常识问答:需要多数事实性常识的问题回答。 · 多跳推理:需要通过多个阵势或信息源进行推理的问题。 拓展阅读 · https://arxiv.org/pdf/2310.06117 · https://blog.langchain.dev/query-transformations/ · https://github.com/langchain-ai/rag-from-scratch IR-CoTIR-CoT(Interleaving Retrieval with Chain-of-Thought Reasoning),是一种用于责罚多阵势问题(Multi-Step Questions)的时代。IR-CoT 通过轮流践诺检索(retrieval)和推理(reasoning)阵势来提肥硕型谈话模子(LLMs)在处理复杂问题时的性能,如图所示。 IR-CoT 的中枢念念想是将检索阵势与推理阵势相结合,以领导检索过程并反过来使用检索限度来立异推理链(Chain-of-Thought, CoT)。论文作家以为,关于多步 QA 任务,单纯基于问题的一次性检索是不够的,因为后续检索的本质取决于还是推导出的信息。 IR-CoT的责任过程如下: 1. 运行化检索:使用问题行为查询,从常识库中检索一组关系段落。 2. 轮流践诺两个阵势: · 推广 CoT:垄断问题、到咫尺为止网罗的段落和还是生成的 CoT 句子来生成下一个 CoT 句子。 · 推广检索信息:使用上一个 CoT 句子行为查询来检索荒芜的段落,并将它们添加到已网罗的段落蚁合。 3. 相通上述阵势:直到 CoT 阐发谜底或达到最大允许的推理阵势数。 4. 隔绝:复返统统网罗的段落行为检索限度,并使用这些段落行为坎坷文,通过径直 QA 指示或CoT 指示来往答原始问题。 图片 这里,咱们以论文中的一个例子来进行说明: 图片 如图所示, 1. 运行问题:Lost Gravity 是在哪个国度制造的? 2. CoT 生成与检索阵势轮流: · 第一步检索:系统帅先进行一次检索,赢得关系信息,限度发现「Lost Gravity 是由 Mack Rides 制造的」。 · 第二步检索:基于之前的限度,系统进行进一步的检索,发现「Mack Rides 是一家来自德国的公司」。 · 第三步检索:链接积存文档,说明这一信息。 3. 最终回答:凭据积存的信息作念出回答:「谜底是德国」。 IR-CoT 通过轮流进行 CoT 生成和检索阵势,使得每一步的检索过程皆受到前一步的推理限度领导,从而不错更精确地定位关系信息。 这比拟于传统的单次检索方法,即只使用运行问题行为查询的形状,概略赢得更多关系且精确的信息,提高了最终谜底的准确性。 拓展阅读 · https://arxiv.org/pdf/2212.10509 · https://github.com/langchain-ai/rag-from-scratch Least-to-MostLeast-to-Most prompting 也不错用于责罚多步推理的问题,它将复杂问题阐明为一系列更粗心的子问题,并按要领责罚这些子问题。 Least-to-Most prompting 包括两个主要阶段: 1. 阐明(Decomposition):在这个阶段,将复杂问题阐明为更粗心的子问题。 2. 子问题责罚(Subproblem Solving):在这个阶段,使用之前责罚的子问题的谜底来匡助责罚刻下子问题。 这种方法的中枢念念想是将问题阐明为可照看的阵势,并垄断徐徐构建的谜底来领导模子责罚更复杂的问题。 图片 这里,咱们以论文中的一个例子来进行说明: 图片 如图所示,展示了怎样通过两阶段的方法使用 LLM 责罚一个数学题。 问题:Amy 爬到滑梯顶部需要4分钟,从滑梯滑下需要1分钟。水滑梯将在15分钟后关闭。她在关闭之前不错滑若干次? 阶段 1:将问题阐明为子问题 LLM 将复杂问题阐明为更小的子问题:为了回答「她在关闭之前不错滑若干次?」,咱们需要先责罚「每次滑行需要多永劫辰?」的问题。 阶段 2:挨次责罚子问题 子问题1: 问:每次滑行需要多永劫辰?答:Amy 爬上滑梯需要4分钟,滑下来需要1分钟。因此每次滑行需要5分钟。 子问题2: 问:她在关闭之前不错滑若干次?答:水滑梯将在15分钟后关闭。每次滑行需要5分钟。因此 Amy 不错滑15 ÷ 5 = 3次。 拓展阅读 · https://arxiv.org/pdf/2205.10625 · https://github.com/langchain-ai/rag-from-scratch 各式 query 贯穿时代的终了知谈了各式 query 贯穿时代的旨趣,咱们就不错尝试使用 LangChain 来终显然。笔者将统统终了代码放在jupyter notebook 中了,需要的读者,请缓和公众号,然后发音书 query 获取 notebook 代码。 图片 在代码中,我使用了 bge-m3 向量模子和 DeepSeek 大模子,它们皆不错很粗浅地获取到。在使用上述 notebook 代码之前,全球需要先安设如下 python 依赖库: langchainlangchain-openailangchain_communitytiktokenlangchainhubchromadbbeautifulsoup4unstructuredlxmlsentence-transformers 另外,读者还需要去 DeepSeek 官网(https://platform.deepseek.com/usage)央求 API Key,刚注册的时候,会送 500 万 token。 这里,给全球展示下坎坷文信息补全的终了,更多代码不错参考笔者的 notebook(缓和公众号,然后发音书 query 进行获取)。 坎坷文信息补全代码如下: from langchain_openai import ChatOpenAIfrom langchain_core.prompts import PromptTemplatellm = ChatOpenAI( model='deepseek-chat', temperature=0, api_key=your_api_key, base_url='https://api.deepseek.com', streaming=False)system_prompt = '''使用聊天对话中的坎坷文重新表述用户问题,使其成为一个零丁好意思满的问题,不要翻译聊天历史和用户问题。<conversation></conversation> 标签中的本质属于聊天对话历史。<question></question> 标签中的本质属于用户的问题。不详开场白,不要说明,凭据聊天对话历史和刻下用户问题,生成一个零丁好意思满的问题。将零丁问题放在 <standalone_question> 标签中。'''user_prompt = '''<conversation>User:最近有什么排场的电视剧?Bot:最近上映了《庆余年 2》,与范闲再探庙堂江湖的故事</conversation><question>User:我想看第一季</question>'''messages = [ {'role': 'system', 'content': system_prompt}, {'role': 'user', 'content': user_prompt},]response = llm.invoke(messages)限度如下: 图片 牵挂构建一个高效的 RAG 系统,不单是是时代上的挑战,更是对咱们贯穿和应酬信息复杂性的锻练。本文防备进展了 Query 贯穿的迫切性、旨趣和时代终了,揭示了在 RAG 系统中,精确的 Query 贯穿是进步信息检索与生成质料的环节。 Query 贯穿行为联结用户需乞降常识库的桥梁,其中枢在于概略准确捕捉用户的意图,并在海量信息中找到最关系的本质。 一个性能优良的 RAG 系统色狗成人快播影院,离不开对 Query 贯穿的执续优化。这一过程不仅是时代的迭代,更是对用户需求的深入贯穿。如故那句话:提高 RAG 系统性能是一个执续的过程,需要不停地评估、优化和迭代。 本站仅提供存储处事,统统本质均由用户发布,如发现存害或侵权本质,请点击举报。 |