使用Llama index构建多代理 RAG

检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示,RAG为LLM提供了有用的上下文,以产生基于事实的输出。

但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在限制了真实世界的RAG性能。多代理体系结构提供了一个理想的框架来克服这些挑战并释放RAG的全部潜力。通过划分职责,多代理系统允许专门的角色、并行执行和优化协作。

单代理RAG

当前的RAG系统使用单个代理来处理完整的工作流程——查询分析、段落检索、排序、摘要和提示增强。

这种单一的方法提供了一个简单的一体化解决方案。但是对每个任务依赖一个代理会导致瓶颈。代理会浪费时间从大量语料库中检索无关紧要的段落。长上下文的总结很糟糕,并且提示无法以最佳方式集成原始问题和检索到的信息。

这些低效率严重限制了实时应用程序的RAG的可伸缩性和速度。

多代理RAG

多代理体系结构可以克服单代理的限制。通过将RAG划分为并发执行的模块化角色可以实现:

检索:专用检索代理专注于使用优化的搜索技术进行有效的通道检索。这将最小化延迟。

搜索:通过排除检索因素,搜索可以在检索代理之间并行化,以减少等待时间。

排名:单独的排名代理评估检索的丰富度,特异性和其他相关信号的传代。这将过滤最大的相关性。

总结:将冗长的上下文总结成简洁的片段,只包含最重要的事实。

优化提示:动态调整原始提示和检索信息的集成。

灵活的体系:可以替换和添加代理来定制系统。可视化工具代理可以提供对工作流的洞察。

通过将RAG划分为专门的协作角色,多代理系统增强了相关性,减少了延迟,并优化了提示。这将解锁可伸缩的高性能RAG。

划分职责允许检索代理结合互补技术,如向量相似性、知识图谱和互联网抓取。这种多信号方法允许检索捕获相关性不同方面的不同内容。

通过在代理之间协作分解检索和排序,可以从不同的角度优化相关性。结合阅读和编排代理,它支持可伸缩的多角度RAG。

模块化架构允许工程师跨专门代理组合不同的检索技术。

Llama index的多代理 RAG

Llama index概述了使用多代理RAG的具体示例:

文档代理——在单个文档中执行QA和摘要。

向量索引——为每个文档代理启用语义搜索。

摘要索引——允许对每个文档代理进行摘要。

高阶(TOP-LEVEL)代理——编排文档代理以使用工具检索回答跨文档的问题。

对于多文档QA,比单代理RAG基线显示出真正的优势。由顶级代理协调的专门文档代理提供基于特定文档的更集中、更相关的响应。

下面我们看看Llama index是如何实现的:

我们将下载关于不同城市的Wikipedia文章。每篇文章都是单独存储的。我们只找了18个城市,虽然不是很大,但是这已经可以很好的演示高级文档检索的功能。

 from llama_index import (
     VectorStoreIndex,
     SummaryIndex,
     SimpleKeywordTableIndex,
     SimpleDirectoryReader,
     ServiceContext,
 )
 from llama_index.schema import IndexNode
 from llama_index.tools import QueryEngineTool, ToolMetadata
 from llama_index.llms import OpenAI

下面是城市的列表:

 wiki_titles = [
     "Toronto",
     "Seattle",
     "Chicago",
     "Boston",
     "Houston",
     "Tokyo",
     "Berlin",
     "Lisbon",
     "Paris",
     "London",
     "Atlanta",
     "Munich",
     "Shanghai",
     "Beijing",
     "Copenhagen",
     "Moscow",
     "Cairo",
     "Karachi",
 ]

下面是下载每个城市文档代码:

 from pathlib import Path
 
 import requests
 
 for title in wiki_titles:
     response = requests.get(
         "https://en.wikipedia.org/w/api.php",
         params={
             "action": "query",
             "format": "json",
             "titles": title,
             "prop": "extracts",
             # 'exintro': True,
             "explaintext": True,
         },
     ).json()
     page = next(iter(response["query"]["pages"].values()))
     wiki_text = page["extract"]
 
     data_path = Path("data")
     if not data_path.exists():
         Path.mkdir(data_path)
 
     with open(data_path / f"{title}.txt", "w") as fp:
         fp.write(wiki_text)

加载下载的文档

 # Load all wiki documents
 city_docs = {}
 for wiki_title in wiki_titles:
     city_docs[wiki_title] = SimpleDirectoryReader(
         input_files=[f"data/{wiki_title}.txt"]
     ).load_data()

定义LLM +上下文+回调管理器

 llm = OpenAI(temperature=0, model="gpt-3.5-turbo")
 service_context = ServiceContext.from_defaults(llm=llm)

我们为每个文档定义“文档代理”:为每个文档定义向量索引(用于语义搜索)和摘要索引(用于摘要)。然后将这两个查询引擎转换为传递给OpenAI函数调用工具。

文档代理可以动态选择在给定文档中执行语义搜索或摘要。我们为每个城市创建一个单独的文档代理。

 from llama_index.agent import OpenAIAgent
 from llama_index import load_index_from_storage, StorageContext
 from llama_index.node_parser import SimpleNodeParser
 import os
 
 node_parser = SimpleNodeParser.from_defaults()
 
 # Build agents dictionary
 agents = {}
 query_engines = {}
 
 # this is for the baseline
 all_nodes = []
 
 for idx, wiki_title in enumerate(wiki_titles):
     nodes = node_parser.get_nodes_from_documents(city_docs[wiki_title])
     all_nodes.extend(nodes)
 
     if not os.path.exists(f"./data/{wiki_title}"):
         # build vector index
         vector_index = VectorStoreIndex(nodes, service_context=service_context)
         vector_index.storage_context.persist(
             persist_dir=f"./data/{wiki_title}"
         )
     else:
         vector_index = load_index_from_storage(
             StorageContext.from_defaults(persist_dir=f"./data/{wiki_title}"),
             service_context=service_context,
         )
 
     # build summary index
     summary_index = SummaryIndex(nodes, service_context=service_context)
     # define query engines
     vector_query_engine = vector_index.as_query_engine()
     summary_query_engine = summary_index.as_query_engine()
 
     # define tools
     query_engine_tools = [
         QueryEngineTool(
             query_engine=vector_query_engine,
             metadata=ToolMetadata(
                 name="vector_tool",
                 description=(
                     "Useful for questions related to specific aspects of"
                     f" {wiki_title} (e.g. the history, arts and culture,"
                     " sports, demographics, or more)."
                 ),
             ),
         ),
         QueryEngineTool(
             query_engine=summary_query_engine,
             metadata=ToolMetadata(
                 name="summary_tool",
                 description=(
                     "Useful for any requests that require a holistic summary"
                     f" of EVERYTHING about {wiki_title}. For questions about"
                     " more specific sections, please use the vector_tool."
                 ),
             ),
         ),
     ]
 
     # build agent
     function_llm = OpenAI(model="gpt-4")
     agent = OpenAIAgent.from_tools(
         query_engine_tools,
         llm=function_llm,
         verbose=True,
         system_prompt=f"""\
 You are a specialized agent designed to answer queries about {wiki_title}.
 You must ALWAYS use at least one of the tools provided when answering a question; do NOT rely on prior knowledge.\
 """,
     )
 
     agents[wiki_title] = agent
     query_engines[wiki_title] = vector_index.as_query_engine(
         similarity_top_k=2
     )

下面就是高阶代理,它可以跨不同的文档代理进行编排,回答任何用户查询。

高阶代理可以将所有文档代理作为工具,执行检索。这里我们使用top-k检索器,但最好的方法是根据我们的需求进行自定义检索。

 # define tool for each document agent
 all_tools = []
 for wiki_title in wiki_titles:
     wiki_summary = (
         f"This content contains Wikipedia articles about {wiki_title}. Use"
         f" this tool if you want to answer any questions about {wiki_title}.\n"
     )
     doc_tool = QueryEngineTool(
         query_engine=agents[wiki_title],
         metadata=ToolMetadata(
             name=f"tool_{wiki_title}",
             description=wiki_summary,
         ),
     )
     all_tools.append(doc_tool)
     
 # define an "object" index and retriever over these tools
 from llama_index import VectorStoreIndex
 from llama_index.objects import ObjectIndex, SimpleToolNodeMapping
 
 tool_mapping = SimpleToolNodeMapping.from_objects(all_tools)
 obj_index = ObjectIndex.from_objects(
     all_tools,
     tool_mapping,
     VectorStoreIndex,
 )
 
 from llama_index.agent import FnRetrieverOpenAIAgent
 
 top_agent = FnRetrieverOpenAIAgent.from_retriever(
     obj_index.as_retriever(similarity_top_k=3),
     system_prompt=""" \
 You are an agent designed to answer queries about a set of given cities.
 Please always use the tools provided to answer a question. Do not rely on prior knowledge.\
 
 """,
     verbose=True,
 )

作为比较,我们定义了一个“简单”的RAG管道,它将所有文档转储到单个矢量索引集合中。设置top_k = 4

 base_index = VectorStoreIndex(all_nodes)
 base_query_engine = base_index.as_query_engine(similarity_top_k=4)

让我们运行一些示例查询,对比单个文档的QA /摘要到多个文档的QA /摘要。

 response = top_agent.query("Tell me about the arts and culture in Boston")

结果如下:

 === Calling Function ===
 Calling function: tool_Boston with args: {
   "input": "arts and culture"
 }
 === Calling Function ===
 Calling function: vector_tool with args: {
   "input": "arts and culture"
 }
 Got output: Boston is known for its vibrant arts and culture scene. The city is home to a number of performing arts organizations, including the Boston Ballet, Boston Lyric Opera Company, Opera Boston, Boston Baroque, and the Handel and Haydn Society. There are also several theaters in or near the Theater District, such as the Cutler Majestic Theatre, Citi Performing Arts Center, the Colonial Theater, and the Orpheum Theatre. Boston is a center for contemporary classical music, with groups like the Boston Modern Orchestra Project and Boston Musica Viva. The city also hosts major annual events, such as First Night, the Boston Early Music Festival, and the Boston Arts Festival. In addition, Boston has several art museums and galleries, including the Museum of Fine Arts, the Isabella Stewart Gardner Museum, and the Institute of Contemporary Art.
 ========================
 Got output: Boston is renowned for its vibrant arts and culture scene. It is home to numerous performing arts organizations, including the Boston Ballet, Boston Lyric Opera Company, Opera Boston, Boston Baroque, and the Handel and Haydn Society. The city's Theater District houses several theaters, such as the Cutler Majestic Theatre, Citi Performing Arts Center, the Colonial Theater, and the Orpheum Theatre.
 
 Boston is also a hub for contemporary classical music, with groups like the Boston Modern Orchestra Project and Boston Musica Viva. The city hosts major annual events, such as First Night, the Boston Early Music Festival, and the Boston Arts Festival, which contribute to its cultural richness.
 
 In terms of visual arts, Boston boasts several art museums and galleries. The Museum of Fine Arts, the Isabella Stewart Gardner Museum, and the Institute of Contemporary Art are among the most notable. These institutions offer a wide range of art collections, from ancient to contemporary, attracting art enthusiasts from around the world.
 ========================

下面我们看看上面的简单RAG管道的结果

 # baseline
 response = base_query_engine.query(
     "Tell me about the arts and culture in Boston"
 )
 print(str(response))
 
 Boston has a rich arts and culture scene. The city is home to a variety of performing arts organizations, such as the Boston Ballet, Boston Lyric Opera Company, Opera Boston, Boston Baroque, and the Handel and Haydn Society. Additionally, there are numerous contemporary classical music groups associated with the city's conservatories and universities, like the Boston Modern Orchestra Project and Boston Musica Viva. The Theater District in Boston is a hub for theater, with notable venues including the Cutler Majestic Theatre, Citi Performing Arts Center, the Colonial Theater, and the Orpheum Theatre. Boston also hosts several significant annual events, including First Night, the Boston Early Music Festival, the Boston Arts Festival, and the Boston gay pride parade and festival. The city is renowned for its historic sites connected to the American Revolution, as well as its art museums and galleries, such as the Museum of Fine Arts, Isabella Stewart Gardner Museum, and the Institute of Contemporary Art.

可以看到我们构建的多代理系统的结果要好的多。

总结

RAG系统必须发展多代理体系结构以实现企业级性能。正如这个例子所说明的,划分职责可以在相关性、速度、摘要质量和及时优化方面获得收益。通过将RAG分解为专门的协作角色,多代理系统可以克服单代理的限制,并启用可扩展的高性能RAG。

https://avoid.overfit.cn/post/7f39d14f7e1a47188870b04c0c332641

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/110416.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

答题小程序源码个人每日答题怎么做

答题小程序源码之个人每日答题怎么做 该模式以个人学习答题的方式进行答题,每人每天有X次答题机会,答对一题得X分,连续答对有额外奖励积分,每道题有倒计时X秒的思考时间。答题完成后领取本次的奖励积分。答题过程中如发现题目或答…

3D模拟场景开发引擎

在3D工程模拟开发中,有一些专门的引擎和工具可供选择,以帮助您创建逼真的三维模拟和模型。以下是一些用于3D工程模拟的开发引擎和工具,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流…

matlab 布尔莎七参数坐标转换模型

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫自重,把自己当个人。 一、算法原理 算法原理与实现代码已在免费文章:布尔莎七参数坐标转换模型一文中给出,不想看付费文章直接跳转即可。 二、代码实现 clc; clear; close all; %% --

C语言C位出道心法(一):基础语法

一:基础语法认知:|变量|常量|数据类型| 变量与常量,数据类型认知升维 C语言中各种变量的定义及数据类型的认知: 一般而言,在譬如C等高级编程语言中,我们定义不同的类型的变量,需要不同的数据类型来进行声明,不同类型的数据类型声明的变量占用的内存空间不一样; 而数据类型大致…

go中“哨兵错误”的由来及使用建议

“哨兵错误(sentinel error)”这个词的出处。之前我也只是在一些书籍和资料中见到过,也没深究。当这个网友问了我之后,就深入的翻了翻资料,在golang的官方博客中找到了这个词的提法,也算是比较官方的了吧。…

如何在外SSH远程连接Ubuntu系统【无公网IP】

如何在外SSH远程连接Ubuntu系统【无公网IP】 文章目录 如何在外SSH远程连接Ubuntu系统【无公网IP】前言1. 在Ubuntu系统下安装cpolar软件2. 完成安装后打开cpolar客户端web—UI界面3. 创建隧道取得连接Ubuntu系统公网地址4. 打开Windows的命令界面并输入命令 前言 随着科技和经…

酷开科技,让家庭更有温度!

生活中总有一些瞬间,会让我们感到无比温暖和幸福。一个拥抱、一句问候、一杯热茶,都能让我们感受到家庭的温馨和关爱。酷开科技也用自己的方式为我们带来了独属于科技的温暖,通过全新的体验将消费者带进一个充满惊喜的世界,让消费…

常见排序算法之堆排序

堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 需要注意的是排升序要建大堆,排降序建小堆…

SurfaceFliger与Vsync信号如何建立链接?

Vsync信号上报流程 Vsync的注册函数,来临时会回调HWComposer的hook_VSYNC方法,接着调用到vsync方法中 大致流程梳理: 该方法会通知给SurfaceFliger的onVsyncReceived方法,接着调用DispSync的addResyncSample方法。 DispSyncThr…

2023-在mac下安装Homebrew的国内镜像

mac安装Homebrew的国内镜像 尝试使用其他下载源:GitHub 可能会受到访问限制,尝试使用其他镜像或下载源。您可以使用清华大学、中科大或阿里云的 Homebrew 镜像,以提高下载速度和可靠性。例如,可以使用阿里云的镜像来安装 Homebre…

window系统修改rabbitmq 默认端口

安装完rabbitmq之后,默认的client端口是5672, 控制台访问端口是15672,rabbitmq管理工具启动之后在浏览器中输入地址: ​ ​http://localhost:15672/​​​ 就可以访问后台​ ​​​, 默认管理员账号:guest 密码&#x…

虚拟化、容器与Docker基本介绍以及安装部署(Docker 基本管理)

虚拟化、容器与Docker基本介绍以及安装部署(Docker 基本管理) 1、Docker 概述1.1Docker与虚拟机的区别1.2容器在内核中支持2种重要技术:1.3Docker核心概念 2、安装docker服务docker安装步骤详解 3、 网络优化4、docker基本命令4.1查看镜像——…

Unity 粒子特效-第二集-烟雾特效

一、烟雾特效预览 二、制作原理 资源在绑定资源里,我得审核通过以后才能改成免费,如果着急要,可以评论区发一下,我给你们发网盘 1.这个是序列帧图片粒子特效一起组合而成的 这就是一个单独整个的烟雾动画 如下,是这…

连铸生产线液压系统比例伺服阀放大器

连铸生产线液压系统是连铸机的关键组成部分,它由液压站组成,包括高压泵站、剪切机泵站、滑动水口站、塞棒液压站、中间罐车液压站和倾翻台液压站。这些站点通过管道连接,共同实现连铸机的各类动作,如升降、横移、定位、锁紧及辊缝…

如何借助数据集更好的评估NLP模型的性能?

随着信息时代的迅猛发展,每天有无数文本、声音、图片和视频不断涌入互联网。如何从海量数据中提炼有意义信息成为学术界和工业界迫切需要解决的问题。在此背景下,自然语言处理(NLP)应运而生,成为人工智能领域最为活跃的…

设计模式_观察者模式

观察者模式 介绍 设计模式定义案例问题堆积在哪里解决办法观察者是行为型设计模式 多个对象 观察 1个对象小强考试完 成绩公布了 家长/同学得知成绩后 做出不同反应一个一个通知很麻烦 先通知谁 也有讲究的 信息发布方 抽象出一个信息管理类 负责管理监听者 类图 代码 Obse…

Java访问直接内存

一、背景 上一篇文章 类目体系设计总结,讲了Forest缓存数据是放在直接内存的,今天我们就来了解一下Java的直接内存是个啥玩意,它该怎么使用。 二、直接内存介绍 直接内存是在Java堆外的,直接向系统申请内存空间,它不…

【数据挖掘 | 数据预处理】缺失值处理 重复值处理 文本处理 确定不来看看?

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

Ansible 安装部署及常用命令和17个模块详解

目录 Ansible 1 ansible 环境安装部署 1.1 管理端安装 ansible 1.2 ansible 目录结构 1.3 配置主机清单 1.4 配置密钥对验证 2 ansible 命令行模块 2.1 command 模块 2.2 shell 模块 2.3 cron 模块 2.4 user 模块 2.5 group 模块 2.6 copy 模块 2.7 file 模块 2.…

第65讲:MySQL存储过程之循环语法的核心概念与应用案例

文章目录 1.存储过程中循环的种类2.WHILE循环控制2.1.WHILE循环语法格式2.2.WHILE循环经典案例 3.REPEAT循环控制3.1.REPEAT循环语法结构3.2.REPEAT循环经典案例 4.LOOP循环控制4.1.LOOP循环语法结构4.2.LOOP循环经典案例一4.3.LOOP循环经典案例二 1.存储过程中循环的种类 在存…