更新于 2026年8月10日

第8节 使用 create_agent 搭建 MiniChatGPT#

在介绍「ReAct 框架思想与原理」一文中我们提过 LangChain 里的 create_agent 函数背后其实就是 ReAct 范式的封装。同时,我们在本系列文章的「第4节 从零实现 MiniChatGPT 助手(本地JSON文件存储记忆版)」「第7节 基于 LangGraph 的 MiniChatGPT 助手(PostgresStore 存储记忆版)」 中我们也分别介绍了如何从零实现 ReAct 处理流程。在接下来的内容中,我们将会介绍如何以更加简洁的方式,使用 create_agent 来完成 MiniChatGPT 的构建。看完你会发现前面上百行的 ReAct 循环,原来可以压缩到这么短。

8.1 整体设计思路#

create_agent 是 LangChain 基于 LangGraph 提供的 Agent 工厂函数(Factory Function),用于构建一个具备消息管理、工具调用、循环推理和状态控制能力的 Agent 运行时,使开发者无需手动搭建图结构就能够创建一个符合 ReAct 思想的智能体。直白一点,我们可以将 create_agent 理解成一个快速构建单一智能体的方法,它将大模型调用、工具管理以及 Agent 的执行流程进行了统一封装,开发者只需要提供模型、工具和必要的配置,即可获得一个可以独立完成任务的智能体。

create_agent 把单一智能体的大部分运行逻辑都封好了,所以绝大多数问答 / RAG 场景一个 create_agent 就够用。当业务流程变复杂、需要多智能体协同时,再上 LangGraph 把它组织成 Multi-Agent 系统。

因此,在本节内容中将要介绍的便是在所有功能一致的情况下如何使用单一的 create_agent 来完成 Mini ChatGPT 的构建,并且有了前面两种实现过程的对比,我们将对 create_agent 有着更加清晰地认识。需要说明的是,基于 create_agent 的版本将依然依赖于 LangGraph 中 PostgresSaverPostgresStore 来分别完成短期记忆和长期记忆的管理,最终,构建完成后的 Agent 其内部编排逻辑如图8-1所示。

图8-1 基于 create_agent 的 Mini ChatGPT 内部编排逻辑图
图8-1 基于 create_agent 的 Mini ChatGPT 内部编排逻辑图

从图8-1可以看出, 用 create_agent 搭出来的 Agent 内部编排逻辑就是一个 ReAct 单一智能体——这跟前面两节一致,但因为 create_agent 内部就是基于 LangGraph 的,整个工程只需要改 agent.py 一个模块。完整示例见 Mini-ChatGPT/mini-chatgpt-agent 工程目录。

8.2 Agent 参数组装#

由于调 create_agent 需要一组配套参数和上下文环境,本节用 CreateAgentApp 类来封装。首先定义初始化方法及 PostgresMemoryStore 实例化对象的获取,示例代码如下:

1 class CreateAgentApp:
2     def __init__(self, checkpointer: PostgresSaver, store: PostgresStore):
3         self.checkpointer = checkpointer
4         self.store = store
5 
6     def get_memory_store(self, memory_root: str) -> PostgresMemoryStore:
7         return PostgresMemoryStore(self.store, memory_root)

进一步,再写一个 build_runtime_agent 方法完成 create_agent 的初始化:

 1     def build_runtime_agent(self, context, user_text: str,
 2                             search_memory_limit: int, recursion_limit: int = 20):
 3         def build_system_prompt(memory_store: PostgresMemoryStore,
 4                 user_id: str,user_text: str,search_memory_limit: int, ) -> str:
 5             memory_hits = memory_store.search(user_id, user_text, search_memory_limit)
 6             return SYSTEM_PROMPT.format(user_info=_format_memories(memory_hits),
 7                                 time=datetime.now().isoformat(timespec="seconds"))
 8 
 9         system_prompt = build_system_prompt(context.memory_store, context.user_id, 
10                                             user_text, search_memory_limit)
11         tool = build_postgres_memory_tool(context.memory_store, context)
12         return create_agent(load_chat_model(context.model),[tool],store=self.store,
13                   checkpointer=self.checkpointer, system_prompt=system_prompt,
14                   context_schema=Context).with_config(recursion_limit=recursion_limit)

在上述代码中,第3~7行用于构建 Agent 对应的系统提示词。第11行返回对应的记忆插入及更新工具。第12~14行则是调用 create_agent() 把模型、工具、短期记忆检查点、长期记忆存储以及上下文结构统一封装为可运行的 Agent,其中第14行recursion_limit 表示指定最大循环步数,如果不指定则默认允许的最大循环步数是 9999 步。

跟前面一样,最终通过 get_agent() 返回搭好的智能体:

1 def get_agent(checkpointer: PostgresSaver, store: PostgresStore) -> CreateAgentApp:
2     return CreateAgentApp(checkpointer=checkpointer, store=store)

8.3 ReAct 循环构建#

在完成 create_agent() 的初始化以后需要定义一个循环来完成 Agent 的每一步执行,即“思考-行动-观察-思考”的迭代,示例代码如下:

 1 def invoke_agent(agent: CreateAgentApp, thread_id: str,
 2                  user_text: str, args) -> str:
 3     memory_store = agent.get_memory_store(args.memory_root)
 4     context = Context(user_id=args.user_id, thread_id=thread_id, model=args.model,
 5                         memory_root=args.memory_root, memory_store=memory_store)
 6     config = RunnableConfig({"configurable": {"thread_id": thread_id, 
 7                 "user_id": context.user_id, "memory_root": context.memory_root,
 8                 "search_memory_limit": args.search_memory_limit}})
 9     runtime_agent = agent.build_runtime_agent(context, user_text,
10                                 args.search_memory_limit, args.recursion_limit)
11     last_msg = ""
12     for i, event in enumerate(run_agent.stream({"messages": {"role": "user", 
13              "content": user_text}]}, stream_mode="values", config=config)):
14         last_msg = message_text(event["messages"][-1])
15     return last_msg

在上述代码中,第3~8行用于构建上下文即配置参数,其中第6行 "thread_id": thread_id 主要用于 PostgresSaver 中对于短期记忆的维护。第9~10行则是返回构建完成的 Agent 。第12~14行则是循环执行 ReAct 框架中 Agent 的每一步,其中第14行取出最后一条消息文本作为阶段性输出。这里的 stream() 本质上就是让 Agent 在 LangGraph 管理的状态流中逐步推进,每一次 event 都代表当前完整消息状态,当stream_mode="values"时表示每次全量输出完整消息,设为 "updates" 时表示每次输出增量内容。

到这 agent.py 模块就改完了。运行方式同第7.8节内容完全一致,这里不再重复。

8.4 小结#

这一节基于 mini-chatgpt-agent 工程,看了一个更接近工程实践的 MiniChatGPT 实现。跟前面两版比,核心差别就是用了集成封装度更高的 create_agent——手写上百行 ReAct 循环压缩成 1 行工厂调用,而且运行时能力完全没缩水。

到此,我们就把整个手把手带你从零实现 MiniChatGPT 系列内容介绍完了,3种实现的完整代码参见 https://github.com/mlwithme/Mini-ChatGPT

阅读 --