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

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

1.功能特点

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

2.安装说明

2.1 前提条件

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

2.2安装步骤

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

  2. 安装依赖包

bash 复制代码
pip install gradio openai

3.使用方法

3.1 代码实现

python 复制代码
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()

3.2 启动应用

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

bash 复制代码
python app.py

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

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格式文件
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:生成时间戳用于保存文件
相关推荐
日月卿_宇11 小时前
分布式事务
java·后端
齐 飞11 小时前
XXL-JOB快速入门
spring boot·后端·spring cloud
MacroZheng11 小时前
别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?
java·spring boot·后端
AAA修煤气灶刘哥11 小时前
从 “库存飞了” 到 “事务稳了”:后端 er 必通的分布式事务 & Seata 闯关指南
java·后端·spring cloud
一刻缱绻11 小时前
iptables MASQUERADE规则对本地回环地址的影响分析
后端·tcp/ip
码事漫谈11 小时前
Hello World背后的秘密:详解 C++ 编译链接模型
后端
brzhang11 小时前
现在有一种深深的感觉,觉大多数情况下,多 Agent 不如单 Agent 好
前端·后端·架构
码事漫谈12 小时前
C++ 类型系统浅析:值类别与引用类型
后端
shark_chili12 小时前
程序员必读:CPU运算原理深度剖析与浮点数精度问题实战指南
后端
Java中文社群12 小时前
崩了!Nacos升级到3.0竟不能用了,哭死!
java·后端