共计 2609 个字符,预计需要花费 7 分钟才能阅读完成。
在线问答系统的核心挑战
开发 ChatGPT 在线问答系统时,我们主要面临三个核心挑战:

- 响应延迟 :用户期望实时交互,但 AI 模型生成需要时间
- 多轮对话状态维护 :需要跟踪上下文,避免每次对话都从零开始
- 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
突发流量降级
- 监控 API 调用速率
- 达到阈值时返回简化响应
- 记录未处理请求稍后重试
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
未来思考
当前架构能支持数千并发,但对于百万级并发,需要考虑:
- 分布式消息队列处理请求
- 多级缓存策略
- 动态扩缩容机制
- 边缘计算节点
这些挑战留给大家思考,也欢迎交流你的解决方案。
正文完
