LlamaIndex 实现 Agent

2024-08-29 20:44
文章标签 实现 agent llamaindex

本文主要是介绍LlamaIndex 实现 Agent,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RAG 是在数据层面为大模型提供更多、更新的外部知识,而 Agent (智能体),为大模型扩展了推理业务的能力。数据是静态的,数据周期可能是天、小时甚至到秒,通过 RAG 实现时,需要调用对应系统的 API 去实时获取相关数据并组合发给 LLM,如果是一系列动作完成一个需求,前一个动作的输出是下一个动作的输入,使用 RAG 处理就相当复杂,也没有利用到大模型强大的推理能力。

Agent 的推出很好的解决了模型调用工具能力(Function Call),工具能力最早始于 ChatGPT,例如,我们想了解当前北京的气温,需要实时数据,有了工具能力就可以调用 API 获取是实时数据。本文将介绍如果通过 LlamaIndex 实现 Agent。

ReActAgent

LlamaIndex 实现 Agent 需要导入 ReActAgent 和 Function Tool,

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool

ReActAgent 是什么?

ReActAgent 通过结合推理(Reasoning)和行动(Acting)来创建动态的 LLM Agent 的框架。该方法允许 LLM 模型通过在复杂环境中交替进行推理步骤和行动步骤来更有效地执行任务。ReActAgent 将推理和动作形成了闭环,Agent 可以自己完成给定的任务。

一个典型的 ReActAgent 遵循以下循环:

  1. 初始推理:代理首先进行推理步骤,以理解任务、收集相关信息并决定下一步行为。
  2. 行动:代理基于其推理采取行动——例如查询API、检索数据或执行命令。
  3. 观察:代理观察行动的结果并收集任何新的信息。
  4. 优化推理:利用新信息,代理再次进行推理,更新其理解、计划或假设。
  5. 重复:代理重复该循环,在推理和行动之间交替,直到达到满意的结论或完成任务。

在这里插入图片描述

本地模型实现 Agent

实现最简单的代码,通过外部工具做算术题,只是一个简单的例子,这个不用 Agent,大模型也可以回答。

from llm import get_local_ollama
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionToolllm = get_local_ollama()def multiply(a: float, b: float) -> float:"""Multiply two numbers and returns the product"""return a * bmultiply_tool = FunctionTool.from_defaults(fn=multiply)def add(a: float, b: float) -> float:"""Add two numbers and returns the sum"""return a + badd_tool = FunctionTool.from_defaults(fn=add)agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)response = agent.chat("What is 20+(2*4)?")

在这里插入图片描述
当我们问大模型一个天气的问题,当没有工具时,大模型这么回答,作为大语言模型,他不知道天气情况并给出去哪里可以查到天气情况。
在这里插入图片描述
现在为我们的 Agent 添加一个查询天气的方法,返回假数据做测试

def get_weather(city: str) -> int:"""Gets the weather temperature of a specified city.Args:city (str): The name or abbreviation of the city.Returns:int: The temperature of the city. Returns 20 for 'NY' (New York),30 for 'BJ' (Beijing), and -1 for unknown cities."""# Convert the input city to uppercase to handle case-insensitive comparisonscity = city.upper()# Check if the city is New York ('NY')if city == "NY":return 20  # Return 20°C for New York# Check if the city is Beijing ('BJ')elif city == "BJ":return 30  # Return 30°C for Beijing# If the city is neither 'NY' nor 'BJ', return -1 to indicate unknown cityelse:return -1weather_tool = FunctionTool.from_defaults(fn=get_weather)agent = ReActAgent.from_tools([multiply_tool, add_tool, weather_tool], llm=llm, verbose=True)response = agent.chat("纽约天气怎么样?")

可以看到模型的推理能力很强,将纽约转成了 NY。
在这里插入图片描述
可以在 arize_phoenix 中看到 agent 的具体提示词,工具被装换成了提示词。
在这里插入图片描述

总结

ReActAgent 使得业务自动向代码转换成为可能,只要有 API 模型就可以调用,很多业务场景都适用,LlamaIndex 提供了一些开源的工具实现,可以到官网查看。

虽然 Agent 可以实现业务功能, 但是一个 Agent 不能完成所有的功能,这也符合软件解耦的设计原则,不同的 Agent 可以完成不同的任务,各司其职,Agent 之间可以进行交互、通信,类似于微服务。后续的文章中,我们将继续介绍 Agent 的高级实现方式。

这篇关于LlamaIndex 实现 Agent的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118850

相关文章

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec