graph = create_react_agent(chat, tools)
1. create_react_agent 函数的作用
create_react_agent 是一个工厂函数,它接收两个参数:
- chat 模型实例(这里是
ChatOpenAI
的对象):它负责生成语言模型的回复,也就是理解用户输入并给出回答。 - tools 列表:这是之前定义的工具函数集合,包含了更新、查询和删除用户宠物信息的函数。这些工具通过
@tool
装饰器包装后,能够被代理在对话中动态调用。
调用 create_react_agent(chat, tools)
后,会构造一个“反应式代理”(react agent),它具有如下特性:
自动决策与工具调用
这个代理不仅仅把用户的输入交给语言模型,还会分析对话内容,决定是否需要调用某个工具函数来完成特定操作。- 举例说明:
- 当用户说“my favorite pets are cats and dogs”时,代理会理解这是在告诉系统用户的宠物喜好,于是调用
update_favorite_pets
工具,把信息存储到全局状态中。 - 当用户询问“what are my favorite pets”时,代理会检测到需要查询之前存储的数据,然后调用
list_favorite_pets
工具返回结果。 - 当用户说“please forget what i told you about my favorite animals”时,代理会调用
delete_favorite_pets
工具,清空之前存储的宠物信息。
- 当用户说“my favorite pets are cats and dogs”时,代理会理解这是在告诉系统用户的宠物喜好,于是调用
- 举例说明:
ReAct 模式的实现
“反应式代理”(react agent)背后的思想通常被称为 ReAct 模式,即在对话中交替进行“推理”(reasoning)和“行动”(acting)。- 代理首先利用传入的
chat
模型进行推理,判断当前用户意图是什么。 - 根据判断结果,代理决定是否需要调用某个工具(比如更新、查询或删除数据)。
- 调用完工具后,代理可以再次让语言模型结合最新的状态信息生成最终回复,形成一个完整的对话闭环。
- 代理首先利用传入的
内部工作流程可视化
在代码中,我们还看到下面这段:try: display(Image(graph.get_graph().draw_mermaid_png())) except Exception: pass
这行代码会尝试将代理内部的决策流程图转换成 Mermaid 格式的 PNG 图片并显示出来。
- 这相当于把代理内部是如何“思考”以及如何调用工具的过程以图形化方式展示,便于开发者理解代理的运行机制。
2. 举例说明整个代理的工作流程
假设你使用这个代理与系统进行对话,整个过程可以描述如下:
更新信息
- 用户输入: “my favorite pets are cats and dogs”
- 代理接收到信息后,首先让
chat
模型处理这条消息。 - 经过内部推理,代理判断这是一个更新宠物喜好的指令,于是调用
update_favorite_pets
工具,把用户 “123” 的宠物列表设为["cats", "dogs"]
。 - 全局状态
user_to_pets
更新后,代理可能生成一个确认回复,如“好的,我已记录你的宠物喜好”。
查询信息
- 用户输入: “what are my favorite pets”
- 代理再次利用
chat
模型处理消息,并发现这是一个查询请求,于是调用list_favorite_pets
工具。 - 工具读取全局状态后返回字符串 “cats, dogs”,代理将这个结果结合上下文返回给用户。
删除信息
- 用户输入: “please forget what i told you about my favorite animals”
- 代理经过判断后,调用
delete_favorite_pets
工具,把用户 “123” 的记录从user_to_pets
中删除。 - 此后,全局状态中不再有该用户的信息,代理可能回复“好的,我已经忘记了之前的信息”。
3. 总结
调用 create_react_agent(chat, tools)
后,我们得到了一个能在对话中自动决策、调用工具来更新或查询状态的代理。它整合了:
- 语言模型:用于理解和生成自然语言回复。
- 工具函数:用于具体的状态管理操作,比如存储、查询和删除数据。
- ReAct 模式:实现了先推理再行动的逻辑,确保代理能根据用户的不同指令做出合适的操作。
这种设计不仅使得对话系统能够与用户自然交互,还能根据需要调用后端逻辑进行数据操作,极大地增强了系统的功能性和灵活性。