ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

vLLM 部署实战:用 Streamlit + OpenAI 兼容 API 快速搭建 LLM 聊天 Web 应用

vLLM 部署实战:用 Streamlit + OpenAI 兼容 API 快速搭建 LLM 聊天 Web 应用 vLLM 部署实战用 Streamlit OpenAI 兼容 API 快速搭建 LLM 聊天 Web 应用【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllmStreamlit 能在几分钟内把 Python 脚本变成交互式 Web 应用而 vLLM 提供 OpenAI 兼容的 HTTP 推理服务两者组合即可低成本搭建一个带会话管理、流式输出的本地 LLM 聊天界面。本文基于 vLLM 官方文档docs/deployment/frameworks/streamlit.md及其配套示例脚本 streamlit_openai_chatbot_webserver.py完整讲解从环境安装、服务启动到脚本源码级功能的部署全流程读完后你可以独立复现一个可切换多会话、支持推理过程可视化的 vLLM 聊天前端。方案架构Streamlit 前端 vLLM 后端这套方案的核心思路是前后端解耦后端vllm serve启动一个 OpenAI 兼容的 HTTP 服务器暴露/v1/chat/completions、/v1/models等标准接口。vLLM 的完整 API 支持范围可在 OpenAI-Compatible Server 文档 中查阅Chat Completions API 仅适用于带 chat template 的文本生成模型。前端Streamlit 脚本通过官方openaiPython 客户端连接后端复用 OpenAI SDK 的生态流式响应、多轮对话消息结构无需自行编写 HTTP 请求逻辑。从示例脚本的 docstring 看它明确列出了功能清单多聊天会话管理、流式响应展示、可配置的 API 端点、实时聊天历史、以及可选的推理过程thinking process可视化展示脚本文件头注释。一、环境准备安装依赖按官方文档一条命令即可装齐全部依赖pip install vllm streamlit openai其中vllm提供推理引擎与vllm serve命令行streamlit提供 Web UI 运行时openai是标准 Python 客户端脚本用它调用 vLLM 的兼容接口脚本中from openai import OpenAI见 脚本第 36 行。二、部署步骤完整可复现1. 启动 vLLM 服务端使用任意受支持的 chat 模型启动服务文档给出的示例是vllm serve Qwen/Qwen1.5-0.5B-Chat服务默认监听http://localhost:8000。这个默认地址在 vLLM CLI 源码中得到印证——CLI 的 --url 参数 的默认值就是http://localhost:8000/v1。如果模型较大可追加--gpu-memory-utilization、--max-model-len等参数控制显存占用完整参数参见 serve 参数文档。安全提示若给服务端配置了--api-key或VLLM_API_KEY该密钥仅保护/v1、/v2、/inference路径前缀下的端点其他端点不受保护。生产环境建议反向代理加固详见 OpenAI-Compatible Server 文档中的警告 与 安全指南。2. 获取示例脚本官方脚本位于仓库 examples/applications/chatbot/streamlit_openai_chatbot_webserver.py将其拷贝到工作目录即可。同目录下还有 Gradio 版本的备选实现gradio_openai_chatbot_webserver.py可按需选择。3. 启动 Streamlit Web UI# 最简方式默认连接 http://localhost:8000/v1 streamlit run streamlit_openai_chatbot_webserver.py # 或显式指定 vLLM 服务端地址远程服务器场景 VLLM_API_BASEhttp://vllm-server-host:vllm-server-port/v1 \ streamlit run streamlit_openai_chatbot_webserver.py # 以 debug 日志级别启动便于排查问题 streamlit run streamlit_openai_chatbot_webserver.py --logger.leveldebug启动后浏览器访问 Streamlit 给出的地址默认http://localhost:8501即可开始对话。三、配置参数详解环境变量与默认值脚本通过两个环境变量配置后端连接均提供了合理的默认值环境变量作用默认值源码依据VLLM_API_BASEvLLM OpenAI 兼容 API 的 Base URL必须包含/v1路径前缀http://localhost:8000/v1脚本第 40 行VLLM_API_KEY请求端点时使用的 API KeyvLLM 未开启鉴权时任意值均可EMPTY脚本第 39 行# 从脚本源码看环境变量在模块加载时一次性读取 openai_api_key os.getenv(VLLM_API_KEY, EMPTY) openai_api_base os.getenv(VLLM_API_BASE, http://localhost:8000/v1)值得注意的设计是API Base URL 还可以在 Web 界面运行时动态修改。脚本把 URL 存入st.session_state.api_base_url侧边栏提供文本输入框检测到变化后写入 session state 并st.rerun()触发整页重载侧边栏 API Settings 逻辑。也就是说环境变量的值只是初始默认值切换后端服务器无需重启 Streamlit。四、脚本源码解析四个核心机制1. 基于 Streamlit session state 的多会话管理脚本用st.session_state维护全部会话数据初始化了以下状态键脚本第 42-61 行sessions字典以时间戳字符串%Y-%m-%d %H:%M:%S格式为键值为该会话的消息列表current_session/active_session当前与激活会话 ID用于侧边栏高亮激活会话显示 主按钮messages当前会话的消息列表供st.chat_message渲染show_reasoning记录每条助手消息对应的推理过程文本api_base_url可运行时修改的后端地址。两个核心函数支撑会话操作create_new_chat_session()用当前时间戳生成唯一会话 ID 并重置消息列表switch_to_chat_session(session_id)切换激活会话并从字典中回填历史消息实现。侧边栏按时间倒序列出所有会话按钮点击即可切换会话列表渲染。2. 流式响应与推理过程分离展示get_llm_response()是与后端交互的核心函数实现关键逻辑params {model: model, messages: messages, stream: True} if reason: # 通过 vLLM 的 chat_template_kwargs 开启 thinking 模式 params[extra_body] {chat_template_kwargs: {enable_thinking: True}} response client.chat.completions.create(**params) for chunk in response: delta chunk.choices[0].delta # 先流式渲染 reasoning 到上方 expander再流式渲染 content 到下方占位符几个实现细节请求参数固定stream: True逐 chunk 读取choices[0].delta推理开关通过 vLLM 特有的extra_body.chat_template_kwargs.enable_thinking传入这是 vLLM 在 OpenAI 协议之上扩展的 chat template 参数通道用st.empty()占位符 拼接全文 ▌光标实现打字机效果的实时刷新异常被捕获并以st.error展示函数返回(完整正文, 完整推理文本)元组供上层持久化到 session state。3. 模型名自动发现脚本不要求用户手动填写模型名而是调用client.models.list()取返回列表的第一个模型 ID 并展示在页面标题下方脚本第 226-229 行models client.models.list() model models.data[0].id st.markdown(f**Model**: {model})这与 vLLM/v1/models端点的行为一致——vllm serve启动时会把 HuggingFace 模型 ID 注册为服务端的 model id。4. 推理能力探测reasoning toggle脚本用一个带缓存的探测函数判断当前模型是否支持推理输出向服务端发一条非流式Hi请求检查响应消息是否带非空reasoning属性server_supports_reasoning 实现st.cache_data(show_spinnerFalse) def server_supports_reasoning(): resp client.chat.completions.create( modelmodel, messages[{role: user, content: Hi}], streamFalse, ) return hasattr(resp.choices[0].message, reasoning) and bool( resp.choices[0].message.reasoning )探测为真时侧边栏出现 Enable Reasoning 复选框为假时显示灰色提示 Reasoning unavailable for this model。注意该函数用st.cache_data缓存每次页面交互不会重复请求探测。五、消息渲染流程主界面按序执行脚本第 231-311 行若尚无任何会话自动创建一个初始会话遍历st.session_state.messages渲染历史用户消息走st.chat_message(user)助手消息先检查show_reasoning中是否有对应索引的推理文本有则先用折叠的 Thinking Process expander 展示再渲染正文捕获st.chat_input输入追加用户消息到会话并渲染以当前全部历史构造msgs进入st.chat_message(assistant)上下文创建两个空占位符reasoning 在上、content 在下调用get_llm_response()流式生成生成结束后把完整助手回复 append 进消息列表若开启了推理且有推理文本按消息索引存入show_reasoning保证刷新页面后历史中的思考过程仍可展开查看。六、排障与实用建议连接不上后端先确认vllm serve已就绪可用curl http://localhost:8000/v1/models验证再检查VLLM_API_BASE是否带/v1前缀、端口是否与--port参数一致查看细节日志使用文档给出的 debug 模式streamlit run ... --logger.leveldebug鉴权失败服务端用--api-key token-xxx启动时客户端必须通过VLLM_API_KEYtoken-xxx传入同一密钥只想试跑文档示例选用Qwen/Qwen1.5-0.5B-Chat这类小模型单卡甚至消费级 GPU 即可运行替换前端框架同一 chatbot 目录下有 Gradio 版本脚本examples/applications/chatbot/gradio_openai_chatbot_webserver.py架构完全同构仅 UI 框架不同。小结vLLM 的部署扩展生态中Streamlit 方案代表了一条最小成本获得可视化聊天界面的路径后端只需一条vllm serve命令前端是约 300 行、无状态数据库依赖的纯 Python 脚本。理解了本文解析的会话状态管理、流式双通道渲染reasoning content、chat_template_kwargs.enable_thinking扩展参数与模型自动发现四个机制后你可以在此基础上轻松扩展出系统提示词配置、温度滑块、模型切换下拉框等自定义功能。【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表