绝对是CSDN ——NO.1的ChatGPT + Codex 开发实战全流程!

ChatGPT + Codex 开发实战全流程

ChatGPT(基于 GPT-3.5/4)与 Codex(基于 GPT-3.5 的代码专用模型)的结合,能够极大提升开发效率,实现从自然语言需求到可运行代码的快速转化。本指南将带你完整走通从环境准备到实际项目部署的全流程,包含多个实战项目和最佳实践。

一、准备工作

1.1 账号与 API 密钥获取

  1. 访问OpenAI 官网注册账号
  2. 进入 API 控制台,创建新的 API 密钥(API Key)
  3. 了解 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 工程技巧

  1. 明确指令:清晰说明你想要的功能、技术栈和要求
  2. 分步骤指导:复杂任务拆分成多个小步骤
  3. 提供示例:给出输入输出示例帮助 AI 理解
  4. 指定格式:明确要求代码格式、注释风格等
  5. 迭代优化:先获取基础版本,再逐步调整完善

6.2 代码质量提升

  1. 人工审核:AI 生成的代码必须经过人工审核和测试
  2. 安全检查:特别注意 SQL 注入、XSS 等安全问题
  3. 性能优化:AI 可能生成效率不高的代码,需要手动优化
  4. 代码规范:确保代码符合团队的编码规范
  5. 测试覆盖:为 AI 生成的代码编写单元测试

6.3 成本控制

  1. 合理选择模型:简单任务用 GPT-3.5,复杂任务用 GPT-4
  2. 控制 token 数量:精简 prompt,限制响应长度
  3. 缓存结果:对常用查询结果进行缓存
  4. 批量处理:将多个小请求合并为一个大请求
  5. 监控使用量:定期查看 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 为例)

  1. 创建Procfile

    plaintext

    web: gunicorn app:app
    
  2. 创建runtime.txt

    plaintext

    python-3.9.10
    
  3. 部署命令:

    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)

九、进阶方向

  1. 集成更多 AI 模型:如 Claude、PaLM 等,对比不同模型的效果
  2. 构建企业级应用:添加用户管理、权限控制、日志系统等
  3. 开发 IDE 插件:将 AI 助手集成到 VS Code、PyCharm 等开发工具中
  4. 自动化测试:利用 AI 自动生成测试用例和测试代码
  5. 代码审查:构建基于 AI 的代码审查系统

通过本指南的学习,你已经掌握了 ChatGPT+Codex 开发的核心流程和实战技巧。记住,AI 是强大的辅助工具,但不能完全替代人类开发者的思考和判断。在实际开发中,要结合 AI 的优势和人类的创造力,才能打造出高质量的软件产品。

ChatGPT + Codex 开发实战全流程

ChatGPT(基于 GPT-3.5/4)与 Codex(基于 GPT-3.5 的代码专用模型)的结合,能够极大提升开发效率,实现从自然语言需求到可运行代码的快速转化。本指南将带你完整走通从环境准备到实际项目部署的全流程,包含多个实战项目和最佳实践。

一、准备工作

1.1 账号与 API 密钥获取

  1. 访问OpenAI 官网注册账号
  2. 进入 API 控制台,创建新的 API 密钥(API Key)
  3. 了解 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 工程技巧

  1. 明确指令:清晰说明你想要的功能、技术栈和要求
  2. 分步骤指导:复杂任务拆分成多个小步骤
  3. 提供示例:给出输入输出示例帮助 AI 理解
  4. 指定格式:明确要求代码格式、注释风格等
  5. 迭代优化:先获取基础版本,再逐步调整完善

6.2 代码质量提升

  1. 人工审核:AI 生成的代码必须经过人工审核和测试
  2. 安全检查:特别注意 SQL 注入、XSS 等安全问题
  3. 性能优化:AI 可能生成效率不高的代码,需要手动优化
  4. 代码规范:确保代码符合团队的编码规范
  5. 测试覆盖:为 AI 生成的代码编写单元测试

6.3 成本控制

  1. 合理选择模型:简单任务用 GPT-3.5,复杂任务用 GPT-4
  2. 控制 token 数量:精简 prompt,限制响应长度
  3. 缓存结果:对常用查询结果进行缓存
  4. 批量处理:将多个小请求合并为一个大请求
  5. 监控使用量:定期查看 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 为例)

  1. 创建Procfile

    plaintext

    web: gunicorn app:app
    
  2. 创建runtime.txt

    plaintext

    python-3.9.10
    
  3. 部署命令:

    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)

九、进阶方向

  1. 集成更多 AI 模型:如 Claude、PaLM 等,对比不同模型的效果
  2. 构建企业级应用:添加用户管理、权限控制、日志系统等
  3. 开发 IDE 插件:将 AI 助手集成到 VS Code、PyCharm 等开发工具中
  4. 自动化测试:利用 AI 自动生成测试用例和测试代码
  5. 代码审查:构建基于 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. 配置环境变量

  1. 复制 .env.example 文件并重命名为 .env
  2. 打开 .env 文件,替换为你的 OpenAI API 密钥
  3. 如有需要,修改 API 基础 URL(用于代理访问)

5. 运行应用

bash

# 启动Web应用
python app.py
  1. 打开浏览器访问: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 为例)

  1. 准备工作

    • 注册 Heroku 账号并安装 Heroku CLI
    • 登录 Heroku:heroku login
  2. 创建 Heroku 应用

    bash

    heroku create my-ai-dev-assistant
    
  3. 配置环境变量

    bash

    heroku config:set OPENAI_API_KEY=your_api_key_here
    heroku config:set FLASK_ENV=production
    heroku config:set FLASK_DEBUG=False
    
  4. 创建必要文件

    创建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
    
  5. 部署应用

    bash

    git init
    git add .
    git commit -m "Initial commit"
    git push heroku main
    
  6. 打开应用

    bash

    heroku open
    

其他部署选项

  • Docker 部署:创建 Dockerfile 并构建镜像
  • AWS EC2:在 EC2 实例上部署
  • Google Cloud Run:无服务器部署
  • 阿里云 / 腾讯云:国内云服务提供商

⚠️ 重要注意事项

  1. API 密钥安全

    • 永远不要将 API 密钥提交到版本控制系统
    • 在生产环境中使用环境变量管理密钥
    • 定期轮换 API 密钥
  2. 成本控制

    • 监控 API 使用情况
    • 设置账户使用额度限制
    • 对频繁请求进行缓存
    • 合理选择模型版本
  3. 安全考虑

    • 在生产环境中禁用调试模式
    • 添加用户认证和授权
    • 对用户输入进行验证和清理
    • 实现速率限制防止滥用
  4. 代码质量

    • AI 生成的代码必须经过人工审核
    • 编写单元测试验证功能正确性
    • 检查代码中的安全漏洞
    • 遵循团队编码规范

🛠️ 故障排除

常见问题及解决方案

  1. API 调用失败

    • 检查 API 密钥是否正确
    • 确认网络连接正常
    • 查看账户余额是否充足
    • 检查是否达到速率限制
  2. 生成的代码有错误

    • 提供更详细的需求描述
    • 分步骤生成代码
    • 明确指定技术栈和版本
    • 手动调试并修正错误
  3. 应用无法启动

    • 检查 Python 版本是否符合要求
    • 确认所有依赖都已安装
    • 查看环境变量配置是否正确
    • 检查端口是否被占用
  4. 界面显示异常

    • 清除浏览器缓存
    • 检查静态文件路径是否正确
    • 确认浏览器支持现代 JavaScript 特性

🎯 下一步扩展

你可以基于这个项目进行以下扩展:

  1. 添加用户注册和登录系统
  2. 集成更多 AI 模型(如 GPT-4、Claude、PaLM)
  3. 添加代码保存和分享功能
  4. 开发 VS Code/IDEA 插件
  5. 实现代码自动运行和测试
  6. 添加项目模板生成功能
  7. 集成 Git 版本控制
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐