跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Streamlit WebUI 实战:适配 Nanbeige、Qwen 与 Llama 大模型的方法

介绍基于 Streamlit 构建极简 WebUI 的方案,针对 Nanbeige 4.1-3B 模型进行定制,并展示如何适配 Qwen 和 Llama 系列模型。内容包括视觉设计优化(CSS 布局)、思考过程(CoT)折叠处理、流式输出实现以及多模型通用适配逻辑。通过单文件 Python 驱动,无需复杂前端框架即可实现类似移动端聊天的交互体验,并提供参数调整与扩展建议。

BackendPro发布于 2026/4/6更新于 2026/5/2026 浏览

Streamlit WebUI 实战:适配 Nanbeige、Qwen 与 Llama 大模型的方法

本文介绍基于 Streamlit 构建极简 WebUI 的方案,专为 Nanbeige 4.1-3B 模型打造,并支持适配 Qwen 或 Llama 等主流模型。核心思路通用,通过 CSS 技巧打破原生组件限制,实现现代化交互体验。

1. 项目核心亮点

1.1 极简现代的视觉设计
  • 背景采用浅灰蓝色搭配网格,专业不失活泼。
  • 聊天气泡区分用户(右侧天蓝)与 AI(左侧白底阴影),模拟手机聊天软件。
  • 去拥挤侧边栏,操作集成在顶部和悬浮按钮。
1.2 智能的思考过程处理

现代大模型具备深度思考(Chain-of-Thought)能力,输出常含 `` 标签。WebUI 自动捕获并折叠思考内容:

  • 默认只显示最终回复,保持清爽。
  • 点击展开查看思考过程。
  • 自动处理,无需额外配置。
1.3 流畅的流式输出体验

基于 TextIteratorStreamer 和多线程技术,实现打字机效果:

  • 文字实时显示。
  • CSS 防抖确保气泡不闪烁。
  • 响应速度快,延迟低。
1.4 简洁部署

仅需一个 Python 文件(app.py)运行:

  • 无需 React、Vue 等前端框架。
  • 纯 Python 驱动,样式用 CSS 实现。
  • 开箱即用。

2. 快速上手:搭建专属聊天界面

2.1 环境准备

确保 Python 3.10+,安装依赖:

# 创建虚拟环境
python -m venv nanbeige-ui
source nanbeige-ui/bin/activate
# 安装依赖
pip install streamlit torch transformers accelerate

包说明:streamlit(界面框架)、torch(深度学习)、transformers(模型加载)、accelerate(推理优化)。

2.2 获取项目代码

克隆项目或直接复制 app.py 文件。

2.3 准备模型权重

从 Hugging Face 下载 Nanbeige 4.1-3B 权重:

from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Nanbeige/Nanbeige4-3B"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model.save_pretrained("./nanbeige-model")
tokenizer.save_pretrained("./nanbeige-model")
2.4 修改配置文件

打开 app.py,设置模型路径:

MODEL_PATH = 
""" return f''
"/home/username/models/nanbeige-4.1-3b"

注意使用绝对路径并确保读取权限。

2.5 启动服务
streamlit run app.py

浏览器访问 http://localhost:8501。

3. 核心技术解析:CSS 魔法改造 Streamlit

3.1 动态聊天气泡对齐

利用 CSS :has() 伪类选择器实现动态对齐:

  1. Python 注入标记:
user_html = f"""<div class="user-mark"><span></span><div>{message}</div></div>"""
st.markdown(user_html, unsafe_allow_html=True)
ai_html = f"""<div><div>{message}</div></div>"""
st.markdown(ai_html, unsafe_allow_html=True)
  1. CSS 检测调整:
.message-wrapper:has(.user-mark) { flex-direction: row-reverse; }
.message-wrapper:has(.user-mark) .message-bubble { background-color: #007AFF; color: white; }
.message-bubble.ai { background-color: white; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
3.2 思考过程的智能折叠

提取 `") if thought_start != -1 and thought_end != -1: thought = text[thought_start+5:thought_end] answer = text[thought_end+5:].strip() return f"""

查看思考过程
{thought}
{answer}
{text}


#### 3.3 流式输出的平滑实现
使用 `st.empty()` 占位符更新内容避免闪烁:
```python
import threading
from transformers import TextIteratorStreamer
def stream_response(prompt):
    inputs = tokenizer(prompt, return_tensors="pt").to(device)
    streamer = TextIteratorStreamer(tokenizer, timeout=60.0, skip_prompt=True)
    generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=1024, temperature=0.7)
    thread = threading.Thread(target=model.generate, kwargs=generation_kwargs)
    thread.start()
    placeholder = st.empty()
    generated_text = ""
    for text in streamer:
        generated_text += text
        placeholder.markdown(f'<div>{generated_text}</div>', unsafe_allow_html=True)
    return generated_text

4. 通用改造:适配 Qwen、Llama 等其他模型

4.1 适配 Qwen 系列模型

需设置 trust_remote_code=True 及特定对话模板:

if model_type == "Qwen":
    tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
    model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, trust_remote_code=True, torch_dtype=torch.float16, device_map="auto")

Qwen 对话格式示例:

messages = [{"role": "system", "content": "你是一个有帮助的助手"}, {"role": "user", "content": "你好"}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
4.2 适配 Llama 系列模型

注意 pad_token 设置及特定对话格式:

elif model_type == "Llama":
    tokenizer.pad_token = tokenizer.eos_token
    # Llama3 对话模板处理...
4.3 通用对话处理器

创建统一类管理不同模型逻辑:

class ChatProcessor:
    def __init__(self, model_type="Nanbeige"):
        self.model_type = model_type
        self.setup_model()
    def setup_model(self):
        if self.model_type == "Qwen": self.load_qwen()
        elif self.model_type == "Llama": self.load_llama()
        else: self.load_nanbeige()
    def format_messages(self, messages):
        if self.model_type == "Qwen": return self.format_qwen(messages)
        elif self.model_type == "Llama": return self.format_llama(messages)
        else: return self.format_nanbeige(messages)
4.4 界面适配注意事项
  1. 参数设置:Temperature、Max Tokens 等。
  2. 特殊 Token 处理。
  3. 流式输出适配。

5. 实际应用与效果展示

5.1 Nanbeige 4.1-3B 实际效果

对话流畅,思考过程折叠显示。

用户:计算斐波那契数列
AI:<details><summary>查看思考过程</summary>...</details>
```python
def fibonacci(n): ...
5.2 适配 Qwen 模型效果

界面美观,无思考过程折叠部分。

用户:描述夏天
AI:夏日的阳光洒在波光粼粼的湖面上...
5.3 多模型切换体验

使用 st.selectbox 切换模型,无需重启应用。

model_choice = st.selectbox("选择 AI 模型", ["Nanbeige 4.1-3B", "Qwen 7B", "Llama 3 8B"])
if model_choice != st.session_state.get("current_model"):
    # 重新加载模型逻辑

6. 总结与扩展建议

6.1 核心收获
  1. Streamlit 配合 CSS 可创造精美界面。
  2. 极简设计提升专注度。
  3. 思考过程折叠实用。
  4. 流式输出必备。
  5. 单文件设计便于维护。
6.2 扩展方向
  1. 添加多轮对话记忆(st.session_state)。
  2. 支持文件上传解析。
  3. 语音输入输出。
  4. 模型参数实时调整。
  5. 对话导出功能。
6.3 开发者建议
  1. 理解 CSS 布局(:has()、Flex)。
  2. 逐步测试适配。
  3. 注意性能优化(加载进度)。
  4. 保持代码简洁。

本项目展示了用最简单技术栈创造最佳用户体验的思路,适合 AI 研究者、开发者参考。

目录

  1. Streamlit WebUI 实战:适配 Nanbeige、Qwen 与 Llama 大模型的方法
  2. 1. 项目核心亮点
  3. 1.1 极简现代的视觉设计
  4. 1.2 智能的思考过程处理
  5. 1.3 流畅的流式输出体验
  6. 1.4 简洁部署
  7. 2. 快速上手:搭建专属聊天界面
  8. 2.1 环境准备
  9. 创建虚拟环境
  10. 安装依赖
  11. 2.2 获取项目代码
  12. 2.3 准备模型权重
  13. 2.4 修改配置文件
  14. 2.5 启动服务
  15. 3. 核心技术解析:CSS 魔法改造 Streamlit
  16. 3.1 动态聊天气泡对齐
  17. 3.2 思考过程的智能折叠
  18. 3.3 流式输出的平滑实现
  19. 4. 通用改造:适配 Qwen、Llama 等其他模型
  20. 4.1 适配 Qwen 系列模型
  21. 4.2 适配 Llama 系列模型
  22. 4.3 通用对话处理器
  23. 4.4 界面适配注意事项
  24. 5. 实际应用与效果展示
  25. 5.1 Nanbeige 4.1-3B 实际效果
  26. 5.2 适配 Qwen 模型效果
  27. 5.3 多模型切换体验
  28. 6. 总结与扩展建议
  29. 6.1 核心收获
  30. 6.2 扩展方向
  31. 6.3 开发者建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java SE 文件 IO 基础:File 类与文件系统操作
  • Vheer:免费免登录的 AI 绘画与视频生成工具
  • Claude Code 的三大核心执行模式
  • Git 基础概念与指令快速入门
  • ToClaw:基于 OpenClaw 的云端 AI 自动化助手评测
  • Vue3+TypeScript 中 Promise<string> 转 string 类型错误解析及异步处理
  • ComfyUI v0.18.0 发布:显存内存优化、VAE 架构进化及 API 前端升级
  • Kimi K2.5 开源部署、API 接入、Agent 集群与多模态视觉实战
  • C++ vector 容器使用、迭代器失效与模拟实现
  • 利用程序员技能进行语音识别和自然语言处理
  • GitLens 使用指南:VS Code 中完整的 Git 可视化开发体验
  • 多模态基础大模型技术白皮书解读与核心挑战分析
  • 多模态赋能情绪理解:Qwen3-VL+LLaMA-Factory 的人脸情绪识别实战
  • Java 二分查找算法实战:从基础到进阶
  • C++动态库加载瓶颈分析与优化
  • C++ 继承与多态详解
  • Java 从入门到企业级开发指南
  • Android 一线大厂核心面试题汇总:Activity、Service 与性能优化
  • Cookie 与 Session:Web 用户状态管理详解
  • Flutter spry 适配鸿蒙 HarmonyOS:轻量化 Web 框架与微服务

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online