一、前情提要
上期我们教学了如何用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,它的下一步将是学会“如何使用工具”。请见下一篇教程。
Comments NOTHING