ChatInterface
是 Gradio 提供的一个专门用于构建聊天应用的类,它可以帮助你创建一个交互式的对话系统,支持用户输入和模型的实时响应。这个接口非常适合构建聊天机器人、问答系统或其他对话类应用。
1. 进度显示
import gradio as gr import time def response1(number): # 创建进度条 progress = gr.Progress() result = 0.0 for i in range(1, number + 1): # 设置进度条的进度 # progress((i, number), desc="准备计算") progress(i / number, desc="准备计算") result += i time.sleep(0.1) return result def response2(number): progress = gr.Progress() # 创建 tqdm 进度条,并让 progress 跟踪其进度 pbar = progress.tqdm(iterable=range(number), desc='正在计算') result = 0.0 for i in pbar: result += i time.sleep(0.1) return result def test(): app = gr.Interface(fn=response1, inputs='number', outputs='number') app.launch() if __name__ == '__main__': test();
2. 迭代输出
import gradio as gr def test(): # 注意:只需将 fn 函数修改为 yield 生成器 def response(number): data = '风起时,叶子轻轻摇,无声地诉说着秋的寂寥。云在天边低语,柔和轻飘,像是在远方寻找着归巢。' output = '' for index in range(number): time.sleep(1) output += data[index] yield output app = gr.Interface(fn=response, inputs='number', outputs='text') app.launch() if __name__ == '__main__': test();
3. 输出标记
Flagging 的目的是将用户看到的输入、输出结果提交服务器端。这在有些场景下比较有用,例如:用户可以反馈模型的预测结果。
import gradio as gr class MyFlaggingCallback(gr.FlaggingCallback): def setup(self, components, flagging_dir): """ :param components: 输入和输出控件对象 :param flagging_dir: 标记信息存储路径 :return: """ print('setup', components, flagging_dir) def flag(self, flag_data, flag_option, username): """ :param flag_data: 输入和输出数据,例如:[12, 22] :param flag_option: 标记的值 :param username: None :return: """ print('flag', flag_data, flag_option, username) def response(number): return number + 10 def test(): # allow_flagging: never 禁用 auto 每次自动标记 manual 每次手动标记 # flagging_dir: 默认 flagged,表示标记的记录存储路径 demo = gr.Interface(response, inputs='number', outputs='number', allow_flagging='manual', flagging_dir='flagged', flagging_options=['错误', '违法'], flagging_callback=MyFlaggingCallback()) demo.launch() if __name__ == "__main__": test()
4. 会话保持
Gradio 会话保持(Session State)是指在用户会话过程中,保存用户请求的数据。这对于需要跟踪用户状态、或在用户交互中保留上下文的应用程序非常有用。
- 全局会话保持:用户共享历史信息
- 用户会话保持:用户独享历史信息
import gradio as gr # 全局记录 def test01(): states = [] def response(content): states.append(content) return content, '\n'.join(states) app = gr.Interface(fn=response, inputs='text', outputs=['text', 'text']) app.launch() # 用户记录 def test02(): def response(content, history): history.append(content) return content, '\n'.join(history), history # 输入和输出必须有且只有 gr.State() # 临时记忆,刷新浏览器后信息丢失 history = gr.State([]) app = gr.Interface(fn=response, inputs=['text', history], outputs=['text', 'text', history]) app.launch() if __name__ == '__main__': test02()
5. 提示信息
import gradio as gr def response(text): if text in ['i', 'I']: gr.Info('这是普通消息', duration=1) return 'no' if text in ['w', 'W']: gr.Warning('这是警告消息', duration=1) return 'no' if text in ['e', 'E']: raise gr.Error('这是错误消息', duration=3) return 'OK' def test(): demo = gr.Interface(response, inputs='text', outputs='text') demo.launch(show_error=True, debug=True) if __name__ == "__main__": test()