LlamaIndex系列教程-三、构建Agent对话机器人

海心 14 次阅读 发布于 27 天前 预计阅读时间: 7 分钟


一、前情提要

上期我们教学了如何用LlamaIndex加入LLM:

[[LlamaIndex系列教程-二、使用LLM:给Agent添加一个大脑]]

我们在绪论中提过,Agent是一个很复杂的系统,包含工作流、工具、上下文工程、事件……

详见[[LlamaIndex系列教程-一、绪论:Agent框架三巨头之一——LlamaIndex]]

今天,我们将要教学的是Agent中最简单的一步:构建一个有上下文记忆的聊天机器人。

二、开始使用

2.1 安装依赖并接入LLM

LlamaIndex需要安装依赖。在命令行输入以下指令:

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

 

导入依赖:

from llama_index.core.memory import ChatMemoryBuffer
from llama_index.core.agent.workflow import FunctionAgent

import asyncio
import os

 

然后,接入我们之前已经配置好的LLM类。(这里仅以OpenAI的GPT4o为例)

from llamaindex_models import OpenAIModel, OpenRouterModel, YunWuModel
talk_llm = OpenAIModel(model="gpt-4o")

 

2.2 创建一个Agent类

LlamaIndex提供多种Agent:

  • FunctionAgent:可以直接利用 LLM 提供者的功能/工具调用能力来执行工具,是最常用的Agent。
  • ReActAgent:结合 推理(Reasoning) 和 行动(Acting),通过“思考-行动-观察”循环动态完成复杂任务。
  • CodeAgent:一种集成了自然语言理解与代码生成执行能力的智能代理,旨在让 AI 能够根据用户的自然语言指令,自动生成、执行代码,并根据执行结果进行反馈和迭代优化。

我们这边使用最简单的FunctionAgent类,来创建一个Agent。

首先,因为我们想要构建的是具有上下文记忆的聊天Agent,我们就必须定义一个上下文组件,用于给Agent储存和用户对话的上下文,然后在下一次对话的时候,将上下文提供给AI,使其有“记忆”。

定义上下文组件:

memory = ChatMemoryBuffer.from_defaults(token_limit=4000)

# token_limit是“上下文token限制”,可以用于限制我们储存的上下文的长度,防止Token爆炸。这在多Agent系统构建中十分有用。

 

接着,我们开始构建FunctionAgent。注意,虽然这里说是叫:Function Agent,但是,我们实际上必须要提供任何工具,因为我们需要的仅仅只是“聊天”这一功能而已。当然,Agent也可以使用工具,我们在下一章介绍如何使用工具。

定义FunctionAgent:

agent = FunctionAgent(
    tools=[],                   # 这是Agent的工具列表,但此时是空的
    llm=talk_llm, # 我们要使用的llm实例
    system_prompt=(
        "你是一个具有上下文记忆的聊天助手,"
        "能够根据对话历史与用户输入进行自然对话。"
    )
)

 

这样,我们就成功构建了一个Agent。

注意,这个时候Agent本身还并没有传入“上下文”。这个Agent本身并没有上下文,上下文需要我们在后续的对话中,提供给他。

所以,我们构建聊天函数。

# 聊天函数
async def chat():
    while True:
        user_input = input("用户:")
        if user_input.strip().lower() == "exit":
            break
        # Agent 运行,传入用户提问与记忆
        response = await agent.run(user_input, memory=memory)
        print("机器人:", str(response))

 

Agent运行的核心方法是run。我们使用run的时候,不仅仅传入了用户的初始输入user_input,还传入了上下文记忆memory。这样,Agent在给我们回复的时候,就是带有上下文记忆的。

而且,这种每次run的时候传入记忆的方式,使得我们的上下文工程可以更加灵活的运用于不同的多个Agent当中。例如,我在和Agent A的对话中有一个上下文,然后我马上就可以在随后将这个上下文交给另一个Agent B,实现了一种”即插即用“的效果。

当然,如果你想要将这个上下文与某一个Agent本身绑定也是可以的,只需要在Agent初始化的时候,将Memory直接固定在这个Agent这里就行。

创建一个固定上下文Memory的Agent(可选):

agent_with_memory = FunctionAgent(
    tools=[],
    llm=llm,
    memory=memory,  # 直接绑定 memory
    system_prompt="你是一个有上下文记忆的聊天助手。"
)

 

最后,开启对话:

if __name__ == "__main__":
    asyncio.run(chat())

 

运行结果:

用户:你好,我是海心
机器人: 你好,海心!很高兴见到你。今天有什么我可以帮忙的吗?
用户:你还记得我是谁吗
机器人: 当然记得,你是海心!有什么特别想聊的或者需要帮助的事情吗?
用户:请介绍一下你自己和我
机器人: 当然可以!我是一个人工智能聊天助手,旨在帮助回答问题、提供信息和进行有趣的对话。而你是海心,我们刚刚开始交流。如果你愿意,可以分享更多关于你的信息,比如你的兴趣爱好或者你今天的心情,这样我可以更好地与你互动。

 

可以看到,这里用户记住了我在前一次对话中提供给他的姓名信息,说明这是一个有上下文记忆的Agent。

总结

本章详细教学了如何使用LlamaIndex构建一个具备上下文记忆的聊天Agent。文章从安装依赖、接入LLM开始,逐步讲解了FunctionAgent的创建与配置,特别是如何利用ChatMemoryBuffer实现对话记忆管理。通过实例代码展示了 Agent 的运行方式、上下文的灵活运用以及如何绑定记忆。

最终,一个能“记住”用户信息的智能聊天机器人成功运行,展示了LlamaIndex在构建智能体方面的强大功能。

仅仅如此还不够。如果只是一个可以上下文对话的聊天机器人而已,市面上大部分AI大模型都可以做到。这就和我们日常使用的Deepseek、ChatGPT本身没有区别。要想构建一个更加强大的Agent,它的下一步将是学会“如何使用工具”。请见下一篇教程。