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; // 全局状态示例跟踪所有用户的分数 Listint scores new Listint(); 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 支持的另一种数据持久化类型是会话状态其中数据在页面会话内的多次提交之间持久化。但是数据不会在模型的不同用户之间共享。要将数据存储在会话状态中您需要执行三件事向函数中传入一个额外的参数该参数表示界面的状态。在函数末尾将状态的更新值作为额外的返回值返回。在创建 Interface 时添加 state 输入和 state 输出组件。下面是一个简单的应用程序来说明会话状态 - 这个应用程序简单地存储用户之前的提交并将它们显示回给用户using Gradio.Net; // 会话状态示例存储用户的消息历史 (string, Liststring) StoreMessage(string message, Liststring history) { // 如果历史为空初始化一个新列表 if (history null) { history new Liststring(); } // 创建输出消息 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 Liststring())], outputs: [gr.Textbox(label: 消息历史), gr.State()] ); await demo.Launch();请注意状态如何在每个页面的多次提交之间保持但如果您在另一个标签页中加载此演示或刷新页面演示将不会共享聊天历史记录。在这里我们不能将提交历史存储在全局变量中否则提交历史会在不同用户之间混淆。State 的初始值默认为null。如果您将参数传递给gr.State()的value参数它将被用作状态的默认值。注意Interface 类仅支持单个会话状态变量尽管它可以是包含多个元素的列表。对于更复杂的用例您可以使用 Blocks它支持多个 State 变量。或者如果您正在构建维护用户状态的聊天机器人请考虑使用 ChatInterface 抽象它会自动管理状态。状态的注意事项全局状态会在所有用户之间共享如果您使用全局变量来存储状态所有访问您应用程序的用户都会共享同一个状态这可能导致意外行为。会话状态仅在单个用户会话中持久化每个用户会话都有自己独立的状态不会与其他用户共享。状态必须是 JSON 可序列化的Gradio.Net 使用 JSON 来序列化和反序列化状态因此您的状态必须是 JSON 可序列化的类型。状态可以是复杂类型您可以使用列表、字典等复杂类型作为状态只要它们是 JSON 可序列化的。总结在本指南中我们学习了 Gradio.Net 中的两种状态管理方法全局状态使用函数外部的变量来存储对所有用户和所有函数调用都可访问的数据。会话状态使用 gr.State组件来存储在单个用户会话内持久化的数据不会在不同用户之间共享。状态管理是构建复杂 Gradio.Net 应用程序的重要工具它允许您基于之前的交互来修改应用程序的行为提供更丰富的用户体验。引入地址