当前位置: 首页 > news >正文

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

  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创建一个用户界面来展示聊天机器人。

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应用。

完整代码

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生成连续的响应,希望对你有所帮助。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JAR文件中混淆和加密class文件
  • Linux系统编程-多路IO套接字
  • GenAI 会消灭软件开发人员的工作吗?
  • Modbus通讯协议
  • linux top
  • 蓝牙网关北京厂家_蓝牙网关型号价格介绍
  • 软件安全测试内容和方法大揭秘,湖南软件测评公司推荐
  • ubuntu22安装k8s-1.24.17
  • 07 Redis List类型操作与使用场景
  • 【Vulnhub靶场AI-WEB-1.0打靶教程】
  • MySQL——日期与时间类型
  • 1000W长连接,如何建立和维护?千万用户IM 架构设计
  • PHP苹果 V X iPhone微商i o s多分开V X语音转发密友朋友圈一键跟圈软件
  • C#中读写INI配置文件
  • 前端入门知识分享:HTML 页面中 head 标签之间的代码详解
  • canvas 高仿 Apple Watch 表盘
  • docker-consul
  • JavaScript HTML DOM
  • Js基础知识(四) - js运行原理与机制
  • Js基础知识(一) - 变量
  • learning koa2.x
  • Linux快速复制或删除大量小文件
  • PHP面试之三:MySQL数据库
  • Python打包系统简单入门
  • Python学习之路13-记分
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue-loader 源码解析系列之 selector
  • 闭包--闭包之tab栏切换(四)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 前端技术周刊 2019-02-11 Serverless
  • 思考 CSS 架构
  • 算法---两个栈实现一个队列
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 优化 Vue 项目编译文件大小
  • const的用法,特别是用在函数前面与后面的区别
  • 阿里云服务器购买完整流程
  • #define与typedef区别
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #传输# #传输数据判断#
  • $.ajax中的eval及dataType
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (TOJ2804)Even? Odd?
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (五)Python 垃圾回收机制
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (自用)仿写程序
  • ***详解账号泄露:全球约1亿用户已泄露
  • .Net 8.0 新的变化
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET单元测试使用AutoFixture按需填充的方法总结