python系列&deep_study系列:Gradio中文教程(七)Interface State




Gradio中文教程(七)Interface State

接口状态

到目前为止,我们假设您的演示是无状态的:它们不会在单个函数调用之外保留信息。如果您想根据与演示的先前交互来修改演示的行为,该怎么办?Gradio中有两种方法:全局状态和会话状态。

全局状态

如果状态是应该对所有函数调用和所有用户都可访问的东西,您可以在函数调用之外创建一个变量,并在函数内部访问它。例如,您可以在函数外部加载一个大型模型,并在函数内部使用它,这样每个函数调用就不需要重新加载模型。

import gradio as gr

scores = []

def track_score(score):
    scores.append(score)
    top_scores = sorted(scores, reverse=True)[:3]
    return top_scores

demo = gr.Interface(
    track_score, 
    gr.Number(label="Score"), 
    gr.JSON(label="Top Scores")
)
demo.launch()

在上面的代码中,scores 数组在所有用户之间共享。如果多个用户正在访问此演示,他们的分数都将添加到同一个列表中,并且返回的前3个分数将从这个共享引用中收集。

会话状态

Gradio支持的另一种数据持久性是会话状态,其中数据在页面会话内的多个提交中持续存在。但是,数据不在您的模型的不同用户之间共享。要在会话状态中存储数据,您需要做三件事:

  1. 将一个额外的参数传递到您的函数中,该参数代表接口的状态。

  2. 在函数的末尾,将状态的更新值作为额外的返回值返回。

  3. 在创建您的 Interface 时,添加 ‘state’ 输入和 ‘state’ 输出组件。

这里有一个简单的应用程序来说明会话状态 - 这个应用程序简单地存储用户的先前提交,并将它们显示回给用户:

import gradio as gr

def store_message(message: str, history: list[str]):
    output = {
        "Current messages": message,
        "Previous messages": history[::-1]
    }
    history.append(message)
    return output, history

demo = gr.Interface(fn=store_message, 
                    inputs=["textbox", gr.State(value=[])], 
                    outputs=["json", gr.State()])

demo.launch()

注意状态如何在每个页面内的提交中持续存在,但是如果您在另一个标签页中加载此演示(或刷新页面),演示将不会共享聊天历史。在这里,我们不能将提交历史存储在全局变量中,否则提交历史将在不同用户之间混杂。

State 的初始值默认为 None。如果您将一个参数传递给 gr.State() 的 value 参数,它将用作状态的默认值。

注意:Interface 类仅支持单个会话状态变量(尽管它可以是一个包含多个元素的列表)。对于更复杂的使用情况,您可以使用 Blocks,它支持多个 State 变量。或者,如果您正在构建一个维护用户状态的聊天机器人,可以考虑使用 ChatInterface 抽象,它自动管理状态。







老刘

Gradio中文教程(七)Interface State

posted @ 2024-06-13 12:41  坦笑&&life  阅读(19)  评论(0编辑  收藏  举报  来源