大模型应用开发教程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 的方式把能力交付出去。接下来如果要继续增强就可以围绕“效果、性能、成本、安全、评测、观测”把这个应用逐步工程化。

相关新闻

从零构建具身智能抓取框架:OpenClaw架构设计与MVP实现

从零构建具身智能抓取框架:OpenClaw架构设计与MVP实现

1. 项目缘起:为什么我们要从零开始造一个“爪子”? 最近两年,AI圈子里最火的概念,除了大模型,恐怕就是“具身智能”了。简单来说,具身智能就是让AI拥有一个“身体”,能感知物理世界,…

2026/9/14 3:33:50 阅读更多 →
STM32标准库工程搭建指南:从零构建嵌入式开发环境

STM32标准库工程搭建指南:从零构建嵌入式开发环境

1. 从零开始:为什么需要一个“干净”的工程模板 如果你刚开始接触STM32,或者刚从51单片机、Arduino平台转过来,第一个让你头疼的问题,很可能不是代码怎么写,而是“工程怎么建”。打开Keil MDK,新建一个Proj…

2026/9/21 7:32:52 阅读更多 →
现代命令行四件套:fd、rg、fzf、bat 提升开发效率

现代命令行四件套:fd、rg、fzf、bat 提升开发效率

1. 为什么你需要一套现代命令行工具 如果你每天的工作都离不开终端,还在用着 find 、 grep 、 cat 这些上古时代流传下来的工具,那你可能已经习惯了它们的“倔强”。 find 的语法复杂得像在解谜, grep 默认不递归搜索, …

2026/9/17 10:45:52 阅读更多 →

最新新闻

滞纳金英文翻译避坑:3种实现方案完整示例与选型

滞纳金英文翻译避坑:3种实现方案完整示例与选型

滞纳金英文翻译避坑:3种实现方案完整示例与选型 上周接了个紧急需求,处理跨境物流的逾期费结算模块。产品经理把Excel甩过来,里面有一列叫“滞纳金”,备注栏写着“对应英文字段…

2026/9/22 10:54:37 阅读更多 →
面试必问:Kubetools 三大致命坑与实战避坑指南

面试必问:Kubetools 三大致命坑与实战避坑指南

面试必问:Kubetools 三大致命坑与实战避坑指南 官方文档那几万字读下来,脑子还是浆糊?别急,这是大多数后端开发者的通病。 在 K8s 相关的面试中, kubetools 或者更广泛意义上的 K8s 客户端工具链(如…

2026/9/22 10:54:37 阅读更多 →
台历怎么做性能慢?一文搞懂3个核心优化点

台历怎么做性能慢?一文搞懂3个核心优化点

台历怎么做性能慢?一文搞懂3个核心优化点 报错一堆看不懂 StackTrace?别慌,这种堆栈信息看着吓人,其实就是程序在喊疼。很多开发者一看到红色异常就头大,觉得是玄学,其实都是性能瓶颈在作祟。今天我们就拿“台历怎么做”这个典型业务场景,…

2026/9/22 10:54:37 阅读更多 →
3行代码解决配置卡顿,手写实现调度器性能优化

3行代码解决配置卡顿,手写实现调度器性能优化

3行代码解决配置卡顿,手写实现调度器性能优化 配置环境就卡半天,你是不是也经历过?刚建好项目, npm install 跑完,启动服务时控制台刷出一堆警告,CPU 占用直接飙到…

2026/9/22 10:54:37 阅读更多 →
15000字速查手册:别再死磕语法,用项目思维搞定全栈开发

15000字速查手册:别再死磕语法,用项目思维搞定全栈开发

15000字速查手册:别再死磕语法,用项目思维搞定全栈开发 学会语法却不知怎么搭项目?这是无数开发者卡在入门到进阶之间的最大拦路虎。你背了三千个单词,却写不出一封邮件;你敲熟了Hello World,却面对真实需求束手无策。…

2026/9/22 10:54:36 阅读更多 →
3个狠招让杭州链家网二手房出售查询提速5倍

3个狠招让杭州链家网二手房出售查询提速5倍

3个狠招让杭州链家网二手房出售查询提速5倍 刚学完Python语法,看着满屏的 for 循环和 if 判断,感觉挺顺手。 一上手 实战项目 ,想抓点杭州链家网二手房出售数据做分析,直接卡死。…

2026/9/22 10:53:36 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →