用FastAPI和Streamlit实现一个ChatBot

发布时间:2026/7/25 21:27:32

用FastAPI和Streamlit实现一个ChatBot 用FastAPI和Streamlit实现一个ChatBot一、为什么选择FastAPI Streamlit在构建ChatBot时我们往往需要同时处理前端交互和后端逻辑。FastAPI作为高性能的Python Web框架天然适合处理异步请求和API开发而Streamlit则能快速搭建数据应用的前端界面。两者结合可以让我们用纯Python代码实现一个完整的对话系统。## 二、基础概念从“请求-响应”开始### 2.1 FastAPI的最小API示例首先我们创建一个最简单的FastAPI应用理解基本的路由和请求处理。python# backend.py - 基础FastAPI示例from fastapi import FastAPIfrom pydantic import BaseModel# 创建FastAPI实例app FastAPI()# 定义请求体模型class ChatRequest(BaseModel): message: str # 用户输入的消息 user_id: str anonymous # 用户ID可选# 定义响应体模型class ChatResponse(BaseModel): reply: str # 机器人的回复 status: str success # 状态信息app.post(/chat, response_modelChatResponse)async def chat_endpoint(request: ChatRequest): 简单的聊天端点返回用户消息的镜像 # 模拟简单的回复逻辑 reply f你说的是{request.message} return ChatResponse(replyreply)# 启动服务器uvicorn backend:app --reload### 2.2 Streamlit的最小前端示例接下来用Streamlit创建用户界面发送请求到FastAPI后端。python# frontend.py - Streamlit前端示例import streamlit as stimport requests# 设置页面标题st.set_page_config(page_title简单ChatBot, page_icon)st.title( 简单ChatBot)# FastAPI后端地址API_URL http://localhost:8000/chat# 初始化聊天历史if messages not in st.session_state: st.session_state.messages []# 显示聊天历史for msg in st.session_state.messages: with st.chat_message(msg[role]): st.write(msg[content])# 用户输入框if user_input : st.chat_input(请输入你的消息): # 添加用户消息到历史 st.session_state.messages.append({role: user, content: user_input}) with st.chat_message(user): st.write(user_input) # 发送请求到后端 try: response requests.post( API_URL, json{message: user_input} ) if response.status_code 200: bot_reply response.json()[reply] else: bot_reply 抱歉服务器出错了 except requests.exceptions.ConnectionError: bot_reply 无法连接到服务器请确保后端正在运行。 # 添加机器人回复到历史 st.session_state.messages.append({role: assistant, content: bot_reply}) with st.chat_message(assistant): st.write(bot_reply)## 三、进阶实现集成真实AI对话能力### 3.1 后端集成OpenAI API现在我们将后端升级集成真实的大语言模型能力。python# advanced_backend.py - 集成OpenAI的FastAPI后端from fastapi import FastAPI, HTTPExceptionfrom pydantic import BaseModelimport openaifrom typing import List, Optionalimport os# 初始化FastAPI应用app FastAPI(titleAI ChatBot API)# 配置OpenAI API密钥建议从环境变量获取openai.api_key os.getenv(OPENAI_API_KEY, your-api-key-here)# 定义数据模型class Message(BaseModel): role: str # user 或 assistant content: str # 消息内容class ChatRequest(BaseModel): messages: List[Message] # 对话历史 model: str gpt-3.5-turbo # 使用的模型class ChatResponse(BaseModel): reply: str model_used: str tokens_used: Optional[int] Noneapp.post(/chat, response_modelChatResponse)async def advanced_chat(request: ChatRequest): 高级聊天端点调用OpenAI API生成回复 try: # 调用OpenAI API response openai.ChatCompletion.create( modelrequest.model, messages[msg.dict() for msg in request.messages], max_tokens500, temperature0.7 ) # 提取回复内容 reply response.choices[0].message.content tokens response.usage.total_tokens return ChatResponse( replyreply, model_usedrequest.model, tokens_usedtokens ) except Exception as e: # 错误处理 raise HTTPException(status_code500, detailstr(e))# 健康检查端点app.get(/health)async def health_check(): return {status: running, model: gpt-3.5-turbo}### 3.2 前端增强的Streamlit界面升级前端支持多轮对话和更好的用户体验。python# advanced_frontend.py - 增强版Streamlit前端import streamlit as stimport requestsimport json# 页面配置st.set_page_config( page_titleAI ChatBot, page_icon, layoutcentered)# 自定义CSS美化界面st.markdown(style .stChatInput { position: fixed; bottom: 0; width: 100%; background-color: white; padding: 10px; } .chat-container { margin-bottom: 100px; }/style, unsafe_allow_htmlTrue)# 初始化会话状态if messages not in st.session_state: st.session_state.messages []if api_url not in st.session_state: st.session_state.api_url http://localhost:8000/chatif model not in st.session_state: st.session_state.model gpt-3.5-turbo# 侧边栏配置with st.sidebar: st.title(⚙️ 设置) st.session_state.api_url st.text_input(API地址, st.session_state.api_url) st.session_state.model st.selectbox( 模型选择, [gpt-3.5-turbo, gpt-4], index0 ) if st.button(清空对话): st.session_state.messages [] st.rerun() st.markdown(---) st.markdown(### 使用说明) st.markdown( 1. 确保后端已启动 2. 输入消息开始对话 3. 支持多轮对话 )# 主界面st.title( AI ChatBot)st.markdown(基于FastAPI和Streamlit构建)# 显示对话历史for msg in st.session_state.messages: with st.chat_message(msg[role]): st.write(msg[content])# 用户输入if prompt : st.chat_input(请输入你的问题...): # 添加用户消息 st.session_state.messages.append({role: user, content: prompt}) with st.chat_message(user): st.write(prompt) # 准备请求数据 payload { messages: st.session_state.messages, model: st.session_state.model } # 发送请求并显示加载状态 with st.spinner(AI思考中...): try: response requests.post( st.session_state.api_url, jsonpayload, timeout30 ) if response.status_code 200: data response.json() bot_reply data[reply] # 显示token使用量如果有 if data.get(tokens_used): st.caption(f本次使用 tokens: {data[tokens_used]}) else: bot_reply f服务器错误: {response.status_code} except requests.exceptions.Timeout: bot_reply 请求超时请检查网络或后端状态。 except requests.exceptions.ConnectionError: bot_reply 无法连接到服务器请确保后端正在运行。 except Exception as e: bot_reply f发生错误: {str(e)} # 添加AI回复 st.session_state.messages.append({role: assistant, content: bot_reply}) with st.chat_message(assistant): st.write(bot_reply) # 刷新界面 st.rerun()## 四、部署与运行指南### 4.1 环境准备bash# 创建虚拟环境python -m venv chatbot_envsource chatbot_env/bin/activate # Linux/Mac# chatbot_env\Scripts\activate # Windows# 安装依赖pip install fastapi uvicorn streamlit requests openai### 4.2 启动服务bash# 终端1启动FastAPI后端uvicorn advanced_backend:app --reload --port 8000# 终端2启动Streamlit前端streamlit run advanced_frontend.py --server.port 8501访问 http://localhost:8501 即可开始对话。## 五、高级特性扩展### 5.1 对话记忆管理在实际应用中长对话可能会导致token超限。我们可以实现一个简单的记忆管理python# 在Streamlit中添加记忆管理MAX_TOKENS 4000def truncate_messages(messages, max_tokensMAX_TOKENS): 当消息过长时保留最近的对话 total_tokens sum(len(m[content]) for m in messages) while total_tokens max_tokens and len(messages) 1: # 移除最早的消息保留系统提示 removed messages.pop(0) total_tokens - len(removed[content]) return messages### 5.2 添加自定义指令python# 在后端添加系统提示词支持class SystemPrompt(BaseModel): content: str 你是一个有帮助的AI助手。# 在聊天请求中包含系统提示system_prompt {role: system, content: 请用中文回答语气友好。}messages [system_prompt] user_messages## 六、总结通过本文我们从零开始逐步构建了一个完整的ChatBot系统。核心收获包括1.架构理解FastAPI负责后端API逻辑Streamlit负责前端界面两者通过HTTP通信协作。2.渐进式开发从最简单的消息回显到集成真实AI能力每一步都包含可运行的代码。3.工程实践包含了错误处理、状态管理、配置化等生产级开发要素。4.扩展性系统设计允许轻松添加新功能如对话记忆、多模型支持等。这个ChatBot框架不仅适用于学习稍加改造即可用于实际项目。你可以尝试- 接入不同的AI模型如Claude、文心一言- 添加用户认证系统- 实现对话导出功能- 集成语音输入输出记住最好的学习方式是动手实践。现在就开始你的ChatBot开发之旅吧

相关新闻