大模型应用开发教程12 | LLMOps 与部署实战(FastAPI 后端 + 前端应用)

📅 2026/8/13 8:23:23
大模型应用开发教程12 | LLMOps 与部署实战(FastAPI 后端 + 前端应用)
理论部分当我们把“调用模型”的代码写成脚本后会很快遇到一个问题脚本能跑但离“应用”还差很远。原因是脚本天然是单机、单用户、一次性运行的形态而应用需要可复用前端、其他服务、甚至不同终端都能调用可观测能知道服务是否健康、耗时多少、报错是什么可交付一个 URL 或一个页面让人可以直接用因此最常见的工程形态是“前后端分离”后端服务API统一封装模型调用负责鉴权/限流/日志/错误处理等本篇先做最小版本前端应用UI提供交互体验负责展示与用户输入这一篇我们用 FastAPI 写一个最小对话服务然后用 Streamlit 写一个最小聊天界面把端到端链路跑通。实践部分本案例做什么我们会做两件事启动 FastAPI 后端服务提供/health与/chat接口启动 Streamlit 前端把用户输入发给后端/chat展示模型回复主要代码 1FastAPI 后端脚本src/5.2_backend_api.pyimportuvicornfromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModelimporttimeimportosfromdotenvimportload_dotenvfromopenaiimportOpenAI# 加载环境变量load_dotenv()# 初始化 OpenAI 客户端 (智谱 AI)clientOpenAI(api_keyos.getenv(ZHIPUAI_API_KEY),base_urlos.getenv(ZHIPUAI_BASE_URL))appFastAPI(titleLLM Chat API Service,description基于 FastAPI 的大模型对话服务 (Direct API),version1.0.0)# 定义请求体模型 classChatRequest(BaseModel):query:strmodel_name:strglm-4-flash# 默认模型classChatResponse(BaseModel):answer:strprocessing_time:float# API 路由 app.get(/)defread_root():return{message:Welcome to LLM Chat API Service! Visit /docs for Swagger UI.}app.get(/health)defhealth_check():return{status:healthy,timestamp:time.time()}app.post(/chat,response_modelChatResponse)defchat_endpoint(request:ChatRequest):start_timetime.time()try:print(f收到请求:{request.query}(Model:{request.model_name}))# 直接调用大模型 APIresponseclient.chat.completions.create(modelrequest.model_name,messages[{role:system,content:你是一个乐于助人的 AI 助手。},{role:user,content:request.query}],temperature0.7)answerresponse.choices[0].message.content process_timetime.time()-start_timereturnChatResponse(answeranswer,processing_timeprocess_time)exceptExceptionase:print(fError:{e})raiseHTTPException(status_code500,detailstr(e))if__name____main__:print( 正在启动 FastAPI 后端服务 (Direct LLM)...)print(文档地址: http://127.0.0.1:8002/docs)uvicorn.run(app,host127.0.0.1,port8002)主要代码 2Streamlit 前端脚本src/5.2_frontend_ui.pyimportstreamlitasstimportrequestsimporttime# 配置 BACKEND_URLhttp://127.0.0.1:8002/chatst.set_page_config(page_titleAI 聊天助手,page_icon)# 侧边栏 withst.sidebar:st.header(⚙️ 设置)model_namest.selectbox(选择模型,[glm-4-flash,glm-4-air,glm-4-plus])st.info(这是一个基于 FastAPI Streamlit 的前后端分离演示应用。)st.markdown(---)st.markdown(**状态**: 后端服务需先启动)# 主界面 st.title( 智能对话助手 (API 版))st.caption( 由 Streamlit 和 FastAPI 驱动直接调用大模型)# 初始化会话状态 (History) ifmessagesnotinst.session_state:st.session_state.messages[{role:assistant,content:你好我是你的 AI 助手有什么可以帮你的吗}]# 显示历史消息 formsginst.session_state.messages:withst.chat_message(msg[role]):st.markdown(msg[content])# 处理用户输入 ifprompt:st.chat_input(请输入你的问题...):# 1. 显示用户消息st.session_state.messages.append({role:user,content:prompt})withst.chat_message(user):st.markdown(prompt)# 2. 调用后端 API 获取回答withst.chat_message(assistant):message_placeholderst.empty()full_responsetry:withst.spinner(思考中...):# 发送请求到后端payload{query:prompt,model_name:model_name}responserequests.post(BACKEND_URL,jsonpayload)ifresponse.status_code200:dataresponse.json()answerdata.get(answer,)# 模拟打字机效果forchunkinanswer:full_responsechunk message_placeholder.markdown(full_response▌)message_placeholder.markdown(full_response)else:st.error(f后端报错:{response.status_code}-{response.text})full_response抱歉服务暂时不可用。exceptrequests.exceptions.ConnectionError:st.error(❌ 无法连接到后端服务。请确保 src/5.2_backend_api.py 正在运行。)full_response连接失败# 3. 保存助手回复到历史st.session_state.messages.append({role:assistant,content:full_response})运行方式第一步启动后端保持运行python3 src/5.2_backend_api.py第二步验证后端健康可选curlhttp://127.0.0.1:8002/health第三步启动前端另开一个终端streamlit run src/5.2_frontend_ui.py运行结果示例后端启动后会看到类似输出并提示文档地址 正在启动 FastAPI 后端服务 (Direct LLM)... 文档地址: http://127.0.0.1:8002/docs INFO: Uvicorn running on http://127.0.0.1:8002 (Press CTRLC to quit)访问健康检查接口会返回类似 JSON{status:healthy,timestamp:1730000000.0}前端启动后会输出 Streamlit 的访问地址本地一般为 8501 端口在页面里输入问题即可得到模型回复。总结这一篇我们把脚本升级为可交互的应用形态用 FastAPI 把模型调用封装为统一接口用 Streamlit 做一个轻量前端界面并跑通了端到端链路。作为整个教程的收尾我们也把 12 篇内容串起来回顾一遍。我们从最基础的环境与第一次调用开始逐步搭起了一套完整的 LLM 应用能力栈第 24 篇跑通调用与多轮对话理解消息列表与会话状态第 56 篇掌握提示词工程与结构化输出让结果更稳定、更可用第 78 篇理解并落地 RAG从“能检索”升级到“能基于资料回答”第 910 篇跑通工具调用与 ReAct Agent让模型具备“多步行动”能力第 11 篇理解微调的定位与流程知道何时需要以及产物是什么第 12 篇完成服务化与前后端串联把能力封装成一个可交付的应用形态到这里我们已经具备了从 0 到 1 开发大模型应用的完整路径既能用 Prompt/RAG/Agent 解决效果问题也能用 API UI 的方式把能力交付出去。接下来如果要继续增强就可以围绕“效果、性能、成本、安全、评测、观测”把这个应用逐步工程化。