从ChatGPT到AI Agent:手把手构建自主编程智能体
最近在技术圈里,一个有趣的现象正在发生:许多深度参与过大型语言模型(LLM)开发或重度依赖AI编程的工程师,正逐渐将工作重心从直接与ChatGPT对话,转向构建和利用更专业的AI Agent(智能体)。这并非意味着ChatGPT等通用对话模型不再重要,而是开发者们找到了更高效、更贴合工程实践的“新工具”。本文将深入探讨这一趋势背后的技术逻辑,并手把手带你从零构建一个能自主完成编码任务的AI Agent,让你亲身体验“造ChatGPT的人”是如何工作的。
1. 从ChatGPT到AI Agent:开发者工具的演进
1.1 ChatGPT的定位与局限
ChatGPT作为一个强大的对话式AI,其核心优势在于理解和生成自然语言。对于开发者而言,它是一个绝佳的“编程助手”,可以解答概念、生成代码片段、调试错误。然而,在实际的、复杂的软件开发流程中,直接使用ChatGPT会面临几个明显的瓶颈:
- 上下文长度与记忆限制 :虽然上下文窗口在不断增大,但面对一个拥有几十个文件、依赖关系复杂的项目时,将全部代码喂给ChatGPT是不现实的。它无法长期记忆项目的完整结构和历史决策。
- 缺乏主动性与连贯性 :ChatGPT通常需要用户明确、具体地提问。它不会主动去检查代码库状态、运行测试、或根据上一次的修改结果决定下一步做什么。完成一个多步骤任务(如“为这个微服务添加用户认证功能”)需要开发者进行多次、手动的“提问-复制-粘贴-执行”循环。
- 工具使用能力受限 :真正的开发工作离不开各种工具:终端(执行命令)、版本控制(Git)、文件系统(增删改查文件)、API调用等。标准的ChatGPT无法直接操作这些工具,它只能告诉你“应该”用什么命令。
1.2 AI Agent的核心思想
AI Agent(智能体)正是为了突破上述局限而生的概念。一个AI Agent可以理解为 一个具备感知、决策和执行能力的自治软件实体 。在编程领域,一个AI编程Agent通常包含以下核心组件:
- 大脑(Brain) :一个大型语言模型(如GPT-4、Claude 3、或本地部署的模型),负责理解任务、制定计划、生成代码和决策。
- 规划器(Planner) :将复杂的用户需求(如“构建一个待办事项API”)分解成一系列可执行的具体子任务(如“1. 初始化项目 2. 设计数据模型 3. 创建控制器 4. 编写路由 5. 添加测试”)。
- 记忆(Memory) :短期记忆保存当前会话的上下文,长期记忆则可以存储项目知识、过往经验,甚至是从代码库中提取的关键信息,帮助Agent做出符合项目背景的决策。
- 工具集(Tools) :这是Agent与真实世界交互的“手脚”。一套丰富的工具让Agent能够:
- 读写文件 :创建、修改、删除项目文件。
- 执行命令 :在终端中运行
npm install,git commit,python test.py等。 - 搜索网络 :获取最新的文档或解决特定错误。
- 调用API :与外部服务交互。
Agent的工作流程是自主的:接收目标 -> 规划步骤 -> 选择工具执行 -> 观察结果 -> 根据结果调整计划或继续下一步 -> 直至目标完成或无法继续。这极大地解放了开发者,使其从繁琐的、重复性的执行工作中脱身,转而专注于更高层的架构设计、需求审核和结果验收。
1.3 相关技术生态:Codex, Cursor, Claude Code与AI Agent框架
在讨论AI Agent时,有几个紧密相关的概念和技术产品:
- OpenAI Codex :这是驱动GitHub Copilot的模型,专为代码生成优化。它是最早的“AI编程助手”核心之一。虽然用户不直接与Codex对话,但它的能力是许多AI编程体验的基础。
- Cursor, Claude Code :这些是集成了先进AI的IDE或编辑器。它们不仅仅是ChatGPT的插件,而是开始具备一些Agent的雏形,比如能理解整个项目上下文、进行代码库范围的搜索和修改。你可以把它们看作是“轻量级”或“面向编辑器的Agent”。
- AI Agent开发框架 :这是本文的重点。这是指像 LangChain, LlamaIndex, AutoGen 这样的开源框架,以及 Cline, Sweep, Aider 等更垂直的编程Agent。它们提供了构建功能完整、能使用工具、有规划能力的自主Agent所需的脚手架。
网络上出现如 codex接入deepseek 、 codex deepseek-v4-pro 、 ai agent mcp 等搜索词,反映了社区正在积极地将不同的模型(如DeepSeek)与Agent框架结合,并探索像 Model Context Protocol (MCP) 这样的新标准来增强工具调用能力。
2. 环境准备:构建你的第一个AI编程Agent
我们将使用一个相对成熟且易于上手的框架来构建一个简单的AI编程Agent。这里选择 LangChain 作为示例,因为它生态丰富、文档齐全,并且对工具调用的支持非常好。同时,我们会使用 OpenAI API 作为“大脑”,但你完全可以根据网络上的探索,替换为其他兼容API的模型(如DeepSeek)。
2.1 基础环境与工具
- 操作系统 :macOS / Linux / Windows (WSL2推荐)
- Python版本 :>= 3.8
- 包管理工具 :pip
- 代码编辑器 :VS Code 或任何你熟悉的IDE
- OpenAI API Key :你需要一个有效的OpenAI API密钥。如果你遇到类似
chatgpt付款未获批准的问题,请确保你的账户已完成绑卡和验证。 请注意 :本文所有涉及API调用的操作均需在合法合规的网络环境下进行。
2.2 创建项目并安装依赖
首先,创建一个新的项目目录并初始化虚拟环境,这是一个好的实践,可以隔离依赖。
# 创建项目目录
mkdir my-ai-coding-agent && cd my-ai-coding-agent
# 创建并激活Python虚拟环境 (Linux/macOS)
python3 -m venv venv
source venv/bin/activate
# Windows 用户使用
# python -m venv venv
# venv\Scripts\activate
# 安装核心依赖
pip install langchain langchain-openai langchain-community
# langchain: 核心框架
# langchain-openai: OpenAI模型集成
# langchain-community: 社区贡献的各种工具和集成
2.3 设置API密钥
为了安全起见,不要将API密钥硬编码在代码中。推荐使用环境变量。
# 在终端中设置环境变量 (临时)
export OPENAI_API_KEY='你的-openai-api-key-here'
# Windows (cmd): set OPENAI_API_KEY=你的-openai-api-key-here
# Windows (PowerShell): $env:OPENAI_API_KEY='你的-openai-api-key-here'
或者在项目根目录创建一个 .env 文件(记得将其加入 .gitignore ):
# .env 文件内容
OPENAI_API_KEY=你的-openai-api-key-here
然后安装 python-dotenv 来读取它:
pip install python-dotenv
3. 核心组件拆解:打造Agent的“大脑”与“手脚”
一个能干活儿的Agent,需要强大的模型和实用的工具。下面我们分步构建这些核心部件。
3.1 初始化LLM(大脑)
我们使用LangChain的ChatOpenAI来封装对GPT模型的调用。你可以选择 gpt-4-turbo-preview 或 gpt-3.5-turbo ,前者能力更强但成本更高。
# 文件:agent_core.py
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
# 加载 .env 文件中的环境变量
load_dotenv()
# 初始化LLM
# 模型名称可以根据需要更改,如‘gpt-4’, ‘gpt-3.5-turbo’
llm = ChatOpenAI(
model="gpt-4-turbo-preview",
temperature=0.1, # 温度值越低,输出越确定和一致,适合编码任务
api_key=os.getenv("OPENAI_API_KEY") # 从环境变量读取密钥
)
# 简单的测试
if __name__ == "__main__":
response = llm.invoke("用Python写一个函数,计算斐波那契数列的第n项。")
print(response.content)
运行 python agent_core.py ,你应该能看到模型生成的代码。这证明你的“大脑”已经就绪。
3.2 创建工具集(手脚)
没有工具的Agent就像没有手的厨师。我们将创建两个最基础但至关重要的工具: 文件读写 和 命令行执行 。
LangChain提供了创建自定义工具的简单方式。我们使用 @tool 装饰器。
# 文件:custom_tools.py
import subprocess
import os
from langchain.tools import tool
from typing import Optional
@tool
def write_file(file_path: str, content: str) -> str:
"""将内容写入指定文件。如果文件已存在,会被覆盖。"""
try:
# 确保目录存在
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
return f"成功写入文件:{file_path}"
except Exception as e:
return f"写入文件时出错:{str(e)}"
@tool
def read_file(file_path: str) -> str:
"""读取指定文件的内容。"""
try:
if not os.path.exists(file_path):
return f"文件不存在:{file_path}"
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return content
except Exception as e:
return f"读取文件时出错:{str(e)}"
@tool
def run_command(command: str, cwd: Optional[str] = None) -> str:
"""在指定工作目录下运行shell命令并返回输出。"""
try:
# 安全考虑:在实际生产Agent中,应对命令进行严格过滤
result = subprocess.run(
command,
shell=True,
capture_output=True,
text=True,
cwd=cwd if cwd else os.getcwd()
)
output = f"STDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}\nExit Code: {result.returncode}"
return output
except Exception as e:
return f"执行命令时出错:{str(e)}"
# 将工具放入列表,供Agent使用
tools = [write_file, read_file, run_command]
重要安全提示 : run_command 工具赋予了Agent在系统上执行任意命令的能力,这非常危险!在实验环境中,请确保在受控的、无重要数据的目录下运行。在生产构想中,必须实现严格的命令白名单、沙箱环境或用户确认机制。
3.3 构建具有推理能力的Agent
现在,我们将“大脑”(LLM)和“手脚”(Tools)组合起来,并赋予Agent自主规划和推理的能力。LangChain提供了多种Agent类型,这里我们使用功能强大的 ReAct 代理框架,它要求模型进行“思考”(Reason)后再“行动”(Act)。
# 文件:build_agent.py
from langchain import hub
from langchain.agents import create_react_agent, AgentExecutor
from custom_tools import tools
from agent_core import llm
# 从LangChain Hub拉取一个优化的ReAct提示词模板
# 这个模板会指导LLM如何按步骤思考和使用工具
prompt = hub.pull("hwchase17/react")
# 创建ReAct Agent
agent = create_react_agent(llm, tools, prompt)
# 创建Agent执行器,它负责运行Agent的循环:思考->行动->观察->直到完成
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 设置为True可以看到Agent的详细思考过程,对调试非常重要!
handle_parsing_errors=True, # 处理模型输出解析错误
max_iterations=10, # 防止Agent陷入无限循环
early_stopping_method="generate" # 当Agent认为任务完成时停止
)
if __name__ == "__main__":
# 让我们给Agent第一个任务!
task = "在当前目录下,创建一个名为‘hello.py’的Python文件,内容为打印‘Hello from AI Agent!’,然后运行它。"
print(f"任务: {task}\n")
result = agent_executor.invoke({"input": task})
print(f"\n最终结果: {result['output']}")
运行 python build_agent.py 。你将看到详细的输出,类似以下格式(已简化):
> 进入新的AgentExecutor链...
思考:我需要先创建文件,然后运行它。我有写文件的工具和运行命令的工具。
行动:使用 `write_file` 工具。
行动输入:{"file_path": "hello.py", "content": "print('Hello from AI Agent!')"}
观察:成功写入文件:hello.py
思考:文件已创建,现在需要运行它。
行动:使用 `run_command` 工具。
行动输入:{"command": "python hello.py"}
观察:STDOUT: Hello from AI Agent!
STDERR:
Exit Code: 0
思考:任务已完成。我成功创建并运行了文件。
最终答案:已成功创建文件‘hello.py’并执行,输出为‘Hello from AI Agent!’。
> 链结束。
恭喜!你已经创建了一个能够自主理解任务、使用工具(写文件、执行命令)并完成简单编程工作的AI Agent。它不再需要你手动复制代码、切换窗口去执行,而是自己完成了整个闭环。
4. 完整实战案例:让Agent创建一个简单的Web API服务
现在,让我们挑战一个更复杂的任务,模拟一个真实的开发场景: 创建一个使用FastAPI的简单待办事项(Todo)API服务 。
4.1 定义高级任务
我们将任务描述得更加自然,就像对一位初级开发者下达指令一样。
# 文件:run_complex_task.py
from build_agent import agent_executor
complex_task = """
请为我创建一个简单的待办事项(Todo)API后端服务,使用FastAPI框架。
项目要求如下:
1. 项目根目录为‘todo_api_project’。
2. 使用Python虚拟环境(venv)管理依赖。
3. 主要依赖包:fastapi, uvicorn。
4. 需要实现以下API端点:
- GET /todos: 获取所有待办事项列表。
- POST /todos: 创建一个新的待办事项(请求体包含‘title‘和‘description‘)。
- GET /todos/{id}: 根据ID获取单个待办事项。
- PUT /todos/{id}: 更新一个待办事项。
- DELETE /todos/{id}: 删除一个待办事项。
5. 数据暂时用一个内存中的Python列表来模拟,不需要数据库。
6. 每个待办事项对象应有id, title, description, completed字段。
7. 在项目根目录创建一个‘requirements.txt‘文件。
8. 最后,写一个简单的‘README.md‘说明如何启动这个服务。
请一步步完成这个项目。
"""
print(f"开始执行复杂任务...\n")
print(f"任务描述:\n{complex_task}\n")
print("="*50)
try:
result = agent_executor.invoke({"input": complex_task})
print(f"\n任务执行完毕。最终输出:{result['output']}")
except Exception as e:
print(f"任务执行过程中出现异常:{e}")
4.2 观察Agent的执行过程与结果
当你运行这个脚本时, verbose=True 的设置会让你看到Agent的完整思考链。它会自主进行以下操作(顺序可能因模型推理而异):
- 规划 :识别出需要创建目录、初始化项目、安装依赖、编写多个代码文件。
- 执行 :
- 使用
run_command创建todo_api_project目录并进入。 - 使用
run_command创建虚拟环境venv。 - 使用
write_file创建requirements.txt,内容为fastapi和uvicorn。 - 使用
run_command在虚拟环境中安装依赖(可能会尝试source venv/bin/activate && pip install -r requirements.txt,但在子进程中激活虚拟环境是常见难点,Agent可能会遇到错误并调整策略,比如使用venv/bin/pip)。 - 使用
write_file创建主应用文件,例如main.py,其中包含完整的FastAPI应用代码、内存数据结构和所有API端点。 - 使用
write_file创建README.md。
- 使用
- 验证 :可能会尝试运行
uvicorn main:app --reload来检查服务是否能启动(由于是后台进程,它可能启动后很快停止或检查端口)。
关键点 :在这个过程中,Agent可能会犯错(比如虚拟环境激活问题),但ReAct框架允许它“观察”到错误(命令执行的错误输出),然后重新“思考”并尝试新的策略(比如使用绝对路径调用pip)。这正是自主智能体的核心能力—— 基于反馈进行迭代 。
4.3 检查生成的项目结构
任务执行完成后,你的目录树应该类似这样:
my-ai-coding-agent/
├── venv/
├── agent_core.py
├── build_agent.py
├── custom_tools.py
├── run_complex_task.py
└── todo_api_project/ (由Agent创建)
├── venv/ (Python虚拟环境)
├── requirements.txt
├── main.py
└── README.md
你可以检查 todo_api_project/main.py 文件,它应该包含了可运行的FastAPI代码。进入该目录,按照README的指示或直接运行 uvicorn main:app --reload ,就能启动这个由AI Agent从零构建的API服务。
5. 常见问题与排查思路
在构建和运行AI Agent的过程中,你可能会遇到以下典型问题:
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
Unexpected status 404 not found: model not found gpt-5.5 |
1. 模型名称拼写错误。 2. 使用了不存在的模型名(如网络热词中提到的 gpt-5.5 )。 3. API端点配置错误。 |
1. 检查 ChatOpenAI 初始化时的 model 参数,确保是OpenAI官方支持的模型,如 gpt-4-turbo-preview , gpt-3.5-turbo 。 2. 不要使用未经证实的模型名称。 3. 确认API密钥有效且有对应模型的权限。 |
OPENAI_API_KEY 未设置或无效 |
环境变量未正确加载或API密钥已过期、被封禁。 | 1. 使用 print(os.getenv(‘OPENAI_API_KEY‘)) 调试。 2. 检查OpenAI平台账户状态和额度。 3. 确保在运行脚本的终端环境中设置了变量。 |
| Agent陷入循环或执行无关操作 | 1. 任务描述不够清晰。 2. max_iterations 设置过高。 3. 模型温度( temperature )过高,导致输出不稳定。 |
1. 将复杂任务拆分成更小、更明确的子任务。 2. 适当降低 max_iterations (如5-10)。 3. 降低 temperature (如0.1)。 4. 使用 verbose=True 观察其思考过程,手动中断并调整提示词。 |
| 工具调用失败或格式错误 | 1. 模型生成的工具调用参数不符合函数签名。 2. 自定义工具的描述( docstring )不够清晰。 |
1. 确保 handle_parsing_errors=True 。 2. 优化工具函数的 文档字符串 ,清晰描述输入参数的类型和用途,这是模型理解如何调用工具的关键。 3. 使用更强大的模型(如GPT-4)通常有更好的工具调用格式遵循能力。 |
run_command 执行危险命令 |
Agent可能根据任务生成并执行破坏性命令,如 rm -rf / 。 |
【极度重要】 仅在沙箱环境(如Docker容器、无重要数据的虚拟机)中实验。生产环境必须实现: 1. 命令白名单 :只允许执行预定义的安全命令。 2. 用户确认 :在执行任何命令前,弹出确认框。 3. 权限隔离 :以低权限用户运行Agent进程。 |
| 虚拟环境激活在子进程中失败 | subprocess.run 在新shell中执行命令, source 命令只影响该子进程,不会改变父进程环境。 |
Agent可能会学习到使用虚拟环境内二进制文件的绝对路径,例如: /path/to/venv/bin/pip install ... /path/to/venv/bin/python script.py 这是一种更可靠的跨平台方式。 |
6. 进阶探索与最佳实践
我们的基础Agent已经可以工作,但要将其用于提升真实生产力,还需要考虑更多。
6.1 增强Agent能力
- 集成代码库感知工具 :让Agent能读取整个项目文件树、搜索特定代码模式。可以结合
LlamaIndex为代码库创建索引,让Agent拥有“长期记忆”。 - 添加Git工具 :创建
git add,git commit,git diff等工具,让Agent能管理版本。 - 集成测试与Lint工具 :让Agent在修改代码后自动运行测试或代码风格检查,并根据结果修复问题。
- 使用更专业的框架 :研究
Cline,Sweep等开源项目,它们专为代码库操作优化,提供了更强大的代码理解和重构能力。
6.2 提升可靠性与安全性
- 结构化输出 :使用LangChain的
Pydantic工具或模型的函数调用(JSON模式)能力,确保Agent输出的计划、代码片段是结构化的,便于后续程序化处理。 - 人机协同(Human-in-the-loop) :对于关键操作(如删除文件、向生产环境部署),设计审批流程。让Agent生成计划或变更列表,由人类审核确认后再执行。
- 沙箱环境 :始终在Docker容器或独立虚拟机中运行具有文件系统和命令执行权限的Agent,防止其对宿主机构成威胁。
- 成本与速率限制 :监控API调用次数和费用,为Agent设置合理的速率限制和单次任务的最大Token消耗,避免意外的高额账单。
6.3 工程化与架构思考
- 清晰的职责边界 :将Agent定义为“高级执行者”,而非“架构师”。人类开发者负责制定架构、定义接口和验收标准,Agent负责实现具体模块、编写测试、修复简单bug。
- 任务分解与验证 :设计一个“主控”Agent,负责将大型需求分解为子任务,并分发给不同的“专家”Agent(如前端Agent、后端Agent、测试Agent)执行,最后汇总验证。
- 持续学习与优化 :记录Agent成功和失败的任务案例,用于微调提示词或作为示例加入上下文,让Agent的表现越来越好。
从直接使用ChatGPT进行问答,到构建能自主执行复杂工作流的AI Agent,是开发者利用AI技术的一次重要范式升级。它标志着AI从“顾问”角色向“协作者”甚至“执行者”角色的转变。通过本文的实践,你已经掌握了构建一个基础AI编程Agent的核心技能:集成LLM、创建工具、利用ReAct框架实现自主规划与执行。
这条路才刚刚开始。接下来,你可以深入研究如何让Agent理解更复杂的项目上下文、如何安全地赋予它更多权限、如何将它集成到CI/CD流程中自动化代码审查或生成测试。真正的效率提升,来自于将人类的创造性思维、架构能力与AI不知疲倦的执行力、庞大的知识库相结合。
更多推荐

所有评论(0)