【OpenAI&SK】:实现自己的问答机器人

前ChatGPT让人惊叹的是,它好像有了真人的思维逻辑,能记住上下文,还能很融洽地和你聊天,并且回答问题让你满意。但如果你问他一些自己身边事,或者公司最新产品的事,ChatGPT的回复就天马行空了。怎么才能让他成为自己的问答机器人呢?下面给出了一个简单的事例,一起看一下吧。

后端代码:

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Memory.Sqlite;
using Microsoft.SemanticKernel.Orchestration;
using Microsoft.SemanticKernel.SkillDefinition;
var builder = WebApplication.CreateBuilder(args);
await builder.AddEmband();
var app = builder.Build();
app.UseStaticFiles();
app.MapGet("/bot", async (IKernel kernel, SKContext context, ISKFunction semanticFunction, string ask,CancellationToken token) =>
{
    var facts = kernel.Memory.SearchAsync("gsw", ask, limit: 10, withEmbeddings: true,cancellationToken:token);
    var fact = await facts.FirstOrDefaultAsync(cancellationToken: token);
    context["fact"] = fact?.Metadata?.Text!;
    context["ask"] = ask;
    var resultContext = await semanticFunction.InvokeAsync(context);
    return resultContext.Result;
});
app.Run();
public static class BuilderExt
{
    public static async Task AddEmband(this WebApplicationBuilder builder)
    {
        var key = File.ReadAllText(@"C:\\GPT\key.txt");
        var store = Directory.GetCurrentDirectory() + "/db.sqlite";
        var kernel = Kernel.Builder                 
                   .WithOpenAITextCompletionService("text-davinci-003", key, serviceId: "gsw")
                   .WithOpenAITextEmbeddingGenerationService("text-embedding-ada-002", key, serviceId: "gsw")
                   .WithMemoryStorage(await SqliteMemoryStore.ConnectAsync(store))
                   .Build();
        const string MemoryCollectionName = "gsw";
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info0", text: "名字叫桂素伟");
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info1", text: "性别男,身高171cm,\r\n体重75千克");
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info2", text: "职业是农民,他擅长种茄子");
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info3", text: "有20年的种地经验");
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info4", text: "现在住在五十亩村");
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info5", text: "祖籍山西长治市省黎城县西井镇五十亩村");
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info6", text: "老家山西长治市省黎城县西井镇五十亩村");
        await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info7", text: "来自山西长治市省黎城县西井镇五十亩村");
        var prompt = """
        给出答案或者不知道答案时说“非常抱歉,我没有找到你要的问题!”     
        对话中的关于桂素伟的信息:
        {{ $fact }}     
        用户: {{ $ask }}
        机器人:
        """;
        var semanticFunction = kernel.CreateSemanticFunction(prompt, temperature: 0.7, topP: 0.5);
        var context = kernel.CreateNewContext();
        builder.Services.AddSingleton(kernel);
        builder.Services.AddSingleton(semanticFunction);
        builder.Services.AddSingleton(context);
    }
}

本例用到OpenAITextCompletion和OpenAITextEmbeddingGeneration两个服务,前者是用来补全词语,后者是用来本地存储自己的问题,本例是用sqlite的方式来持久化。基本原理是,当你提问一个问题,首先会从本地存储的问题向量中找到得分最高的答案,然后一起提交给OpenAI,进行回复优化汇总,然后给出结果。

前端代码:




    机器人
    


    

机器人

前端代码相对简单,把问题提交后端,等结果就ok

运行效果:

【OpenAI&SK】:实现自己的问答机器人_第1张图片

你可能感兴趣的:(机器人,chatgpt)