ChatGPT API接入实战:从认证到流式响应的完整指南

1次阅读
没有评论

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

image.webp

背景痛点

在实际开发中,直接调用 ChatGPT API 可能会遇到一些常见问题:

ChatGPT API 接入实战:从认证到流式响应的完整指南

  • token 计算误差 :OpenAI 的 token 计算方式与常见的分词器不同,容易导致请求超出限制
  • 流式响应中断 :网络波动或超时可能导致流式响应中途断开
  • 上下文长度限制 :长对话场景下需要合理管理上下文,避免超出模型限制

技术对比:REST API vs WebSocket

  • REST API
  • 优点:实现简单,适合低频请求
  • 缺点:每次请求都需要建立新连接,延迟较高

  • WebSocket

  • 优点:保持长连接,适合高频交互场景
  • 缺点:实现复杂度高,服务器资源消耗大

核心实现

1. OpenAI 认证流程

  1. 获取 API Key:登录 OpenAI 平台创建 API Key
  2. 安全存储:推荐使用环境变量或密钥管理服务
  3. 请求认证:在请求头中添加 Authorization: Bearer <your_api_key>

2. Python 异步调用示例

import openai
import asyncio

async def chat_completion(messages):
    try:
        response = await openai.ChatCompletion.acreate(
            model="gpt-3.5-turbo",
            messages=messages,
            stream=True
        )
        async for chunk in response:
            yield chunk['choices'][0]['delta'].get('content', '')
    except Exception as e:
        # 错误重试逻辑
        print(f"Error: {e}")
        await asyncio.sleep(1)
        await chat_completion(messages)

3. Node.js 流式响应处理

const {Configuration, OpenAIApi} = require('openai');

const config = new Configuration({apiKey: process.env.OPENAI_API_KEY});

const openai = new OpenAIApi(config);

async function streamChat(messages) {
  const response = await openai.createChatCompletion({
    model: "gpt-3.5-turbo",
    messages,
    stream: true
  }, {responseType: 'stream'});

  let buffer = '';
  response.data.on('data', (chunk) => {const payloads = chunk.toString().split('\n\n');
    for (const payload of payloads) {if (payload.includes('[DONE]')) return;
      if (!payload.startsWith('data:')) continue;

      try {const data = JSON.parse(payload.replace('data:', ''));
        const content = data.choices[0]?.delta?.content || '';
        buffer += content;
      } catch (e) {console.error('Error parsing chunk:', e);
      }
    }
  });

  return buffer;
}

生产级考量

1. 请求队列设计

from collections import deque
import time

class RateLimiter:
    def __init__(self, max_requests, time_window):
        self.max_requests = max_requests
        self.time_window = time_window
        self.request_times = deque()

    async def wait(self):
        now = time.time()
        # 移除超过时间窗口的请求
        while self.request_times and now - self.request_times[0] > self.time_window:
            self.request_times.popleft()

        if len(self.request_times) >= self.max_requests:
            sleep_time = self.time_window - (now - self.request_times[0])
            await asyncio.sleep(sleep_time)
            return await self.wait()

        self.request_times.append(now)

2. 上下文管理策略

  • 全量携带 :每次请求都携带完整对话历史
  • 优点:上下文完整
  • 缺点:token 消耗大
  • 摘要压缩 :将历史对话压缩为摘要
  • 优点:节省 token
  • 缺点:可能丢失细节

避坑指南

1. 防止 Prompt 注入

  • 对用户输入进行过滤和转义
  • 使用系统消息明确角色设定
  • 考虑在 API 网关层添加防护

2. 成本监控

import openai
from datetime import datetime

def track_cost(response):
    usage = response.get('usage', {})
    timestamp = datetime.now().isoformat()
    cost = calculate_cost(usage)

    log_entry = {
        'timestamp': timestamp,
        'prompt_tokens': usage.get('prompt_tokens', 0),
        'completion_tokens': usage.get('completion_tokens', 0),
        'total_tokens': usage.get('total_tokens', 0),
        'estimated_cost': cost
    }

    # 写入日志系统或数据库
    save_to_logging_system(log_entry)

总结与建议

在实际项目中接入 ChatGPT API 时,除了关注基础功能实现外,还需要特别注意生产环境中的稳定性、性能和成本控制。建议从小规模测试开始,逐步增加负载,同时建立完善的监控系统,确保服务的可靠性。

对于需要长期维护的项目,可以考虑封装统一的 SDK,将认证、限流、错误处理等通用逻辑集中管理,这样可以大大提高开发效率和系统稳定性。

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