从0到1的超小中文多模态大模型VLM的Pre-train、SFT和DPO实现之路(四)
Hello,这篇文章主要介绍一下针对Pre-train或者SFT后的模型如何使用Gradio构建Web交互界面来进行多轮对话和快速验证。
正文
使用Gradio构建Web端交互界面的核心对话逻辑其实和在命令行端与模型进行多轮交互是一样的,唯一的区别就是在Gradio中多了Gradio UI构建的逻辑。主要有以下几点需要注意:
本文涉及到的所有代码在文章末尾
- 在写一个load_model函数供用户自行选择模型(Pre-trian or SFT):
MODEL_PATHS = {
"SFT模型": "",
"Pretrain模型": ""
} # 根据实际情况填写自己保存模型的路径即可
current_model = None
tokenizer = None
processor = None
# 加载模型
def load_model(model_choice):
global current_model, tokenizer, processor
path = MODEL_PATHS[model_choice]
current_model = AutoModelForCausalLM.from_pretrained(path).to(device)
tokenizer = AutoTokenizer.from_pretrained(config.llm_path)
processor = AutoProcessor.from_pretrained(config.vision_model_path)
# 替换 lm_head
qwen_model = AutoModelForCausalLM.from_pretrained(config.llm_path)
current_model.llm.lm_head.load_state_dict(qwen_model.lm_head.state_dict())
current_model.eval()
- 构建多轮对话逻辑函数。和命令行多轮推理一样,这里只支持用户在第一轮对话里输入图片信息,需要注意的是在多轮对话里需要把图片信息进行保存,否则模型从第二轮对话开始就会忘记图片的信息。同时,这里加入了temperature和top_p参数,便于用户控制模型生成回复的采样策略,代码如下:
def chat(user_input, image, history_json, model_choice, temperature, top_p, pixel_values_state):
if current_model is None:
load_model(model_choice)
if history_json is None or len(history_json) == 0:
history = [{"role": "system", "content": "You are a helpful assistant."}]
first_round = True
else:
history = history_json
first_round = False
# 图像处理逻辑
if first_round:
if not user_input.endswith("\n<image>"):
user_input = user_input + "\n<image>"
image = image.convert("RGB")
pixel_values = processor(images=image, return_tensors="pt")["pixel_values"].to(device)
pixel_values_state = pixel_values # 缓存视觉特征
else:
pixel_values = pixel_values_state # 复用之前的视觉特征
history.append({"role": "user", "content": user_input})
prompt_text = tokenizer.apply_chat_template(
history,
tokenize=False,
add_generation_prompt=True
).replace("<image>", "<|image_pad|>" * config.image_pad_num)
input_ids = tokenizer(prompt_text, return_tensors="pt").input_ids.to(device)
attention_mask = torch.ones_like(input_ids)
with torch.no_grad():
output_ids = current_model.generate(
input_ids=input_ids,
attention_mask=attention_mask,
pixel_values=pixel_values,
max_new_tokens=256,
temperature=temperature,
top_p=top_p
)
answer = tokenizer.decode(output_ids[0], skip_special_tokens=True)
history.append({"role": "assistant", "content": answer})
messages = [{"role": item["role"], "content": item["content"]} for item in history[1:]]
return "", history, messages, pixel_values_state
- 构建清除历史对话的函数。主要目的是让模型和用户从零开始一轮新对话,避免上下文累积带来的显存消耗、话题干扰和交互混乱。
def clear_history():
return [], [], "", None, None # history, chatbot, input, image, pixel_values_state
- 构建Gradio交互界面。其实核心逻辑就是将刚刚实现的对话逻辑函数chat和清除历史对话函数分别传入send_button.click和clear_button.click,其它的都是在Web端DIY自己想要展示的内容。
with gr.Blocks() as demo:
gr.Markdown("## 🧠 多模态对话 Demo (仅首轮上传图像)")
with gr.Row():
model_choice = gr.Radio(["SFT模型", "Pretrain模型"], label="选择使用模型", value="SFT模型")
with gr.Row():
temperature = gr.Slider(0.0, 1.5, value=0.7, step=0.05, label="Temperature")
top_p = gr.Slider(0.0, 1.0, value=0.9, step=0.05, label="Top-p")
with gr.Row():
with gr.Column(scale=1):
image_input = gr.Image(type="pil", label="上传图像 (仅第一轮使用)")
with gr.Column(scale=2):
chatbot = gr.Chatbot(label="多轮对话", type="messages")
user_input = gr.Textbox(label="你的问题", placeholder="输入文本内容...")
send_button = gr.Button("发送")
clear_button = gr.Button("清除历史记录")
history_state = gr.State([])
pixel_values_state = gr.State(None)
send_button.click(
fn=chat,
inputs=[user_input, image_input, history_state, model_choice, temperature, top_p, pixel_values_state],
outputs=[user_input, history_state, chatbot, pixel_values_state]
)
clear_button.click(
fn=clear_history,
inputs=[],
outputs=[history_state, chatbot, user_input, image_input, pixel_values_state]
)
效果视频
视频里使用了两张图片对SFT后的模型进行测试,和在命令行端的测试一样,这里还测试了模型的通用对话能力。由于本文使用的ubuntu系统没有装中文输入法,所以我直接通过英文提问然后让模型使用中文回答,正好可以看看模型在经过两轮后训练后跨语言回答问题的能力。(发现上传的视频都会被压缩画质,这里添加了相应字幕,辛苦大家将就着看吧。)
代码链接和数据集链接
- github: https://github.com/7Alive7/VLM-Finetuning/tree/main
我们该怎样系统的去转行学习大模型 ?
很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习门槛,降到了最低!
在这个版本当中:
第一您不需要具备任何算法和数学的基础第二不要求准备高配置的电脑第三不必懂Python等任何编程语言
您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包分享出来, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

一、大模型经典书籍(免费分享)
AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

二、640套大模型报告(免费分享)
这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
三、大模型系列视频教程(免费分享)

四、2025最新大模型学习路线(免费分享)
我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代
L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的
核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊
L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计
L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署
L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

L5阶段:专题集丨特训篇 【录播课】

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码,免费领取

更多推荐




所有评论(0)