基本的检索增强生成 (RAG) (opens new window) 数据管道通常依赖于硬编码的步骤,每次运行时都遵循预定义的路径。在这些系统中,没有实时决策,也不会根据输入数据动态调整操作。这种限制可能会降低在复杂或变化环境中的灵活性和响应能力,突显了传统 RAG 系统的主要弱点。
LlamaIndex 通过引入 代理 (opens new window) 解决了这一限制。代理不仅仅是我们的查询引擎,它们不仅可以从静态数据源“读取”,还可以动态摄取和修改来自各种工具的数据。由 LLM 提供支持,这些代理旨在通过选择最合适的工具来执行一系列操作,以完成指定任务。这些工具可以是简单的基本功能,也可以是复杂的 LlamaIndex 查询引擎。它们处理用户输入或查询,内部决定如何处理这些输入,并决定是否需要额外的步骤或是否可以提供最终结果。这种自动化推理和决策的能力使代理在处理复杂数据任务时高度适应和高效。
Source: LlamaIndex
该图说明了 LlamaIndex 代理的工作流程。它们如何生成步骤、做出决策、选择工具并评估进度,以根据用户输入动态完成任务。
# LlamaIndex 代理的核心组件
在 LlamaIndex 中,代理有两个主要组件:AgentRunner 和 AgentWorker。
Source: LlamaIndex
# Agent Runner
Agent Runner 是 LlamaIndex 中的协调器。它管理代理的状态,包括对话记忆,并提供用户交互的高级接口。它创建并维护任务,负责通过每个任务运行步骤。以下是其功能的详细分解:
- 任务创建:Agent Runner 根据用户查询或输入创建任务。
- 状态管理:它存储和维护对话和任务的状态。
- 记忆管理:它在内部管理对话记忆,确保在交互过程中保持上下文。
- 任务执行:它通过每个任务运行步骤,与 Agent Worker 协调。
与 LangChain 代理 (opens new window) 不同,后者要求开发人员手动定义和传递记忆,LlamaIndex 代理在内部处理记忆管理。
Source: LlamaIndex
# Agent Worker
Agent Worker 控制 Agent Runner 给定任务的逐步执行。它负责根据当前输入生成任务的下一步。Agent Worker 可以定制以包含特定的推理逻辑,使其高度适应不同任务。关键方面包括:
- 步骤生成:根据当前数据确定任务的下一步。
- 定制:这可以定制以处理特定类型的推理或数据处理。
Agent Runner 管理任务创建和状态,而 Agent Worker 执行每个任务的步骤,作为 Agent Runner 指导下的操作单元。
# LlamaIndex 中的代理类型
LlamaIndex 提供了为特定任务和功能设计的不同类型的代理。
# 数据代理
数据代理 (opens new window) 是设计用于处理各种数据任务的专业代理,包括检索和操作。它们可以在读取和写入模式下操作,并与不同的数据源无缝交互。
数据代理可以跨各种数据库和 API 搜索、检索、更新和操作数据。它们支持与 Slack、Shopify、Google 等平台的交互,允许轻松集成这些服务。数据代理可以处理复杂的数据操作,如查询数据库、调用 API、更新记录和执行数据转换。其适应性设计使其适用于广泛的应用,从简单的数据检索到复杂的数据处理管道。
from llama_index.agent import OpenAIAgent, ReActAgent
from llama_index.llms import OpenAI
# import and define tools
...
# initialize llm
llm = OpenAI(model="gpt-3.5-turbo")
# initialize openai agent
agent = OpenAIAgent.from_tools(tools, llm=llm, verbose=True)
# initialize ReAct agent
agent = ReActAgent.from_tools(tools, llm=llm, verbose=True)
# use agent
response = agent.chat("What is (121 * 3) + 42?")
# 自定义代理
自定义代理为您提供了大量的灵活性和定制选项。通过子类化 CustomSimpleAgentWorker
,您可以为您的代理定义特定的逻辑和行为。这包括处理复杂查询、集成多个工具和实现错误处理机制。
您可以通过定义逐步逻辑、重试机制和集成各种工具来定制自定义代理,以满足特定需求。这种定制允许您创建能够管理复杂任务和工作流程的代理,使其高度适应不同场景。无论是管理复杂的数据操作还是与独特的服务集成,自定义代理都提供了构建专业、高效解决方案所需的工具。
# 工具和工具规范
工具 (opens new window) 是任何代理的最重要组成部分。它们允许代理执行各种任务并扩展其功能。通过使用不同类型的工具,代理可以根据需要执行特定操作。这使得代理高度适应和高效。
# 功能工具
功能工具允许您将任何 Python 函数转换为代理可以使用的工具。此功能对于创建自定义操作非常有用,增强了代理执行各种任务的能力。
您可以将简单的函数转换为工具,代理可以将其集成到其工作流程中。这可以包括数学运算、数据处理函数和其他自定义逻辑。
您可以使用以下代码将您的 Python 函数转换为工具:
from llama_index.core.tools import FunctionTool
def multiply(a: int, b: int) -> int:
"""Multiple two integers and returns the result integer"""
return a * b
multiply_tool = FunctionTool.from_defaults(fn=multiply)
LlamaIndex 中的 FunctionTool
方法允许您将任何 Python 函数转换为代理可以使用的工具。函数的名称成为工具的名称,函数的文档字符串作为工具的描述。
# QueryEngine 工具
QueryEngine 工具封装现有的查询引擎,允许代理对数据源执行复杂查询。这些工具与各种数据库和 API 集成,使代理能够高效地检索和操作数据。
这些工具使代理能够与特定的数据源交互,执行复杂的查询并检索相关信息。这种集成使代理能够在决策过程中有效地使用数据。
要将任何查询引擎转换为查询引擎工具,您可以使用以下代码:
from llama_index.core.tools import QueryEngineTool
from llama_index.core.tools import ToolMetadata
query_engine_tools = QueryEngineTool(
query_engine="your_index_as_query_engine_here",
metadata=ToolMetadata(
name="name_your_tool",
description="Provide the description",
),
)
QueryEngineTool
方法允许您将查询引擎转换为代理可以使用的工具。ToolMetadata
类有助于定义该工具的名称和描述。工具的名称由 name
属性设置,描述由 description
属性设置。
注意:工具的描述非常重要,因为它有助于 LLM 决定何时使用该工具。
# 使用 MyScaleDB 和 LlamaIndex 构建 AI 代理
让我们使用 Query Engine Tool 和 Function Tool 构建一个 AI 代理 (opens new window),以演示这些工具如何集成和有效利用。
# 安装必要的库
首先,通过在终端中运行以下命令安装所需的库:
pip install myscale-client llama-index
我们将使用 MyScaleDB (opens new window) 作为向量搜索引擎来开发查询引擎。它是一种高级 SQL 向量数据库,专为可扩展应用程序设计。
# 获取查询引擎的数据
我们将使用 Nike 目录数据集 (opens new window) 作为示例。使用以下代码下载并准备数据:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
import requests
url = 'https://niketeam-asset-download.nike.net/catalogs/2024/2024_Nike%20Kids_02_09_24.pdf?cb=09302022'
response = requests.get(url)
with open('Nike_Catalog.pdf', 'wb') as f:
f.write(response.content)
reader = SimpleDirectoryReader(input_files=["Nike_Catalog.pdf"])
documents = reader.load_data()
此代码将下载 Nike 目录 PDF 并加载数据以供查询引擎使用。
# 连接 MyScaleDB
在使用 MyScaleDB 之前,我们需要建立连接:
import clickhouse_connect
client = clickhouse_connect.get_client
(
host='your_host_here',
port=443,
username='your_username_here',
password='your_password_here'
)
要了解如何获取集群详细信息并阅读更多关于 MyScale 的信息,您可以参考 MyScaleDB 快速入门指南 (opens new window)。
# 创建查询引擎工具
让我们首先为我们的代理构建第一个工具,即查询引擎工具。为此,我们首先使用 MyScaleDB 开发查询引擎并将 Nike 目录数据添加到向量存储中。
from llama_index.vector_stores.myscale import MyScaleVectorStore
from llama_index.core import StorageContext
vector_store = MyScaleVectorStore(myscale_client=client)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context
)
query_engine = index.as_query_engine()
一旦数据被摄取到向量存储并创建了索引。下一步是将查询引擎转换为工具。为此,我们将使用 LlamaIndex 的 QueryEngineTool
方法。
from llama_index.core.tools import QueryEngineTool
from llama_index.core.tools import ToolMetadata
query_engine_tool = QueryEngineTool(
query_engine=index,
metadata=ToolMetadata(
name="nike_data",
description="Provide information about the Nike products. Use a detailed plain text question as input to the tool."
),
)
QueryEngineTool
采用 query_engine
和 meta_data
作为参数。在元数据中,我们定义工具的名称和描述。
# 创建功能工具
我们的下一个工具是一个简单的 Python 函数,它将两个数字相乘。此方法将使用 LlamaIndex 的 FunctionTool
转换为工具。
from llama_index.core.tools import FunctionTool
# Define a simple Python function
def multiply(a: int, b: int) -> int:
"""Multiply two integers and return the result."""
return a * b
# Change function to a tool
multiply_tool = FunctionTool.from_defaults(fn=multiply)
在此之后,我们完成了工具的设置。LlamaIndex 代理将工具作为 Python 列表接受。因此,让我们将工具添加到列表中。
tools = [multiply_tool, query_engine_tool]
# 定义 LLM
让我们定义 LLM,这是任何 LlamaIndex 代理的核心。LLM 的选择至关重要,因为 LLM 理解和表现得越好,它就能越有效地作为决策者处理复杂问题。我们将使用 OpenAI 的 gpt-3.5-turbo
模型。
from llama_index.llms.openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo")
# 初始化代理
正如我们之前所见,代理由 Agent Runner 和 Agent Worker 组成。这是代理的两个构建模块。现在,我们将探讨它们在实践中的工作方式。我们通过两种方式实现了以下代码:
- 自定义代理:第一种方法是首先使用工具和 llm 初始化代理 worker。然后,将代理 worker 传递给 Agent Runner 以处理整个代理。在这里,您导入必要的模块并组成自己的代理。
from llama_index.core.agent import AgentRunner
from llama_index.agent.openai import OpenAIAgentWorker
# Method 2: Initialize AgentRunner with OpenAIAgentWorker
openai_step_engine = OpenAIAgentWorker.from_tools(tools, llm=llm, verbose=True)
agent1 = AgentRunner(openai_step_engine)
- 使用预定义代理:第二种方法是使用 Agents,它们是
AgentRunner
的子类,捆绑了OpenAIAgentWorker
。因此,我们不需要自己定义 AgentRunner 或 AgentWorkers,因为它们在后端实现。
from llama_index.agent.openai import OpenAIAgent
# Initialize OpenAIAgent
agent = OpenAIAgent.from_tools(tools, llm=llm, verbose=True)
注意:当 LLM 设置为 verbose=true
时,我们可以深入了解模型的思维过程,了解它是如何通过提供详细的解释和推理得出答案的。
无论初始化方法如何,您都可以使用相同的方法测试代理。让我们测试第一个:
# Call the custom agent
agent = agent.chat("What's the price of BOYS NIKE DF STOCK RECRUIT PANT DJ573?")
您应该得到类似这样的结果:
现在,让我们用数学运算调用第一个自定义代理。
# Call the second agent
response = agent1.chat("What's 2+2?")
在调用第二个代理并要求进行数学运算时。您将得到类似的响应:
AI 代理自主处理复杂任务的潜力正在扩大,使其在业务环境中非常宝贵,因为它们可以管理日常任务并释放人类工人用于更高价值的活动。随着我们的前进,预计 AI 代理的采用将增长,进一步革新我们与技术互动和优化工作流程的方式。
# 结论
LlamaIndex 代理提供了一种智能的数据管理和处理方式,超越了传统的 RAG 系统。与静态数据管道不同,这些代理能够做出实时决策,根据传入的数据调整其操作。这种自动化推理使其高度适应和高效处理复杂任务。它们集成了各种工具,从基本功能到高级查询引擎,以智能地处理输入并提供优化的结果。
MyScaleDB 是顶级向量数据库,特别适合大规模 AI 应用。其 MSTG 算法 (opens new window) 在可扩展性和效率方面优于其他算法,使其成为高需求环境的理想选择。MyScaleDB 旨在快速处理大数据集和 复杂查询 (opens new window),确保快速准确的数据检索。这使其成为创建健壮和可扩展 AI 应用程序的必备工具,与其他向量数据库相比,提供了无缝集成和卓越的性能。
如果您有兴趣讨论更多关于使用 MyScaleDB 构建 AI 代理的信息,请关注我们在 X (Twitter) (opens new window) 或加入我们的 Discord (opens new window) 社区。让我们一起构建数据和 AI 的未来!