Gradio.Net 开发指南 -- Interface 状态管理

📅 2026/7/24 16:23:13 👁️ 阅读次数 📝 编程学习
Gradio.Net 开发指南 -- Interface 状态管理

目录

Interface 状态管理

全局状态

会话状态

状态的注意事项

总结



上一篇

Gradio.Net (https://github.com/feiyun0112/Gradio.Net)是一个开源的 .NET 库,它是 Gradio 的 .NET 移植版本,允许你为机器学习模型、API 或任何 C# 函数快速构建演示或 Web 应用程序,无需任何 JavaScript、CSS 或 Web 开发经验!

Interface 状态管理

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

全局状态

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

using Gradio.Net; // 全局状态示例:跟踪所有用户的分数 List<int> scores = new List<int>(); string TrackScore(int score) { scores.Add(score); var topScores = scores.OrderByDescending(s => s).Take(3).ToList(); return $"当前分数: {score}\n前3名分数: {string.Join(", ", topScores)}"; } var demo = gr.Interface( fn: TrackScore, inputs: new object[] { gr.Number(label: "分数") }, outputs: new object[] { gr.Textbox(label: "结果") }, apiName: "predict" ); await demo.Launch();

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

会话状态

Gradio.Net 支持的另一种数据持久化类型是会话状态,其中数据在页面会话内的多次提交之间持久化。但是,数据不会在模型的不同用户之间共享。要将数据存储在会话状态中,您需要执行三件事:

  1. 向函数中传入一个额外的参数,该参数表示界面的状态。

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

  3. 在创建 Interface 时添加 'state' 输入和 'state' 输出组件。

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

using Gradio.Net; // 会话状态示例:存储用户的消息历史 (string, List<string>) StoreMessage(string message, List<string> history) { // 如果历史为空,初始化一个新列表 if (history == null) { history = new List<string>(); } // 创建输出消息 var output = $"当前消息: {message}\n之前的消息: {string.Join("\n", history.AsEnumerable().Reverse())}"; // 将当前消息添加到历史记录中 history.Add(message); // 返回输出和更新后的历史记录 return (output, history); } var demo = gr.Interface( fn: StoreMessage, inputs: ["textbox", gr.State(value: new List<string>())], outputs: [gr.Textbox(label: "消息历史"), gr.State()] ); await demo.Launch();

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

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

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

状态的注意事项

  1. 全局状态会在所有用户之间共享:如果您使用全局变量来存储状态,所有访问您应用程序的用户都会共享同一个状态,这可能导致意外行为。

  2. 会话状态仅在单个用户会话中持久化:每个用户会话都有自己独立的状态,不会与其他用户共享。

  3. 状态必须是 JSON 可序列化的:Gradio.Net 使用 JSON 来序列化和反序列化状态,因此您的状态必须是 JSON 可序列化的类型。

  4. 状态可以是复杂类型:您可以使用列表、字典等复杂类型作为状态,只要它们是 JSON 可序列化的。

总结

在本指南中,我们学习了 Gradio.Net 中的两种状态管理方法:

  1. 全局状态:使用函数外部的变量来存储对所有用户和所有函数调用都可访问的数据。

  2. 会话状态:使用 ‎gr.State组件来存储在单个用户会话内持久化的数据,不会在不同用户之间共享。

状态管理是构建复杂 Gradio.Net 应用程序的重要工具,它允许您基于之前的交互来修改应用程序的行为,提供更丰富的用户体验。

引入地址