LLM之RAG实战(二):使用LlamaIndex + Metaphor实现知识工作自动化

      最先进的大型语言模型(LLM),如ChatGPT、GPT-4、Claude 2,具有令人难以置信的推理能力,可以解锁各种用例——从洞察力提取到问答,再到通用工作流自动化。然而,他们检索上下文相关信息的能力有限。检索增强生成(RAG)系统可以将LLM与静态知识源上的外部存储解决方案相结合。

        RAG通常需要两个核心组件

  1. 通用抽象,允许LLM以“读取”和“写入”的方式智能地对数据执行各种任务;

  2. 一个适合LLM使用的好搜索引擎

      LlamaIndex数据代理抽象有助于满足第一个核心组件。一个完整的数据代理由一个推理循环和一组工具组成。这些工具可以是用于搜索/检索的接口,或者更一般地是任何外部API。给定一个查询,代理将执行其推理循环,并动态地计算出完成手头任务所需的工具集。

       数据代理可以访问LlamaHub上提供的一套丰富的工具,从Gmail API到SQL数据库API,再到Bing搜索形式的基本工具。我们已经证明,他们能够执行e2e任务,从发送电子邮件、安排会议到自动化定制支持洞察力提取。然而,从来没有专门为LLM使用而设计的工具。

      本文将介绍LlamaIndex和Metaphor的集成来实现RAG:将LlamaIndex数据代理的功能与Metaphor作为一种本地LLM搜索工具相结合,使知识工作者能够回答任何数据上的任何问题,无论是最近的还是复杂的。示例可以参考:https://github.com/emptycrown/llama-hub/blob/main/llama_hub/tools/notebooks/metaphor.ipynb

一、Metaphor介绍

      Metaphor API旨在将你的LLM连接到互联网,它允许你在互联网上进行完全神经化、高度语义化的搜索,还可以从结果中获得干净的HTML内容。

       根据人们在互联网上谈论事物的方式,Metaphor被训练来预测互联网上的链接。例如,有人可能会这样发布他们读到的一篇很棒的文章:

Found an amazing article I read about the history of Rome’s architecture: [LINK]

       通过训练一个模型来预测人们谈论这些链接的方式,最终的结果是一种完全不同的互联网搜索方式——就像你要分享你想要的链接一样进行搜索。虽然一开始有点不直观,但以这种方式搜索可以返回极高质量的结果。但就LlamaIndex而言,您不必担心这一点,因为默认情况下,查询将转换为Metaphor Prompt。

为什么你会在Bing/Google上使用Metaphor搜索?主要有三个原因:

  • 您可以完全从语义上进行搜索,例如使用感觉或复杂的描述符;
  • 您只能搜索所需实体的类型。公司、文章、人;
  • 你可能会发现谷歌的内容表现不佳,可能是因为关键词不是正确的工具,也可能只是因为谷歌不在乎为这类内容返回好的结果。

PS:要了解更多信息,您可以阅读完整的Metaphor API博客文章(https://platform.metaphor.systems/blog/building-search-for-the-post-chatgpt-world)

二、LlamaIndex和Metaphor的集成原理

LlamaHub提供了Metaphor API接口,包括如下5个工具可供Agent使用。

  • 搜索:是Metaphor的入口——Agent可以通过自然语言向Metaphor搜索引擎进行查询。查询还可以包含一些附加参数,例如返回结果的数量、要包含/排除的领域以及日期筛选器;
  • 检索文档:根据搜索到的文档内容从中检索出符合条件的部分内容;
  • 搜索和检索文档:结合了“搜索”和“检索文档”的功能;
  • 查找相似:直接调用Metaphor提供的端点,可以返回与给定URL相似的文档列表;
  • 当前日期:这是一个返回当前日期的函数。就其本身而言,它与Metaphor的API无关,但可能会事先调用它,以确定传递到Metaphor的某些端点的正确日期过滤器。

在下一节中,让我们了解数据代理如何通过各种用例使用这些端点。

三、LlamaIndex和Metaphor集成示例

让我们看一下LlamaIndex数据Agent是如何与Metaphor一起使用的。

3.1 Metaphor工具测试

第一步是导入MetaphorToolSpec:

# Set up Metaphor toolfrom llama_hub.tools.metaphor.base import MetaphorToolSpecmetaphor_tool = MetaphorToolSpec(api_key='your-key',)# convert tool spec to a list of toolsmetaphor_tool_list = metaphor_tool.to_tool_list()for tool in metaphor_tool_list:print(tool.metadata.name)

输入

metaphor_tool.search('machine learning transformers', num_results=3)

输出

[{'title': 'On the potential of Transformers in Reinforcement Learning','url': 'https://lorenzopieri.com/rl_transformers/','id': 'ysJlYSgeGW3l4zyOBoSGcg'},{'title': 'Transformers: Attention in Disguise','url': 'https://www.mihaileric.com/posts/transformers-attention-in-disguise/','id': 'iEYMai5rS9k0hN5_BH0VZg'},{'title': 'Transformers in Computer Vision: Farewell Convolutions!','url': 'https://towardsdatascience.com/transformers-in-computer-vision-farewell-convolutions-f083da6ef8ab?gi=a1d0a9a2896c','id': 'kX1Z89DdjSvBrH1S1XLvwg'}]

3.2 使用Metaphor设置OpenAI Agent

我们可以创建一个可以访问上述所有工具的代理,并开始测试它:

from llama_index.agent import OpenAIAgent# We don't give the Agent our unwrapped retrieve document tools, instead passing the wrapped toolsagent = OpenAIAgent.from_tools(  metaphor_tool_list,  verbose=True,)

下面看一个直接查询的例子:

print(agent.chat('What are the best restaurants in toronto?"))

了解一下该例子中Metaphor工具的执行细节:

=== Calling Function ===Calling function: search with args: {  "query": "best restaurants in Toronto"}[Metaphor Tool] Autoprompt string: Here's a link to the best restaurant in Toronto:Got output: [{'title': 'Via Allegro Ristorante - Toronto Fine Dining Restaurant', 'url': 'https://viaallegroristorante.com/', 'id': 'EVlexzJh-lzkVr4tb2y_qw'}, {'title': 'The Senator – Home', 'url': 'https://thesenator.com/', 'id': 'dA3HVr5P8E0Bs7nH2gH7ZQ'}, {'title': 'Home - The Rushton', 'url': 'https://therushton.com/', 'id': '6Je-igG-i-ApqISC5XXmGQ'}, {'title': 'Location', 'url': 'https://osteriagiulia.ca/', 'id': 'HjP5c54vqb3n3UNa3HevSA'}, {'title': 'StockYards | Stockyards Toronto', 'url': 'https://www.thestockyards.ca/', 'id': 'Pffz-DQlOepqVgKQDmW5Ig'}, {'title': 'Select A Restaurant', 'url': 'https://www.torontopho.com/', 'id': 'DiQ1hU1gmrIzpKnOaVvZmw'}, {'title': 'Home | Kit Kat Italian Bar & Grill', 'url': 'http://www.kitkattoronto.com/', 'id': 'kdAcLioBgnwzuHyd0rWS1w'}, {'title': 'La Fenice', 'url': 'https://www.lafenice.ca/', 'id': 'M-LHQZP6V40V81fqLFAQxQ'}, {'title': 'Le Phénix', 'url': 'https://www.lephenixto.com/', 'id': 'spCTcFr0GHlFUTzyngfRVw'}, {'title': 'ITALIAN, INSPIRED.', 'url': 'https://figotoronto.com/', 'id': 'OvBcTqEo1tCSywr4ATptCg'}]========================Here are some of the best restaurants in Toronto:1. [Via Allegro Ristorante](https://viaallegroristorante.com/)2. [The Senator](https://thesenator.com/)3. [The Rushton](https://therushton.com/)4. [Osteria Giulia](https://osteriagiulia.ca/)5. [Stockyards](https://www.thestockyards.ca/)6. [Toronto Pho](https://www.torontopho.com/)7. [Kit Kat Italian Bar & Grill](http://www.kitkattoronto.com/)8. [La Fenice](https://www.lafenice.ca/)9. [Le Phénix](https://www.lephenixto.com/)10. [Figo](https://figotoronto.com/)You can visit their websites for more information. Enjoy your dining experience in Toronto!

可以看到agent执行了”search“操作,结果返回了Toronto最好的饭店列表。

继续追问进行多轮对话:

print(agent.chat('tell me more about Osteria Giulia'))
=== Calling Function ===Calling function: retrieve_documents with args: {"ids": ["HjP5c54vqb3n3UNa3HevSA"]}Got output: […]========================Osteria Giulia is a restaurant located at 134 Avenue Road in Toronto, Ontario. You can contact them at 416.964.8686 or via email at info@osteriagiulia.ca (for general inquiries only, no reservation requests via email).The restaurant's operating hours are from Monday to Saturday, from 5:00pm to 11:00pm. On Sundays, the restaurant is available for private bookings.Parking is available on Avenue Road and Davenport Road.You can follow Osteria Giulia on Instagram [@osteriagiulia](https://www.instagram.com/osteriagiulia). They also have a sister restaurant called Giulietta, which you can visit at [giu.ca](https://giu.ca) or on Instagram [@giulietta972](https://www.instagram.com/giulietta972).Please note that the information provided is based on the available document and may be subject to change. It is recommended to visit their official website or contact them directly for the most up-to-date information.

3.3 避免上下文窗口问题(高级)

       使用retrieve的一个问题是内容可能很长。如果内容被直接地附加到会话历史并转储到LLM上下文窗口中,那么我们可能会遇到上下文窗口限制。

    LlamaIndex提供了工具抽象来帮助处理这一问题。我们的LoadAndSearchToolSpec嵌入了任何可能返回大量数据的工具,并将其分为两个工具:一个是将数据动态存储在索引中的加载工具,另一个是允许在该索引上进行搜索的搜索工具。

       在Metaphor方面,我们定义search_and_recovere_documents端点来结合search和retrieve。这允许代理进行单个查询以检索大量文档,当这些文档与LoadAndSearchToolSpec结合使用时,这些文档将直接存储在索引中。如果代理分别调用search和retrieve,那么将搜索结果写入会话历史记录,然后再次将其传递到提示中,以调用retrieve覆盖所有文档ID,将花费更长的时间,并消耗更多的token。

       创建LoadAndSearchToolSpec:

from llama_index.tools.tool_spec.load_and_search.base import LoadAndSearchToolSpec# The search_and_retrieve_documents tool is the third in the tool list, as seen abovewrapped_retrieve = LoadAndSearchToolSpec.from_defaults(  metaphor_tool_list[2],)

         下面展示一个完整的例子:

# Just pass the wrapped tools and the get_date utilityagent = OpenAIAgent.from_tools(  [*wrapped_retrieve.to_tool_list(), metaphor_tool_list[4]],  verbose=True,)print(agent.chat('Can you summarize everything published in the last month regarding news on superconductors'))

        下面看一个agent调用多个工具的详细过程:

=== Calling Function ===Calling function: current_date with args: {}Got output: 2023-08-20=========================== Calling Function ===Calling function: search_and_retrieve_documents with args: {  "query": "superconductors",  "start_published_date": "2023-07-20",  "end_published_date": "2023-08-20"}[Metaphor Tool] Autoprompt: "Here is an interesting article about superconductors:Got output: Content loaded! You can now search the information using read_search_and_retrieve_documents=========================== Calling Function ===Calling function: read_search_and_retrieve_documents with args: {  "query": "superconductors"}Got output: Superconductors are materials that can perfectly conduct electricity. They are used in a variety of applications, such as particle accelerators, nuclear fusion devices, MRI machines, and maglev trains. However, so far, no superconductor has been proven to work at ambient pressures and temperatures. On July 22, scientists in South Korea published research claiming to have solved this problem with a material called LK-99, which has an electrical resistivity that drops to near zero at 30 degrees Celsius (86 degrees Fahrenheit).========================In the last month, there have been developments in the field of superconductors. Scientists in South Korea have published research on a material called LK-99, which has the ability to conduct electricity with near-zero resistance at a temperature of 30 degrees Celsius (86 degrees Fahrenheit). This breakthrough could potentially lead to the development of superconductors that work at ambient pressures and temperatures, opening up new possibilities for various applications such as particle accelerators, nuclear fusion devices, MRI machines, and maglev trains.

      agent使用get_date工具来确定当前月份,然后在调用search时,根据发布日期应用Metaphor中的过滤器。使用retrieve_documents加载文档,并使用read_retrieve_documents读取这些文档。

参考文献:

[1] https://blog.llamaindex.ai/llamaindex-metaphor-towards-automating-knowledge-work-with-llms-5520a32efa2f

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

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

相关文章

使用Caliper对Fabric地basic链码进行性能测试

如果你需要对fabric网络中地合约进行吞吐量、延迟等性能进行评估,可以使用Caliper来实现,会返回给你一份网页版的直观测试报告。下面是对test-network网络地basic链码地测试过程。 目录 1. 建立caliper-workspace文件夹2. 安装npm等3. calipe安装4. 创建…

从线程间通信聊到阻塞队列

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 很多Java新手都对Reent…

C#科学绘图库ScottPlot

文章目录 安装和准备初步使用简单的设置 安装和准备 ScottPlot是基于.Net的一款开源免费的交互式可视化库,支持Winform和WPF等UI框架,本文示例在WPF环境中运行。在VS的菜单栏->工具->NuGet包管理器->管理解决方案的NuGet程序包->在浏览选项…

WordCount 源码解析 Mapper,Reducer,Driver

创建包 com.nefu.mapreduce.wordcount ,开始编写 Mapper , Reducer , Driver 用户编写的程序分成三个部分: Mapper 、 Reducer 和 Driver 。 ( 1 ) Mapper 阶段 ➢ 用户自定义的 Mapper 要继承自己的父…

电话卡Giffgaff激活

Giffgaff是一家总部位于英国的移动电话公司。作为一家移动虚拟网络电信运营商,Giffgaff使用O2的网络,是O2的全资子公司,成立于2009年11月25日。 Giffgaff与传统的移动电话运营商不同,区别在于其用户也可以参与公司的部分运营&…

lazada来赞达API开发系列:item_get - 获得lazada商品详情API返回值说明

Lazada API接口的作用主要体现在以下几个方面: 获取商品信息:通过Lazada API接口,开发者可以获取Lazada平台上的商品详细信息,包括商品的名称、价格、图片、描述、规格、库存等,这些信息有助于用户了解商品特点、性能…

Xshell应用程序无法正常启动0xc000007b

重启,卸载重装,添加csdn教程里的缺失文件没用下载修复工工具也没弄出来之后,在他的工具下拉栏里调成增强模式增加C,功能成功解决。如下图在重新修复,他中途会有捐赠提示,可以关闭成功后再支持,我…

MES系统中的生产调度流程你了解多少?

万界星空科技专注于制造业生产(MES)管理平台的研发和实施,已成功帮助很多企业和工厂解决了内部的管理问题,有效的提高了生产效率,并且节省了人力。成功应用于汽车、高科技电子、注塑、电线电缆、造鞋、设备制造、新能源…

Vue.js实现可编辑表格并高亮修改的单元格

实现一个可编辑的表格,让用户可以修改表格中的数据,并且能够清楚地看到哪些单元格被修改过。这样的功能可以提高用户体验,也方便后端处理数据的变化。 本文将介绍如何使用Vue.js和Element UI的el-table组件来实现一个可编辑表格,…

postcss-pxtorem实现页面自适应的原理

先声明一点这玩意本身不能实现哈,他只是一个工具,更是一个postcss的插件 帮助我们从px转化成为rem比如我们的代码 div {height: 100px;width: 100px; }经过这个插件转化之后变成 假设变成下面这样哈 div {height: 1rem;width: 1rem; }其他没啥子太大作…

GateWay网关介绍以及整合knife4j聚合所有服务的接口文档

为什么使用网关? 因为多个微服务的端口不同,前端调用不方便,使用网关可以统一接收处理前端的请求,同时方便接口的集中处理,比如鉴权、聚合接口文档、限流等等.. 这里使用Knife4j文档工具来实现接口文档:K…

【分布式微服务专题】从单体到分布式(二、SpringCloud整合Nacos)

目录 前言阅读对象阅读导航前置知识笔记正文一、下载安装二、项目整合2.1 服务注册与发现2.2 动态配置管理 三、其他实验四、服务之间的调用 学习总结感谢 前言 本篇笔记主要是记录我整合Nacos项目进来的过程。以实现服务注册发现,以及分布式配置管理。关于Nacos&a…

hive数据库查看参数/hive查看当前环境配置

文章目录 一、hive查看当前环境配置命令 在一次hive数据库执行命令 set ngmr.exec.modecluster时,想看一下 ngmr.exec.mode参数原先的值是什么,所以写一下本篇博文,讲一下怎么查看hive中的参数。 一、hive查看当前环境配置命令 set &#…

06 硬件知识入门(MOSS管)

1 简介 MOS管和三极管的驱动方式完全不一样,以NPN型三极管为例,base极以小电流打开三极管,此时三极管的集电极被打开,发射极的高电压会导入,此时电流:Ic IbIe ;电压:Ue>Uc>Ub…

DBSCAN算法原理及其Python实现

文章目录 原理Python实现验证 原理 DBSCAN,即Density-Based Spatial Clustering of Applications with Noise,基于密度的噪声应用空间聚类。 在DBSCAN算法中,将数据点分为三类: 核心点:若样本 x i x_i xi​的 ε \v…

《深入理解计算机系统》学习笔记 - 第三课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入,相加,相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

Linux 网络协议

1 网络基础 1.1 网络概念 网络是一组计算机或者网络设备通过有形的线缆或者无形的媒介如无线,连接起来,按照一定的规则,进行通讯的集合( 缺一不可 )。 5G的来临以及IPv6的不断普及,能够进行联网的设备将会是越来越多&#xff08…

扩展学习|商务智能与社会计算

一、概念介绍 (一)商务智能 商务智能(Business Intelligence,简称BI)是一种基于数据分析的决策支持系统,旨在帮助企业或组织更好地理解和利用自身数据,发现其中的模式和趋势,并提供…

Java物联网项目源码

Java物联网项目源码 使用技术:JAVA [ springmvc / spring / mybatis ] 、Mysql 、Html 、Jquery 、css 协议和优势:TCP/IP、HTTP、MQTT 通讯协议。 系统包括:后台服务,传感器解析服务、web展示; 目前web系统支持功…

【Proteus仿真】【STM32单片机】蓝牙遥控小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使LCD1602液晶,L298电机,直流电机,HC05/06蓝牙模块等。 主要功能: 系统运行后,LCD1602显…