DeepSeek-R1-Distill-Qwen-7B WebDemo 部署:用 Streamlit 构建带“思考过程“展示的推理聊天界面
DeepSeek-R1-Distill-Qwen-7B WebDemo 部署用 Streamlit 构建带思考过程展示的推理聊天界面【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm本指南基于《开源大模型食用指南》仓库完整讲解如何在 Linux CUDA 环境下用 Streamlit 将 DeepSeek-R1-Distill-Qwen-7B 部署为一个可交互的 WebDemo 聊天界面。读完本文你将掌握模型下载、Streamlit 对话应用编写、R1 系列think思考过程的分割展示以及本地服务的启动与访问方法。为什么需要 WebDemo让推理模型的思考过程可见DeepSeek-R1 系列模型最显著的特点是先思考、后作答模型在给出最终答案前会在一对think与/think标签之间生成一段完整的推理过程。根据仓库内 DeepSeek-R1-Distill-Qwen 模型介绍 的说明DeepSeek-R1-Zero 通过大规模强化学习RL训练无需监督微调SFT即可表现出色的推理行为后续的 DeepSeek-R1 则在强化学习之前整合了冷启动数据以解决无休止重复、可读性差和语言混合等问题并基于 Llama 和 Qwen 蒸馏出包括 DeepSeek-R1-Distill-Qwen-7B 在内的六个密集模型。DeepSeek-R1-Distill-Qwen-7B 正是从 R1 蒸馏到 Qwen 架构上的 7B 级推理模型可以在单卡如 AutoDL 等云平台的消费级 GPU上运行。用 Streamlit 部署 WebDemo 的价值在于以浏览器聊天界面的形式直观验证模型的对话与推理能力借助st.expander折叠组件将/think之前的推理过程与最终答案分层展示把 R1 系列模型的特色完整呈现给使用者代码结构简单清晰便于在此基础上扩展为知识库助手、Agent 应用等更复杂的形态。本文的完整实操主线如下环境准备 → 模型下载 → 编写 chatBot.py → 启动 Streamlit 服务 → 浏览器交互验证。一、环境准备本文默认基础环境如下对应的完整依赖清单与其余部署形态FastAPI、LangChain、vLLM可在本仓库该模型的系列文档中交叉验证---------------- ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0 ----------------默认学习者已安装好以上 Pytorch(CUDA) 环境如未安装请自行安装。1. pip 换源并安装依赖在国内网络环境下先升级 pip 并切换为清华 PyPI 镜像源可显著加速依赖包下载# 升级 pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install transformers4.48.2 pip install accelerate1.3.0 pip install modelscope1.22.3 pip install streamlit1.41.1各依赖在本次 WebDemo 部署中的职责如下依赖包版本作用transformers4.48.2加载并运行模型与分词器AutoModelForCausalLM / AutoTokenizeraccelerate1.3.0支持device_mapauto自动设备分配实现多设备/显存受限场景下的加载modelscope1.22.3从国内 ModelScope 平台下载模型权重snapshot_downloadstreamlit1.41.1构建 Web 聊天界面、会话状态管理st.session_state与资源缓存st.cache_resource若本地环境配置遇到困难仓库在 AutoDL 等云平台准备了 DeepSeek-R1-Distill-Qwen 的现成环境镜像可直接创建实例使用省去手动装环境的步骤。同时建议参考 General-Setting 中的环境与模型下载说明 了解国内下载模型的更多细节。二、模型下载使用modelscope中的snapshot_download函数从国内镜像下载模型权重。第一个参数为模型名称cache_dir参数指定模型在本地磁盘的下载路径revision指定分支版本。新建model_download.py文件并输入以下内容保存后运行python model_download.py执行下载from modelscope import snapshot_download model_dir snapshot_download(deepseek-ai/DeepSeek-R1-Distill-Qwen-7B, cache_dir/root/autodl-tmp, revisionmaster)注意记得把cache_dir修改为你的模型下载路径。模型体积约 15GB 左右下载耗时取决于网络带宽请耐心等待。下载完成后模型文件将组织在cache_dir下以模型名命名的目录中例如/root/autodl-tmp/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B。该路径就是后续代码中mode_name_or_path要指向的位置。三、编写 chatBot.pyWebDemo 核心代码新建chatBot.py文件并输入以下内容保存后即可运行。下面代码有很详细的注释逐模块拆解可参见后文。from transformers import AutoTokenizer, AutoModelForCausalLM import torch import streamlit as st import re # 在侧边栏中创建一个标题和一个链接 with st.sidebar: st.markdown(## DeepSeek-R1-Distill-Qwen-7B LLM) st.markdown(开源大模型食用指南 self-llm) # 创建一个滑块用于选择最大长度范围在 0 到 8192 之间默认值为 8192 # DeepSeek-R1-Distill-Qwen-7B 支持 128K 上下文并能生成最多 8K tokens # 我们推荐设为 8192因为思考需要输出更多的 Token 数 max_length st.slider(max_length, 0, 8192, 8192, step1) # 创建一个标题和一个副标题 st.title( DeepSeek R1 Distill Chatbot) st.caption( A streamlit chatbot powered by Self-LLM) # 定义模型路径 mode_name_or_path /root/autodl-tmp/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B # 文本分割函数 def split_text(text): pattern re.compile(rthink(.*?)/think(.*), re.DOTALL) # 定义正则表达式模式 match pattern.search(text) # 匹配 think思考过程/think回答 if match: # 如果匹配到思考过程 think_content match.group(1).strip() # 获取思考过程 answer_content match.group(2).strip() # 获取回答 else: think_content # 如果没有匹配到思考过程则设置为空字符串 answer_content text.strip() # 直接返回回答 return think_content, answer_content # 定义一个函数用于获取模型和 tokenizer st.cache_resource def get_model(): # 从预训练的模型中获取 tokenizer tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) tokenizer.pad_token tokenizer.eos_token # 从预训练的模型中获取模型并设置模型参数 model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, device_mapauto) return tokenizer, model # 加载 Qwen2.5 的 model 和 tokenizer tokenizer, model get_model() # 如果 session_state 中没有 messages则创建一个包含默认消息的列表 if messages not in st.session_state: st.session_state[messages] [{role: assistant, content: 有什么可以帮您的}] # 遍历 session_state 中的所有消息并显示在聊天界面上 for msg in st.session_state.messages: st.chat_message(msg[role]).write(msg[content]) # 如果用户在聊天输入框中输入了内容则执行以下操作 if prompt : st.chat_input(): # 在聊天界面上显示用户的输入 st.chat_message(user).write(prompt) # 将用户输入添加到 session_state 中的 messages 列表中 st.session_state.messages.append({role: user, content: prompt}) # 将对话输入模型获得返回 input_ids tokenizer.apply_chat_template(st.session_state.messages,tokenizeFalse,add_generation_promptTrue) model_inputs tokenizer([input_ids], return_tensorspt).to(cuda) generated_ids model.generate(model_inputs.input_ids,max_new_tokensmax_length) generated_ids [ output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) ] response tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0] think_content, answer_content split_text(response) # 调用 split_text 函数分割思考过程和回答 # 将模型的输出添加到 session_state 中的 messages 列表中 st.session_state.messages.append({role: assistant, content: response}) # 在聊天界面上显示模型的输出 with st.expander(模型思考过程): st.write(think_content) # 展示模型思考过程 st.chat_message(assistant).write(answer_content) # 输出模型回答 # print(st.session_state) # 打印 session_state 调试代码中的mode_name_or_path需要修改为你实际的模型下载路径。原示例代码在侧边栏以 Markdown 链接形式展示本教程项目仓库读者可通过git clone https://gitcode.com/datawhalechina/self-llm获取本仓库全部教程与配套代码。3.1 侧边栏max_length 滑块的语义with st.sidebar: st.markdown(## DeepSeek-R1-Distill-Qwen-7B LLM) max_length st.slider(max_length, 0, 8192, 8192, step1)滑块范围0~8192默认值8192。它直接控制生成阶段的最大新 token 数max_new_tokensmax_length。之所以推荐8192是因为 DeepSeek-R1-Distill-Qwen-7B 在输出最终答案前会先生成较长的推理链think内容生成上限过小会导致推理被截断、答案质量下降。这一点在仓库 vLLM 部署文档 中同样体现其代码同样将max_tokens设为 8K 并注释思考需要输出更多的 Token 数。3.2 split_text解析think推理链R1 系列模型遵循think思考过程/think回答内容的输出格式。split_text用正则表达式rthink(.*?)/think(.*)配合re.DOTALL使.可匹配换行符做非贪婪匹配将输出一分为二match.group(1)think与/think之间的思考过程match.group(2)/think之后的正式回答未匹配到时模型未输出思考标签思考内容置为空字符串整个输出直接作为回答展示。该函数的实现在仓库 FastAPI 部署文档 的api.py中完全一致同一段正则、同样的分组逻辑属于 R1 系列部署中共用的关键解析逻辑可以放心复用。3.3 get_model模型加载与缓存st.cache_resource def get_model(): tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, device_mapauto) return tokenizer, modelst.cache_resourceStreamlit 每次脚本重跑时被该装饰器修饰的函数结果会被全局缓存模型权重只加载一次避免每次交互都重新占用显存。torch_dtypetorch.bfloat16以 BF16 精度加载权重相比 FP16 显存占用相同但数值稳定性更好是 7B 级模型单卡推理的常见选择。device_mapauto由 accelerate 自动把模型各层分配到可用设备GPU/CPU在显存不足时会自动启用 CPU offload。trust_remote_codeTrue允许加载模型仓库中的自定义代码tokenizer.pad_token tokenizer.eos_token为分词器补齐 pad 标记避免批处理时告警。3.4 对话循环chat template 与流式会话if messages not in st.session_state: st.session_state[messages] [{role: assistant, content: 有什么可以帮您的}]st.session_state在浏览器会话级别持久化保证多轮对话历史不因页面重跑而丢失初始写入一条助手的欢迎语。用户输入后先渲染用户气泡再把消息追加进messages列表随后构造生成请求input_ids tokenizer.apply_chat_template(st.session_state.messages, tokenizeFalse, add_generation_promptTrue) model_inputs tokenizer([input_ids], return_tensorspt).to(cuda) generated_ids model.generate(model_inputs.input_ids, max_new_tokensmax_length)apply_chat_template按照模型的对话模板Qwen 系 ChatML 格式把多轮消息拼成带system/user/assistant标记的提示词add_generation_promptTrue表示在末尾补上模型回复的起始标记返回字符串后再交给tokenizer做批处理并移到 CUDA 上。同样用法也出现在仓库 FastAPI 部署文档 与 LangChain 接入文档 中是整个仓库部署 R1 系列的标准调用方式。生成完成后通过output_ids[len(input_ids):]截掉输入部分batch_decode(..., skip_special_tokensTrue)还原为纯文本再交给split_text拆出思考与回答。最后用st.expander(模型思考过程)把推理链收进可折叠面板而正式回答直接以 assistant 气泡展示界面层级清晰。四、运行 demo在终端中运行以下命令启动 Streamlit 服务--server.port可更换端口streamlit run chatBot.py --server.address 127.0.0.1 --server.port 6006--server.address 127.0.0.1仅监听本机回环地址适合本机调试或配合 SSH 隧道/平台端口映射访问--server.port 6006服务监听端口可自由更换如使用云平台时可与平台开放的自定义端口对应起来具体开放端口方法参见 General-Setting 开放端口教程。首次启动需要加载约 15GB 的模型权重到显存BF16 下约占 14GB 左右请耐心等待加载完成。随后在本地浏览器打开 http://localhost:6006/ 即可看到部署好的 WebDemo 聊天界面。运行效果如下图所示界面中可以看到模型回答被组织成层级清晰的分点内容在正式回答之上通过折叠面板可以展开模型的思考过程直观体验 R1 系列推理-作答的两阶段输出。五、关键参数与调优建议结合仓库内该模型的系列部署文档以下参数对 WebDemo 的体验影响最大参数建议取值说明max_length / max_new_tokens8192R1 推理链较长生成上限过小会截断思考过程。模型支持 128K 上下文、最多生成 8K tokens采样温度 temperature0.5 ~ 0.7推荐 0.6来自仓库 vLLM 部署文档中转述的 DeepSeek 官方建议温度过高会引入噪声过低则降低多样性top_p0.95核心采样概率阈值与 temperature 配合控制输出多样性prompt 结尾建议追加think\n在 vLLM 部署文档 的离线脚本与 OpenAI 兼容接口示例中均按官方建议在每个 prompt 末尾显式追加think\n以触发推理链数学推理类内容还可补充Please reason step by step, and put your final answer within \boxed{}类指令说明WebDemo 中的chatBot.py通过apply_chat_template走的是聊天模板路径而 vLLM 示例中的裸 prompt 方式需要手动追加think\n。若想显式触发思考链也可以在聊天输入内容后拼接该标记再送入模板两种方式均兼容。六、从 WebDemo 走向更多部署形态本次 WebDemo 适合本地调试、效果演示与教学场景若需要对外提供服务或追求更高吞吐仓库为同一模型提供了完整的姊妹教程可直接对照使用DeepSeek-R1-Distill-Qwen-7B FastAPI 部署调用基于 FastAPI Uvicorn 暴露 POST 接口返回response/think/answer结构化字段并包含torch_gc显存回收与请求日志DeepSeek-R1-Distill-Qwen-7B Langchain 接入自定义DeepSeek_R1_Distill_Qwen_LLM子类将本地模型无缝接入 LangChain 生态DeepSeek-R1-Distill-Qwen-7B vLLM 部署调用使用 vLLM 的 PagedAttention 与连续批处理获得更高吞吐并可直接启动兼容 OpenAI 协议的 API Server。这些文档与本文共享同一套环境配置、模型下载方式与think解析逻辑任意一篇跑通后再阅读其余文档均可实现低成本迁移。总结本文完整复现了 DeepSeek-R1-Distill-Qwen-7B 的 Streamlit WebDemo 部署流程从 pip 换源与依赖安装、ModelScope 模型下载到chatBot.py中侧边栏参数、split_text思考链解析、get_model缓存加载、apply_chat_template多轮对话四大模块的逐行解析再到启动服务与浏览器验证。基于这份代码你可以轻松将界面接入 LangChain 知识库、改造为流式输出streamlit的st.write_stream或替换为其他 Qwen 系蒸馏模型快速搭建属于自己的推理模型演示应用。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Prettier 如何格式化 Markdown 代码块中的 CSS:以 mdn-background-5 多层渐变背景为例

Prettier 如何格式化 Markdown 代码块中的 CSS:以 mdn-background-5 多层渐变背景为例

开发工具格式化CLI 【免费下载链接】prettier Prettier is an opinionated code formatter. 项目地址: https://gitcode.com/gh_mirrors/pr/prettier 点击查看 免费下载 本文围绕 Prettier 代码库中用于 Markdown 格式化测试的样例文档 tests/format/markdown/code…

2026/9/21 1:25:43 阅读更多 →
LangChain、AutoGPT与图计算方案的工业级应用对比

LangChain、AutoGPT与图计算方案的工业级应用对比

1. 项目概述最近在技术社区和面试中经常被问到一个问题:"LangChain、AutoGPT和BabyAGI到底有什么区别?为什么工业级项目更倾向使用基于图(Graph)的方案?"作为在AI工程化领域摸爬滚打多年的从业者&#xff0c…

2026/9/21 2:02:13 阅读更多 →
Cocos Creator项目打包为Windows exe:Electron+NSIS完整指南

Cocos Creator项目打包为Windows exe:Electron+NSIS完整指南

1. 从Cocos Creator到Windows桌面端:为什么值得折腾很多做Cocos Creator的朋友,项目跑在浏览器或者模拟器里挺顺,一旦被问到“能不能给我一个双击就能打开的exe”,就开始挠头。尤其是做工具类、展示类、教育类小项目的团队&#x…

2026/9/21 2:03:25 阅读更多 →

最新新闻

高中物理必刷题PDF高效使用指南:模型识别与三轮刷题法

高中物理必刷题PDF高效使用指南:模型识别与三轮刷题法

简介:这是一份面向高考物理备考生的《高中物理高考必刷题-题目解析版》PDF文档,涵盖超声波测距、匀变速直线运动、自由落体、竖直上抛逆向思维、牛顿运动定律及地球自转对物体运动影响等核心考点,并结合历年真题与易错题进行详细解析&#xf…

2026/9/21 2:04:06 阅读更多 →
AI技术周报:高效筛选与解读行业动态

AI技术周报:高效筛选与解读行业动态

1. 项目概述"每周AI新鲜事儿"这个栏目名称已经透露了它的核心定位——一个定期更新的AI领域资讯聚合平台。作为长期跟踪技术趋势的从业者,我深知在这个信息爆炸的时代,专业筛选的价值有多大。每周260320这个日期编码(2023年3月20日…

2026/9/21 2:04:06 阅读更多 →
STM32 HAL库驱动ESP8266实战:从CubeMX配置到AT指令收发框架

STM32 HAL库驱动ESP8266实战:从CubeMX配置到AT指令收发框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 2:04:06 阅读更多 →
15个生活化比喻轻松理解AI核心技术

15个生活化比喻轻松理解AI核心技术

1. 项目概述:用生活化比喻拆解AI核心概念去年在给团队做内部培训时,我发现一个有趣现象:当用"快递驿站"比喻机器学习中的梯度下降时,新同事眼睛突然亮了起来。这促使我系统整理了15个类似的比喻,帮助不同背景…

2026/9/21 2:04:06 阅读更多 →
LibreChat:本地化AI智能工作台与Agent架构实践指南

LibreChat:本地化AI智能工作台与Agent架构实践指南

1. LibreChat 是什么?一个能跑在你本地的、真正开源的 AI 聊天界面 LibreChat 不是另一个套壳 OpenAI 官网的网页前端,也不是只支持单一模型的玩具项目。它是一个从零开始构建的、功能完整的、可自托管的开源聊天应用,核心目标非常明确&…

2026/9/21 2:04:06 阅读更多 →
RV1126平台JD9366触摸屏驱动移植实战指南

RV1126平台JD9366触摸屏驱动移植实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 2:03:06 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

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

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

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

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/19 23:35:34 阅读更多 →