Semantic Kernel:用Embedding做客服(RAG)

RAG(Retrieval-Augmented Generation)是一种结合信息检索和生成模型的自然语言处理方法。它通过检索相关文档片段作为生成模型的上下文,提高生成文本的准确性和相关性。RAG广泛应用于问答系统、对话系统和文本摘要等领域,兼具高效性和灵活性。公司的客户机器人都特别适合。

下面的案例是使用GPT的embedding来向量化相关信息,然后通过关键字检索,最后把这些信息,结合用户问题送给gpt-4o,得到一个相对友好的回复结果。

具体实现如下:

using Azure.AI.OpenAI;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Connectors.Redis;
using Microsoft.SemanticKernel.Memory;
using StackExchange.Redis;
using System.Runtime.CompilerServices;
using System.Text;


var chatModelId = "gpt-4o";
var embeddingId = "text-embedding-ada-002";
var key = File.ReadAllText(@"C:\GPT\key.txt");
#pragma warning disable SKEXP0020
#pragma warning disable SKEXP0010
#pragma warning disable SKEXP0001
var kernel = Kernel.CreateBuilder()
   .AddOpenAIChatCompletion(chatModelId, key)
   .Build();


var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(new ConfigurationOptions
{
    EndPoints = { "localhost:6379" },
    ConnectTimeout = 10000,
    ConnectRetry = 3


});
var database = connectionMultiplexer.GetDatabase();
var store = new RedisMemoryStore(database, vectorSize: 1536);
var embeddingGenerator = new OpenAITextEmbeddingGenerationService(embeddingId, key);
var memory = new SemanticTextMemory(store, embeddingGenerator);
var dic = new Dictionary<string, string>
{
    {"name","我的名字是桂素伟" },
    {"age","我今年30岁" },
    {"job","我是一位.net高级讲师" },
    {"experience","我有10年的.net开发经验" },
    {"skill","我精通.net core、asp.net core、微服务、docker、k8s等技术" },
    {"hobby","我喜欢阅读、写作、旅行" },
    {"motto","我的座右铭是:行成于思,毁于随" }
};
foreach (var item in dic)
{
    await memory.SaveInformationAsync("ask", id: item.Key, text: item.Value);
}


var chatHistory = new ChatHistory();
var chat = kernel.GetRequiredService<IChatCompletionService>();
var settings = new PromptExecutionSettings
{
    ExtensionData = new Dictionary<string, object>
    {
        ["max_tokens"] = 1000,
        ["temperature"] = 0.2,
        ["top_p"] = 0.8,
        ["presence_penalty"] = 0.0,
        ["frequency_penalty"] = 0.0
    }
};
while (true)
{
    Console.ResetColor();
    Console.WriteLine("----------学生提问:----------");
    var ask = Console.ReadLine();
    chatHistory.Clear();
    chatHistory.AddSystemMessage("基于下面的信息回复问题:");
    await foreach (var answer in memory.SearchAsync(
        collection: "ask",
        query: ask,
        limit: 3,
        minRelevanceScore: 0.65d,
        withEmbeddings: true))
    {
        chatHistory.AddSystemMessage(answer.Metadata.Text);
    };


    chatHistory.AddUserMessage(ask);
    Console.WriteLine();
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine( "==========讲师回答:==========");
    AuthorRole? role = AuthorRole.Assistant;
    var contentBuilder = new StringBuilder();
    await foreach (var reply in chat.GetStreamingChatMessageContentsAsync(chatHistory, settings))
    {
        if (reply.Role.HasValue && role != reply.Role)
        {
            role = reply.Role;
        }
        Console.Write(reply.Content);
        contentBuilder.Append(reply.Content);
    }
    chatHistory.AddMessage(role.Value, contentBuilder.ToString());
    Console.WriteLine();
}

用户提问后,第一步,把问题送给memory,在67行,利用Search来查看结果,SemanticTextMemory会把相关的几个(取决于配置参数)结果返回,74行添加到chatHistory中。第二步77行再把用户的问题结合进来,一起送给GPT,就相当于把答案相关的信息和问题一些送给GPT,GPT汇总结果后返回。

虽然RAG在一定程序上能把私用化个体化的数据,结合LLM的能力返回,但毕竟这是固定映射,也就是向量化的数据进去是什么,在Seach后,只是把语意相近的返回,但对于一些需要大量上下文才能得出结果的查询就无能为力,或效果很差了。

最近比较多的GraphRAG,就是一个很好的解决方案,不过就是在建立和查询检索时有点小贵,相信随着技术的成熟和时间的推移,有更完善的方案出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
3D点云语义分割是一项在计算机视觉领域中引人注目的研究任务,旨在将复杂的3D点云数据进行像素级的语义分类。这项研究具有广泛的应用前景,如自动驾驶、智能机器人、增强现实等领域。 在研究中,3D点云语义分割算法通常包括三个主要步骤:特征提取、分类器训练和语义分割。首先,特征提取是为了提取3D点云数据中的有用信息,常用的方法包括基于图像的特征提取和基于几何特征的提取。其次,分类器训练是为了建立一个能够将提取到的特征与语义类别进行关联的模型,常用的分类器包括支持向量机、决策树和深度学习网络等。最后,语义分割是将训练好的分类器应用于新的3D点云数据,将每个点的语义类别进行划分。 目前,关于3D点云语义分割的研究涉及了多种算法和技术。例如,基于深度学习的方法在该领域取得了显著的突破,尤其是卷积神经网络(CNN)的应用。这些方法通过利用CNN的卷积和池化等操作,可以有效地从3D点云中提取语义特征,进而进行语义分割。此外,一些基于图像的方法也被应用于3D点云语义分割中,通过将3D数据投影到2D图像平面上,再利用图像语义分割方法进行处理。这些方法巧妙地将2D图像的分割技术应用于3D点云数据上,取得了一定的效果。 尽管3D点云语义分割在计算机视觉领域中取得了显著的进展,但仍然存在一些挑战和问题。例如,点云数据的不规则性和稀疏性导致了特征提取的困难;同时,数据标注的成本和复杂性也限制了算法的发展。为了解决这些问题,研究者们正在不断探索新的算法和技术,如图卷积神经网络、图注意力机制等。 总的来说,3D点云语义分割是一个具有挑战性但有着广泛应用前景的研究领域。通过不断地改进算法和应用新的技术,我们有望实现更精确和高效的3D点云语义分割,推动计算机视觉领域的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值