LlamaIndex中的Tools工具概念和使用

概念

拥有适当的工具抽象是构建数据代理的核心。定义一组 Tools 类似于定义任何 API 接口,不同之处在于这些工具供代理使用,而不是供人工使用。我们允许用户定义 ToolToolSpec(工具规格说明),其中包含一系列后台功能。

将代理或 LLM 与函数调用一起使用时,所选工具(以及为该工具编写的参数)在很大程度上依赖于工具名称和工具用途和参数的描述。花时间调整这些参数可能会导致 LLM 调用这些工具的方式发生巨大变化。

一个工具实现了一个非常通用的接口——简单地定义__call__并返回一些基本的元数据(名称,描述,函数模式)。

我们提供几种不同类型的工具:

  • FunctionTool:函数工具允许用户轻松地将任何用户定义的函数转换为工具。它还可以自动推断函数架构。
  • QueryEngineTool:包装现有查询引擎的工具。注意:由于我们的 agent 抽象继承自 ,这些工具也可以包装其他 agent。BaseQueryEngine
  • 社区贡献的工具,围绕单个服务(如 Gmail)定义一个或多个工具ToolSpecs(工具规格说明)
  • 用于包装其他工具以处理从工具返回大量数据的实用工具

FunctionTool

函数工具是对任何现有函数的简单包装(同步和异步都支持!)

from llama_index.core.tools import FunctionTooldef get_weather(location: str) -> str:"""Usfeful for getting the weather for a given location."""...tool = FunctionTool.from_defaults(get_weather,# async_fn=aget_weather,  # optional!
)agent = ReActAgent.from_tools(tools, llm=llm, verbose=True)

为了更好地定义函数,您还可以将 pydantic 用于函数参数。

from pydantic import Fielddef get_weather(location: str = Field(description="A city name and state, formatted like '<name>, <state>'"),
) -> str:"""Usfeful for getting the weather for a given location."""...tool = FunctionTool.from_defaults(get_weather)

默认情况下,工具名称将是函数名称,文档字符串将是工具描述。但您也可以覆盖此权限。

tool = FunctionTool.from_defaults(get_weather, name="...", description="...")

QueryEngineTool

任何查询引擎都可以转换为工具,使用:QueryEngineTool

from llama_index.core.tools import QueryEngineTooltool = QueryEngineTool.from_defaults(query_engine, name="...", description="..."
)

Tool Specs

我们还通过 LlamaHub 🦙 提供丰富的工具和工具规格。

您可以将工具规格视为旨在一起使用的工具包。通常,这些涵盖单个界面/服务中的有用工具,例如 Gmail

要与代理一起使用,您可以安装特定的工具规范集成:

pip install llama-index-tools-google

然后使用它:

from llama_index.agent.openai import OpenAIAgent
from llama_index.tools.google import GmailToolSpectool_spec = GmailToolSpec()
agent = OpenAIAgent.from_tools(tool_spec.to_tool_list(), verbose=True)

有关社区贡献的工具规格的完整列表,请参阅 LlamaHub

Utility Tools

通常,直接查询 API 可能会返回大量数据,这些数据本身可能会使 LLM 的上下文窗口溢出(或者至少不必要地增加您正在使用的令牌数量)。

为了解决这个问题,我们在 LlamaHub 工具中提供了一组初始的“Utility Tools”——实用工具在概念上并不与给定的服务(例如 Gmail、Notion)相关联,而是可以增强现有工具的功能。在这种特殊情况下,实用工具有助于抽象出需要缓存/索引和查询从任何 API 请求返回的数据的常见模式。

让我们来看看下面的两个主要实用工具。

OnDemandLoaderTool

此工具将任何现有的 LlamaIndex 数据加载器(类)转换为代理可以使用的工具。可以使用从数据加载程序触发所需的所有参数以及自然语言查询字符串来调用该工具。在执行过程中,我们首先从数据加载器加载数据,为其编制索引(例如使用向量存储),然后“按需”查询它。所有这三个步骤都发生在单个工具调用中。BaseReaderload_data

通常,这比自己弄清楚如何加载和索引 API 数据更可取。虽然这可能允许数据可重用性,但通常用户只需要一个临时索引来抽象出任何 API 调用的提示窗口限制。

下面给出了一个使用示例:

from llama_index.readers.wikipedia import WikipediaReader
from llama_index.core.tools.ondemand_loader_tool import OnDemandLoaderTooltool = OnDemandLoaderTool.from_defaults(reader,name="Wikipedia Tool",description="A tool for loading data and querying articles from Wikipedia",
)

LoadAndSearchToolSpec

LoadAndSearchToolSpec 将任何现有工具作为输入。作为工具规范,它实现了 ,当调用该函数时,将返回两个工具:一个 tool,然后是一个 tool。to_tool_listloadsearch

Tool 执行将调用底层 Tool,索引将调用输出(默认情况下使用向量索引)。Tool 执行将采用查询字符串作为输入并调用底层索引。loadsearch

这对于任何默认返回大量数据的 API 端点都很有用 - 例如,我们的 WikipediaToolSpec 将默认返回整个 Wikipedia 页面,这很容易使大多数 LLM 上下文窗口溢出。

示例用法如下所示:

from llama_index.tools.wikipedia import WikipediaToolSpec
from llama_index.core.tools.tool_spec.load_and_search import (LoadAndSearchToolSpec,
)wiki_spec = WikipediaToolSpec()# Get the search wikipedia tool
tool = wiki_spec.to_tool_list()[1]# Create the Agent with load/search tools
agent = OpenAIAgent.from_tools(LoadAndSearchToolSpec.from_defaults(tool).to_tool_list(), verbose=True
)

Return Direct

您会注意到 tool 类构造函数中的选项return_direct。如果设置为True ,则直接返回来自代理的响应,而不会由代理解释和重写。这有助于减少运行时间,或设计/指定将结束代理推理循环的工具。

例如,假设您指定了一个工具:

tool = QueryEngineTool.from_defaults(query_engine,name="<name>",description="<description>",return_direct=True,
)agent = OpenAIAgent.from_tools([tool])response = agent.chat("<question that invokes tool>")

在上面的示例中,将调用查询引擎工具,并且来自该工具的响应将直接作为响应返回,并且执行循环将结束。

如果使用return_direct=False,则代理将使用聊天历史记录的上下文重写响应,甚至进行另一个工具调用。

return_direct使用的另一个例子

工具设置

from typing import Optionalfrom llama_index.core.tools import FunctionTool
from llama_index.core.bridge.pydantic import BaseModel# we will store booking under random IDs
bookings = {}# we will represent and track the state of a booking as a Pydantic model
class Booking(BaseModel):name: Optional[str] = Noneemail: Optional[str] = Nonephone: Optional[str] = Nonedate: Optional[str] = Nonetime: Optional[str] = Nonedef get_booking_state(user_id: str) -> str:"""Get the current state of a booking for a given booking ID."""try:return str(bookings[user_id].dict())except:return f"Booking ID {user_id} not found"def update_booking(user_id: str, property: str, value: str) -> str:"""Update a property of a booking for a given booking ID. Only enter details that are explicitly provided."""booking = bookings[user_id]setattr(booking, property, value)return f"Booking ID {user_id} updated with {property} = {value}"def create_booking(user_id: str) -> str:"""Create a new booking and return the booking ID."""bookings[user_id] = Booking()return "Booking created, but not yet confirmed. Please provide your name, email, phone, date, and time."def confirm_booking(user_id: str) -> str:"""Confirm a booking for a given booking ID."""booking = bookings[user_id]if booking.name is None:raise ValueError("Please provide your name.")if booking.email is None:raise ValueError("Please provide your email.")if booking.phone is None:raise ValueError("Please provide your phone number.")if booking.date is None:raise ValueError("Please provide the date of your booking.")if booking.time is None:raise ValueError("Please provide the time of your booking.")return f"Booking ID {user_id} confirmed!"# create tools for each function
get_booking_state_tool = FunctionTool.from_defaults(fn=get_booking_state)
update_booking_tool = FunctionTool.from_defaults(fn=update_booking)
create_booking_tool = FunctionTool.from_defaults(fn=create_booking, return_direct=True
)
confirm_booking_tool = FunctionTool.from_defaults(fn=confirm_booking, return_direct=True
)

开始使用工具

from llama_index.llms.anthropic import Anthropic
from llama_index.core.llms import ChatMessage
from llama_index.core.agent import FunctionCallingAgentllm = Anthropic(model="claude-3-sonnet-20240229", temperature=0.1)user = "user123"
prefix_messages = [ChatMessage(role="system",content=(f"You are now connected to the booking system and helping {user} with making a booking. ""Only enter details that the user has explicitly provided. ""Do not make up any details."),)
]agent = FunctionCallingAgent.from_tools(tools=[get_booking_state_tool,update_booking_tool,create_booking_tool,confirm_booking_tool,],llm=llm,prefix_messages=prefix_messages,max_function_calls=10,allow_parallel_tool_calls=False,verbose=True,
)

调试Tools工具

通常,调试发送到 API 的工具定义到底是什么可能很有用。

您可以通过使用底层函数来获取当前工具架构,该架构在 OpenAIAnthropic 等 API 中得到利用。

schema = tool.metadata.get_parameters_dict()
print(schema)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信步数C++

题目&#xff1a; 样例解释&#xff1a; 【样例 #1 解释】 从 (1,1) 出发将走 2 步&#xff0c;从 (1,2) 出发将走 4 步&#xff0c;从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步&#xff0c;从 (2,2) 出发将走 3 步&#xff0c;从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网)

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网&#xff09; 思维导图汇总深度优先搜索理论基础98.所有可达路径(卡码网)1.邻接矩阵法2.邻接表法 思维导图汇总 深度优先搜索理论基础 深度优先搜索&#xff08;dfs&#xff09;与广度优先搜索&#xff08;bfs&#xf…

QSerialPort 串口通信示例

之前使用过MFC写过串口通信的示例&#xff0c;今年学了Qt&#xff0c;特意使用Qt写了串口通信的示例&#xff0c;发现比MFC要容易一些&#xff0c; MFC串口示例如下&#xff1a; Qt示例如下&#xff1a; Qt这个做的很简单&#xff0c;主要还是想验证一下api&#xff0c; 核心…

Python中对象obj类型确定最pythonic的方式——isinstance()函数

python中确定对象obj的类型&#xff0c;isinstance函数最是优雅&#xff0c;type、issubclass等函数也可以&#xff0c;但终究“曲折”。 (笔记模板由python脚本于2024年10月07日 19:42:38创建&#xff0c;本篇笔记适合喜欢python的coder翻阅) 【学习的细节是欢悦的历程】 Pyth…

算法专题四: 前缀和

目录 1. 前缀和2. 二维前缀和3. 寻找数组的中心下标4. 除自身以外数组的乘积5. 和为k的子数组6. 和可被K整除的子数组7. 连续数组8. 矩阵区域和 博客主页:酷酷学!!! 感谢关注~ 1. 前缀和 算法思路: 根据题意, 创建一个前缀和数组, dp[i] dp[i -1] arr[i], 再使用前缀和数组,…

排查和解决JVM OOM实战

JVM OOM介绍 Java内存区域布局 下面的分析中都是基于JDK 8开始的。关于JMM不过多介绍每个区域的作用。OOM不单只会发生在堆内存&#xff0c;也可能是因为元空间或直接内存泄漏导致OOM&#xff0c;此时在OOM的详细信息中会有不同体现。 Java OOM的类别 java.lang.OutOfMemory…

王者农药更新版

一、启动文件配置 二、GPIO使用 2.1基本步骤 1.配置GPIO&#xff0c;所以RCC开启APB2时钟 2.GPIO初始化&#xff08;结构体&#xff09; 3.给GPIO引脚设置高/低电平&#xff08;WriteBit&#xff09; 2.2Led循环点亮&#xff08;GPIO输出&#xff09; 1.RCC开启APB2时钟。…

HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词&#xff1a;CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常 问题存在API版本&#xff1a;API10 - API12&#xff08;该问题已反馈&#xff0c;期望后续官方能增加页面级控制能力&#xff09; 在正常的鸿蒙app开发过程中&…

TIM(Timer)定时器的原理

一、介绍 硬件定时器的工作原理基于时钟信号源提供稳定的时钟信号作为计时器的基准。计数器从预设值开始计数&#xff0c;每当时钟信号到达时计数器递增。当计数器达到预设值时&#xff0c;定时器会触发一个中断信号通知中断控制器处理相应的中断服务程序。在中断服务程序中&a…

LeetCode讲解篇之239. 滑动窗口最大值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们维护一个长度为k的窗口&#xff0c;然后窗口从数组最左边一直移动到最右边&#xff0c;记录过程中窗口中的最大值&#xff0c;就是答案 我们每次查询长度为k的窗口最大值是什么时间复杂度是O(k)的&#xff0…

rust中async/await的使用

在Rust中,async/await 用于编写异步代码。它允许您以同步的方式编写异步代码,使得异步操作更易于理解和编写。 安装依赖: cargo add futures cargo add async-std 使用示例: 示例1: use async_std::task::block_on;fn main() {block_on(hello()); }async fn hello() …

MoveIt2-humble----Planning Around Objects

1 添加Planning Scene Interface头文件 #include <moveit/planning_scene_interface/planning_scene_interface.h>2 改变目标位姿 // Set a target Pose auto const target_pose [] {geometry_msgs::msg::Pose msg;msg.orientation.w 1.0;msg.position.x 0.28;msg.p…

Github 2024-10-06 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…

Linux安装部署MySQL8.0加遇着问题解决

1.首先我先给个URL下载MySQL官方网站https://downloads.mysql.com/archives/community/ 2.选择Linux的红帽系统 3.接着选择红帽系统的7版本,x86 4.接着选择MySQL版本,此时我选择8.4.0,下载rpm bundle这个,下载下面这个就好 5.Windows文件上传到Linux系统 rz上传文件命令,找到…

【unity游戏开发】彻底理解AnimatorStateInfo,获取真实动画长度

前言 前置知识&#xff1a;设置参数后&#xff0c;下一个循环才会切换对应动画&#xff0c;所以在下一个循环获取真实的动画长度 AnimatorStateInfo是结构体&#xff01;值类型&#xff0c;要不断重复获取才是最新的 主要是自动设置trigger切换的动画自动切回上一个动画&#x…

Java中如何实现定时任务?

目录 一、定时任务 概念 作用 二、简单定时任务实现方式 1. Thread线程等待&#xff08;最原始最简单方式&#xff09; 2. 使用java.util.Timer Timer 优缺点分析 3. 使用JDK自带的ScheduledExecutorService schedule和scheduleAtFixedRate的区别 schedule侧重保持间隔…

B 私域模式升级:开源技术助力传统经销体系转型

一、引言 1.1 研究背景 随着市场竞争加剧&#xff0c;传统经销代理体系面临挑战。同时&#xff0c;开源技术发展迅速&#xff0c;为 B 私域升级带来新机遇。在当今数字化时代&#xff0c;企业面临着日益激烈的市场竞争。传统的经销代理体系由于管理效率低下、渠道局限、库存压…

贝锐蒲公英网盘首发,秒建私有云,高速远程访问

虽然公共网盘带来了不少便利&#xff0c;但是大家对隐私泄露和重要数据泄密的担忧也随之增加。如果想要确保数据安全&#xff0c;自建私有云似乎是一条出路&#xff0c;然而面对搭建私有云的复杂步骤&#xff0c;许多人感到力不从心&#xff0c;NAS设备的成本也往往让人望而却步…

项目——超级马里奥——Day(2)

争取今天晚上能搞一半啊&#xff0c;啊啊啊啊&#xff0c;感觉事多的忙不过来 设计思路&#xff1a; 1&#xff09;创建并完成常量类 ------->一张图片的情况 先完成对图片的封装------>把图片加载一遍 &#xff08;老实说&#xff0c;我也不太知道为什么&#xff0…

【项目安全设计】软件系统安全设计规范和标准(doc原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取&#xff1a;私信或者进主页。…