1. 为什么你需要亲手实现一个ReAct Agent?
如果你对AI Agent(智能体)感兴趣,或者已经用过了像AutoGPT、LangChain这类框架,你可能会觉得它们很强大,但同时又有点“黑盒”。你输入一个任务,它就开始自动搜索、思考、执行,最后给你一个答案。整个过程看起来很酷,但内部到底是怎么运转的?提示词长什么样?LLM(大语言模型)在每一步究竟接收到了什么信息?工具调用失败时,Agent会不会“卡住”?
这些问题,只有当你亲手从零开始构建一个Agent时,才能找到最清晰的答案。而ReAct(Reasoning + Acting) 范式,正是理解这一切的绝佳起点。它不像一些复杂框架那样封装了无数层抽象,它的核心思想极其简洁:让模型学会“三思而后行”。具体来说,就是让模型在解决问题时,交替进行思考(Thought)、行动(Action) 和观察(Observation)。思考用于分析当前情况和规划下一步;行动则是调用外部工具(比如搜索网络、查询数据库);观察是接收工具返回的结果,作为下一步思考的依据。这个循环会一直持续,直到模型认为已经得到足够信息,可以输出最终答案。
我刚开始接触Agent时,直接上手机器学习框架,虽然能跑起来,但总觉得隔着一层纱。后来我决定抛开框架,用最基础的Python,参照ReAct论文的原型,自己实现一遍。这个过程让我恍然大悟,原来Agent的核心逻辑可以如此清晰。你会发现,所谓的“智能”,很大程度上依赖于我们精心设计的提示词和可靠的工具调用循环。通过这次构建,你不仅能深刻理解ReAct,更能获得一种“造轮子”的自信,未来再去使用或定制任何Agent框架,你都能一眼看穿其本质。
所以,这篇文章就是带你走一遍我走过的路。我们将完全使用Python标准库和requests,不依赖任何重型框架,从零开始,一步步搭建一个能真实运行、具备搜索和查找能力的ReAct Agent。我会把每一行代码的逻辑、每一个设计选择背后的考量,以及我实际调试中踩过的坑,都毫无保留地分享给你。当你跟着完成时,你得到的不仅仅是一段可以运行的代码,更是一张深入AI Agent世界的清晰地图。
2. 拆解ReAct的核心循环:它到底是怎么“想”和“做”的?
在动手写代码之前,我们必须像建筑师看蓝图一样,彻底理解ReAct的工作流程。很多教程会直接扔给你一个循环图,但我想带你像侦探一样,拆解其中的每一个环节。整个流程的核心是一个受控的循环,Agent在这个循环里扮演一个“拥有工具的使用者”,而LLM则是它的“大脑”。
第一步:接收任务与初始化。 我们给Agent一个问题,比如“ChatGPT是哪个公司的?”。同时,我们要给Agent一个“工作手册”,也就是提示词模板。这个模板至关重要,它定义了Agent的“人格”和“能力范围”。它会告诉LLM:你现在是一个ReAct Agent,你可以进行三种操作(Search, Lookup, Finish),并且这是几个示例(Few-shot Learning)。我们把问题拼接到这个模板后面,就形成了给LLM的初始提示。
第二步:生成“思考”与“行动”。 这是循环的开始。我们将拼接好的提示词发送给LLM(比如通过OpenAI或国内的通义千问API)。这里的关键是,我们要求LLM严格按照“Thought X: ... Action X: ...”的格式输出。Thought部分是模型对当前情况的内部分析和推理,这部分内容不会直接影响外部世界,只是它的“内心戏”。Action部分则是它决定要对外部世界采取的具体操作。例如,它可能输出:“Thought 1: 我需要先知道ChatGPT是什么,然后才能查找它的公司。Action 1: Search[ChatGPT]”。
第三步:解析与执行行动。 我们的程序需要像老师批改作业一样,严格解析LLM返回的文本,准确提取出Thought和Action字符串。一旦提取出Action,比如Search[ChatGPT],程序就要调用对应的工具函数——这里是搜索维基百科的函数。这个函数会访问外部API或网页,获取关于“ChatGPT”的摘要信息。
第四步:形成“观察”并更新上下文。 工具函数返回的结果(比如一段描述文本)就成为了Observation。接下来是最精妙的一步:我们把“Thought”、“Action”和这个新的“Observation”作为一个完整的步骤,追加到最初的提示词后面。然后,整个流程回到第二步。现在,LLM收到的提示词包含了历史的所有步骤(Thought1, Action1, Observation1),它在此基础上进行新一轮的思考。例如,它可能看到Observation1里提到了“OpenAI”,那么它下一步的Thought2可能就是“ChatGPT由OpenAI创建,那么我需要搜索OpenAI来了解其子公司和产品”,Action2则可能是Search[OpenAI]。
第五步:循环终止。 这个“思考-行动-观察”的循环会一直进行,直到模型生成的Action是Finish[最终答案]。此时,程序跳出循环,提取出Finish[]括号中的内容作为最终答案返回。我们通常也会设置一个最大步数(比如8步),防止问题过于复杂导致无限循环。
这个循环的巧妙之处在于,它将模型的推理过程(Thought)外部化、结构化,使得整个决策过程变得可追踪、可调试。同时,通过将工具调用结果(Observation)反馈给模型,实现了与外部世界的闭环交互。你之后会发现,无论多复杂的Agent框架,其底层都离不开这个基本的交互循环。
3. 搭建你的开发环境与工具函数
理论清楚了,我们开始动手。首先确保你有一个Python环境(3.8以上即可)。我们不需要TensorFlow或PyTorch,只需要几个轻量级的库来处理网络请求和HTML解析。打开你的终端,创建一个新的项目目录,然后安装依赖:
pip install requests beautifulsoup4
requests库用于调用LLM API和访问维基百科,beautifulsoup4则用来解析维基百科返回的HTML页面,提取我们需要的文本内容。接下来,我们创建一个Python文件,比如叫做react_agent.py。文件开头,我们先导入必要的模块:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
从零构建ReAct Agent
一个纯Python实现,用于深入理解思考-行动-观察循环的核心机制。
"""
import requests
import time
import re
import json
from bs4 import BeautifulSoup
现在,我们来配置最关键的部分——LLM的访问。为了代码的通用性,我们使用与OpenAI API兼容的接口格式。这里我以阿里云的通义千问为例,因为它提供了兼容的端点,且易于获取API Key。你也可以替换成任何支持相同接口的模型服务。
# ============================


5747

被折叠的 条评论
为什么被折叠?



