绝对是CSDN ——NO.1的ChatGPT + Codex 开发实战全流程!
绝对是CSDN ——NO.1的ChatGPT + Codex 开发实战全流程!
ChatGPT + Codex 开发实战全流程
ChatGPT(基于 GPT-3.5/4)与 Codex(基于 GPT-3.5 的代码专用模型)的结合,能够极大提升开发效率,实现从自然语言需求到可运行代码的快速转化。本指南将带你完整走通从环境准备到实际项目部署的全流程,包含多个实战项目和最佳实践。
一、准备工作
1.1 账号与 API 密钥获取
- 访问OpenAI 官网注册账号
- 进入 API 控制台,创建新的 API 密钥(API Key)
- 了解 API 定价:
- GPT-3.5-turbo:约 $0.002/1K tokens
- GPT-4:约 $0.03-$0.06/1K tokens
- Codex (code-davinci-002):约 $0.02/1K tokens
1.2 开发环境搭建
# 创建项目目录
mkdir chatgpt-codex-dev
cd chatgpt-codex-dev
# 初始化Python环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装必要依赖
pip install openai python-dotenv flask requests
1.3 配置环境变量
创建.env文件:
OPENAI_API_KEY=your_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1 # 如有需要可修改为代理地址
二、核心概念与基础 API 使用
2.1 ChatGPT vs Codex 对比
| 特性 | ChatGPT (gpt-3.5-turbo) | Codex (code-davinci-002) |
|---|---|---|
| 主要用途 | 对话、理解、生成文本 | 代码生成、解释、调试 |
| 上下文窗口 | 4K/16K tokens | 8K tokens |
| 代码能力 | 较强 | 最强 |
| 响应格式 | 对话式 | 更专注于代码 |
2.2 基础 API 调用示例
创建basic_api.py:
import os
from dotenv import load_dotenv
import openai
# 加载环境变量
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
def chatgpt_completion(prompt):
"""调用ChatGPT API"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=1000
)
return response.choices[0].message.content.strip()
def codex_completion(prompt):
"""调用Codex API"""
response = openai.Completion.create(
model="code-davinci-002",
prompt=prompt,
temperature=0.2, # 代码生成使用较低温度以保证准确性
max_tokens=1000,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response.choices[0].text.strip()
if __name__ == "__main__":
# 测试ChatGPT
print("ChatGPT响应:")
print(chatgpt_completion("解释什么是RESTful API"))
# 测试Codex
print("\nCodex响应:")
print(codex_completion("# 编写一个Python函数,计算斐波那契数列的第n项\n\ndef fibonacci(n):"))
三、实战项目一:智能代码生成器
3.1 项目目标
创建一个能根据自然语言描述生成多种编程语言代码的工具,支持代码解释和优化建议。
3.2 实现代码
创建code_generator.py:
import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
class CodeGenerator:
def __init__(self):
self.chat_model = "gpt-3.5-turbo"
self.code_model = "code-davinci-002"
def generate_code(self, description, language="python"):
"""根据自然语言描述生成代码"""
prompt = f"""
请用{language}语言编写代码,实现以下功能:
{description}
要求:
1. 代码要有清晰的注释
2. 遵循{language}的最佳实践
3. 包含必要的错误处理
4. 如果是函数,包含使用示例
"""
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
max_tokens=2000
)
return response.choices[0].message.content.strip()
def explain_code(self, code):
"""解释代码功能"""
prompt = f"""
请详细解释以下代码的功能、逻辑和关键点:
{code}
plaintext
请分点说明:
1. 整体功能
2. 核心逻辑
3. 关键函数/方法
4. 可能的优化点
"""
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.5,
max_tokens=1500
)
return response.choices[0].message.content.strip()
def optimize_code(self, code, focus="performance"):
"""优化代码"""
prompt = f"""
请优化以下代码,重点关注{focus}:
{code}
plaintext
要求:
1. 保留原代码的核心功能
2. 说明优化的原因和效果
3. 提供优化后的完整代码
"""
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
max_tokens=2000
)
return response.choices[0].message.content.strip()
if __name__ == "__main__":
generator = CodeGenerator()
# 生成代码示例
code = generator.generate_code(
"实现一个简单的任务管理系统,支持添加、删除、查看任务,任务有标题、描述和状态",
language="python"
)
print("生成的代码:")
print(code)
# 解释代码
explanation = generator.explain_code(code)
print("\n代码解释:")
print(explanation)
四、实战项目二:交互式代码助手
4.1 项目目标
创建一个 Web 界面的交互式代码助手,用户可以通过聊天方式与 AI 交互,实现代码编写、调试、解释等功能。
4.2 后端实现
创建app.py:
import os
from dotenv import load_dotenv
import openai
from flask import Flask, render_template, request, jsonify
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
app = Flask(__name__)
# 存储对话历史
conversations = {}
@app.route('/')
def index():
return render_template('index.html')
@app.route('/chat', methods=['POST'])
def chat():
data = request.json
session_id = data.get('session_id', 'default')
message = data.get('message', '')
if session_id not in conversations:
conversations[session_id] = [
{"role": "system", "content": "你是一位专业的编程助手,擅长各种编程语言和开发技术。你可以帮助用户编写代码、调试错误、解释概念、优化性能。请用简洁明了的语言回答,代码部分使用代码块格式。"}
]
conversations[session_id].append({"role": "user", "content": message})
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=conversations[session_id],
temperature=0.7,
max_tokens=2000
)
assistant_message = response.choices[0].message.content.strip()
conversations[session_id].append({"role": "assistant", "content": assistant_message})
return jsonify({
"success": True,
"message": assistant_message
})
except Exception as e:
return jsonify({
"success": False,
"error": str(e)
})
@app.route('/clear', methods=['POST'])
def clear_conversation():
data = request.json
session_id = data.get('session_id', 'default')
if session_id in conversations:
del conversations[session_id]
return jsonify({"success": True})
if __name__ == '__main__':
app.run(debug=True)
4.3 前端实现
创建templates/index.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI代码助手</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.chat-container {
background-color: white;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
height: 600px;
display: flex;
flex-direction: column;
}
.chat-messages {
flex: 1;
overflow-y: auto;
padding: 20px;
}
.message {
margin-bottom: 15px;
padding: 10px 15px;
border-radius: 10px;
max-width: 80%;
}
.user-message {
background-color: #007bff;
color: white;
margin-left: auto;
}
.assistant-message {
background-color: #e9ecef;
color: #333;
}
.code-block {
background-color: #f8f9fa;
border-radius: 5px;
padding: 10px;
margin: 10px 0;
overflow-x: auto;
font-family: monospace;
}
.input-container {
display: flex;
padding: 20px;
border-top: 1px solid #eee;
}
#message-input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 16px;
}
#send-button, #clear-button {
padding: 10px 20px;
margin-left: 10px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
}
#send-button {
background-color: #007bff;
color: white;
}
#clear-button {
background-color: #dc3545;
color: white;
}
</style>
</head>
<body>
<h1>AI代码助手</h1>
<div class="chat-container">
<div class="chat-messages" id="chat-messages"></div>
<div class="input-container">
<input type="text" id="message-input" placeholder="输入你的问题或代码需求...">
<button id="send-button">发送</button>
<button id="clear-button">清空对话</button>
</div>
</div>
<script>
const sessionId = Math.random().toString(36).substring(7);
const chatMessages = document.getElementById('chat-messages');
const messageInput = document.getElementById('message-input');
const sendButton = document.getElementById('send-button');
const clearButton = document.getElementById('clear-button');
function addMessage(content, isUser) {
const messageDiv = document.createElement('div');
messageDiv.className = `message ${isUser ? 'user-message' : 'assistant-message'}`;
// 处理代码块
content = content.replace(/```([\s\S]*?)```/g, '<div class="code-block">$1</div>');
messageDiv.innerHTML = content;
chatMessages.appendChild(messageDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
}
async function sendMessage() {
const message = messageInput.value.trim();
if (!message) return;
addMessage(message, true);
messageInput.value = '';
try {
const response = await fetch('/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
session_id: sessionId,
message: message
})
});
const data = await response.json();
if (data.success) {
addMessage(data.message, false);
} else {
addMessage(`错误:${data.error}`, false);
}
} catch (error) {
addMessage(`网络错误:${error.message}`, false);
}
}
async function clearConversation() {
try {
await fetch('/clear', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
session_id: sessionId
})
});
chatMessages.innerHTML = '';
} catch (error) {
console.error('清空对话失败:', error);
}
}
sendButton.addEventListener('click', sendMessage);
clearButton.addEventListener('click', clearConversation);
messageInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
sendMessage();
}
});
</script>
</body>
</html>
五、实战项目三:全栈应用快速开发
5.1 项目目标
利用 ChatGPT+Codex 快速开发一个完整的待办事项全栈应用,包含前端、后端和数据库。
5.2 需求描述
向 AI 输入以下需求:
plaintext
我需要开发一个待办事项应用,包含以下功能:
1. 用户可以注册和登录
2. 用户可以添加、编辑、删除、标记完成待办事项
3. 待办事项可以设置优先级和截止日期
4. 界面美观,响应式设计
技术栈要求:
- 后端:Python Flask
- 数据库:SQLite
- 前端:HTML, CSS, JavaScript
- 认证:JWT
请提供完整的项目结构和代码实现。
5.3 典型 AI 生成的项目结构
plaintext
todo-app/
├── app.py # 主应用文件
├── config.py # 配置文件
├── models.py # 数据库模型
├── routes/ # 路由目录
│ ├── auth.py # 认证路由
│ └── todos.py # 待办事项路由
├── static/ # 静态文件
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── main.js
├── templates/ # 模板文件
│ ├── index.html
│ ├── login.html
│ └── register.html
└── requirements.txt # 依赖文件
5.4 关键代码示例(AI 生成)
models.py:
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
todos = db.relationship('Todo', backref='user', lazy=True)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text, nullable=True)
completed = db.Column(db.Boolean, default=False)
priority = db.Column(db.String(20), default='medium') # low, medium, high
due_date = db.Column(db.DateTime, nullable=True)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
六、最佳实践与优化技巧
6.1 Prompt 工程技巧
- 明确指令:清晰说明你想要的功能、技术栈和要求
- 分步骤指导:复杂任务拆分成多个小步骤
- 提供示例:给出输入输出示例帮助 AI 理解
- 指定格式:明确要求代码格式、注释风格等
- 迭代优化:先获取基础版本,再逐步调整完善
6.2 代码质量提升
- 人工审核:AI 生成的代码必须经过人工审核和测试
- 安全检查:特别注意 SQL 注入、XSS 等安全问题
- 性能优化:AI 可能生成效率不高的代码,需要手动优化
- 代码规范:确保代码符合团队的编码规范
- 测试覆盖:为 AI 生成的代码编写单元测试
6.3 成本控制
- 合理选择模型:简单任务用 GPT-3.5,复杂任务用 GPT-4
- 控制 token 数量:精简 prompt,限制响应长度
- 缓存结果:对常用查询结果进行缓存
- 批量处理:将多个小请求合并为一个大请求
- 监控使用量:定期查看 API 使用情况,避免意外超支
七、部署与上线
7.1 本地测试
# 安装依赖
pip install -r requirements.txt
# 初始化数据库
flask db init
flask db migrate -m "Initial migration"
flask db upgrade
# 运行应用
flask run
7.2 云平台部署(以 Heroku 为例)
-
创建
Procfile:plaintext
web: gunicorn app:app -
创建
runtime.txt:plaintext
python-3.9.10 -
部署命令:
bash
heroku create my-ai-app git push heroku main heroku config:set OPENAI_API_KEY=your_api_key_here heroku open
八、常见问题与解决方案
8.1 API 调用失败
- 检查 API 密钥是否正确
- 确认网络连接正常
- 查看是否达到 API 速率限制
- 检查账户余额是否充足
8.2 生成的代码有错误
- 提供更详细的错误信息给 AI
- 简化需求,分步骤生成
- 尝试不同的 prompt 表述
- 手动调试并修正错误
8.3 上下文过长问题
- 定期清理对话历史
- 使用摘要技术压缩上下文
- 拆分大型任务为多个小任务
- 使用支持更长上下文的模型(如 GPT-4-32k)
九、进阶方向
- 集成更多 AI 模型:如 Claude、PaLM 等,对比不同模型的效果
- 构建企业级应用:添加用户管理、权限控制、日志系统等
- 开发 IDE 插件:将 AI 助手集成到 VS Code、PyCharm 等开发工具中
- 自动化测试:利用 AI 自动生成测试用例和测试代码
- 代码审查:构建基于 AI 的代码审查系统
通过本指南的学习,你已经掌握了 ChatGPT+Codex 开发的核心流程和实战技巧。记住,AI 是强大的辅助工具,但不能完全替代人类开发者的思考和判断。在实际开发中,要结合 AI 的优势和人类的创造力,才能打造出高质量的软件产品。
ChatGPT + Codex 开发实战全流程
ChatGPT(基于 GPT-3.5/4)与 Codex(基于 GPT-3.5 的代码专用模型)的结合,能够极大提升开发效率,实现从自然语言需求到可运行代码的快速转化。本指南将带你完整走通从环境准备到实际项目部署的全流程,包含多个实战项目和最佳实践。
一、准备工作
1.1 账号与 API 密钥获取
- 访问OpenAI 官网注册账号
- 进入 API 控制台,创建新的 API 密钥(API Key)
- 了解 API 定价:
- GPT-3.5-turbo:约 $0.002/1K tokens
- GPT-4:约 $0.03-$0.06/1K tokens
- Codex (code-davinci-002):约 $0.02/1K tokens
1.2 开发环境搭建
bash
运行
# 创建项目目录
mkdir chatgpt-codex-dev
cd chatgpt-codex-dev
# 初始化Python环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装必要依赖
pip install openai python-dotenv flask requests
1.3 配置环境变量
创建.env文件:
env
OPENAI_API_KEY=your_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1 # 如有需要可修改为代理地址
二、核心概念与基础 API 使用
2.1 ChatGPT vs Codex 对比
表格
| 特性 | ChatGPT (gpt-3.5-turbo) | Codex (code-davinci-002) |
|---|---|---|
| 主要用途 | 对话、理解、生成文本 | 代码生成、解释、调试 |
| 上下文窗口 | 4K/16K tokens | 8K tokens |
| 代码能力 | 较强 | 最强 |
| 响应格式 | 对话式 | 更专注于代码 |
2.2 基础 API 调用示例
创建basic_api.py:
python
运行
import os
from dotenv import load_dotenv
import openai
# 加载环境变量
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
def chatgpt_completion(prompt):
"""调用ChatGPT API"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=1000
)
return response.choices[0].message.content.strip()
def codex_completion(prompt):
"""调用Codex API"""
response = openai.Completion.create(
model="code-davinci-002",
prompt=prompt,
temperature=0.2, # 代码生成使用较低温度以保证准确性
max_tokens=1000,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response.choices[0].text.strip()
if __name__ == "__main__":
# 测试ChatGPT
print("ChatGPT响应:")
print(chatgpt_completion("解释什么是RESTful API"))
# 测试Codex
print("\nCodex响应:")
print(codex_completion("# 编写一个Python函数,计算斐波那契数列的第n项\n\ndef fibonacci(n):"))
三、实战项目一:智能代码生成器
3.1 项目目标
创建一个能根据自然语言描述生成多种编程语言代码的工具,支持代码解释和优化建议。
3.2 实现代码
创建code_generator.py:
python
运行
import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
class CodeGenerator:
def __init__(self):
self.chat_model = "gpt-3.5-turbo"
self.code_model = "code-davinci-002"
def generate_code(self, description, language="python"):
"""根据自然语言描述生成代码"""
prompt = f"""
请用{language}语言编写代码,实现以下功能:
{description}
要求:
1. 代码要有清晰的注释
2. 遵循{language}的最佳实践
3. 包含必要的错误处理
4. 如果是函数,包含使用示例
"""
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
max_tokens=2000
)
return response.choices[0].message.content.strip()
def explain_code(self, code):
"""解释代码功能"""
prompt = f"""
请详细解释以下代码的功能、逻辑和关键点:
{code}
plaintext
请分点说明:
1. 整体功能
2. 核心逻辑
3. 关键函数/方法
4. 可能的优化点
"""
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.5,
max_tokens=1500
)
return response.choices[0].message.content.strip()
def optimize_code(self, code, focus="performance"):
"""优化代码"""
prompt = f"""
请优化以下代码,重点关注{focus}:
{code}
plaintext
要求:
1. 保留原代码的核心功能
2. 说明优化的原因和效果
3. 提供优化后的完整代码
"""
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
max_tokens=2000
)
return response.choices[0].message.content.strip()
if __name__ == "__main__":
generator = CodeGenerator()
# 生成代码示例
code = generator.generate_code(
"实现一个简单的任务管理系统,支持添加、删除、查看任务,任务有标题、描述和状态",
language="python"
)
print("生成的代码:")
print(code)
# 解释代码
explanation = generator.explain_code(code)
print("\n代码解释:")
print(explanation)
四、实战项目二:交互式代码助手
4.1 项目目标
创建一个 Web 界面的交互式代码助手,用户可以通过聊天方式与 AI 交互,实现代码编写、调试、解释等功能。
4.2 后端实现
创建app.py:
python
运行
import os
from dotenv import load_dotenv
import openai
from flask import Flask, render_template, request, jsonify
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
app = Flask(__name__)
# 存储对话历史
conversations = {}
@app.route('/')
def index():
return render_template('index.html')
@app.route('/chat', methods=['POST'])
def chat():
data = request.json
session_id = data.get('session_id', 'default')
message = data.get('message', '')
if session_id not in conversations:
conversations[session_id] = [
{"role": "system", "content": "你是一位专业的编程助手,擅长各种编程语言和开发技术。你可以帮助用户编写代码、调试错误、解释概念、优化性能。请用简洁明了的语言回答,代码部分使用代码块格式。"}
]
conversations[session_id].append({"role": "user", "content": message})
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=conversations[session_id],
temperature=0.7,
max_tokens=2000
)
assistant_message = response.choices[0].message.content.strip()
conversations[session_id].append({"role": "assistant", "content": assistant_message})
return jsonify({
"success": True,
"message": assistant_message
})
except Exception as e:
return jsonify({
"success": False,
"error": str(e)
})
@app.route('/clear', methods=['POST'])
def clear_conversation():
data = request.json
session_id = data.get('session_id', 'default')
if session_id in conversations:
del conversations[session_id]
return jsonify({"success": True})
if __name__ == '__main__':
app.run(debug=True)
4.3 前端实现
创建templates/index.html:
html
预览
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI代码助手</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.chat-container {
background-color: white;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
height: 600px;
display: flex;
flex-direction: column;
}
.chat-messages {
flex: 1;
overflow-y: auto;
padding: 20px;
}
.message {
margin-bottom: 15px;
padding: 10px 15px;
border-radius: 10px;
max-width: 80%;
}
.user-message {
background-color: #007bff;
color: white;
margin-left: auto;
}
.assistant-message {
background-color: #e9ecef;
color: #333;
}
.code-block {
background-color: #f8f9fa;
border-radius: 5px;
padding: 10px;
margin: 10px 0;
overflow-x: auto;
font-family: monospace;
}
.input-container {
display: flex;
padding: 20px;
border-top: 1px solid #eee;
}
#message-input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 16px;
}
#send-button, #clear-button {
padding: 10px 20px;
margin-left: 10px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
}
#send-button {
background-color: #007bff;
color: white;
}
#clear-button {
background-color: #dc3545;
color: white;
}
</style>
</head>
<body>
<h1>AI代码助手</h1>
<div class="chat-container">
<div class="chat-messages" id="chat-messages"></div>
<div class="input-container">
<input type="text" id="message-input" placeholder="输入你的问题或代码需求...">
<button id="send-button">发送</button>
<button id="clear-button">清空对话</button>
</div>
</div>
<script>
const sessionId = Math.random().toString(36).substring(7);
const chatMessages = document.getElementById('chat-messages');
const messageInput = document.getElementById('message-input');
const sendButton = document.getElementById('send-button');
const clearButton = document.getElementById('clear-button');
function addMessage(content, isUser) {
const messageDiv = document.createElement('div');
messageDiv.className = `message ${isUser ? 'user-message' : 'assistant-message'}`;
// 处理代码块
content = content.replace(/```([\s\S]*?)```/g, '<div class="code-block">$1</div>');
messageDiv.innerHTML = content;
chatMessages.appendChild(messageDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
}
async function sendMessage() {
const message = messageInput.value.trim();
if (!message) return;
addMessage(message, true);
messageInput.value = '';
try {
const response = await fetch('/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
session_id: sessionId,
message: message
})
});
const data = await response.json();
if (data.success) {
addMessage(data.message, false);
} else {
addMessage(`错误:${data.error}`, false);
}
} catch (error) {
addMessage(`网络错误:${error.message}`, false);
}
}
async function clearConversation() {
try {
await fetch('/clear', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
session_id: sessionId
})
});
chatMessages.innerHTML = '';
} catch (error) {
console.error('清空对话失败:', error);
}
}
sendButton.addEventListener('click', sendMessage);
clearButton.addEventListener('click', clearConversation);
messageInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
sendMessage();
}
});
</script>
</body>
</html>
五、实战项目三:全栈应用快速开发
5.1 项目目标
利用 ChatGPT+Codex 快速开发一个完整的待办事项全栈应用,包含前端、后端和数据库。
5.2 需求描述
向 AI 输入以下需求:
plaintext
我需要开发一个待办事项应用,包含以下功能:
1. 用户可以注册和登录
2. 用户可以添加、编辑、删除、标记完成待办事项
3. 待办事项可以设置优先级和截止日期
4. 界面美观,响应式设计
技术栈要求:
- 后端:Python Flask
- 数据库:SQLite
- 前端:HTML, CSS, JavaScript
- 认证:JWT
请提供完整的项目结构和代码实现。
5.3 典型 AI 生成的项目结构
plaintext
todo-app/
├── app.py # 主应用文件
├── config.py # 配置文件
├── models.py # 数据库模型
├── routes/ # 路由目录
│ ├── auth.py # 认证路由
│ └── todos.py # 待办事项路由
├── static/ # 静态文件
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── main.js
├── templates/ # 模板文件
│ ├── index.html
│ ├── login.html
│ └── register.html
└── requirements.txt # 依赖文件
5.4 关键代码示例(AI 生成)
models.py:
python
运行
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
todos = db.relationship('Todo', backref='user', lazy=True)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text, nullable=True)
completed = db.Column(db.Boolean, default=False)
priority = db.Column(db.String(20), default='medium') # low, medium, high
due_date = db.Column(db.DateTime, nullable=True)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
六、最佳实践与优化技巧
6.1 Prompt 工程技巧
- 明确指令:清晰说明你想要的功能、技术栈和要求
- 分步骤指导:复杂任务拆分成多个小步骤
- 提供示例:给出输入输出示例帮助 AI 理解
- 指定格式:明确要求代码格式、注释风格等
- 迭代优化:先获取基础版本,再逐步调整完善
6.2 代码质量提升
- 人工审核:AI 生成的代码必须经过人工审核和测试
- 安全检查:特别注意 SQL 注入、XSS 等安全问题
- 性能优化:AI 可能生成效率不高的代码,需要手动优化
- 代码规范:确保代码符合团队的编码规范
- 测试覆盖:为 AI 生成的代码编写单元测试
6.3 成本控制
- 合理选择模型:简单任务用 GPT-3.5,复杂任务用 GPT-4
- 控制 token 数量:精简 prompt,限制响应长度
- 缓存结果:对常用查询结果进行缓存
- 批量处理:将多个小请求合并为一个大请求
- 监控使用量:定期查看 API 使用情况,避免意外超支
七、部署与上线
7.1 本地测试
bash
运行
# 安装依赖
pip install -r requirements.txt
# 初始化数据库
flask db init
flask db migrate -m "Initial migration"
flask db upgrade
# 运行应用
flask run
7.2 云平台部署(以 Heroku 为例)
-
创建
Procfile:plaintext
web: gunicorn app:app -
创建
runtime.txt:plaintext
python-3.9.10 -
部署命令:
bash
运行
heroku create my-ai-app git push heroku main heroku config:set OPENAI_API_KEY=your_api_key_here heroku open
八、常见问题与解决方案
8.1 API 调用失败
- 检查 API 密钥是否正确
- 确认网络连接正常
- 查看是否达到 API 速率限制
- 检查账户余额是否充足
8.2 生成的代码有错误
- 提供更详细的错误信息给 AI
- 简化需求,分步骤生成
- 尝试不同的 prompt 表述
- 手动调试并修正错误
8.3 上下文过长问题
- 定期清理对话历史
- 使用摘要技术压缩上下文
- 拆分大型任务为多个小任务
- 使用支持更长上下文的模型(如 GPT-4-32k)
九、进阶方向
- 集成更多 AI 模型:如 Claude、PaLM 等,对比不同模型的效果
- 构建企业级应用:添加用户管理、权限控制、日志系统等
- 开发 IDE 插件:将 AI 助手集成到 VS Code、PyCharm 等开发工具中
- 自动化测试:利用 AI 自动生成测试用例和测试代码
- 代码审查:构建基于 AI 的代码审查系统
通过本指南的学习,你已经掌握了 ChatGPT+Codex 开发的核心流程和实战技巧。记住,AI 是强大的辅助工具,但不能完全替代人类开发者的思考和判断。在实际开发中,要结合 AI 的优势和人类的创造力,才能打造出高质量的软件产品。
ChatGPT + Codex 开发实战完整项目包
这是一个可直接运行的完整项目包,包含了之前介绍的所有功能:基础 API 调用、智能代码生成器和交互式 Web 代码助手。项目结构清晰,代码经过优化,附带详细的部署和使用说明。
📁 项目完整结构
plaintext
chatgpt-codex-dev/
├── 📄 .env.example # 环境变量配置模板
├── 📄 requirements.txt # Python依赖列表
├── 📄 README.md # 本说明文档
├── 📄 basic_api.py # 基础API调用演示
├── 📄 code_generator.py # 智能代码生成器(命令行版)
├── 📄 app.py # Web应用主入口(包含所有功能)
├── 📂 static/
│ ├── 📂 css/
│ │ └── 📄 style.css # 全局样式文件
│ └── 📂 js/
│ └── 📄 main.js # 前端交互逻辑
└── 📂 templates/
├── 📄 index.html # 主页(导航页)
├── 📄 chat.html # 交互式代码助手页面
└── 📄 generator.html # 智能代码生成器页面
🚀 快速开始
1. 下载项目文件
创建项目目录并依次创建以下所有文件,或者直接复制每个文件的内容到对应位置。
2. 环境准备
系统要求:Python 3.8+
3. 安装依赖
bash
# 创建虚拟环境(推荐)
python -m venv venv
# 激活虚拟环境
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
# 安装所有依赖
pip install -r requirements.txt
4. 配置环境变量
- 复制
.env.example文件并重命名为.env - 打开
.env文件,替换为你的 OpenAI API 密钥 - 如有需要,修改 API 基础 URL(用于代理访问)
5. 运行应用
bash
# 启动Web应用
python app.py
- 打开浏览器访问:
http://127.0.0.1:5000
📄 各文件完整代码
1. requirements.txt
openai==0.28.1
flask==2.3.3
python-dotenv==1.0.0
flask-cors==4.0.0
2. .env.example
env
# OpenAI API密钥(必填)
OPENAI_API_KEY=your_api_key_here
# API基础URL(可选,用于代理访问)
# OPENAI_BASE_URL=https://api.openai.com/v1
# 应用配置
FLASK_APP=app.py
FLASK_ENV=development
FLASK_DEBUG=True
3. README.md
markdown
# ChatGPT + Codex 开发实战项目
这是一个基于OpenAI GPT-3.5和Codex模型的AI开发助手项目,包含以下功能:
- ✅ 基础API调用演示
- ✅ 智能代码生成器(支持多种编程语言)
- ✅ 交互式代码助手(聊天界面)
- ✅ 代码解释与优化建议
- ✅ 美观的Web界面
## 快速启动
1. 安装依赖:`pip install -r requirements.txt`
2. 复制`.env.example`为`.env`并填入你的OpenAI API密钥
3. 运行:`python app.py`
4. 访问:`http://127.0.0.1:5000`
## 功能说明
### 1. 交互式代码助手
- 自然语言对话式编程
- 代码编写、调试、解释
- 上下文记忆功能
- 支持多种编程语言
### 2. 智能代码生成器
- 根据自然语言描述生成代码
- 支持Python、JavaScript、Java、C++等多种语言
- 自动添加注释和使用示例
- 代码解释与优化建议
### 3. 基础API演示
- 展示ChatGPT和Codex的基本调用方法
- 对比两个模型的不同表现
- 可作为学习和测试的基础
## 注意事项
- 请妥善保管你的API密钥,不要泄露给他人
- 注意API使用成本,建议设置使用额度限制
- AI生成的代码需要经过人工审核和测试
- 不要在生产环境中使用未经安全检查的代码
## 常见问题
### API调用失败
- 检查API密钥是否正确
- 确认网络连接正常
- 查看账户余额是否充足
- 检查是否达到速率限制
### 生成的代码有错误
- 提供更详细的错误信息给AI
- 简化需求,分步骤生成
- 尝试不同的prompt表述
- 手动调试并修正错误
4. basic_api.py
python
import os
from dotenv import load_dotenv
import openai
# 加载环境变量
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.api_base = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
def chatgpt_completion(prompt, temperature=0.7, max_tokens=1000):
"""调用ChatGPT API"""
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
max_tokens=max_tokens
)
return {
"success": True,
"content": response.choices[0].message.content.strip(),
"usage": response.usage
}
except Exception as e:
return {
"success": False,
"error": str(e)
}
def codex_completion(prompt, temperature=0.2, max_tokens=1000):
"""调用Codex API"""
try:
response = openai.Completion.create(
model="code-davinci-002",
prompt=prompt,
temperature=temperature,
max_tokens=max_tokens,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return {
"success": True,
"content": response.choices[0].text.strip(),
"usage": response.usage
}
except Exception as e:
return {
"success": False,
"error": str(e)
}
if __name__ == "__main__":
print("=== ChatGPT + Codex 基础API演示 ===")
# 测试ChatGPT
print("\n1. ChatGPT测试 - 解释RESTful API")
chat_result = chatgpt_completion("用简洁的语言解释什么是RESTful API,以及它的主要特点")
if chat_result["success"]:
print(chat_result["content"])
print(f"\nToken使用量: {chat_result['usage']}")
else:
print(f"错误: {chat_result['error']}")
# 测试Codex
print("\n" + "="*50)
print("\n2. Codex测试 - 生成斐波那契数列函数")
codex_result = codex_completion(
"# 编写一个Python函数,计算斐波那契数列的第n项\n"
"# 要求:使用递归方法,包含错误处理\n\n"
"def fibonacci(n):"
)
if codex_result["success"]:
print("```python")
print("def fibonacci(n):")
print(codex_result["content"])
print("```")
print(f"\nToken使用量: {codex_result['usage']}")
else:
print(f"错误: {codex_result['error']}")
5. code_generator.py
import os
from dotenv import load_dotenv
import openai
# 加载环境变量
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.api_base = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
class CodeGenerator:
def __init__(self):
self.chat_model = "gpt-3.5-turbo"
def generate_code(self, description, language="python", additional_requirements=""):
"""根据自然语言描述生成代码"""
prompt = f"""
请用{language}语言编写代码,实现以下功能:
{description}
要求:
1. 代码要有清晰详细的注释
2. 遵循{language}的官方最佳实践和编码规范
3. 包含必要的错误处理和边界条件检查
4. 如果是函数或类,包含完整的使用示例
5. 代码要简洁高效,易于理解和维护
{additional_requirements}
请直接返回代码,不要添加多余的解释。
"""
try:
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
max_tokens=2000
)
return {
"success": True,
"code": response.choices[0].message.content.strip(),
"usage": response.usage
}
except Exception as e:
return {
"success": False,
"error": str(e)
}
def explain_code(self, code):
"""解释代码功能"""
prompt = f"""
请详细解释以下代码的功能、逻辑和关键点:
{code}
plaintext
请按照以下结构进行解释:
1. 整体功能概述
2. 核心逻辑流程
3. 关键函数/方法说明
4. 输入输出示例
5. 可能的优化点和改进建议
"""
try:
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.5,
max_tokens=1500
)
return {
"success": True,
"explanation": response.choices[0].message.content.strip(),
"usage": response.usage
}
except Exception as e:
return {
"success": False,
"error": str(e)
}
def optimize_code(self, code, focus="performance"):
"""优化代码"""
focus_options = {
"performance": "运行性能和效率",
"readability": "代码可读性和可维护性",
"security": "安全性和漏洞防护",
"memory": "内存使用效率",
"all": "综合优化"
}
prompt = f"""
请优化以下代码,重点关注{focus_options.get(focus, focus)}:
{code}
plaintext
要求:
1. 严格保留原代码的所有核心功能
2. 详细说明每一处优化的原因和带来的效果
3. 提供优化后的完整代码
4. 如果有多种优化方案,说明各自的优缺点
"""
try:
response = openai.ChatCompletion.create(
model=self.chat_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
max_tokens=2000
)
return {
"success": True,
"optimization": response.choices[0].message.content.strip(),
"usage": response.usage
}
except Exception as e:
return {
"success": False,
"error": str(e)
}
if __name__ == "__main__":
generator = CodeGenerator()
print("=== 智能代码生成器演示 ===")
# 生成代码示例
print("\n1. 生成任务管理系统代码")
result = generator.generate_code(
"实现一个简单的任务管理系统,支持添加、删除、查看任务,任务有标题、描述和状态(未完成/已完成)",
language="python"
)
if result["success"]:
print("\n生成的代码:")
print(result["code"])
print(f"\nToken使用量: {result['usage']}")
# 解释代码
print("\n" + "="*50)
print("\n2. 代码解释")
explain_result = generator.explain_code(result["code"])
if explain_result["success"]:
print(explain_result["explanation"])
else:
print(f"错误: {result['error']}")
6. app.py
import os
import uuid
from dotenv import load_dotenv
import openai
from flask import Flask, render_template, request, jsonify, redirect, url_for
from flask_cors import CORS
# 加载环境变量
load_dotenv()
# 配置OpenAI
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.api_base = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
# 初始化Flask应用
app = Flask(__name__)
CORS(app)
app.secret_key = os.urandom(24)
# 存储对话历史(生产环境请使用数据库)
conversations = {}
# 导入代码生成器
from code_generator import CodeGenerator
code_generator = CodeGenerator()
@app.route('/')
def index():
"""主页"""
return render_template('index.html')
@app.route('/chat')
def chat():
"""交互式代码助手页面"""
return render_template('chat.html')
@app.route('/generator')
def generator():
"""智能代码生成器页面"""
return render_template('generator.html')
@app.route('/api/chat', methods=['POST'])
def api_chat():
"""聊天API"""
data = request.json
session_id = data.get('session_id')
message = data.get('message', '').strip()
if not message:
return jsonify({
"success": False,
"error": "消息不能为空"
})
# 如果没有session_id,创建一个新的
if not session_id:
session_id = str(uuid.uuid4())
# 初始化对话历史
if session_id not in conversations:
conversations[session_id] = [
{
"role": "system",
"content": "你是一位专业的编程助手,擅长各种编程语言和开发技术。你可以帮助用户编写代码、调试错误、解释概念、优化性能。请用简洁明了的语言回答,代码部分使用代码块格式。如果用户的问题与编程无关,请礼貌地提醒你只能回答编程相关的问题。"
}
]
# 添加用户消息
conversations[session_id].append({"role": "user", "content": message})
try:
# 调用OpenAI API
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=conversations[session_id],
temperature=0.7,
max_tokens=2000
)
assistant_message = response.choices[0].message.content.strip()
conversations[session_id].append({"role": "assistant", "content": assistant_message})
# 限制对话历史长度,避免上下文过长
if len(conversations[session_id]) > 20:
conversations[session_id] = conversations[session_id][:1] + conversations[session_id][-19:]
return jsonify({
"success": True,
"message": assistant_message,
"session_id": session_id,
"usage": response.usage
})
except Exception as e:
return jsonify({
"success": False,
"error": str(e)
})
@app.route('/api/clear-chat', methods=['POST'])
def api_clear_chat():
"""清空对话历史"""
data = request.json
session_id = data.get('session_id')
if session_id and session_id in conversations:
del conversations[session_id]
return jsonify({"success": True})
@app.route('/api/generate-code', methods=['POST'])
def api_generate_code():
"""生成代码API"""
data = request.json
description = data.get('description', '').strip()
language = data.get('language', 'python')
additional_requirements = data.get('additional_requirements', '').strip()
if not description:
return jsonify({
"success": False,
"error": "功能描述不能为空"
})
result = code_generator.generate_code(description, language, additional_requirements)
return jsonify(result)
@app.route('/api/explain-code', methods=['POST'])
def api_explain_code():
"""解释代码API"""
data = request.json
code = data.get('code', '').strip()
if not code:
return jsonify({
"success": False,
"error": "代码不能为空"
})
result = code_generator.explain_code(code)
return jsonify(result)
@app.route('/api/optimize-code', methods=['POST'])
def api_optimize_code():
"""优化代码API"""
data = request.json
code = data.get('code', '').strip()
focus = data.get('focus', 'performance')
if not code:
return jsonify({
"success": False,
"error": "代码不能为空"
})
result = code_generator.optimize_code(code, focus)
return jsonify(result)
if __name__ == '__main__':
app.run(debug=os.getenv("FLASK_DEBUG", "False").lower() == "true")
7. static/css/style.css
css
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8f9fa;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
/* 导航栏 */
.navbar {
background-color: #2c3e50;
color: white;
padding: 1rem 0;
margin-bottom: 2rem;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.navbar .container {
display: flex;
justify-content: space-between;
align-items: center;
}
.navbar-brand {
font-size: 1.5rem;
font-weight: bold;
color: white;
text-decoration: none;
}
.navbar-nav {
display: flex;
list-style: none;
}
.nav-item {
margin-left: 1.5rem;
}
.nav-link {
color: white;
text-decoration: none;
padding: 0.5rem 0;
border-bottom: 2px solid transparent;
transition: border-color 0.3s;
}
.nav-link:hover, .nav-link.active {
border-color: #3498db;
}
/* 卡片样式 */
.card {
background-color: white;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
padding: 2rem;
margin-bottom: 2rem;
}
.card-title {
font-size: 1.5rem;
margin-bottom: 1.5rem;
color: #2c3e50;
border-bottom: 2px solid #3498db;
padding-bottom: 0.5rem;
}
/* 按钮样式 */
.btn {
display: inline-block;
padding: 0.75rem 1.5rem;
border: none;
border-radius: 5px;
font-size: 1rem;
cursor: pointer;
text-decoration: none;
transition: background-color 0.3s;
}
.btn-primary {
background-color: #3498db;
color: white;
}
.btn-primary:hover {
background-color: #2980b9;
}
.btn-danger {
background-color: #e74c3c;
color: white;
}
.btn-danger:hover {
background-color: #c0392b;
}
.btn-success {
background-color: #2ecc71;
color: white;
}
.btn-success:hover {
background-color: #27ae60;
}
/* 表单样式 */
.form-group {
margin-bottom: 1.5rem;
}
.form-label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
}
.form-control {
width: 100%;
padding: 0.75rem;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 1rem;
font-family: inherit;
}
.form-control:focus {
outline: none;
border-color: #3498db;
box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2);
}
textarea.form-control {
resize: vertical;
min-height: 120px;
}
select.form-control {
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23333' viewBox='0 0 16 16'%3E%3Cpath d='M8 11L3 6h10l-5 5z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.75rem center;
padding-right: 2rem;
}
/* 聊天界面 */
.chat-container {
height: 600px;
display: flex;
flex-direction: column;
border: 1px solid #ddd;
border-radius: 10px;
overflow: hidden;
}
.chat-messages {
flex: 1;
overflow-y: auto;
padding: 1.5rem;
background-color: #fafafa;
}
.message {
margin-bottom: 1.5rem;
padding: 1rem 1.25rem;
border-radius: 10px;
max-width: 80%;
line-height: 1.5;
}
.user-message {
background-color: #3498db;
color: white;
margin-left: auto;
border-bottom-right-radius: 0;
}
.assistant-message {
background-color: white;
color: #333;
border: 1px solid #eee;
border-bottom-left-radius: 0;
}
/* 代码块样式 */
.code-block {
background-color: #f8f9fa;
border-radius: 5px;
padding: 1rem;
margin: 1rem 0;
overflow-x: auto;
font-family: 'Consolas', 'Monaco', monospace;
font-size: 0.9rem;
line-height: 1.4;
border: 1px solid #e9ecef;
}
.chat-input-container {
display: flex;
padding: 1rem;
border-top: 1px solid #ddd;
background-color: white;
}
#message-input {
flex: 1;
padding: 0.75rem 1rem;
border: 1px solid #ddd;
border-radius: 25px;
font-size: 1rem;
margin-right: 0.75rem;
}
#message-input:focus {
outline: none;
border-color: #3498db;
}
.chat-buttons {
display: flex;
gap: 0.5rem;
}
/* 代码生成器界面 */
.code-result {
margin-top: 2rem;
}
.result-section {
margin-bottom: 2rem;
}
.result-section h3 {
margin-bottom: 1rem;
color: #2c3e50;
}
/* 加载动画 */
.loading {
display: inline-block;
width: 20px;
height: 20px;
border: 3px solid rgba(255,255,255,.3);
border-radius: 50%;
border-top-color: white;
animation: spin 1s ease-in-out infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* 响应式设计 */
@media (max-width: 768px) {
.navbar .container {
flex-direction: column;
text-align: center;
}
.navbar-nav {
margin-top: 1rem;
justify-content: center;
}
.nav-item {
margin: 0 0.75rem;
}
.message {
max-width: 90%;
}
.chat-input-container {
flex-direction: column;
}
.chat-buttons {
margin-top: 0.75rem;
justify-content: flex-end;
}
}
8. static/js/main.js
javascript
// 全局变量
let currentSessionId = null;
// 通用工具函数
function showLoading(buttonId) {
const button = document.getElementById(buttonId);
if (button) {
button.disabled = true;
const originalText = button.innerHTML;
button.innerHTML = '<span class="loading"></span> 处理中...';
return originalText;
}
return null;
}
function hideLoading(buttonId, originalText) {
const button = document.getElementById(buttonId);
if (button && originalText) {
button.disabled = false;
button.innerHTML = originalText;
}
}
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
function formatMessage(content) {
// 处理代码块
content = content.replace(/```([\s\S]*?)```/g, function(match, code) {
return '<div class="code-block">' + escapeHtml(code) + '</div>';
});
// 处理换行
content = content.replace(/\n/g, '<br>');
return content;
}
// 聊天功能
function initChat() {
const chatMessages = document.getElementById('chat-messages');
const messageInput = document.getElementById('message-input');
const sendButton = document.getElementById('send-button');
const clearButton = document.getElementById('clear-button');
if (!sendButton) return;
function addMessage(content, isUser) {
const messageDiv = document.createElement('div');
messageDiv.className = `message ${isUser ? 'user-message' : 'assistant-message'}`;
messageDiv.innerHTML = formatMessage(content);
chatMessages.appendChild(messageDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
}
async function sendMessage() {
const message = messageInput.value.trim();
if (!message) return;
addMessage(message, true);
messageInput.value = '';
const originalText = showLoading('send-button');
try {
const response = await fetch('/api/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
session_id: currentSessionId,
message: message
})
});
const data = await response.json();
if (data.success) {
currentSessionId = data.session_id;
addMessage(data.message, false);
} else {
addMessage(`❌ 错误:${data.error}`, false);
}
} catch (error) {
addMessage(`❌ 网络错误:${error.message}`, false);
} finally {
hideLoading('send-button', originalText);
}
}
async function clearConversation() {
if (!currentSessionId) return;
try {
await fetch('/api/clear-chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
session_id: currentSessionId
})
});
chatMessages.innerHTML = '';
currentSessionId = null;
} catch (error) {
console.error('清空对话失败:', error);
}
}
sendButton.addEventListener('click', sendMessage);
clearButton.addEventListener('click', clearConversation);
messageInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
sendMessage();
}
});
}
// 代码生成器功能
function initCodeGenerator() {
const generateButton = document.getElementById('generate-button');
const explainButton = document.getElementById('explain-button');
const optimizeButton = document.getElementById('optimize-button');
if (!generateButton) return;
async function generateCode() {
const description = document.getElementById('description').value.trim();
const language = document.getElementById('language').value;
const additionalRequirements = document.getElementById('additional-requirements').value.trim();
if (!description) {
alert('请输入功能描述');
return;
}
const originalText = showLoading('generate-button');
try {
const response = await fetch('/api/generate-code', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
description: description,
language: language,
additional_requirements: additionalRequirements
})
});
const data = await response.json();
if (data.success) {
document.getElementById('generated-code').innerHTML =
'<div class="code-block">' + escapeHtml(data.code) + '</div>';
document.getElementById('code-result').style.display = 'block';
// 自动填充到解释和优化的输入框
document.getElementById('code-input').value = data.code;
} else {
alert(`生成失败:${data.error}`);
}
} catch (error) {
alert(`网络错误:${error.message}`);
} finally {
hideLoading('generate-button', originalText);
}
}
async function explainCode() {
const code = document.getElementById('code-input').value.trim();
if (!code) {
alert('请输入要解释的代码');
return;
}
const originalText = showLoading('explain-button');
try {
const response = await fetch('/api/explain-code', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
code: code
})
});
const data = await response.json();
if (data.success) {
document.getElementById('code-explanation').innerHTML = formatMessage(data.explanation);
document.getElementById('explanation-result').style.display = 'block';
} else {
alert(`解释失败:${data.error}`);
}
} catch (error) {
alert(`网络错误:${error.message}`);
} finally {
hideLoading('explain-button', originalText);
}
}
async function optimizeCode() {
const code = document.getElementById('code-input').value.trim();
const focus = document.getElementById('optimize-focus').value;
if (!code) {
alert('请输入要优化的代码');
return;
}
const originalText = showLoading('optimize-button');
try {
const response = await fetch('/api/optimize-code', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
code: code,
focus: focus
})
});
const data = await response.json();
if (data.success) {
document.getElementById('code-optimization').innerHTML = formatMessage(data.optimization);
document.getElementById('optimization-result').style.display = 'block';
} else {
alert(`优化失败:${data.error}`);
}
} catch (error) {
alert(`网络错误:${error.message}`);
} finally {
hideLoading('optimize-button', originalText);
}
}
generateButton.addEventListener('click', generateCode);
explainButton.addEventListener('click', explainCode);
optimizeButton.addEventListener('click', optimizeCode);
}
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
initChat();
initCodeGenerator();
});
9. templates/index.html
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChatGPT + Codex 开发助手</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<nav class="navbar">
<div class="container">
<a href="{{ url_for('index') }}" class="navbar-brand">🤖 AI开发助手</a>
<ul class="navbar-nav">
<li class="nav-item"><a href="{{ url_for('index') }}" class="nav-link active">首页</a></li>
<li class="nav-item"><a href="{{ url_for('chat') }}" class="nav-link">交互式助手</a></li>
<li class="nav-item"><a href="{{ url_for('generator') }}" class="nav-link">代码生成器</a></li>
</ul>
</div>
</nav>
<div class="container">
<div class="card">
<h1 class="card-title">欢迎使用ChatGPT + Codex开发助手</h1>
<p class="lead">这是一个基于OpenAI GPT-3.5和Codex模型的AI开发工具,能够帮助你快速编写、解释和优化代码。</p>
<div style="margin-top: 2rem; display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
<div class="card" style="margin-bottom: 0;">
<h3>💬 交互式代码助手</h3>
<p>通过自然语言对话的方式与AI交流,实现代码编写、调试、解释等功能。支持上下文记忆,让编程更加轻松。</p>
<a href="{{ url_for('chat') }}" class="btn btn-primary">开始对话</a>
</div>
<div class="card" style="margin-bottom: 0;">
<h3>⚡ 智能代码生成器</h3>
<p>根据自然语言描述快速生成多种编程语言的代码。支持代码解释和优化建议,提高开发效率。</p>
<a href="{{ url_for('generator') }}" class="btn btn-success">生成代码</a>
</div>
</div>
</div>
<div class="card">
<h2 class="card-title">功能特性</h2>
<ul style="list-style-position: inside; columns: 2; gap: 1rem;">
<li>支持多种编程语言(Python、JavaScript、Java、C++等)</li>
<li>智能代码生成,自动添加注释和示例</li>
<li>代码详细解释,帮助理解复杂逻辑</li>
<li>代码优化建议,提升性能和可读性</li>
<li>交互式聊天界面,支持上下文记忆</li>
<li>美观的Web界面,响应式设计</li>
<li>完整的错误处理和用户提示</li>
</ul>
</div>
<div class="card">
<h2 class="card-title">使用提示</h2>
<div class="alert alert-info" style="background-color: #e3f2fd; padding: 1rem; border-radius: 5px; border-left: 4px solid #2196f3;">
<strong>💡 提示:</strong>
<ul style="margin-top: 0.5rem; margin-left: 1.5rem;">
<li>描述需求时尽量详细和具体</li>
<li>复杂任务可以拆分成多个小步骤</li>
<li>AI生成的代码需要经过人工审核和测试</li>
<li>注意保护你的API密钥和账户安全</li>
</ul>
</div>
</div>
</div>
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
</body>
</html>
10. templates/chat.html
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>交互式代码助手 - AI开发助手</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<nav class="navbar">
<div class="container">
<a href="{{ url_for('index') }}" class="navbar-brand">🤖 AI开发助手</a>
<ul class="navbar-nav">
<li class="nav-item"><a href="{{ url_for('index') }}" class="nav-link">首页</a></li>
<li class="nav-item"><a href="{{ url_for('chat') }}" class="nav-link active">交互式助手</a></li>
<li class="nav-item"><a href="{{ url_for('generator') }}" class="nav-link">代码生成器</a></li>
</ul>
</div>
</nav>
<div class="container">
<div class="card">
<h1 class="card-title">💬 交互式代码助手</h1>
<p>通过自然语言对话的方式与AI交流,获取编程帮助。你可以询问任何编程相关的问题,AI会尽力为你解答。</p>
<div class="chat-container">
<div class="chat-messages" id="chat-messages">
<div class="message assistant-message">
👋 你好!我是你的AI编程助手。我可以帮助你:<br><br>
• 编写各种编程语言的代码<br>
• 解释代码的功能和逻辑<br>
• 调试代码中的错误<br>
• 优化代码的性能和可读性<br>
• 解答编程相关的问题<br><br>
请问有什么我可以帮助你的吗?
</div>
</div>
<div class="chat-input-container">
<input type="text" id="message-input" placeholder="输入你的问题或代码需求...">
<div class="chat-buttons">
<button id="send-button" class="btn btn-primary">发送</button>
<button id="clear-button" class="btn btn-danger">清空</button>
</div>
</div>
</div>
</div>
<div class="card">
<h2 class="card-title">使用示例</h2>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1rem;">
<div style="background-color: #f8f9fa; padding: 1rem; border-radius: 5px;">
<strong>代码编写:</strong>
<p>"用Python写一个简单的计算器程序,支持加减乘除运算"</p>
</div>
<div style="background-color: #f8f9fa; padding: 1rem; border-radius: 5px;">
<strong>代码解释:</strong>
<p>"解释一下这段代码的功能:[粘贴你的代码]"</p>
</div>
<div style="background-color: #f8f9fa; padding: 1rem; border-radius: 5px;">
<strong>错误调试:</strong>
<p>"这段代码报错了,帮我看看是什么问题:[粘贴代码和错误信息]"</p>
</div>
<div style="background-color: #f8f9fa; padding: 1rem; border-radius: 5px;">
<strong>代码优化:</strong>
<p>"帮我优化这段代码,提高运行效率:[粘贴你的代码]"</p>
</div>
</div>
</div>
</div>
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
</body>
</html>
11. templates/generator.html
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>智能代码生成器 - AI开发助手</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<nav class="navbar">
<div class="container">
<a href="{{ url_for('index') }}" class="navbar-brand">🤖 AI开发助手</a>
<ul class="navbar-nav">
<li class="nav-item"><a href="{{ url_for('index') }}" class="nav-link">首页</a></li>
<li class="nav-item"><a href="{{ url_for('chat') }}" class="nav-link">交互式助手</a></li>
<li class="nav-item"><a href="{{ url_for('generator') }}" class="nav-link active">代码生成器</a></li>
</ul>
</div>
</nav>
<div class="container">
<div class="card">
<h1 class="card-title">⚡ 智能代码生成器</h1>
<p>根据自然语言描述快速生成多种编程语言的代码。生成的代码包含详细注释和使用示例。</p>
<form id="generate-form">
<div class="form-group">
<label for="description" class="form-label">功能描述 *</label>
<textarea id="description" class="form-control" rows="4" placeholder="请详细描述你想要实现的功能..."></textarea>
</div>
<div class="form-group">
<label for="language" class="form-label">编程语言</label>
<select id="language" class="form-control">
<option value="python">Python</option>
<option value="javascript">JavaScript</option>
<option value="java">Java</option>
<option value="cpp">C++</option>
<option value="csharp">C#</option>
<option value="go">Go</option>
<option value="rust">Rust</option>
<option value="php">PHP</option>
<option value="ruby">Ruby</option>
<option value="swift">Swift</option>
</select>
</div>
<div class="form-group">
<label for="additional-requirements" class="form-label">额外要求(可选)</label>
<textarea id="additional-requirements" class="form-control" rows="2" placeholder="例如:使用面向对象编程、添加异常处理、使用特定库等"></textarea>
</div>
<button type="button" id="generate-button" class="btn btn-primary btn-lg">生成代码</button>
</form>
</div>
<div class="card" id="code-result" style="display: none;">
<h2 class="card-title">生成结果</h2>
<div class="result-section">
<h3>📝 生成的代码</h3>
<div id="generated-code"></div>
</div>
</div>
<div class="card">
<h2 class="card-title">代码解释与优化</h2>
<p>你可以将生成的代码复制到下方输入框,进行解释或优化。</p>
<div class="form-group">
<label for="code-input" class="form-label">代码输入</label>
<textarea id="code-input" class="form-control" rows="8" placeholder="粘贴你想要解释或优化的代码..."></textarea>
</div>
<div style="display: flex; gap: 1rem; margin-bottom: 2rem;">
<button type="button" id="explain-button" class="btn btn-success">解释代码</button>
<div style="display: flex; align-items: center;">
<select id="optimize-focus" class="form-control" style="width: auto; margin-right: 0.5rem;">
<option value="performance">性能优化</option>
<option value="readability">可读性优化</option>
<option value="security">安全性优化</option>
<option value="memory">内存优化</option>
<option value="all">综合优化</option>
</select>
<button type="button" id="optimize-button" class="btn btn-danger">优化代码</button>
</div>
</div>
<div id="explanation-result" class="result-section" style="display: none;">
<h3>📖 代码解释</h3>
<div id="code-explanation"></div>
</div>
<div id="optimization-result" class="result-section" style="display: none; margin-top: 2rem;">
<h3>🚀 代码优化</h3>
<div id="code-optimization"></div>
</div>
</div>
</div>
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
</body>
</html>
📦 部署说明
本地部署(开发环境)
按照上面的 "快速开始" 步骤操作即可。
生产环境部署(以 Heroku 为例)
-
准备工作:
- 注册 Heroku 账号并安装 Heroku CLI
- 登录 Heroku:
heroku login
-
创建 Heroku 应用:
bash
heroku create my-ai-dev-assistant -
配置环境变量:
bash
heroku config:set OPENAI_API_KEY=your_api_key_here heroku config:set FLASK_ENV=production heroku config:set FLASK_DEBUG=False -
创建必要文件:
创建
Procfile:plaintext
web: gunicorn app:app --preload创建
runtime.txt:plaintext
python-3.9.16更新
requirements.txt,添加 gunicorn:txt
openai==0.28.1 flask==2.3.3 python-dotenv==1.0.0 flask-cors==4.0.0 gunicorn==21.2.0 -
部署应用:
bash
git init git add . git commit -m "Initial commit" git push heroku main -
打开应用:
bash
heroku open
其他部署选项
- Docker 部署:创建 Dockerfile 并构建镜像
- AWS EC2:在 EC2 实例上部署
- Google Cloud Run:无服务器部署
- 阿里云 / 腾讯云:国内云服务提供商
⚠️ 重要注意事项
-
API 密钥安全:
- 永远不要将 API 密钥提交到版本控制系统
- 在生产环境中使用环境变量管理密钥
- 定期轮换 API 密钥
-
成本控制:
- 监控 API 使用情况
- 设置账户使用额度限制
- 对频繁请求进行缓存
- 合理选择模型版本
-
安全考虑:
- 在生产环境中禁用调试模式
- 添加用户认证和授权
- 对用户输入进行验证和清理
- 实现速率限制防止滥用
-
代码质量:
- AI 生成的代码必须经过人工审核
- 编写单元测试验证功能正确性
- 检查代码中的安全漏洞
- 遵循团队编码规范
🛠️ 故障排除
常见问题及解决方案
-
API 调用失败:
- 检查 API 密钥是否正确
- 确认网络连接正常
- 查看账户余额是否充足
- 检查是否达到速率限制
-
生成的代码有错误:
- 提供更详细的需求描述
- 分步骤生成代码
- 明确指定技术栈和版本
- 手动调试并修正错误
-
应用无法启动:
- 检查 Python 版本是否符合要求
- 确认所有依赖都已安装
- 查看环境变量配置是否正确
- 检查端口是否被占用
-
界面显示异常:
- 清除浏览器缓存
- 检查静态文件路径是否正确
- 确认浏览器支持现代 JavaScript 特性
🎯 下一步扩展
你可以基于这个项目进行以下扩展:
- 添加用户注册和登录系统
- 集成更多 AI 模型(如 GPT-4、Claude、PaLM)
- 添加代码保存和分享功能
- 开发 VS Code/IDEA 插件
- 实现代码自动运行和测试
- 添加项目模板生成功能
- 集成 Git 版本控制
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)