最近在技术圈里,一个有趣的现象正在发生:许多深度参与过大型语言模型(LLM)开发或重度依赖AI编程的工程师,正逐渐将工作重心从直接与ChatGPT对话,转向构建和利用更专业的AI Agent(智能体)。这并非意味着ChatGPT等通用对话模型不再重要,而是开发者们找到了更高效、更贴合工程实践的“新工具”。本文将深入探讨这一趋势背后的技术逻辑,并手把手带你从零构建一个能自主完成编码任务的AI Agent,让你亲身体验“造ChatGPT的人”是如何工作的。

1. 从ChatGPT到AI Agent:开发者工具的演进

1.1 ChatGPT的定位与局限

ChatGPT作为一个强大的对话式AI,其核心优势在于理解和生成自然语言。对于开发者而言,它是一个绝佳的“编程助手”,可以解答概念、生成代码片段、调试错误。然而,在实际的、复杂的软件开发流程中,直接使用ChatGPT会面临几个明显的瓶颈:

  1. 上下文长度与记忆限制 :虽然上下文窗口在不断增大,但面对一个拥有几十个文件、依赖关系复杂的项目时,将全部代码喂给ChatGPT是不现实的。它无法长期记忆项目的完整结构和历史决策。
  2. 缺乏主动性与连贯性 :ChatGPT通常需要用户明确、具体地提问。它不会主动去检查代码库状态、运行测试、或根据上一次的修改结果决定下一步做什么。完成一个多步骤任务(如“为这个微服务添加用户认证功能”)需要开发者进行多次、手动的“提问-复制-粘贴-执行”循环。
  3. 工具使用能力受限 :真正的开发工作离不开各种工具:终端(执行命令)、版本控制(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的完整思考链。它会自主进行以下操作(顺序可能因模型推理而异):

  1. 规划 :识别出需要创建目录、初始化项目、安装依赖、编写多个代码文件。
  2. 执行
    • 使用 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
  3. 验证 :可能会尝试运行 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不知疲倦的执行力、庞大的知识库相结合。

更多推荐