前言
前面的章节介绍了Gradio的接口类,组件,让我们对Gradio有了整体的认识,接下来,我们使用Gradio一步一步搭建一个基于大模型的聊天机器人,整个过程循序渐进,从最简单的问答,到多模态,再到引入大模型,langchain等,让我们开始吧;
一、傻瓜机器人
在Gradio中构建聊天机器人只需要调用gr.ChatInterface()接口即可完成界面搭建,接下来我们写一个很傻瓜的机器人示例代码如下
import random
import gradio as gr
def alternatingly_agree(message, history):
if len(history) % 2 == 0:
return f"Yes, I do think that '{message}'"
else:
return "I don't think so"
gr.ChatInterface(alternatingly_agree).launch()
二、流媒体聊天机器人
我们在使用聊天机器人时,机器人响应往往是流式传输,所以这里我们模拟一个流式响应的机器人回复;当响应流式传输时,“提交”按钮会变成“停止”按钮,可用于停止生成器功能。您可以使用“stop_btn”参数自定义“停止”按钮的外观和行为。
import time
import gradio as gr
def slow_echo(message, history):
for i in range(len(message)):
time.sleep(0.3)
yield "You typed: " + message[: i+1]
gr.ChatInterface(slow_echo).launch()
三、自定义聊天界面
gr.ChatInterface包含许多参数,您可以使用这些参数来自定义聊天机器人的外观及功能,使其符合你的需求
参数名 | 描述 |
---|---|
fn | 要围绕聊天界面包装的函数。该函数应接受两个参数:一个字符串输入消息和一个由形如[[user_message, bot_message], ...] 的两元素列表组成的列表,表示聊天历史,并返回一个字符串响应。有关聊天历史格式的更多信息,请参阅Chatbot文档。 |
multimodal | 如果为True,聊天界面将使用gr.MultimodalTextbox 组件作为输入,允许上传多媒体文件。如果为False,聊天界面将使用gr.Textbox 组件作为输入。 |
chatbot | 如果想要自定义聊天机器人的属性,则可以使用gr.Chatbot 组件的实例作为聊天界面的聊天机器人。如果未提供,将创建一个默认的gr.Chatbot 组件。 |
textbox | 如果想要自定义文本框的属性,则可以使用gr.Textbox 或gr.MultimodalTextbox 组件的实例作为聊天界面的文本框。如果未提供,将创建默认的gr.Textbox 或gr.MultimodalTextbox 组件。 |
additional_inputs | 聊天机器人所需的额外输入的Gradio组件实例(或其字符串快捷方式)的单个实例或实例列表。如果组件尚未在周围的Blocks中渲染,则这些组件将在聊天机器人下方的手风琴(accordion)中显示。 |
additional_inputs_accordion_name | 已弃用。将在Gradio的未来版本中移除。请使用additional_inputs_accordion 参数代替。 |
additional_inputs_accordion | 如果提供字符串,则这是用于包含额外输入的gr.Accordion 的标签。也可以提供gr.Accordion 对象来配置包含额外输入的容器的其他属性。默认为gr.Accordion(label="Additional Inputs", open=False) 。此参数仅在提供additional_inputs 时使用。 |
examples | 函数的示例输入;如果提供,则显示在聊天机器人下方,并可通过点击来填充聊天机器人。 |
代码如下(示例):
import gradio as gr
def yes_man(message, history):
if message.endswith("?"):
return "Yes"
else:
return "Ask me anything!"
gr.ChatInterface(
yes_man,
chatbot=gr.Chatbot(height=300),
textbox=gr.Textbox(placeholder="Ask me a yes or no question", container=False, scale=7),
title="Yes Man",
description="Ask Yes Man any question",
theme="soft",
examples=["Hello", "Am I cool?", "Are tomatoes vegetables?"],
cache_examples=True,
retry_btn=None,
undo_btn="Delete Previous",
clear_btn="Clear",
).launch()
四、使用火星大模型的聊天机器人
搜索了一下火星大模型送一些免费的token,所以这里调用火星大模型做一个实例,几行代码就可以打造一个基于大模型的聊天机器人。
在逛网注册后,进入服务管理
创建新应用,名字自定义
创建完成后,选择对应模型可以看到对应的APIKey和APISecret
有了这些信息,我们通过OpenAI SDK 几行代码就可以做一个聊天机器人,将下列代码中的key和secret换成你的
# 导入SDK,发起请求
from openai import OpenAI # 从openai模块导入OpenAI类,用于实例化客户端
import gradio as gr # 导入gradio库,用于创建交互式Web界面
# 控制台获取key和secret拼接,假使APIKey是key123456,APISecret是secret123456
spark_api_key="key123456:secret123456" #这里一定要换成你的哦 !!!!!!!!!!!!!!!
spark_base_url = 'https://spark-api-open.xf-yun.com/v1' # 指向讯飞星火的请求地址
spark_model='generalv3.5' # 指定请求的版本
client = OpenAI(api_key=spark_api_key,base_url=spark_base_url) # 使用你的API密钥实例化OpenAI客户端
# 定义predict函数,它接受用户的消息和聊天历史作为输入
def predict(message, history):
history_openai_format = [] # 创建一个空列表用于存储处理过的历史记录
for human, assistant in history: # 遍历历史对话
# 将每条历史消息按照OpenAI所需的格式添加到列表中
history_openai_format.append({"role": "user", "content": human })
history_openai_format.append({"role": "assistant", "content":assistant})
# 将最新的用户消息也以相同的格式添加到列表
history_openai_format.append({"role": "user", "content": message})
# 使用客户端请求GPT-3.5-turbo模型的回复,传入处理过的历史消息和其他参数
response = client.chat.completions.create(model=spark_model,
messages= history_openai_format,
temperature=1.0,
stream=True)
#print(response.choices[0].message) # 打印OpenAI的响应
partial_message = "" # 初始化用于收集模型响应的字符串
for chunk in response: # 遍历响应中的每个部分
if chunk.choices[0].delta.content is not None: # 如果响应部分有内容
partial_message += chunk.choices[0].delta.content # 将其添加到累积的响应字符串completion.choices[0].message
yield partial_message # 使用yield返回累积的响应字符串,实现流式响应
gr.ChatInterface(predict).launch() # 使用Gradio的ChatInterface调用predict函数,并启动Web界面
好了,看看效果吧
总结
本章展示了一步一步使用gradio和火星大模型打造聊天机器人的过程,可以看到打造基于gradio的应用速度非常快,几行代码就可以完成一个应用。