目录
文末附全部源代码
在上一章中,我们已经探索了如何构建一个用户友好的Web界面,使用户能够轻松地提出问题并获得AI的即时回答。
现在,我们将进一步深入,探讨如何运用AI技术来增强用户体验和应用程序的交互性。在特定功能的AI应用中,我们期望用户无需输入冗长的提示,而只需提供关键信息即可。
示例应用
以“产品起名神器”这一AI应用为例,用户仅需输入他们的产品信息,如下所示:
using (var blocks = gr.Blocks())
{
gr.Markdown("# 产品起名神器");
Textbox input, output;
using (gr.Row())
{
input = gr.Textbox(label: "产品");
output = gr.Textbox(label: "名称");
}
var btn = gr.Button("提交");
await btn.Click(fn: async (input) => gr.Output(await AskAi(input, kernel)), inputs: new[] { input }, outputs: new[] { output });
return blocks;
}
我们优化了AskAi函数,通过插值字符串来构建提交给AI的最终提示:
static async Task<string> AskAi(Input input, Kernel kernel)
{
var product = Textbox.Payload(input.Data[0]);
var prompt = $"为一家生产{product}的公司起一个好名字?并且只返回最好的一个。";
var result = await kernel.InvokePromptAsync(prompt);
return result.ToString();
}
如上所述,我们的示例应用中,大多数提示内容是固定的,仅用户输入的部分会发生变化。为了使提示与应用程序解耦,我们引入了提示模板功能。
提示模板
通过使用SK的模板语言,我们可以添加标记,这些标记将自动替换为输入参数。要在提示中包含变量值,我们使用{{$variableName}}
语法。
例如,使用提示模板后的AskAi函数可以这样实现:
static async Task<string> AskAi(Input input, Kernel kernel)
{
var product = Textbox.Payload(input.Data[0]);
var prompt = "为一家生产{{ $product }}的公司起一个好名字?并且只返回最好的一个。";
var result = await kernel.InvokePromptAsync(prompt, new (){ { "product", product } });
return result.ToString();
}
这样,提示内容可以完全独立于应用程序代码,甚至可以在多个应用程序之间共享。
结论
提示模板不仅提高了开发效率,也使得应用程序的维护和更新变得更加容易。
通过精心设计的提示模板,开发者能够构建更加灵活和可扩展的开发应用程序,从而使得用户与AI的互动更加自然和直观。
Gradio.NET(https://github.com/feiyun0112/Gradio.Net/)的目标是成为用于开发 Web 应用的 .NET 开发者的首选框架。它的设计理念是让开发变得更加简单,让每个人都能够参与到Web应用的创造中来。
添加微信GradioDotNet,通过加入技术讨论群,开发者们可以分享经验,解决问题,并共同推动.NET的发展。
完整源代码:
using Gradio.Net;
using Microsoft.SemanticKernel;
string endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_GPT_NAME");
string apiKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
var kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(
deploymentName: deploymentName,
endpoint: endpoint,
apiKey: apiKey)
.Build();
App.Launch(await CreateBlocks(kernel));
static async Task<Blocks> CreateBlocks(Kernel kernel)
{
using (var blocks = gr.Blocks())
{
gr.Markdown("# 产品起名神器");
Textbox input, output;
using (gr.Row())
{
input = gr.Textbox(label: "产品");
output = gr.Textbox(label: "名称");
}
var btn = gr.Button("提交");
await btn.Click(fn: async (input) => gr.Output(await AskAi(input, kernel)), inputs: new[] { input }, outputs: new[] { output });
return blocks;
}
}
static async Task<string> AskAi(Input input, Kernel kernel)
{
var product = Textbox.Payload(input.Data[0]);
var prompt = "为一家生产{{ $product }}的公司起一个好名字?并且只返回最好的一个。";
var result = await kernel.InvokePromptAsync(prompt, new() { { "product", product } });
return result.ToString();
}