构建 Agent#
在 LlamaIndex 中,智能体(agent)是一个由 LLM 驱动的半自治软件单元,它被赋予一个任务,并执行一系列步骤来解决该任务。它被提供一套工具,这些工具可以是任意函数,也可以是完整的 LlamaIndex 查询引擎。智能体会为完成每个步骤选择最佳可用工具。当每个步骤完成后,智能体会判断任务是否已完成,如果完成,则向用户返回结果;如果需要再采取一步,则循环回到开始。
在 LlamaIndex 中,你既可以从头开始构建自己的智能体工作流(在“构建工作流”部分介绍),也可以使用我们预构建的智能体工作流,例如 FunctionAgent
(一个简单的函数/工具调用智能体)或 AgentWorkflow
(一个能够管理多个智能体的智能体)。本教程介绍如何使用 FunctionAgent
构建一个函数调用智能体。
要了解如何构建多智能体系统,请参阅 “使用 AgentWorkflow 构建多智能体系统”。
入门#
你可以在 智能体教程仓库 中找到所有这些代码。
为了避免冲突并保持环境整洁,我们将启动一个新的 Python 虚拟环境。你可以使用任何虚拟环境管理器,但这里我们将使用 poetry
。
poetry init
poetry shell
然后我们将安装 LlamaIndex 库和一些其他会派上用场的依赖项。
pip install llama-index-core llama-index-llms-openai python-dotenv
如果遇到任何问题,请查阅我们更详细的 安装指南。
OpenAI 密钥#
我们的智能体将由 OpenAI 的 gpt-4o-mini
LLM 驱动,因此你需要一个 API 密钥。获得密钥后,你可以将其放在项目根目录下的 .env
文件中。
OPENAI_API_KEY=sk-proj-xxxx
如果你不想使用 OpenAI,可以使用 任何其他 LLM,包括本地模型。智能体需要强大的模型,因此较小的模型可能可靠性较低。
引入依赖项#
我们将首先导入所需的 LlamaIndex 组件,并从 .env
文件加载环境变量。
from dotenv import load_dotenv
load_dotenv()
from llama_index.llms.openai import OpenAI
from llama_index.core.agent.workflow import FunctionAgent
创建基本工具#
对于这个简单的例子,我们将创建两个工具:一个知道如何将数字相乘,另一个知道如何将数字相加。
def multiply(a: float, b: float) -> float:
"""Multiply two numbers and returns the product"""
return a * b
def add(a: float, b: float) -> float:
"""Add two numbers and returns the sum"""
return a + b
如你所见,这些是常规的 Python 函数。在决定使用哪个工具时,你的智能体将使用工具的名称、参数和文档字符串来确定工具的功能以及是否适用于当前任务。因此,确保文档字符串具有描述性和有帮助非常重要。它还将使用类型提示来确定预期的参数和返回类型。
初始化 LLM#
今天将由 gpt-4o-mini
来执行工作。
llm = OpenAI(model="gpt-4o-mini")
你也可以选择其他可以通过 API 访问的流行模型,例如来自 Mistral、来自 Anthropic 的 Claude 或来自 Google 的 Gemini。
初始化 Agent#
现在我们创建智能体。它需要一个工具数组、一个 LLM 以及一个系统提示来告诉它应该成为哪种类型的智能体。你的系统提示通常会比这更详细!
workflow = FunctionAgent(
tools=[multiply, add],
llm=llm,
system_prompt="You are an agent that can perform basic mathematical operations using tools.",
)
实际上,GPT-4o-mini 足够聪明,无需工具就能进行如此简单的数学计算,这就是为什么我们在提示中指定它应该使用工具。
提问#
现在我们可以要求智能体进行一些数学计算。
response = await workflow.run(user_msg="What is 20+(2*4)?")
print(response)
注意,这是异步代码。它可以在笔记本环境中运行,但如果你想在常规 Python 中运行它,你需要将其封装在一个异步函数中,如下所示:
async def main():
response = await workflow.run(user_msg="What is 20+(2*4)?")
print(response)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
这应该会产生类似于以下内容的输出:
The result of (20 + (2 times 4)) is 28.
查看 仓库,了解最终代码应该是什么样子。
恭喜!你已经构建了最基本的智能体。接下来让我们学习如何使用 预构建工具。