背景
在使用Chatbot()过程中,需要定义机器人回复的函数,定义的时候其实可以借助数据类ChatMessage
让体验更好,因此记录一下,以供参考。
前置
- 已经安装了Gradio 并且 Version: 4.40.0
- 已经知道
Chatbot()
大概长啥样
数据类 ChatMessage
的使用或不用
前文提到,设定对话格式类型,支持tuples
和messages
。
在实际使用中,为了更好的提示与类型补全,Gradio 使用了@dataclass
这个python的装饰器,提供了 ChatMessage 数据类,会很方便地进行自动完成提示和类型检查。
这样使用只要改造两点就可以:
1 from gradio import ChatMessage
2 记得设定 gr.Chatbot()
的类型 type="messages"
具体参考代码和效果图是:
import gradio as gr
from gradio import ChatMessage
css = """
.gradio-container {
background-color: MediumPurple; overflow: visible !important; max-width: none !important;}
.outer {
background-color: rgba(100, 100, 100, 0); width: 100%; height: 900px; display: inline-block; overflow-y: scroll;}
.textTitle {
height: 100px; text-align: center; margin: 0 auto; display: flex; flex-flow: column; justify-content: center;
}
::-webkit-scrollbar {
width: 5px; /* 滚动条宽度 */}
"""
def give_reply_bot(history):
history.append(
ChatMessage(role="user",
metadata={"title": "从“时乐食记API”获取"},
content="根据“时乐食记API”提供的信息,一个鸡蛋的重量约 50 克,70 大卡。(现在这些都是写死的哈哈哈)。",
)
)
return history
with gr.Blocks(
css=css,
title="页签标题 | gr.Chatbot",
) as lookDemo:
with gr.Column(elem_classes="outer"):
with gr.Column():
gr.HTML(elem_classes="textTitle",
value="""
<h1> 用一用 Gradio 的 Chatbox() </h1> <p> Note by Fiestina </p> """ )
with gr.Column():
chatbot = gr.Chatbot(
give_reply_bot(history=[{"role": "user", "content": "一个鸡蛋有多重"}, ]),
type="messages"
)
if __name__ == "__main__":
lookDemo.launch()
使用 ChatMessage 有两个好处
这是我自己的看法,可能随着以后学习深入还会有其他认知。
1 可以使用metadata
def give_reply_bot(history):
history.append(
ChatMessage(role="user",
metadata={"title": "从“时乐食记API”获取"},
content="根据“时乐食记API”提供的信息,一个鸡蛋的重量约 50 克,70 大卡。(现在这些都是写死的哈哈哈)。",
)
)
return history
上面代码块就是使用了import进来的 ChatMessage 的能力直接定义好消息的相关部分。
值得注意的是,这里除了设定角色、回复内容,还可以设定元数据,也就是metadata。
个人认为,可能它在机器人借助其他有来源方消息参考的时候比较好用,比如从天气API获取天气、股票API获取价格等等,是可以尝试去结合实际业务的点,点击图片中的【 从“时乐食记API”获取】可以展开信息:
其实,抛开下面要说的第二点不谈,不用这个 ChatMessage
也照样可以定义函数并正确展示界面。
写法也大概都一样,不过不能使用 metadata了。
def say_hello_bot(history):
history.append({"role": "assistant", "content": "Hello!"})
return history
使用的方法也是一样,界面效果是:
2 在IDE中可以更好地在函数定义的时候检查类型
就是多点提示和自动补全:
使用了 ChatMessage
不使用 ChatMessage
大概就是这样(本文完)。