使用gradio构建一个大模型多轮对话WEB应用

329 阅读6分钟

一个基于Gradio构建的大模型多轮对话Web界面,支持API密钥配置、模型参数调整和对话记录管理功能。

1.功能特点

  • 灵活的API配置:支持设置API密钥和自定义Base URL
  • 多模型选择:内置多种大模型选项,包括ernie系列模型
  • 参数可调:可调整温度参数和最大令牌数,控制输出效果
  • 对话管理:支持查看、清除和保存对话历史
  • 用户友好界面:直观的Web操作界面,无需编程知识即可使用

2.安装说明

2.1 前提条件

  • Python 3.8+环境
  • 有效的API密钥(根据使用的模型提供商获取)

2.2安装步骤

  1. 克隆或下载本项目到本地

  2. 安装依赖包

pip install gradio openai

3.使用方法

3.1 代码实现

import gradio as gr
import openai
import json
from datetime import datetime
from openai import OpenAI

# 设置OpenAI API密钥和Base URL
def set_model_config(api_key, base_url, model_name, temperature, max_tokens):
    if api_key:
        openai.api_key = api_key
    if base_url:
        openai.api_base = base_url
    # 保存模型参数到全局变量
    global MODEL_CONFIG
    MODEL_CONFIG = {
        "model_name": model_name,
        "temperature": temperature,
        "max_tokens": max_tokens
    }
    return f"配置已更新: 模型={model_name}, 温度={temperature}, 最大令牌={max_tokens}"

# 处理对话逻辑
def chat_with_model(user_message, history):
    # 转换历史记录为OpenAI API所需格式
    messages = []
    for user_msg, bot_msg in history:
        messages.append({"role": "user", "content": user_msg})
        messages.append({"role": "assistant", "content": bot_msg})
    messages.append({"role": "user", "content": user_message})
    
    # 使用全局模型配置
    global MODEL_CONFIG
    
    # 调用OpenAI API
    client = OpenAI(
                    api_key="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",  # Access Token属于个人账户的重要隐私信息,请谨慎管理,切忌随意对外公开,
                    base_url="https://aistudio.baidu.com/llm/lmapi/v3",  # aistudio 大模型 api 服务域名
                    )
    chat_completion = client.chat.completions.create(
                        model=MODEL_CONFIG["model_name"],
                        messages=messages,
                        temperature=MODEL_CONFIG["temperature"],
                        max_tokens=MODEL_CONFIG["max_tokens"]
                        )    

    print("chat_completion.choices[0].message.content:",chat_completion.choices[0])
    return chat_completion.choices[0].message.content

# 保存对话记录为JSONL格式
def save_chat_history(history, api_key):
    if not history:
        return "没有聊天记录可保存"
    
    # 确保API密钥已设置
    if api_key:
        openai.api_key = api_key
    
    # 生成带时间戳的文件名
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"chat_history_{timestamp}.jsonl"
    
    # 以JSONL格式保存
    with open(filename, "w", encoding="utf-8") as f:
        for user_msg, bot_msg in history:
            json.dump({"role": "user", "content": user_msg}, f, ensure_ascii=False)
            f.write("\n")
            json.dump({"role": "assistant", "content": bot_msg}, f, ensure_ascii=False)
            f.write("\n")
    
    return f"聊天记录已保存至: {filename}"

# 创建Gradio界面
with gr.Blocks(title="大模型多轮对话") as demo:
    gr.Markdown("# 大模型多轮对话界面")
    
    # 初始化全局模型配置
    global MODEL_CONFIG
    MODEL_CONFIG = {
        "model_name": "ernie-4.0-8k-latest",
        "temperature": 0.7,
        "max_tokens": 1024
    }
    
    with gr.Row():
        api_key_input = gr.Textbox(
            label="OpenAI API密钥", 
            type="password",
            placeholder="请输入您的OpenAI API密钥",
            value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        )
        base_url_input = gr.Textbox(
            label="大模型Base URL",
            placeholder="请输入大模型的Base URL (可选)",
            value="https://aistudio.baidu.com/llm/lmapi/v3"
        )
        set_key_btn = gr.Button("设置API配置")
        key_status = gr.Textbox(label="配置状态", interactive=False)
    
    # 先定义模型参数输入控件
    with gr.Accordion("模型参数设置", open=False):
        model_name_input = gr.Dropdown(
            label="模型选择",
            choices=["ernie-4.5-0.3b", "ernie-4.0-8k-latest","ernie-4.5-turbo-vl-preview"],
            value="ernie-4.5-0.3b"
        )
        temperature_slider = gr.Slider(
            label="温度参数",
            minimum=0.0, maximum=2.0, value=0.7, step=0.1,
            info="控制输出的随机性,值越高越随机,值越低越确定"
        )
        max_tokens_slider = gr.Slider(
            label="最大令牌数",
            minimum=128, maximum=4096, value=1024, step=128,
            info="控制输出的最大长度"
        )
    
    # 再定义按钮点击事件(现在可以引用上面定义的控件了)
    set_key_btn.click(
        fn=set_model_config,
        inputs=[api_key_input, base_url_input, model_name_input, temperature_slider, max_tokens_slider],
        outputs=[key_status]
    )
    
    chatbot = gr.Chatbot(height=500)
    msg = gr.Textbox(label="输入消息")
    clear = gr.Button("清除对话")
    save_btn = gr.Button("保存对话记录")
    save_status = gr.Textbox(label="保存状态", interactive=False)
    
    def user(user_message, history):
        return "", history + [[user_message, None]]
    
    def bot(history, api_key):
        if not api_key and not openai.api_key:
            history[-1][1] = "请先设置OpenAI API密钥"
            return history
        
        if api_key:
            openai.api_key = api_key
        
        user_message = history[-1][0]
        bot_response = chat_with_model(user_message, history[:-1])
        history[-1][1] = bot_response
        return history
    
    msg.submit(
        user, [msg, chatbot], [msg, chatbot], queue=False
    ).then(
        bot, [chatbot, api_key_input], [chatbot]
    )
    
    clear.click(lambda: None, None, chatbot, queue=False)
    
    save_btn.click(
        fn=save_chat_history,
        inputs=[chatbot, api_key_input],
        outputs=[save_status]
    )

if __name__ == "__main__":
    demo.launch()

截图 2025-08-03 19-31-23.png

3.2 启动应用

在项目目录下执行以下命令启动Web界面:

python app.py

应用启动后,会自动在默认浏览器中打开界面,或手动访问终端中显示的URL(通常为 http://localhost:7860)。

截图 2025-08-03 19-25-34.png

3.3 基本配置

  1. API配置

    • 在"OpenAI API密钥"输入框中填写您的API密钥
    • 如需使用自定义API服务,在"大模型Base URL"输入框中填写服务地址
    • 点击"设置API配置"按钮使配置生效
  2. 模型参数设置 点击"模型参数设置"展开面板,可配置以下参数:

    • 模型选择:从下拉菜单选择要使用的大模型
    • 温度参数:滑块调整(0.0-2.0),值越高输出越随机,值越低越确定
    • 最大令牌数:滑块调整(128-4096),控制单次输出的最大长度

3.4 对话操作

  1. 在底部输入框中键入消息,按Enter键或点击发送按钮提交
  2. 对话历史会显示在上方聊天窗口中
  3. 点击"清除对话"按钮可清空当前对话历史
  4. 点击"保存对话记录"按钮可将当前对话保存为JSONL格式文件
{"role": "user", "content": "你好"}
{"role": "assistant", "content": "你好呀!😊 😊 有什么我可以帮你的吗?无论是学习、生活还是兴趣爱好,都可以随时告诉我哦~ 😊"}
{"role": "user", "content": "请问你的模型名称叫什么?"}
{"role": "assistant", "content": "我的模型叫“AI助手”,🤖 😊。如果你有任何问题或者需要帮助,随时告诉我哦!"}
{"role": "user", "content": "我叫你可乐可以吗?"}
{"role": "assistant", "content": "当然可以啦!🍹 没问题,AI助手会根据你的需求提供帮助,比如回答问题、生成建议,或者陪你聊天~ 😊"}
{"role": "user", "content": "可乐给我讲个故事"}
{"role": "assistant", "content": "当然可以呀!🍹 我可是AI助手,专门帮你讲故事呢~你讲的故事里有没有特别有趣或感人的情节呀?比如故事里的角色、情节,或者故事中某个场景让你觉得特别温暖呢?告诉我,AI帮你一起创造美好的回忆吧!😄"}

4.配置说明

4.1默认配置

4.2支持的模型

目前支持的模型包括:

  • ernie-4.5-0.3b
  • ernie-4.0-8k-latest
  • ernie-4.5-turbo-vl-preview

5.文件说明

  • app.py:应用程序主文件,包含所有功能实现
  • 聊天记录文件:以chat_history_YYYYMMDD_HHMMSS.jsonl格式命名,保存在项目根目录

6.注意事项

  • API密钥属于敏感信息,请妥善保管,不要分享给他人
  • 对话记录文件保存在本地,请注意定期备份重要记录
  • 不同模型对参数支持可能有所差异,如遇问题可尝试调整参数或更换模型
  • 网络连接不稳定可能导致对话失败,请确保网络通畅

7.故障排除

常见问题

  1. API连接错误

    • 检查API密钥是否正确
    • 确认Base URL配置正确
    • 检查网络连接
  2. 模型响应超时

    • 尝试减少最大令牌数
    • 检查网络状况
    • 稍后重试
  3. 界面显示异常

    • 刷新浏览器页面
    • 清除浏览器缓存
    • 确保gradio版本为最新

8.依赖包

  • gradio:构建Web界面
  • openai:与大模型API交互
  • json:处理对话记录的JSONL格式
  • datetime:生成时间戳用于保存文件