Qwen模型遇上Gradio:打造你的专属AI交互界面

113

打造Qwen模型专属交互界面:Gradio实战指南

前言

在人工智能领域,模型固然重要,但如何让模型更好地服务于人,实现人机交互,同样至关重要。通过前几篇文章的学习,相信你已经掌握了Qwen模型的基本使用方法。本文将带你更进一步,利用Gradio这一强大的工具,为Qwen模型打造一个美观、易用的交互界面,让人与AI之间的沟通更加顺畅。

术语解析

Gradio: 简单来说,Gradio是一个Python库,它能帮助开发者快速构建机器学习模型的用户界面。无需编写复杂的前端代码,即可将模型部署为Web应用或本地应用。Gradio支持多种输入方式,如文本、图像、音频等,使得用户能够方便地与模型进行交互。

准备工作

在开始之前,请确保你已完成以下准备工作:

  1. Windows操作系统: 本教程以Windows系统为例进行讲解,其他操作系统用户可参考官方文档进行配置。

  2. Qwen-1_8B-Chat模型: 从Hugging Face下载Qwen-1_8B-Chat模型。下载地址:https://huggingface.co/Qwen/Qwen-1_8B-Chat/tree/main

搭建步骤

接下来,我们将一步步地搭建Qwen模型的Gradio交互界面。

步骤一:安装必要的Python库

打开命令提示符或Anaconda Prompt,依次输入以下命令安装所需库:

pip install gradio
pip install transformers
pip install accelerate
pip install tiktoken

步骤二:编写Gradio交互代码

创建一个Python文件(例如:qwen_gradio.py),并复制以下代码:

import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

MODEL_PATH = "./Qwen-1_8B-Chat"

tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, device_map="auto", trust_remote_code=True).eval()

def predict(message, history):
    # 将历史对话拼接成prompt
    prompt = ""
    for human, assistant in history:
        prompt += f"<|im_start|>user\n{human}<|im_end|>\n"
        prompt += f"<|im_start|>assistant\n{assistant}<|im_end|>\n"
    prompt += f"<|im_start|>user\n{message}<|im_end|>\n<|im_start|>assistant\n"

    # 使用tokenizer编码prompt
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    # 生成回复
    outputs = model.generate(
        **inputs,
        max_new_tokens=512,
        do_sample=True,
        temperature=0.7,
        top_p=0.95,
        repetition_penalty=1.15,
        pad_token_id=tokenizer.eos_token_id
    )

    # 解码回复
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)

    # 提取模型回复部分
    response = response.split("<|im_start|>assistant\n")[-1].replace("<|im_end|>\n", "").strip()

    # 返回回复
    return response

with gr.Blocks() as demo:
    chatbot = gr.Chatbot()
    state = gr.State([])

    with gr.Row():
        message = gr.Textbox(label="提问", placeholder="请输入你的问题", lines=4)
        submit = gr.Button("提交")

    submit.click(predict, [message, state], [chatbot, state])
    message.submit(predict, [message, state], [chatbot, state])

demo.launch(share=False, server_name="127.0.0.1", server_port=8080)

请注意,你需要将MODEL_PATH修改为你实际的模型路径。

步骤三:运行Gradio应用

在命令提示符或Anaconda Prompt中,进入到qwen_gradio.py文件所在的目录,并执行以下命令:

python qwen_gradio.py

运行成功后,你将在命令行看到类似以下的输出:

Running on local URL:  http://127.0.0.1:8080

To create a public link, set `share=True` in `launch()`.

在浏览器中打开http://127.0.0.1:8080,即可看到Qwen模型的Gradio交互界面。

步骤四:体验交互

在文本框中输入你的问题,点击“提交”按钮,即可与Qwen模型进行对话。你也可以通过按下回车键来提交问题。

代码详解

让我们来详细分析一下代码:

  1. 导入必要的库:

    import gradio as gr
    from transformers import AutoModelForCausalLM, AutoTokenizer
    import torch
    • gradio:用于创建交互界面。
    • transformers:用于加载和使用Qwen模型。
    • torch:用于张量计算。
  2. 加载tokenizer和模型:

    tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
    model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, device_map="auto", trust_remote_code=True).eval()
    • AutoTokenizer.from_pretrained():加载与模型对应的tokenizer。
    • AutoModelForCausalLM.from_pretrained():加载Qwen模型。
    • device_map="auto":自动将模型加载到合适的设备上(GPU或CPU)。
    • .eval():将模型设置为评估模式。
  3. 定义预测函数:

def predict(message, history): # 将历史对话拼接成prompt prompt = "" for human, assistant in history: prompt += f"<|im_start|>user\n{human}<|im_end|>\n" prompt += f"<|im_start|>assistant\n{assistant}<|im_end|>\n" prompt += f"<|im_start|>user\n{message}<|im_end|>\n<|im_start|>assistant\n"

    # 使用tokenizer编码prompt
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    # 生成回复
    outputs = model.generate(
        **inputs,
        max_new_tokens=512,
        do_sample=True,
        temperature=0.7,
        top_p=0.95,
        repetition_penalty=1.15,
        pad_token_id=tokenizer.eos_token_id
    )

    # 解码回复
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)

    # 提取模型回复部分
    response = response.split("<|im_start|>assistant\n")[-1].replace("<|im_end|>\n", "").strip()

    # 返回回复
    return response
```

*   `predict()`函数接收用户输入的消息和历史对话记录,并返回模型的回复。
*   函数首先将历史对话拼接成一个完整的prompt,然后使用tokenizer将prompt编码成模型可以理解的格式。
*   `model.generate()`函数用于生成模型的回复,其中包含一些重要的参数:
    *   `max_new_tokens`:生成回复的最大长度。
    *   `do_sample`:是否使用采样策略。
    *   `temperature`:控制生成回复的随机性,值越高,回复越随机。
    *   `top_p`:控制生成回复的概率分布,值越高,回复越保守。
    *   `repetition_penalty`:防止模型重复生成相同的文本。
    *   `pad_token_id`:用于填充的token ID。
*   最后,函数将模型的回复解码成文本,并提取出模型生成的部分。
  1. 创建Gradio界面:

with gr.Blocks() as demo: chatbot = gr.Chatbot() state = gr.State([])

with gr.Row():
    message = gr.Textbox(label="提问", placeholder="请输入你的问题", lines=4)
    submit = gr.Button("提交")

submit.click(predict, [message, state], [chatbot, state])
message.submit(predict, [message, state], [chatbot, state])

demo.launch(share=False, server_name="127.0.0.1", server_port=8080) ```

*   `gr.Blocks()`:创建一个Gradio应用。
*   `gr.Chatbot()`:创建一个聊天机器人组件,用于显示对话历史。
*   `gr.State([])`:创建一个状态变量,用于存储对话历史。
*   `gr.Textbox()`:创建一个文本框,用于接收用户输入。
*   `gr.Button()`:创建一个按钮,用于提交用户输入。
*   `submit.click()`和`message.submit()`:将提交按钮和文本框的回车事件绑定到`predict()`函数,当用户点击提交按钮或按下回车键时,`predict()`函数将被调用。
*   `demo.launch()`:启动Gradio应用,并指定应用的访问地址和端口。

进阶技巧

除了上述基本功能外,Gradio还提供了许多高级功能,可以进一步提升用户体验。

  • 自定义界面风格: Gradio允许你自定义界面的颜色、字体、布局等,使其更符合你的审美。
  • 添加多媒体输入: 除了文本输入外,你还可以添加图像、音频、视频等输入方式,让用户能够以更丰富的方式与模型进行交互。
  • 集成外部API: 你可以将Gradio应用与外部API集成,实现更复杂的功能。

常见问题及解决方案

  • 模型加载失败: 请检查模型路径是否正确,以及是否安装了所有必要的依赖库。
  • GPU显存不足: 尝试减小max_new_tokens的值,或使用更小的模型。
  • Gradio界面无法访问: 请检查端口是否被占用,以及防火墙是否阻止了对该端口的访问。

总结

通过本文的学习,你已经掌握了使用Gradio为Qwen模型创建交互界面的基本方法。希望你能以此为基础,进一步探索Gradio的强大功能,打造出更加智能、易用的AI应用。

至此,我们已经完成了Qwen模型Gradio界面的搭建。通过这个界面,用户可以方便地与Qwen模型进行对话,体验AI带来的乐趣。当然,这只是一个简单的示例,你可以根据自己的需求,进一步扩展和完善这个界面,例如添加更多的功能、优化界面风格等。