新闻详情

新闻详情

首页 / 资讯中心 / 详情

Phi-4 WebDemo 部署实战:基于 Streamlit 快速搭建本地交互式聊天界面

发布时间:2026/9/12 14:45:24来源:尧图网络
Phi-4 WebDemo 部署实战:基于 Streamlit 快速搭建本地交互式聊天界面
Phi-4 WebDemo 部署实战基于 Streamlit 快速搭建本地交互式聊天界面【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本篇技术指南聚焦于在 Linux 环境下为微软 Phi-4 开源大模型搭建 WebDemo 交互式聊天界面属于《开源大模型食用指南》self-llm项目 phi4 教程体系 中的一环。读完本文你将掌握一套可完整复现的实战方案从 pip 环境配置、ModelScope 模型下载到编写基于 Streamlit 的 chatBot 代码并启动本地 Web 服务最终在浏览器中获得一个支持多轮对话、可调最大生成长度的聊天应用。文中所有命令与代码均来自仓库 03-Phi-4 WebDemo部署.md并补充了同目录文档与源码层面的参数原理说明。一、背景为什么选择 WebDemo 方式部署 Phi-4Phi-4 是微软开源的大语言模型其 FastApi 部署、LangChain 接入、WebDemo 部署、LoRA 微调 等教程在仓库中构成完整链路。WebDemo 属于部署应用层次适合以下场景希望以图形化界面的方式直观体验模型的对话能力而非通过 API 或命令行交互需要在本地或远程服务器上快速搭建一个可分享给他人使用的聊天入口作为后续接入业务系统前的交互原型验证。与 FastApi 部署相比WebDemo 的核心差异在于交互形态FastApi 面向程序化调用curl / requests而 WebDemo 基于 Streamlit 提供浏览器聊天界面内置多轮对话管理与会话状态保持无需自行维护history参数。两者共享同一套模型加载与生成逻辑本文也会在结尾给出两种方式的对照方便你按需选择。二、环境准备基础环境与依赖安装2.1 基础环境要求本文基于以下经过验证的基础环境组合---------------- ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0 ----------------本文默认学习者已安装好以上 Pytorch(cuda) 环境如未安装请自行安装。其中 Python 3.12 与 Pytorch 2.3.0 是仓库内 Phi-4 各篇教程统一使用的组合FastApi 教程 与 LangChain 教程 环境完全一致CUDA 12.1 用于支撑 GPU 推理。如果你的机器没有现成环境仓库文档说明 AutoDL 平台准备了 Phi-4 的环境镜像创建实例后可直接使用省去自行配置的麻烦。2.2 pip 换源与依赖包安装国内网络环境下先为 pip 更换清华源以加速依赖下载# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple随后安装 WebDemo 所需的依赖包pip install transformers4.44.2 pip install huggingface-hub0.25.0 pip install accelerate0.34.2 pip install modelscope1.18.0 pip install streamlit1.41.1各依赖包在本次部署中的职责如下表依赖包版本作用transformers4.44.2加载模型与分词器AutoModelForCausalLM/AutoTokenizer执行对话生成huggingface-hub0.25.0Hugging Face Hub 客户端部分模型组件加载时的底层依赖accelerate0.34.2支持device_mapauto的自动设备分配与多卡调度modelscope1.18.0从魔搭社区下载模型权重snapshot_downloadstreamlit1.41.1Web 应用框架提供聊天界面、侧边栏控件与会话状态管理其中accelerate与streamlit是本次部署的两个关键点前者是device_mapauto得以生效的前提模型加载时自动把不同层分配到可用 GPU/CPU后者则是整个 WebDemo 界面的承载框架。三、模型下载使用 ModelScope 拉取 Phi-4 权重模型权重从魔搭社区下载。使用modelscope中的snapshot_download函数在/root/autodl-tmp下新建model_download.py文件写入以下内容并保存import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(LLM-Research/phi-4, cache_dir/root/autodl-tmp, revisionmaster)运行python model_download.py即可开始下载。关于该函数的三个关键参数第一个参数model_id模型在魔搭社区的名称即LLM-Research/phi-4。如何确认该名称在魔搭社区搜索该模型即可看到cache_dir模型下载到的本地路径这里配置为/root/autodl-tmp。注意务必修改为你的实际模型下载路径revision模型版本号一般默认为master。模型大小约 28 GB根据网络状况不同下载大概需要 10 到 20 分钟。下载完成后模型的本地路径形如/root/autodl-tmp/LLM-Research/phi-4后续代码中的mode_name_or_path变量即指向此路径。补充说明本仓库 LoRA 微调教程 使用完全相同的下载方式并强调注意不要在 notebook 中直接运行即模型下载脚本建议在终端中以python方式执行避免 notebook 环境带来的网络或进程问题。四、代码准备编写 chatBot.py 聊天应用在/root/autodl-tmp路径下新建chatBot.py文件写入以下完整代码并保存from transformers import AutoTokenizer, AutoModelForCausalLM import torch import streamlit as st # 在侧边栏中创建一个标题和一个链接 with st.sidebar: st.markdown(## Phi4 LLM) [开源大模型食用指南 self-llm](https://github.com/datawhalechina/self-llm.git) # 创建一个滑块用于选择最大长度范围在 0 到 8192 之间默认值为 512Qwen2.5 支持 128K 上下文并能生成最多 8K tokens max_length st.slider(max_length, 0, 8192, 512, step1) # 创建一个标题和一个副标题 st.title( Phi4 Chatbot) st.caption( A streamlit chatbot powered by Self-LLM) # 定义模型路径 mode_name_or_path /root/autodl-tmp/LLM-Research/phi-4 # 定义一个函数用于获取模型和 tokenizer st.cache_resource def get_model(): # 从预训练的模型中获取 tokenizer tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) tokenizer.pad_token_id tokenizer.eos_token_id 100265 # 从预训练的模型中获取模型并设置模型参数 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(model.device) 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] # 将模型的输出添加到 session_state 中的 messages 列表中 st.session_state.messages.append({role: assistant, content: response}) # 在聊天界面上显示模型的输出 st.chat_message(assistant).write(response) # print(st.session_state) # 打印 session_state 调试下面对代码的四个关键部分做逐一拆解帮助理解每个参数的含义与底层行为。4.1 侧边栏参数控制生成最大长度with st.sidebar: st.markdown(## Phi4 LLM) [开源大模型食用指南 self-llm](https://github.com/datawhalechina/self-llm.git) max_length st.slider(max_length, 0, 8192, 512, step1)侧边栏放置了一个st.slider滑块控件参数含义取值范围0 到 8192步长为 1默认值512即默认情况下模型每次回复最多生成 512 个新 token作用对象该值会作为model.generate(max_new_tokensmax_length)中的max_new_tokens传入。max_new_tokens控制的是在输入基础上新增生成的 token 数上限而不是包含输入在内的总长度这也是generate方法中与max_length的关键区别——用max_new_tokens可以避免把很长的多轮对话历史误计入生成长度导致回复被意外截断。实际使用中若模型回复偏长如代码生成、推理过程可将滑块调大若显存紧张则可调小。4.2 模型加载缓存 半精度 自动设备分配st.cache_resource def get_model(): tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) tokenizer.pad_token_id tokenizer.eos_token_id 100265 model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, device_mapauto) return tokenizer, model这一段有三个值得关注的技术点st.cache_resourceStreamlit 的资源级缓存装饰器。它保证模型与分词器在整个服务进程生命周期内只加载一次所有浏览器会话共享同一份实例。如果没有这一行每次页面交互即每次脚本重新运行都会重新加载 28 GB 的模型服务将完全无法使用。缓存键基于函数名与参数mode_name_or_path发生变化时缓存会自动失效重建tokenizer.pad_token_id tokenizer.eos_token_id 100265将 pad token 与 eos token 统一设置为 100265。从仓库 LoRA 微调教程 的注释可知100265 对应|im_end|——这是 Phi-4 采用 ChatML 模板时的对话结束标记。显式指定 pad token 是为了避免批处理 padding 时使用不合适的默认 token从而保证生成质量torch_dtypetorch.bfloat16与device_mapauto前者以半精度 bfloat16 加载权重相比 fp32 大幅降低显存占用后者依赖accelerate库将模型各层自动分配到可用的 GPU/CPU 设备上。模型加载完成后tokenizer与model通过get_model()返回并在模块级持有供后续对话生成调用。4.3 会话状态Streamlit 的多轮对话管理if messages not in st.session_state: st.session_state[messages] [{role: assistant, content: 有什么可以帮您的}] for msg in st.session_state.messages: st.chat_message(msg[role]).write(msg[content])Streamlit 脚本每次交互都会从头到尾重跑st.session_state是跨重跑保留数据的唯一途径。这里以messages列表维护完整的对话历史初始注入一条助手的欢迎消息有什么可以帮您的随后将历史消息逐条渲染为聊天气泡。这正是 WebDemo 与 FastApi 部署的体验差异所在——多轮上下文由前端自动累积无需调用方手动传递history。4.4 对话生成模板应用、生成与解码if prompt : st.chat_input(): st.chat_message(user).write(prompt) 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(model.device) 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] st.session_state.messages.append({role: assistant, content: response}) st.chat_message(assistant).write(response)生成链路分为四步模板应用apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue)将[{role: user, content: ...}, ...]形式的消息列表套用模型的 ChatML 模板add_generation_promptTrue会在末尾追加 assistant 的生成提示。从仓库 LoRA 微调教程 可知Phi-4 的 Prompt Template 格式为|im_start|system You are a helpful assistant.|im_end| |im_start|user 你是谁|im_end| |im_start|assistant 我是一个有用的助手。|im_end|张量化tokenizer([input_ids], return_tensorspt).to(model.device)将文本转为 PyTorch 张量并移动到模型所在设备.to(model.device)确保设备一致避免 CUDA/CPU 张量不匹配报错生成model.generate(..., max_new_tokensmax_length)执行自回归生成产出包含输入部分在内的完整 token 序列裁剪与解码通过output_ids[len(input_ids):]仅保留新生成的部分输入 token 数量即为裁剪起点再以batch_decode(generated_ids, skip_special_tokensTrue)解码为纯文本——skip_special_tokensTrue会去掉|im_end|等特殊标记使回复干净可读。最终模型的回复被追加进st.session_state.messages供下一轮对话作为上下文并即时渲染到聊天界面。五、运行 demo启动 Streamlit 服务并访问5.1 启动命令在终端中运行以下命令启动服务streamlit run /root/autodl-tmp/chatBot.py --server.address 127.0.0.1 --server.port 6006命令参数说明streamlit run 脚本路径启动 Streamlit 应用--server.address 127.0.0.1服务仅监听本机回环地址外部无法直接访问安全性更好--server.port 6006指定服务端口。选用 6006 端口与本仓库 FastApi 教程 保持一致便于后续用同一端口做本地映射。启动成功后按照 AutoDL 平台的指示将端口映射到本地然后在浏览器中打开http://localhost:6006/即可看到聊天界面如上文截图所示。5.2 可选AutoDL 平台端口映射若服务运行在 AutoDL 等远程 GPU 实例上需要在本地终端执行 SSH 端口映射把远端 6006 端口转发到本地。参考仓库 FastApi 教程 中的通用做法命令格式为ssh -CNg -L 6006:127.0.0.1:6006 -p 【你的autodl机器的ssh端口】 root[你的autodl机器地址]将方括号内容替换为你的实例实际 SSH 端口与地址后本地http://localhost:6006/即指向远端的 Phi-4 WebDemo 服务。六、同环境的其他调用方式从 WebDemo 到 API 与 LangChainWebDemo 只是 Phi-4 部署的一种交互形态。同一个模型、同一套环境仓库还提供了另外两条链路可在本教程完成后继续学习FastApi 部署调用将模型封装为 POST 接口支持 curl、Python requests、ApiPost 三种调用方式。适合程序化集成其 API 逻辑apply_chat_templatemodel.generate 裁剪解码与 WebDemo 完全同构仅增加了history参数由调用方显式传入LangChain 接入继承langchain.llms.base.LLM类并重写_call方法把本地 Phi-4 包装为 LangChain 标准 LLM 组件之后即可无差别使用 LangChain 的上层能力。此外若希望基于 WebDemo 进一步做效果增强可参考仓库的 LoRA 微调教程微调产出的 LoRA 权重可通过PeftModel.from_pretrained加载后接入同一套对话生成流程。七、常见问题与排查模型加载报路径错误确认mode_name_or_path指向实际的模型目录/root/autodl-tmp/LLM-Research/phi-4且model_download.py中的cache_dir已修改为你的下载路径首次打开页面长时间无响应st.cache_resource首次生效时需要加载约 28 GB 模型含 bfloat16 转换与设备分配耗时数分钟属正常现象日志中出现模型加载完成提示后即可正常对话显存不足OOM可将侧边栏max_length滑块调小以缩短生成长度确认以torch_dtypetorch.bfloat16加载必要时在from_pretrained中配合device_mapauto让部分层卸载到 CPU端口被占用修改--server.port为其他端口如 6007并同步更新本地映射命令中的端口号本地无法访问确认--server.address 127.0.0.1与浏览器访问地址一致若在远程实例上部署务必先完成 SSH 端口映射。八、总结本文完整复现了 Phi-4 的 WebDemo 部署全流程环境配置与依赖安装 → ModelScope 下载 28 GB 模型权重 → 编写基于 Streamlit 的chatBot.py含侧边栏生成长度控制、st.cache_resource模型缓存、st.session_state多轮会话管理、apply_chat_templatemodel.generate生成链路→ 启动服务并通过端口映射在浏览器中访问。其中pad_token_id eos_token_id 100265、bfloat16 半精度加载、device_mapauto自动设备分配等关键细节均与仓库 LoRA 微调教程 中的用法互相印证构成一致的 Phi-4 使用基线。掌握本教程后你可以在此基础上继续深入 FastApi 部署 与 LangChain 接入将本地 Phi-4 逐步融入真实应用系统。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI听声辨人:端侧实时语音分离技术解析 2026/9/12 15:30:29

AI听声辨人:端侧实时语音分离技术解析

1. 项目概述:当物理干扰撞上AI语音分离,WX-0813不是在“降噪”,而是在“认人” 你有没有试过在厨房炒菜时开视频会议?锅铲敲打铁锅的“哐哐”声、抽油烟机的低频轰鸣、还有手机贴着灶台边缘被热气烘得发烫——这时候哪怕把麦克风音…

阅读更多 →
27. 数据产品- BI - AI 应用4-构建高质量 AI 基座 2026/9/12 15:30:29

27. 数据产品- BI - AI 应用4-构建高质量 AI 基座

文章目录前言一、AI 针对结构化数据实战处理场景二、AI 对半结构化、非结构化数据全场景落地处理1. 通过笔记管理模块实现对企业重要临时性数据的收集及处理2. 通过文件管理模块实现对文件的接入及 AI 智能化管理(图片、文档、PDF 等)三、AI 处理数据后&…

阅读更多 →
HC90N03M:专为RGB调光优化的N沟道场效应管 2026/9/12 15:30:29

HC90N03M:专为RGB调光优化的N沟道场效应管

1. 这颗HC90N03M到底解决了什么实际问题?我做LED驱动方案设计快十二年了,从最早的恒流IC搭外围三极管,到后来用集成MOS的驱动芯片,再到如今自己选管子搭半桥、同步整流、PWM调光电路——踩过的坑比走过的路还多。最近三个月&#…

阅读更多 →
27. 数据产品- BI 实战2-需求调研、元数据、数据质量实践 2026/9/12 15:30:29

27. 数据产品- BI 实战2-需求调研、元数据、数据质量实践

文章目录前言一、需求调研方法论:自上而下、分层递进、战略先行二、元数据管理规范:源于业务、贴合实际、全链记录三、数据质量管理方案:锚定需求、对标元数据、落地执行四、需求调研核心认知:贯穿全周期、反复迭代、长期经营五、…

阅读更多 →
27. 数据产品- BI 入门-数仓实战5-ADS 整体设计框架 2026/9/12 15:30:29

27. 数据产品- BI 入门-数仓实战5-ADS 整体设计框架

文章目录前言一、核心设计哲学:以空间换时间,以规范换信任1. 面向应用,拒绝 "通用表" 思维2. 指标分层,坚守口径 "一言堂"3. 宽表与星型的平衡:分级存储策略4. 性能优先,物理表为王二、…

阅读更多 →
CodeMagicianT:智能HTML代码生成与优化工具 2026/9/12 15:27:29

CodeMagicianT:智能HTML代码生成与优化工具

1. CodeMagicianT项目概述 CodeMagicianT是一个专注于HTML代码高效生成与优化的开发工具。作为一名拥有十年Web开发经验的从业者,我深知在项目开发过程中,重复编写基础HTML结构的痛苦。这个工具正是为了解决这个痛点而生,它能通过智能化的方…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞