【黄啊码】Gradio配合Openai接口实现机器人问答对话

ops/2024/9/23 13:15:55/
aidu_pl">
  1. Gradio 实现 OpenAI 流式问答机器人教程

本文将介绍如何使用Gradio和OpenAI API来实现一个流式问答机器人。通过这个教程,你将学会如何构建一个可以处理文本输入并返回连续响应的聊天机器人。

环境准备

在开始之前,确保你已经安装了必要的Python库。你可以使用以下命令安装Gradio和OpenAI库:

pip install gradio openai

代码结构

我们将代码分为几个部分进行详细解读:

  1. 导入必要的库

  2. 定义消息添加函数

  3. 定义机器人响应函数

  4. 创建Gradio界面

1. 导入必要的库

首先,我们需要导入Gradio和OpenAI库,以及操作系统相关的库。

import os

import gradio as gr from openai

import OpenAI

2. 定义消息添加函数

add_message函数用于将用户的输入消息添加到聊天记录中。

def add_message(history, message):for x in message["files"]:history.append(((x,), None))if message["text"] is not None:history.append((message["text"], None))return history, gr.MultimodalTextbox(value=None, interactive=False)

函数参数:

  • history:聊天记录。

  • message:用户输入的消息,是一个字符串。

函数功能:

  • 将文件或文本消息添加到聊天记录中。

  • 返回更新后的聊天记录和一个新的空的输入框。

3. 定义机器人响应函数

bot函数用于处理用户输入,并通过OpenAI API生成机器人响应。

def bot(history):history[-1][1] = ""history_openai_format = []for human, assistant in history[:-1]:history_openai_format.append({"role": "user", "content": human})history_openai_format.append({"role": "assistant", "content": assistant})history_openai_format.append({"role": "user", "content": history[-1][0]})client = OpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",)completion = client.chat.completions.create(model="qwen-turbo",messages=history_openai_format,temperature=0.1,stream=True,)for chunk in completion:history[-1][1] += chunk.choices[0].delta.contentyield history

函数参数:

  • history:聊天记录。

函数功能:

  • 从聊天记录中获取最新的用户输入(prompt)。

  • 拼接历史消息history,这是一个二维数组,每条消息包含用户输入和LLM输出。

  • 使用OpenAI API创建一个聊天完成请求。

  • 设置API请求的模型和消息内容。

  • 逐步接收API响应,并将内容追加到最新的消息响应中。

  • 使用yield逐步更新聊天记录,实现流式响应。

为方便对接国内大模型,我们使用了DashScope API代替OpenAI API,只需要改写api_key、base_url和model即可使用。

4. 创建Gradio界面

接下来,我们使用Gradio创建一个用户界面来展示聊天机器人。

python">with gr.Blocks() as demo:chatbot = gr.Chatbot([], elem_id="chatbot", bubble_full_width=False)chat_input = gr.MultimodalTextbox(interactive=True,file_types=[],placeholder="Enter message or upload file...",show_label=False,)chat_msg = chat_input.submit(add_message, [chatbot, chat_input], [chatbot, chat_input])bot_msg = chat_msg.then(bot, chatbot, chatbot, api_name="bot_response")bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])demo.queue()
demo.launch()

步骤说明:

  • 创建一个gr.Blocks实例作为整个应用的容器。

  • 创建一个Chatbot组件来显示聊天内容。

  • 创建一个MultimodalTextbox组件作为用户的输入框。

  • 当用户提交消息时,调用add_message函数更新聊天记录。

  • 使用then方法链式调用bot函数处理并生成机器人响应。

  • 重新启用输入框供用户继续输入。

  • 最后,通过launch()启动Gradio应用。

完整代码

python">import osimport gradio as gr
from openai import OpenAIdef add_message(history, message):for x in message["files"]:history.append(((x,), None))if message["text"] is not None:history.append((message["text"], None))return history, gr.MultimodalTextbox(value=None, interactive=False)def bot(history):history[-1][1] = ""history_openai_format = []for human, assistant in history[:-1]:history_openai_format.append({"role": "user", "content": human})history_openai_format.append({"role": "assistant", "content": assistant})history_openai_format.append({"role": "user", "content": history[-1][0]})client = OpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",)completion = client.chat.completions.create(model="qwen-turbo",messages=history_openai_format,temperature=0.1,stream=True,)for chunk in completion:history[-1][1] += chunk.choices[0].delta.contentyield historywith gr.Blocks() as demo:chatbot = gr.Chatbot([], elem_id="chatbot", bubble_full_width=False)chat_input = gr.MultimodalTextbox(interactive=True,file_types=[],placeholder="Enter message or upload file...",show_label=False,)chat_msg = chat_input.submit(add_message, [chatbot, chat_input], [chatbot, chat_input])bot_msg = chat_msg.then(bot, chatbot, chatbot, api_name="bot_response")bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])demo.queue()
demo.launch()

效果展示

可以看到,LLM响应是流式输出的,并且LLM在处理第二个问题“里面有哪些教程”时,理解了用户想要问的上下文是“Datawhale里面有哪些教程”。

暂时无法在飞书文档外展示此内容

总结

通过上述步骤,我们成功地实现了一个基于Gradio和OpenAI的流式问答机器人。这个教程展示了如何处理用户输入并使用OpenAI API生成连续的响应,希望对你有所帮助。

现在,你可以根据自己的需求进一步定制和扩展这个聊天机器人,例如添加更多的对话逻辑或支持更多类型的输入。


http://www.ppmy.cn/ops/87442.html

相关文章

python map

在 Python 中,如果你指的是字典(dictionary),可以使用字典的 .items() 方法来遍历键值对。Python 中没有严格意义上的 Map 类型,而是使用字典来实现类似于键值对映射的功能。 遍历字典的键值对 可以使用 for 循环和 …

54、PHP 实现希尔排序

题目: PHP 实现希尔排序 描述: 思路分析:希尔排序是基于插入排序的,区别在于插入排序是相邻的一个个比较(类似于希尔中h1的情形),而希尔排序是距离h的比较和替换。 希尔排序中一个常数因子n&a…

慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第三部分

分析代码 解析完虚拟化部分,我们继续分析启动过程中,对中断控制器的处理 #ifdef CONFIG_ARM_GIC_V3/* GICv3 system register access */mrs x0, id_aa64pfr0_el1ubfx x0, x0, #ID_AA64PFR0_GIC_SHIFT, #4cbz x0, 3fmrs_s x0, SYS_ICC_SRE_EL2orr x0, x…

【Vulnhub系列】Vulnhub_Seattle_003靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Seattle_003靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

【Django】ajax和django接口交互(获取新密码)

文章目录 一、需求1. 效果图 二、实验1. 写get接口后端2. 写html后端3. 写前端4. 测试 一、需求 1. 效果图 二、实验 1. 写get接口后端 写views import string import random def getnewpwd(request):words list(string.ascii_lowercasestring.ascii_uppercasestring.digi…

政安晨:【Keras机器学习示例演绎】(五十七)—— 基于Transformer的推荐系统

目录 介绍 数据集 设置 准备数据 将电影评分数据转换为序列 定义元数据 创建用于训练和评估的 tf.data.Dataset 创建模型输入 输入特征编码 创建 BST 模型 开展培训和评估实验 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的…

端口映射工具对比

背景: 在开发网络程序的时候常常会用到内网的服务器(工具)需要开放到公网上,方便移动设备(4G等)连接。或者公司内网的erp或其他的系统需要居家访问,也需要把内网的http或者https端口映射到外网&…

3.Java面试题之AQS

1. 写在前面 AQS(AbstractQueuedSynchronizer)是Java并发包(java.util.concurrent)中的一个抽象类,用于实现同步器(如锁、信号量、栅栏等)。AQS提供了一种基于FIFO队列的机制来管理线程的竞争和…