跳转到内容

构建智能体

在LlamaIndex中,智能体是由大型语言模型驱动的半自主软件模块,它被赋予任务并执行一系列步骤来解决该任务。它被提供一组工具,这些工具可以是任意函数,甚至是完整的LlamaIndex查询引擎,它会选择最佳可用工具来完成每个步骤。当每个步骤完成时,智能体会判断任务是否已完成,若已完成则向用户返回结果,若需要继续执行下一步,则返回循环起点。

在LlamaIndex中,您可以选择从零开始构建自己的智能体工作流(相关内容在"构建工作流"章节中介绍),或者使用我们预置的智能体工作流,例如FunctionAgent(一个简单的函数/工具调用智能体)或AgentWorkflow(能够管理多个智能体的智能体)。本教程将介绍如何使用FunctionAgent构建函数调用智能体。

要了解构建多智能体系统的各种方法,请前往“多智能体系统”

agent flow

你可以在智能体教程代码库中找到所有这些代码。

为避免冲突并保持环境整洁,我们将创建一个新的Python虚拟环境。您可以使用任何虚拟环境管理器,但这里我们将使用poetry

Terminal window
poetry init
poetry shell

然后我们将安装LlamaIndex库以及其他一些会有用的依赖项:

Terminal window
pip install llama-index-core llama-index-llms-openai python-dotenv

如果遇到任何问题,请查阅我们更详细的安装指南

我们的智能体将由 OpenAI 的 gpt-4o-mini 大语言模型驱动,因此您需要一个 API 密钥。获取密钥后,您可以将其放置在项目根目录的 .env 文件中:

Terminal window
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函数。在决定使用哪种工具时,您的智能体将使用工具的名称、参数和文档字符串来确定工具的功能以及它是否适合当前任务。因此,确保文档字符串具有描述性且实用非常重要。它还会使用类型提示来确定预期的参数和返回类型。

gpt-4o-mini 今天将执行以下工作:

llm = OpenAI(model="gpt-4o-mini")

您也可以选择其他可通过API访问的流行模型,例如来自MistralAnthropic的ClaudeGoogle的Gemini的模型。

现在我们创建我们的智能体。它需要一个工具数组、一个大语言模型和一个系统提示,以告知它要成为何种类型的智能体。通常你的系统提示会比这个更详细!

workflow = FunctionAgent(
tools=[multiply, add],
llm=llm,
system_prompt="You are an agent that can perform basic mathematical operations using tools.",
)

GPT-4o-mini 实际上足够智能,无需工具就能完成如此简单的数学运算,这就是为什么我们在提示中指定它应该使用工具。

除了 FunctionAgent 之外,LlamaIndex 中还提供了其他智能体,例如 ReActAgentCodeActAgent,它们使用不同的提示策略来执行工具。

现在我们可以让智能体进行一些数学运算:

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.

查看代码仓库了解最终代码应该是什么样子。

恭喜!您已经构建了最基础的智能体类型。接下来让我们学习如何使用预构建工具