共计 1963 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
传统对话系统通常采用规则匹配或小规模机器学习模型,响应速度较快,但缺乏上下文理解和生成能力。而 GPT-3.5+ 等大语言模型带来了革命性的变化,同时也引入了新的技术挑战:

- 流式响应:GPT 模型生成文本是逐字进行的,传统 HTTP 请求 - 响应模式无法实时展示
- 长对话上下文管理:大模型对上下文长度有限制,需要智能的 token 计数和截断策略
- API 延迟:模型推理时间较长,需要考虑超时处理和用户体验优化
架构对比
RESTful API
- 优点:实现简单,兼容性好
- 缺点:需要轮询获取完整响应,连接开销大
POST /chat HTTP/1.1
Content-Type: application/json
Authorization: Bearer {token}
{
"message": "你好",
"conversation_id": "123"
}
WebSocket
- 优点:全双工通信,适合实时对话
- 缺点:实现复杂度较高,需要额外连接管理
// WebSocket 客户端示例
const socket = new WebSocket('wss://api.example.com/chat');
socket.onmessage = (event) => {console.log('收到消息:', event.data);
};
核心实现
FastAPI 后端服务
from fastapi import FastAPI, Request, Depends
from fastapi.security import HTTPBearer
app = FastAPI()
security = HTTPBearer()
@app.post("/chat")
async def chat_endpoint(request: Request, token: str = Depends(security)):
# JWT 验证和速率限制
verify_token(token.credentials)
check_rate_limit(request.client.host)
# 流式响应
async def generate():
async for chunk in openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "你好"}],
stream=True
):
yield chunk.choices[0].delta.get("content", "")
return StreamingResponse(generate(), media_type="text/event-stream")
前端 EventSource 处理
// React 组件示例
function ChatBox() {const [messages, setMessages] = useState([]);
const handleSend = (message) => {const eventSource = new EventSource(`/chat?message=${encodeURIComponent(message)}`);
eventSource.onmessage = (e) => {setMessages(prev => [...prev, e.data]);
};
eventSource.onerror = () => {eventSource.close();
};
};
return (
<div>
{messages.map((msg, i) => (<div key={i}>{msg}</div>
))}
</div>
);
}
生产考量
Redis 会话存储
import redis
r = redis.Redis()
def save_conversation(user_id, conversation):
# 保存对话历史,设置 TTL
r.setex(f"conv:{user_id}", 3600, json.dumps(conversation))
API 调用策略
- 指数退避重试:首次失败后等待 1 秒重试,之后每次等待时间翻倍
- 降级响应:当 GPT 服务不可用时返回预置的简单回复
- 超时设置:API 调用设置 10 秒超时限制
避坑指南
- UTF- 8 编码问题:
- 确保前后端都明确指定 UTF- 8 编码
-
特殊字符需要进行转义处理
-
Token 计数优化:
- 使用
tiktoken库精确计算 token -
对长对话采用 ” 滑动窗口 ” 策略保持关键上下文
-
CORS 配置:
- 明确指定允许的源和 Headers
- 预检请求 (OPTIONS) 需要正确处理
总结与思考
通过本文的实践,我们实现了一个基本的类 ChatGPT 对话系统。但在实际生产中,还需要考虑更多因素:
- 如何设计多轮对话的评价体系?
- 当需要处理图片、语音等多模态输入时,系统架构该如何调整?
- 在保证响应速度的前提下,如何实现更复杂的对话状态管理?
这些开放性问题留给读者进一步思考和探索。
正文完
