从零构建ChatGPT Demo:新手入门指南与避坑实践

1次阅读
没有评论

共计 2806 个字符,预计需要花费 8 分钟才能阅读完成。

image.webp

开篇目标

本教程将带你在 30 分钟内完成一个可运行的 ChatGPT 对话 Demo。使用 Python 3.8+ 和 OpenAI 官方库,兼容 GPT-3.5/ 4 模型。最终效果:输入问题→获取 AI 回答→保持多轮对话上下文。

从零构建 ChatGPT Demo:新手入门指南与避坑实践

环境准备

  1. 注册 OpenAI 账号并获取 API 密钥
  2. 安装 Python 3.8+ 和 pip
  3. 安装必要库:
pip install openai python-dotenv

API 密钥安全管理

永远不要将 API 密钥硬编码在代码中!推荐方案:

  1. 创建 .env 文件:
# .env 文件示例
OPENAI_API_KEY= 你的实际密钥
  1. 创建 .gitignore 文件避免密钥上传:
# .gitignore
.env
__pycache__/
  1. 安全读取密钥的代码示例:
# config.py
from dotenv import load_dotenv
import os

load_dotenv()  # 加载.env 文件

def get_api_key() -> str:
    """安全获取 API 密钥"""
    key = os.getenv("OPENAI_API_KEY")
    if not key:
        raise ValueError("请检查.env 文件中的 OPENAI_API_KEY 配置")
    return key

基础请求封装(含错误处理)

# chat.py
import openai
from typing import Optional, Dict, List
from config import get_api_key

openai.api_key = get_api_key()

class ChatGPT:
    @staticmethod
    def ask(
        prompt: str,
        model: str = "gpt-3.5-turbo",
        temperature: float = 0.7,
        max_tokens: int = 1000
    ) -> Optional[str]:
        """
        基础问答请求
        :param prompt: 用户输入的问题或指令
        :param model: 使用的模型版本
        :param temperature: 创造性控制(0-2):param max_tokens: 限制响应长度
        :return: AI 生成的回答或 None(出错时)
        """
        try:
            response = openai.ChatCompletion.create(
                model=model,
                messages=[{"role": "user", "content": prompt}],
                temperature=temperature,
                max_tokens=max_tokens
            )
            return response.choices[0].message.content
        except Exception as e:
            print(f"请求出错: {str(e)}")
            return None

# 使用示例
if __name__ == "__main__":
    answer = ChatGPT.ask("Python 如何实现快速排序?")
    print(answer)

流式与非流式响应对比

非流式(默认)
– 一次性返回完整结果
– 代码简单,适合快速开发

流式响应
– 逐片段返回结果
– 体验更好,适合长文本

流式实现代码:

# 在 ChatGPT 类中添加
@staticmethod
def ask_stream(
    prompt: str,
    model: str = "gpt-3.5-turbo",
    temperature: float = 0.7
) -> None:
    """流式输出结果"""
    try:
        response = openai.ChatCompletion.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=temperature,
            stream=True  # 关键参数
        )

        for chunk in response:
            content = chunk.choices[0].delta.get("content", "")
            print(content, end="", flush=True)
        print()
    except Exception as e:
        print(f"流式请求出错: {str(e)}")

上下文保持实现

关键点:维护 messages 数组,包含完整对话历史

# 扩展 ChatGPT 类
class ChatGPTWithMemory(ChatGPT):
    def __init__(self):
        self.messages: List[Dict] = []

    def add_message(self, role: str, content: str) -> None:
        """添加对话记录"""
        self.messages.append({"role": role, "content": content})

    def ask_with_memory(self, prompt: str) -> Optional[str]:
        """带上下文的问答"""
        self.add_message("user", prompt)

        try:
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=self.messages
            )
            answer = response.choices[0].message.content
            self.add_message("assistant", answer)
            return answer
        except Exception as e:
            print(f"请求出错: {str(e)}")
            return None

# 使用示例
if __name__ == "__main__":
    bot = ChatGPTWithMemory()
    print(bot.ask_with_memory("什么是机器学习?"))  # 第一问
    print(bot.ask_with_memory("用通俗语言解释一下"))  # 延续上文

避坑指南

1. Token 超限预防
– 监控response.usage.total_tokens
– 长对话时定期清理早期消息

2. 敏感信息过滤
– 请求前检查用户输入:

blacklist = ["密码", "密钥", "身份证号"]

def contains_sensitive(text: str) -> bool:
    return any(word in text for word in blacklist)

3. 生产环境建议
– 限制 QPS(每秒查询次数)
– 添加 API 调用速率限制
– 考虑使用异步请求

延伸思考

  1. 多轮对话记忆压缩
  2. 当对话轮数过多时,如何提炼关键信息?
  3. 尝试用 AI 自动总结对话要点

  4. 非英文 Prompt 优化

  5. 明确指定响应语言
  6. 示例:” 请用简体中文回答 ”
  7. 注意文化差异导致的表达歧义

结语

现在你已经掌握了 ChatGPT API 的基础用法。建议从简单对话开始,逐步尝试:
– 添加前端界面
– 实现语音输入输出
– 结合业务场景定制 prompt

遇到问题时,记得查阅OpenAI 官方文档,大部分常见问题都有详细说明。Happy coding!

正文完
 0
评论(没有评论)