news 2026/4/23 17:49:41

给自己做一个 ChatGPT:基于 Gradio 的本地 LLM 网页对话界面

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
给自己做一个 ChatGPT:基于 Gradio 的本地 LLM 网页对话界面

给自己做一个 ChatGPT:基于 Gradio 的本地 LLM 网页对话界面

摘要:黑底白字的命令行虽然极客,但不够直观。今天我们将使用 Python 领域最流行的机器学习界面库Gradio,为我们在 RTX 3090 上微调的 Qwen/Llama 模型穿上一件漂亮的“外衣”。我们将实现流式输出 (Streaming),让 AI 的回答像打字机一样一个个字蹦出来,体验拉满!

关键词GradioWebUIChatbot流式输出RTX 3090


1. 准备工作

首先,我们需要安装 Gradio。

conda activate llm_learn pipinstallgradio

2. 编写 WebUI 代码

在工作目录下新建web_demo.py
我们将以Qwen2.5-7B为例(因为它聊起天来更有趣)。

fromunslothimportFastLanguageModelimporttorchimportgradioasgrfromthreadingimportThreadfromtransformersimportTextIteratorStreamer# ===========================# 1. 模型加载 (只运行一次)# ===========================model_path="lora_model"# 指向我们微调 Qwen 的目录max_seq_length=2048print(f"🚀 正在加载模型:{model_path}...")model,tokenizer=FastLanguageModel.from_pretrained(model_name=model_path,max_seq_length=max_seq_length,dtype=None,load_in_4bit=True,)FastLanguageModel.for_inference(model)# ===========================# 2. 定义聊天逻辑 (支持流式)# ===========================defchat_stream(message,history):# message: 用户当前的输入# history: 之前的对话记录 [[user, bot], [user, bot]...]# 构造 Prompt (Qwen 格式)# 这里我们简化处理,只取最近一轮对话,实际项目可以拼接 historyprompt=f"""<|im_start|>user{message}<|im_end|> <|im_start|>assistant """inputs=tokenizer([prompt],return_tensors="pt").to("cuda")# 定义流式输出器streamer=TextIteratorStreamer(tokenizer,skip_prompt=True,skip_special_tokens=True)generation_kwargs=dict(inputs,streamer=streamer,max_new_tokens=512,temperature=0.3,)# 在独立线程中运行生成,主线程读取流thread=Thread(target=model.generate,kwargs=generation_kwargs)thread.start()# 逐步返回生成的文字partial_text=""fornew_textinstreamer:partial_text+=new_textyieldpartial_text# ===========================# 3. 搭建界面# ===========================demo=gr.ChatInterface(fn=chat_stream,title="🤖 我的专属 Qwen 助手 (RTX 3090版)",description="这是我在本地微调并部署的大模型,支持流式对话!",examples=["RTX 3090 适合做深度学习吗?","请用 Python 写一个快排","你是谁?"],theme=gr.themes.Soft())if__name__=="__main__":# share=True 可以生成一个公网链接发给朋友体验demo.launch(server_name="0.0.0.0",share=False)

3. 启动服务

python web_demo.py

终端会输出:
Running on local URL: http://0.0.0.0:7860

打开浏览器访问http://localhost:7860

体验亮点

  • 打字机效果:当你问问题时,AI 的回答是实时蹦出来的,不用等十几秒才看到结果。
  • 历史记录gr.ChatInterface自动帮你处理了对话气泡的 UI。
  • 专属知识:试试问它“RTX 3090 适合做深度学习吗?”,它会用你微调过的知识回答你!

4. 进阶玩法

如果你想让朋友也能通过互联网访问这个界面,只需将最后一行代码改为:

demo.launch(share=True)

Gradio 会自动生成一个为期 72 小时的免费公网链接(类似https://xxxx.gradio.live)。

尽情享受你的私人 GPT 吧!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:46:57

昇腾310P平台强化学习训练环境搭建实战:基于Qwen2.5-7B的完整部署流程

目录引一、Docker环境准备1.1 镜像选择与下载1.2 创建容器坑1: 镜像ID混淆**坑2: 容器秒退**1.3 正确的创建方式1.4 进入容器二、Python环境配置2.1 安装Miniconda2.2 激活conda环境2.3 创建Python 3.10环境三、安装PyTorch与昇腾支持3.1 安装PyTorch 2.5.13.2 安装torch-npu四…

作者头像 李华
网站建设 2026/4/23 12:16:21

精密仪器中的微型导轨如何选对润滑脂?

微型导轨是一种高精度、小型化的直线运动元件&#xff0c;具备体积小、负载能力强、摩擦系数低等特点。被广泛应用于精密仪器、医疗设备、半导体设备、机器人等领域。其运行稳定性与寿命高度依赖润滑脂的性能&#xff0c;选型不当易导致磨损加剧、噪音增大甚至故障停机。那么&a…

作者头像 李华
网站建设 2026/4/23 12:18:25

如何选择德诺超声波焊接机才合适?

在选择德诺超声波焊接机时&#xff0c;用户需要关注多个关键因素。首先&#xff0c;设备性能是重中之重&#xff0c;包括功率、频率与工作效率&#xff0c;这直接影响焊接质量。此外&#xff0c;维修服务也是必不可少的&#xff0c;确保在设备出现故障时能够快速恢复生产。与此…

作者头像 李华
网站建设 2026/4/23 10:44:50

不花一分钱广告,月增3000客户?一招让客户主动帮你介绍三个月

私域圈里有个常见困惑&#xff1a;曾经风靡的“推三返一”模式&#xff0c;为什么总是火一阵就凉&#xff1f;不少商家初期靠它快速拉新&#xff0c;用户为了“免费拿”主动分享。可没过俩月&#xff0c;参与度断崖式下滑&#xff0c;最终只剩老板在群里自嗨。其实不是模式不行…

作者头像 李华
网站建设 2026/4/23 10:46:49

JSM9N20C 200V N 沟道 MOSFET

在电力电子技术日新月异的当下&#xff0c;MOSFET 作为承载能量转换与电路控制的核心功率器件&#xff0c;其性能表现直接决定了终端产品的能效水平、运行稳定性与使用寿命。从工业自动化生产线的核心控制单元&#xff0c;到消费电子的高效电源适配器&#xff1b;从新能源领域的…

作者头像 李华
网站建设 2026/4/23 10:44:31

GraniStudio:IO写入例程

1.文件运行 导入工程 双击运行桌面GraniStudio.exe。 通过引导界面导入IO写入例程&#xff0c;点击导入按钮。 打开IO写入例程所在路径&#xff0c;选中IO写入.gsp文件&#xff0c;点击打开&#xff0c;完成导入。 2.功能说明 实现输出IO控制以及读取。 2.1通过初始化IO算子…

作者头像 李华