ChatGPT在线问答系统开发指南:从零搭建到性能优化

1次阅读
没有评论

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

image.webp

在线问答系统的核心挑战

开发 ChatGPT 在线问答系统时,我们主要面临三个核心挑战:

ChatGPT 在线问答系统开发指南:从零搭建到性能优化

  1. 响应延迟 :用户期望实时交互,但 AI 模型生成需要时间
  2. 多轮对话状态维护 :需要跟踪上下文,避免每次对话都从零开始
  3. API 调用频控 :OpenAI API 有严格的速率限制,需要合理管理

技术选型:为什么选择 FastAPI

在 Python 生态中,我们有多个 Web 框架可选:

  • Flask:简单易用但同步框架,不适合高并发
  • Django:功能全面但重量级,对 AI 服务来说有些臃肿
  • FastAPI:异步支持好,性能优异,自动生成 API 文档

FastAPI 的异步特性特别适合 AI 服务场景,能更好地处理大量并发请求。

核心实现方案

1. 使用 aiohttp 处理并发请求

import aiohttp

async def query_chatgpt(prompt):
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.openai.com/v1/chat/completions",
            headers={"Authorization": f"Bearer {API_KEY}"},
            json={"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": prompt}]}
        ) as resp:
            return await resp.json()

2. Redis 缓存对话 session

import redis
from uuid import uuid4

r = redis.Redis(host='localhost', port=6379, db=0)

def get_or_create_session(user_id):
    session_id = r.get(f"user:{user_id}:session")
    if not session_id:
        session_id = str(uuid4())
        r.setex(f"user:{user_id}:session", 3600, session_id)
    return session_id

3. API 调用重试机制

import asyncio
from math import exp

async def call_api_with_retry(prompt, max_retries=3):
    for attempt in range(max_retries):
        try:
            return await query_chatgpt(prompt)
        except Exception as e:
            wait_time = min(exp(attempt) * 0.1, 5)
            await asyncio.sleep(wait_time)
    raise Exception("API 调用失败")

完整 FastAPI 实现

带 JWT 鉴权的路由示例

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.post("/chat")
async def chat_endpoint(
    message: str,
    token: str = Depends(oauth2_scheme)
):
    # 验证 JWT token
    user_id = verify_token(token)

    # 获取或创建对话 session
    session_id = get_or_create_session(user_id)

    # 调用 ChatGPT API
    response = await call_api_with_retry(message)

    return {"response": response}

流式响应处理

@app.get("/stream")
async def stream_response():
    # 设置流式响应头
    return StreamingResponse(generate_stream(),
        media_type="text/event-stream"
    )

async def generate_stream():
    # 模拟流式生成内容
    for chunk in ["Hello", "","World","!"]:
        yield f"data: {chunk}\n\n"
        await asyncio.sleep(0.1)

性能优化

Uvicorn 配置调优

uvicorn main:app --workers 4 --limit-concurrency 100 --timeout-keep-alive 10

压力测试数据

使用 Locust 进行测试,4 核 8G 服务器:

  • 100 并发:平均响应时间 200ms
  • 500 并发:平均响应时间 800ms
  • 1000 并发:平均响应时间 1.5s(开始出现超时)

上下文长度影响

上下文长度 内存占用 响应时间
1 轮对话 50MB 200ms
5 轮对话 120MB 400ms
10 轮对话 250MB 800ms

GPT-3.5 vs GPT-4

  • GPT-3.5:响应快 (200-500ms),成本低
  • GPT-4:响应慢 (1-3s),质量高,成本高 5 -10 倍

避坑指南

敏感内容过滤

def filter_sensitive_content(text):
    sensitive_words = [...] # 敏感词列表
    for word in sensitive_words:
        if word in text:
            return "内容包含敏感信息"
    return text

突发流量降级

  1. 监控 API 调用速率
  2. 达到阈值时返回简化响应
  3. 记录未处理请求稍后重试

Token 计费监控

def calculate_cost(response):
    prompt_tokens = response["usage"]["prompt_tokens"]
    completion_tokens = response["usage"]["completion_tokens"]
    total_cost = (prompt_tokens * 0.002 + completion_tokens * 0.002) / 1000
    return total_cost

未来思考

当前架构能支持数千并发,但对于百万级并发,需要考虑:

  1. 分布式消息队列处理请求
  2. 多级缓存策略
  3. 动态扩缩容机制
  4. 边缘计算节点

这些挑战留给大家思考,也欢迎交流你的解决方案。

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