使用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:生成时间戳用于保存文件
相关推荐
风象南5 小时前
我把大脑开源给了AI
人工智能·后端
橙序员小站10 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德10 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆12 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好202513 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字13 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常13 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强13 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端
小码哥_常14 小时前
Spring Boot接口防抖秘籍:告别“手抖”,守护数据一致性
后端
心之语歌14 小时前
基于注解+拦截器的API动态路由实现方案
java·后端