
在开始之前,先回答一个根本问题:
"市面上有 Claude、GPT-4、DeepSeek 那么多模型,为什么要专门学 Codex 智能体?"
三个核心理由:
理由 | 说明 |
|---|---|
🧠 代码理解能力最强 | Codex 在代码生成、理解、调试方面经过专门优化,是"最懂程序员"的模型 |
🔧 工具调用原生支持 | Codex 系列模型(特别是 GPT-4o + Codex 能力)天然支持 Function Calling,是构建智能体的最佳基座 |
📚 代码库级上下文 | 支持 128K+ 上下文,能一次性理解整个项目仓库,实现真正的"全库级"智能体 |
🎯 一句话定位: Codex 智能体 = 能理解代码、能调用工具、能自主完成编程任务的 AI 系统。
在开始 Coding 之前,先建立正确的概念模型。
智能体(Agent)= 大脑(LLM)+ 手脚(工具)+ 记忆(Memory)+ 规划(Planning)
┌─────────────────────────────────────────────┐
│ 智能体系统架构 │
├─────────────────────────────────────────────┤
│ ┌───────────┐ │
│ │ 用户输入 │ │
│ └─────┬─────┘ │
│ ▼ │
│ ┌───────────┐ ┌───────────┐ │
│ │ 规划模块 │◄─┤ 记忆模块 │ │
│ │ (拆解任务) │ │ (短期/长期)│ │
│ └─────┬─────┘ └───────────┘ │
│ ▼ │
│ ┌───────────┐ ┌───────────┐ │
│ │ 执行模块 │──►│ 工具调用 │ │
│ │ (调用工具) │ │ (API/代码) │ │
│ └─────┬─────┘ └───────────┘ │
│ ▼ │
│ ┌───────────┐ │
│ │ 反思模块 │ ← 检查结果,决定下一步 │
│ └───────────┘ │
└─────────────────────────────────────────────┘能力维度 | Codex 表现 | 其他模型表现 |
|---|---|---|
代码生成准确率 | ⭐⭐⭐⭐⭐ (专有训练) | ⭐⭐⭐⭐ |
复杂多步推理 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
工具调用(Function Calling) | ⭐⭐⭐⭐⭐ (原生支持) | ⭐⭐⭐ (需额外封装) |
长上下文理解 | ⭐⭐⭐⭐⭐ (128K+) | ⭐⭐⭐⭐ |
项目 | 要求 | 检查方法 |
|---|---|---|
Python | 3.9+ | python --version |
Node.js | 18+ | node --version |
OpenAI API Key | 有效且可用 | 在 platform.openai.com 获取 |
代码编辑器 | VS Code / Cursor | 已安装即可 |
方式 | 适合场景 | 操作 |
|---|---|---|
方式一:Cursor 内置 | 新手快速体验 | 下载 Cursor,在聊天框中输入需求即可,无需配置 |
方式二:Python SDK | 需要深度定制的开发者 | pip install openai + 写脚本调用 API |
方式三:LangChain 集成 | 需要复杂编排的智能体 | pip install langchain langchain-openai |
🎯 本教程采用方式三(LangChain),因为它是构建复杂智能体的事实标准。
# 1. 创建项目目录
mkdir codex-agent-tutorial && cd codex-agent-tutorial
# 2. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows 用 venv\Scripts\activate
# 3. 安装依赖
pip install langchain langchain-openai python-dotenv
# 4. 创建 .env 文件(填入你的 API Key)
echo "OPENAI_API_KEY=sk-xxx" > .env
# 5. 创建主文件
touch agent.py在 agent.py 中写入以下代码:
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import tool
from langchain.prompts import PromptTemplate
# 加载环境变量
load_dotenv()
# 1. 初始化 Codex 模型(通过 OpenAI API)
llm = ChatOpenAI(
model="gpt-4o", # 或使用 gpt-4o-codex 专用模型
temperature=0.1,
api_key=os.getenv("OPENAI_API_KEY")
)
# 2. 定义一个简单工具
@tool
def get_current_time() -> str:
"""获取当前日期和时间。"""
from datetime import datetime
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 3. 构建智能体
tools = [get_current_time]
prompt = PromptTemplate.from_template("""
你是一个有用的AI助手。你可以使用以下工具来回答问题:
{tools}
工具名称: {tool_names}
用户问题: {input}
请一步步思考,如果需要使用工具就调用,否则直接回答。
思考过程: {agent_scratchpad}
""")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 打印思考过程,便于学习
max_iterations=5 # 防止无限循环
)
# 4. 运行智能体
if __name__ == "__main__":
result = agent_executor.invoke({
"input": "现在几点了?"
})
print(f"答案: {result['output']}")运行:
python agent.py输出示例:
> Entering new AgentExecutor chain...
我需要获取当前时间,调用 get_current_time 工具。
Action: get_current_time
Action Input:
Observation: 2026-07-08 14:35:22
Thought: 我已经获取到当前时间,可以回答用户了。
Final Answer: 现在是 2026年7月8日 14:35:22。
> Finished chain.
答案: 现在是 2026年7月8日 14:35:22。🎉 你已经成功运行了第一个 Codex 智能体!
工具是智能体与外部世界交互的接口。学会定义工具是进阶的第一步。
from langchain.tools import tool
# 方式一:装饰器(推荐,最简单)
@tool
def multiply(a: float, b: float) -> float:
"""两个数相乘。"""
return a * b
# 方式二:显式定义(更灵活)
from langchain.tools import StructuredTool
def search_web(query: str) -> str:
# 模拟搜索
return f"关于'{query}'的搜索结果:..."
search_tool = StructuredTool.from_function(
func=search_web,
name="web_search",
description="搜索互联网获取信息,参数为搜索关键词"
)import subprocess
import json
import requests
@tool
def read_file(filepath: str) -> str:
"""读取文件内容。"""
with open(filepath, 'r', encoding='utf-8') as f:
return f.read()
@tool
def write_file(filepath: str, content: str) -> str:
"""写入内容到文件。"""
with open(filepath, 'w', encoding='utf-8') as f:
f.write(content)
return f"文件 {filepath} 写入成功"
@tool
def execute_command(command: str) -> str:
"""执行命令行命令(谨慎使用)。"""
result = subprocess.run(command, shell=True, capture_output=True, text=True)
return result.stdout if result.returncode == 0 else result.stderr
@tool
def search_github(repo_name: str) -> str:
"""在 GitHub 上搜索仓库。"""
url = f"https://api.github.com/search/repositories?q={repo_name}"
response = requests.get(url)
data = response.json()
top_repos = data.get('items', [])[:3]
return json.dumps([{
'name': r['full_name'],
'stars': r['stargazers_count'],
'description': r['description']
} for r in top_repos], ensure_ascii=False)
# 组装工具集
developer_tools = [read_file, write_file, execute_command, search_github]智能体需要记住历史对话,才能进行连贯的多轮交互。
from langchain.memory import ConversationBufferMemory
from langchain.agents import initialize_agent
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
agent_with_memory = initialize_agent(
tools=tools,
llm=llm,
agent="chat-conversational-react-description",
memory=memory,
verbose=True
)
# 多轮对话测试
print(agent_with_memory.run("我叫小明"))
print(agent_with_memory.run("我叫什么名字?")) # 会记住上轮回答from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
# 1. 加载文档(你的"私密知识库")
loader = TextLoader("my_knowledge.txt")
documents = loader.load()
# 2. 分块
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)
# 3. 向量化并存储
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
# 4. 检索函数
@tool
def search_knowledge(query: str) -> str:
"""从知识库中检索信息。"""
docs = vectorstore.similarity_search(query, k=3)
return "\n".join([d.page_content for d in docs])
# 5. 添加到智能体
agent_tools = developer_tools + [search_knowledge]复杂任务需要智能体自主规划。
from langchain.chains import LLMChain
planner_prompt = """
你是一个任务规划专家。请将以下用户目标拆解为 3-5 个可执行的子任务,每个子任务描述清楚需要做什么、调用什么工具。
目标: {goal}
输出格式(JSON):
{{
"goal": "原始目标",
"subtasks": [
{{"id": 1, "description": "...", "tools_needed": ["..."]}},
...
]
}}
"""
planner_chain = LLMChain(
llm=llm,
prompt=PromptTemplate.from_template(planner_prompt)
)
# 使用示例
plan = planner_chain.invoke({"goal": "帮我给项目添加一个 README.md,包含安装步骤和使用示例"})
print(plan)@tool
def execute_with_retry(code: str, max_retries: int = 3) -> str:
"""执行代码,失败后自动修正并重试。"""
for attempt in range(max_retries):
try:
result = exec_compiled_code(code) # 假想的执行函数
return f"执行成功!结果: {result}"
except Exception as e:
if attempt == max_retries - 1:
return f"执行失败(已重试{max_retries}次): {str(e)}"
# 让 LLM 修正代码
code = self._fix_code(code, str(e))
return "执行失败"构建一个能够自动审查代码 PR、发现 Bug、提供优化建议的智能体。
功能清单:
import os
import json
from github import Github
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
# ==================== 配置 ====================
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
REPO_NAME = "your-username/your-repo"
# ==================== 工具定义 ====================
@tool
def get_pr_files(pr_number: int) -> str:
"""获取 PR 中所有变更的文件列表及 diff 内容。"""
g = Github(GITHUB_TOKEN)
repo = g.get_repo(REPO_NAME)
pr = repo.get_pull(pr_number)
files_info = []
for file in pr.get_files():
files_info.append({
"filename": file.filename,
"status": file.status,
"additions": file.additions,
"deletions": file.deletions,
"patch": file.patch # 具体变更内容
})
return json.dumps(files_info, ensure_ascii=False)
@tool
def analyze_code_quality(file_content: str) -> str:
"""分析一段代码的质量,返回潜在问题和改进建议。"""
# 这里可以集成 SonarQube / ESLint 等静态分析工具
# 简化版:让 LLM 自行分析
pass
@tool
def generate_review_report(issues: list) -> str:
"""根据发现的 issues 生成 Markdown 格式的审查报告。"""
report = f"# 代码审查报告\n\n"
report += f"## 概要\n- 共发现 {len(issues)} 个问题\n\n"
report += f"## 详情\n\n"
for idx, issue in enumerate(issues, 1):
report += f"### {idx}. {issue['filename']}: {issue['severity']}\n"
report += f"- 问题描述: {issue['description']}\n"
report += f"- 建议修改: {issue['suggestion']}\n\n"
return report
# ==================== 智能体创建 ====================
def create_code_review_agent():
llm = ChatOpenAI(model="gpt-4o", temperature=0.1)
tools = [get_pr_files, generate_review_report]
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个资深代码审查专家。你的任务是:
1. 分析 PR 中的代码变更
2. 发现潜在的 Bug、安全漏洞、性能问题
3. 给出具体的改进建议
4. 生成结构化的审查报告
请重点关注:
- 空指针 / 未处理异常
- SQL 注入 / XSS 等安全问题
- 性能瓶颈(循环、数据库查询)
- 代码规范和可读性
"""),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
agent = create_openai_tools_agent(llm, tools, prompt)
return AgentExecutor(agent=agent, tools=tools, verbose=True)
# ==================== 运行 ====================
if __name__ == "__main__":
agent = create_code_review_agent()
result = agent.invoke({
"input": "请审查 PR #42 的代码变更,生成完整的审查报告"
})
print(result['output'])方案 | 适合场景 | 成本 | 技术栈 |
|---|---|---|---|
API 服务 | 内部系统集成 | 低 | FastAPI + Docker |
Web 应用 | 对外提供界面 | 中 | Gradio / Streamlit |
即时通讯机器人 | 团队内部使用 | 极低 | 飞书 / 钉钉 / 企微 Bot |
import gradio as gr
def chat_with_agent(message, history):
response = agent_executor.invoke({"input": message})
return response['output']
interface = gr.ChatInterface(
fn=chat_with_agent,
title="Codex 智能体助手",
description="基于 GPT-4o 构建的编程智能体"
)
interface.launch(share=True) # share=True 生成公网链接要点 | 建议 |
|---|---|
API Key 安全 | 使用环境变量,不要在代码中硬编码 |
速率限制 | 用 Redis 做请求限流,防止费用失控 |
错误处理 | 所有工具调用包在 try-except 中 |
日志记录 | 记录所有智能体交互,便于调试 |
监控告警 | 监控 Token 消耗、延迟、错误率 |
学习方向 | 重要性 | 推荐资源 |
|---|---|---|
多智能体协作 | ⭐⭐⭐⭐⭐ | LangGraph、AutoGen 框架 |
RAG 高级检索 | ⭐⭐⭐⭐⭐ | 混合检索、Rerank、HyDE |
提示词工程 | ⭐⭐⭐⭐ | ReAct、CoT、ToT 论文 |
智能体评估 | ⭐⭐⭐⭐ | AgentBench、HELM 基准 |
工具生态 | ⭐⭐⭐ | MCP(Model Context Protocol)、工具市场 |
Codex 智能体的学习路径有三个阶段:
阶段 | 标志 | 你能做什么 |
|---|---|---|
Phase 1:调用者 | 会用 API 调用 Codex | 写出能对话的简单脚本 |
Phase 2:构建者 | 能定义工具和记忆 | 构建解决特定问题的智能体 |
Phase 3:架构师 | 能设计多智能体系统 | 搭建自动化工作流和产品 |
你现在已经完成了 Phase 1 和 2 的核心内容。 剩下的,就是在真实项目中不断打磨。
💡 最后一句话: 智能体的上限不是由模型决定的,而是由你给它配了什么"工具"、喂了什么"知识"、设了什么"规划"决定的。当你把这三件事做到极致,Codex 就不再是一个 API,而是一个替你工作的数字员工。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。