FastAPI開發AI應用一:實現連續多輪對話
本文將通過一個完整的實戰項目,介紹如何使用 FastAPI 框架開發 AI 聊天應用,重點講解連續多輪對話的實現原理和核心技術。即使你是編程新手,也能跟著本教程一步步構建出功能完整的 AI 聊天應用。
本項目已經開源之 Github,項目地址:https://github.com/wayn111/fastapi-ai-chat-demo
項目概述
想象一下,你正在和一個聰明的 AI 助手對話,它不僅能回答你的問題,還能記住你們之前聊過的內容。這就是我們要構建的 AI 聊天應用!
核心功能
- 連續多輪對話:AI 能記住對話歷史,就像和真人聊天一樣自然
- 多角色切換:可以選擇不同的 AI 角色(智能助手、AI 老師、編程專家)
- 流式響應:AI 回復時有打字機效果,體驗更流暢
- 會話管理:支持多個對話會話,可以隨時切換
- Web 界面:簡潔美觀的聊天界面,操作簡單
技術棧
- 后端框架:FastAPI(Python 的現代 Web 框架)
- 數據存儲:Redis(高性能內存數據庫)
- AI 模型:支持 OpenAI 接口請求調用
- 前端:HTML + CSS + JavaScript
- 服務器:Uvicorn(高性能 ASGI 服務器)
核心架構
應用初始化
應用啟動時需要完成幾個關鍵的初始化步驟,就像搭建房子需要先打地基一樣:
1. 創建 Web 應用框架
使用 FastAPI 創建應用實例,這是整個系統的核心。FastAPI 會自動生成 API 文檔,讓開發和調試變得更簡單。
2. 連接數據存儲
Redis 就像應用的"大腦記憶",用來存儲所有的對話歷史。選擇 Redis 是因為它速度快、支持數據過期,非常適合聊天應用的場景。
3. 連接 AI 服務
這是連接到 OpenAI 的"橋梁",讓我們能夠調用 GPT 模型進行智能對話。通過配置 API 密鑰和基礎 URL,建立與 AI 服務的通信通道。
4. 配置 AI 角色
通過不同的"人設"提示詞,讓 AI 扮演不同的角色:
- 智能助手:友善專業,適合日常問答
- AI 老師:耐心教學,善于解釋復雜概念
- 編程專家:技術專業,提供代碼建議
每個角色都有獨特的回答風格,讓用戶獲得更個性化的體驗。
數據模型設計
在聊天應用中,我們需要一個標準的"消息格式"來確保數據的一致性。就像寄信需要標準的信封格式一樣:
class ChatMessage(BaseModel):
role: str # 誰說的話:"user"(用戶) 或 "assistant"(AI)
content: str # 說了什么:具體的對話內容
timestamp: float # 什么時候說的:消息時間戳
為什么需要這個格式?
- role 字段:幫助 AI 區分哪些是用戶的問題,哪些是自己的回答
- content 字段:存儲實際的對話內容
- timestamp 字段:記錄時間,方便按時間順序顯示對話
這種標準化的數據格式讓我們的應用更加穩定可靠,也方便后續的功能擴展。
多輪對話實現原理
多輪對話的"秘密"在于讓 AI 能夠"記住"之前聊過的內容。就像人類對話一樣,我們需要上下文來理解當前的話題。
工作原理
想象 AI 的"記憶"是這樣工作的:
- 系統角色設定:"你是一個友善的 AI 助手"
- 歷史對話:
用戶:"我叫小明"
AI:"你好小明!"
用戶:"我喜歡編程"
AI:"編程很有趣!"
- 當前問題:"你還記得我的名字嗎?"
當 AI 收到新問題時,它會看到完整的對話歷史,所以能回答:"當然記得,你是小明!"
會話管理
會話管理就像給每個用戶分配一個"聊天房間",讓 AI 能夠記住每個用戶的對話歷史。
核心功能說明
1. 生成會話 ID
def generate_session_id() -> str:
return str(uuid.uuid4())
每個用戶開始聊天時,系統會生成一個唯一的"房間號"(會話 ID),就像酒店給客人分配房間一樣。
2. 保存對話消息
def save_message(user_id: str, session_id: str, message: ChatMessage):
conversation_key = get_conversation_key(user_id, session_id)
redis_client.lpush(conversation_key, json.dumps(message_data))
redis_client.ltrim(conversation_key, 0, 19) # 只保留最近20條消息
通過 userid + 會話 id 生成 key,將消息保存到 Redis 隊列中
3. 獲取對話歷史
def get_conversation_history(user_id: str, session_id: str):
conversation_key = get_conversation_key(user_id, session_id)
messages = redis_client.lrange(conversation_key, 0, -1)
return [json.loads(msg) for msg in messages]
從 userid + 會話 id 生成 key,從 Redis 中讀取用戶該會話的歷史消息,讓 AI 了解之前聊了什么
為什么這樣設計?
- 唯一性:每個會話都有獨特的 ID,避免混淆
- 持久化:消息存儲在 Redis 中,重啟應用也不會丟失
- 性能優化:只保留最近的消息,避免內存占用過大
- 自動清理:每次只保留最近 20 條消息,自動清理舊數據
這種設計讓 AI 能夠"記住"每個用戶的對話歷史,實現真正的多輪對話體驗。
流式響應核心
流式響應就像 AI 在"實時打字",讓用戶看到回復逐字出現,而不是等待很久后一次性顯示全部內容。
?? 工作流程
1. 保存用戶消息
user_msg = ChatMessage(role="user", content=user_message)
save_message(session_id, user_msg)
首先將用戶的問題保存到"聊天記錄本"中。
2. 獲取對話歷史
history = get_conversation_history(session_id, limit=10)
讀取最近 10 條對話記錄,讓 AI 了解聊天的上下文。
3. 構建完整對話
messages = [
{"role": "system", "content": AI_ROLES[role]}, # AI角色設定
*history, # 歷史對話
{"role": "user", "content": user_message} # 當前問題
]
將角色設定、歷史對話和當前問題組合成完整的對話上下文。
4. 調用 AI 服務
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
stream=True # 關鍵:啟用流式響應
)
在 openAi 接口請求格式中,stream=True 表示啟用流式響應。
5. 實時返回回復
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
yield f"data: {json.dumps({'content': content})}\n\n"
AI 每生成一小段文字,就立即發送給前端顯示。
技術亮點
- Server-Sent Events (SSE) :使用 SSE 協議實現服務器向瀏覽器的實時推送
- 異步處理:不阻塞其他用戶的請求
- 錯誤恢復:網絡中斷時能夠優雅處理
- 上下文保持:每次對話都能"記住"之前聊過的內容
這種設計讓聊天體驗更加自然流暢,就像和真人對話一樣!
核心功能實現
API 接口設計
我們的聊天應用提供了 5 個核心 API 接口,就像一個完整的"聊天服務臺":
1. 開始新對話
@app.post("/chat/start")
async def start_chat(user_id: str):
session_id = generate_session_id()
return {"session_id": session_id, "welcome_message": "你好!我是你的AI助手"}
功能:為每個用戶創建一個新的"聊天房間",返回房間號(會話 ID)。
?? 2. 流式聊天
@app.get("/chat/stream")
async def chat_stream(user_id: str, session_id: str, message: str, role: str = "assistant"):
return StreamingResponse(generate_streaming_response(user_id, session_id, message, role))
功能:這是核心接口!處理用戶消息,調用 AI 生成回復,并實時返回。
3. 獲取聊天歷史
@app.get("/chat/history")
async def get_chat_history(user_id: str, session_id: str):
history = await get_conversation_history(user_id, session_id)
return {"messages": history, "total": len(history)}
功能:查看之前的聊天記錄,就像翻看聊天記錄本。
4. 清除對話歷史
@app.delete("/chat/history/{session_id}")
async def clear_conversation_history(session_id: str, user_id: str):
redis_client.delete(get_conversation_key(user_id, session_id))
return {"message": "對話歷史已清除"}
功能:清空聊天記錄,重新開始對話。
5. 獲取 AI 角色列表
@app.get("/roles")
async def get_roles():
return {"roles": AI_ROLES, "default_role": "assistant"}
功能:獲取所有可用的 AI 角色(助手、老師、程序員等)。
安全特性
- 參數驗證:檢查輸入參數的有效性
- 錯誤處理:優雅處理各種異常情況
- CORS 支持:允許跨域訪問
- 速率限制:防止惡意請求(可選)
前端實現
前端就是用戶看到和操作的界面,我們用 HTML、CSS 和 JavaScript 構建了一個現代化的聊天界面。
界面結構
我們的聊天界面包含幾個主要部分:
<div class="chat-container">
<!-- 1. 頭部:顯示標題和角色選擇 -->
<div class="chat-header">
<h1>?? AI智能助手</h1>
<select id="roleSelect">
<option value="assistant">?? 智能助手</option>
<option value="teacher">???? AI老師</option>
<option value="programmer">???? 編程專家</option>
</select>
</div>
<!-- 2. 消息區域:顯示對話內容 -->
<div class="messages-container" id="messagesContainer">
<!-- 消息會動態添加到這里 -->
</div>
<!-- 3. 輸入區域:用戶輸入消息 -->
<div class="input-container">
<input type="text" id="messageInput" placeholder="輸入你的消息...">
<button onclick="sendMessage()">?? 發送</button>
</div>
<!-- 4. 工具欄:常用功能按鈕 -->
<div class="toolbar">
<button onclick="clearHistory()">??? 清除歷史</button>
<button onclick="newChat()">?? 新對話</button>
</div>
</div>
樣式設計特點
- 現代化外觀:使用漸變色和圓角設計
- 消息氣泡:用戶消息在右邊(藍色),AI 消息在左邊(白色)
- 響應式布局:在手機和電腦上都能正常顯示
- 動畫效果:按鈕懸停效果和打字指示器
- 清晰層次:不同區域有明確的視覺分割
JavaScript 核心邏輯
JavaScript 負責處理用戶交互和與后端的通信,就像聊天應用的"大腦"。
核心功能實現
1. 開始新對話
async function startNewChat() {
// 調用后端API創建新會話
const response = await fetch('/api/chat/start', { method: 'POST' });
const data = await response.json();
currentSessionId = data.session_id;
// 顯示歡迎消息
addMessage('assistant', '你好!我是你的AI助手,有什么可以幫助你的嗎?');
}
2. 發送消息
async function sendMessage() {
const message = document.getElementById('messageInput').value;
// 顯示用戶消息
addMessage('user', message);
// 使用EventSource接收流式響應
const eventSource = new EventSource(`/api/chat/stream?session_id=${currentSessionId}&message=${message}`);
eventSource.onmessage = function(event) {
const data = JSON.parse(event.data);
if (data.content) {
// 實時顯示AI回復
updateAIMessage(data.content);
}
};
}
3. 添加消息到界面
function addMessage(role, content) {
const messageDiv = document.createElement('div');
messageDiv.className = `message ${role}`;
// 用戶消息顯示在右邊,AI消息顯示在左邊
const icon = role === 'user' ? '??' : '??';
messageDiv.innerHTML = `${icon} ${content}`;
document.getElementById('messagesContainer').appendChild(messageDiv);
// 自動滾動到最新消息
messageDiv.scrollIntoView({ behavior: 'smooth' });
}
4. 清除歷史記錄
async function clearHistory() {
if (confirm('確定要清除所有對話歷史嗎?')) {
await fetch(`/api/chat/history/${currentSessionId}`, { method: 'DELETE' });
document.getElementById('messagesContainer').innerHTML = '';
addMessage('system', '對話歷史已清除');
}
}
技術亮點
- EventSource:實現服務器推送,讓 AI 回復實時顯示
- DOM 操作:動態添加和更新聊天消息
- 用戶體驗:自動滾動、按鈕狀態管理、錯誤提示
- 響應式設計:適配不同設備和屏幕尺寸
這些 JavaScript 代碼讓聊天界面變得生動有趣,用戶可以流暢地與 AI 進行對話!
如何開始項目
環境準備
在開始之前,請確保你的電腦已安裝:
- Python 3.8+ :編程語言環境
- Redis:數據存儲服務
- OpenAI API 密鑰:用于調用 AI 模型
項目結構
讓我們先了解一下項目的文件組織結構:
fastapi-ai-chat-demo/
├── main.py # ?? 主應用文件(核心邏輯)
├── config.py # ?? 配置文件(參數設置)
├── start_server.py # ?? 服務器啟動腳本
├── requirements.txt # ?? 依賴包列表
├── .env.example # ?? 環境變量模板
├── static/
│ └── index.html # ?? 前端聊天界面
└── README.md # ?? 項目說明文檔
文件說明:
main.py
:包含所有的 API 接口和核心業務邏輯config.py
:存放配置參數,如 Redis 連接信息、OpenAI 設置等static/index.html
:聊天界面的前端代碼requirements.txt
:列出了項目需要的所有 Python 包
安裝步驟
1. 克隆項目
git clone git@github.com:wayn111/fastapi-ai-chat-demo.git
cd fastapi-ai-chat-demo
2. 安裝依賴包
pip install -r requirements.txt
這會安裝以下核心包:
fastapi
:Web 框架uvicorn
:ASGI 服務器redis
:Redis 客戶端openai
:OpenAI API 客戶端pydantic
:數據驗證庫
3. 配置環境變量
復制 .env.example
為 .env
并填入你的配置:
# OpenAI配置
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1
# Redis配置
REDIS_HOST=localhost
REDIS_PORT=6379
4. 啟動 Redis 服務
# Windows
redis-server
# Linux/macOS
sudo systemctl start redis
5. 運行應用
python start_server.py
6. 訪問應用
打開瀏覽器訪問:http://localhost:8000
圖片
恭喜!你的 AI 聊天應用已經運行起來了!
總結
本項目展示了使用 FastAPI 構建 AI 聊天應用的完整流程,核心技術包括:
- 異步編程:提升并發處理能力
- 流式響應:改善用戶體驗
- 會話管理:實現多輪對話記憶
- 角色系統:支持多樣化 AI 交互
這個架構具有良好的擴展性,可以輕松添加用戶認證、多模態交互等高級功能。FastAPI 的高性能和完善的類型系統使其成為構建現代 AI 應用的理想選擇。
最后覺得本文寫的不錯的話,可以關注我,我會繼續更新 FastAPI 框架開發 AI 聊天應用代碼。