核心内容摘要
Citrullinated Histone H3 ELISA Kit:助力炎症、自身免疫、血栓等科研解决方案
Qwen
5-
5B Streamlit部署教程添加API接口供其他系统调用的改造方法
为什么需要为Streamlit对话应用增加API能力你已经成功跑起了一个本地Qwen
5-
5B聊天界面——界面清爽、响应快、数据不出本地用起来很安心。
但很快你会发现这个漂亮的Web页面只服务“人”不服务“系统”。
比如你想把AI能力嵌入到公司内部的OA审批流程里让员工提交报销单时自动补全事由或者想接入企业微信机器人让群聊中机器人就能查知识库又或者要和低代码平台联动让表单提交后自动触发文案生成……这些场景都需要一个可编程调用的接口API而不是只能点开浏览器手动聊天。
原生Streamlit是面向终端用户的交互框架它不提供HTTP API服务。
它的核心逻辑是“前端渲染后端状态管理”所有推理都在st.session_state里流转没有对外暴露的REST端点。
这就意味着其他程序根本没法和它说话。
本教程不教你从零重写服务而是基于你已有的Streamlit项目做最小侵入式改造——保留原有聊天界面完全不变同时新增一套独立、稳定、可被任意HTTP客户端调用的API服务。
整个过程无需更换模型、不改动推理逻辑、不重装依赖只需增加不到50行关键代码就能让本地Qwen
5-
5B真正成为你私有AI基础设施中的一个“可插拔模块”。
1 改造前 vs 改造后能力边界彻底打开维度改造前纯Streamlit改造后Streamlit API调用方式仅限浏览器人工操作支持curl、Python requests、Postman、Node.js、企业微信/飞书机器人、Zapier等任意HTTP客户端集成能力孤立应用无法嵌入业务流可作为微服务接入ERP、CRM、BI、低代码平台等现有系统使用场景单人临时问答批量处理如每天自动生成100份周报摘要、自动化触发如Git提交后自动写PR描述、多端统一调用Web/App/小程序共用同一后端部署灵活性必须启动Streamlit服务才能用API可独立部署如用Uvicorn托管Streamlit前端甚至可关闭只留API持续运行这不是功能叠加而是角色升级从“玩具级聊天框”变成“生产就绪的AI能力节点”。
核心思路分离UI层与能力层复用已有推理逻辑很多开发者一想到加API就本能地想“重写后端”甚至准备上FastAPI或Flask。
但这里有个关键认知你最宝贵的资产不是界面而是已经调试好的模型加载、上下文管理、生成参数配置和安全处理逻辑。
这些在Streamlit代码里早已稳定运行。
我们的策略是不动模型加载和推理主干只把“输入→模型→输出”这一核心链路抽离成可复用函数并用轻量HTTP服务器包裹它。
具体分三步走第一步将Streamlit中负责“接收用户输入→调用模型→返回回复”的核心逻辑封装成一个干净、无UI依赖的Python函数第二步用UvicornASGI服务器托管一个FastAPI应用该应用只做一件事接收HTTP请求调用上一步封装的函数返回JSON响应第三步保持原有Streamlit应用完全不动让它继续服务人类用户新API服务则并行运行服务机器用户。
整个架构清晰解耦[用户浏览器] ←→ [Streamlit UI][其他系统] ←→ [FastAPI API] ←→ [共享推理函数] ←→ [Qwen
5-
5B模型]所有GPU资源、模型缓存、分词器实例都由同一个Python进程管理零重复加载显存占用不增加。
实操步骤5分钟完成API改造前提确认你已按原项目说明在/root/qwen
5b路径下完整存放Qwen
5-
5B-Instruct模型文件并能正常运行Streamlit聊天界面。
1 创建独立API模块api_server.py在你的项目根目录即app.py所在位置新建文件api_server.py内容如下# api_server.py import os import torch from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer from threading import Thread from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List, Optional # 复用原Streamlit的模型加载逻辑精简版 MODEL_PATH /root/qwen
5b tokenizer AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( MODEL_PATH, device_mapauto, torch_dtypeauto, trust_remote_codeTrue ) model.eval() # 封装核心推理函数关键 def chat_with_qwen( messages: List[dict], max_new_tokens: int 1024, temperature: float
7, top_p: float
9, do_sample: bool True ) - str: 纯文本对话推理函数完全复用原项目逻辑 messages: [{role: user, content: 你好}, {role: assistant, content: 你好}] 返回纯文本回复 # 使用官方聊天模板拼接上下文 text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) model_inputs tokenizer([text], return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate( **model_inputs, max_new_tokensmax_new_tokens, temperaturetemperature, top_ptop_p, do_sampledo_sample, pad_token_idtokenizer.eos_token_id, eos_token_idtokenizer.eos_token_id ) response tokenizer.decode(outputs[0][model_inputs.input_ids.shape[1]:], skip_special_tokensTrue) return response.strip() # FastAPI应用 app FastAPI( titleQwen
5-
5B Local API, description基于Qwen
5-
5B-Instruct的本地化文本生成API支持多轮对话上下文, version
0 ) class ChatRequest(BaseModel): messages: List[dict] max_new_tokens: Optional[int] 1024 temperature: Optional[float]
7 top_p: Optional[float]
9 class ChatResponse(BaseModel): reply: str app.post(/v1/chat/completions, response_modelChatResponse) async def chat_completions(request: ChatRequest): try: reply chat_with_qwen( messagesrequest.messages, max_new_tokensrequest.max_new_tokens, temperaturerequest.temperature, top_prequest.top_p ) return {reply: reply} except Exception as e: raise HTTPException(status_code500, detailf推理失败: {str(e)}) app.get(/health) async def health_check(): return {status: ok, model: Qwen
5-
5B-Instruct, device: str(model.device)}关键点说明chat_with_qwen()函数完全复用原Streamlit中st.cache_resource加载后的tokenizer和model确保行为100%一致输入messages格式严格对齐OpenAI API规范[{role:user,content:...}]方便未来无缝迁移/health端点用于健康检查运维监控必备所有异常捕获并返回标准HTTP错误便于调用方处理。
2 安装轻量依赖在项目环境中执行仅需一次pip install fastapi uvicorn python-multipart注意uvicorn是ASGI服务器比传统WSGI更轻更快完美适配大模型推理的异步IO特性python-multipart用于后续可能的文件上传扩展如图生文当前非必需但建议安装。
3 启动API服务在终端中运行uvicorn api_server:app --host
0.
0.
0 --port 8000 --workers 1 --reload--host
0.
0.
0允许局域网内其他设备访问如手机、同事电脑--port 8000API服务端口与Streamlit默认的8501端口不冲突--workers 1大模型推理是CPU/GPU密集型多进程反而争抢显存单worker最稳--reload开发时启用热重载改代码后自动重启上线请移除。
启动成功后你会看到类似日志INFO: Uvicorn running on http://
0.
0.
0:8000 (Press CTRLC to quit) INFO: Started reloader process [12345] INFO: Started server process [12346] INFO: Waiting for application startup. INFO: Application startup complete.此时API已就绪打开浏览器访问http://localhost:8000/health应返回{status:ok,...}。
测试API三种最常用调用方式别急着写业务代码先亲手验证API是否真正可用。
以下测试均在本地执行无需额外工具。
1 使用curlLinux/macOS终端或Windows PowerShellcurl -X POST http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { messages: [ {role: user, content: 用一句话解释量子纠缠} ], max_new_tokens: 256 }成功响应示例{reply:量子纠缠是指两个或多个粒子在相互作用后形成一种特殊关联状态即使相隔遥远对其中一个粒子的测量会瞬间影响另一个粒子的状态这种关联无法用经典物理理论解释。
}
2 使用Python requests适合集成进脚本新建test_api.pyimport requests url http://localhost:8000/v1/chat/completions data { messages: [ {role: user, content: 写一首关于春天的五言绝句} ] } response requests.post(url, jsondata) if response.status_code 200: print( AI回复, response.json()[reply]) else: print(❌ 请求失败, response.text)运行python test_api.py立即看到AI生成的古诗。
3 使用Postman可视化调试推荐给非程序员新建RequestMethod选POSTURL填http://localhost:8000/v1/chat/completions切换到Body→raw→JSON粘贴上述curl中的JSON数据点击Send右侧立刻显示格式化JSON响应。
小技巧在Postman中保存这个请求为集合以后每次重启API只需点一下Send5秒验证服务状态。
进阶实践让API真正融入你的工作流API跑通只是起点。
下面两个真实场景展示如何把它变成生产力工具。
1 场景一企业微信机器人自动答疑假设你公司知识库存在Confluence你想让员工在企微群里机器人提问自动返回答案。
只需在企微机器人后台配置「接收消息」URL为http://你的服务器IP:8000/v1/chat/completions需内网穿透或部署在公网服务器然后用以下Python伪代码处理# 企微收到消息后提取text字段构造messages messages [ {role: system, content: 你是一个技术文档助手请基于提供的知识库片段回答问题不要编造信息。
}, {role: user, content: 企微用户发送的问题文本} ] # 调用本地API response requests.post(http://localhost:8000/v1/chat/completions, json{messages: messages}) ai_reply response.json()[reply] # 将ai_reply发回企微群 send_to_wecom_group(ai_reply)效果员工不再需要切出微信去打开浏览器提问-回答全程在群内闭环。
2 场景二自动化周报生成定时任务每周一上午9点自动汇总上周Git提交记录生成团队周报摘要。
用cronLinux或Task SchedulerWindows定时执行# 每周一9点执行 0 9 * * 1 curl -s http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d {messages:[{role:user,content:根据以下Git提交记录生成一份简洁的团队技术周报摘要200字以内$(git log --oneline -n 20 --since\last week\)}]} \ | jq -r .reply /home/user/reports/weekly_$(date %Y%m%d).md效果从此告别手动写周报AI帮你提炼重点你只需花2分钟审阅。
关键
注意事项与避坑指南API虽小但涉及模型、网络、并发几个细节没注意就会卡住❌不要用--reload上线开发时方便但模型加载后热重载会引发CUDA context错误。
生产环境启动命令去掉--reload并用nohup或systemd守护进程❌避免多worker争抢GPUuvicorn --workers NN1会导致每个worker都尝试加载模型到GPU显存直接爆满。
务必保持--workers 1显存清理已内置torch.no_grad()model.eval()已确保推理时不占梯度显存若需长期运行可在chat_with_qwen()末尾加torch.cuda.empty_cache()仅GPU环境跨域问题不用管本API默认不设CORS因为它是供后端系统调用非浏览器直连。
如果你真要用JS前端调用加一行from fastapi.middleware.cors import CORSMiddleware并配置即可安全性兜底当前API无鉴权仅限内网使用。
如需公网暴露务必在反向代理Nginx层加Basic Auth或在FastAPI中集成OAuth2。
7.
总结你已掌握本地大模型API化的通用范式回顾整个过程你并没有学习新模型、没有重写推理代码、没有折腾CUDA版本——你只是做了一件极简单却极关键的事把“能做事”的逻辑从“给人看的界面”里摘出来包装成“给机器用的语言”。
这套方法论可100%迁移到其他本地模型换成Phi-3-mini只需改MODEL_PATH和AutoTokenizer.from_pretrained(...)两处换成DeepSeek-Coder-
3B同样只改模型路径apply_chat_template换成对应方法想支持图片输入在chat_with_qwen()里加入transformers.AutoProcessor再扩展API参数即可。
真正的技术价值不在于炫技跑通某个模型而在于构建可复用、可组合、可演进的能力基座。
今天你为Qwen
5-
5B加上的这组API明天就能成为你私有AI平台的第一块基石。
现在关掉这个教程页面打开你的终端敲下那行uvicorn api_server:app --host
0.
0.