.NET Core C#系列之 利用kernel_memory实现导入文件提问

B站影视 2024-12-13 08:35 2

摘要:using Microsoft.KernelMemory;var httpClientHandler = new OpenAIHttpClientHandler("https://api.token-ai.cn/");var key = "这里填写在https

首先我们需要打开 Visual Studio 2022,然后创建一个7_KernelMemory名称控制台项目。打开项目文件 Exe net8.0 _7_KernelMemory enable enable 添加OpenAIHttpClientHandler.cs public class OpenAIHttpClientHandler : HttpClientHandler { private readonly string _uri; public OpenAIHttpClientHandler(string uri) => _uri = uri.TrimEnd('/'); protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { UriBuilder uriBuilder; if (request.RequestUri?.LocalPath == "/v1/chat/completions") { uriBuilder = new UriBuilder(_uri + "/v1/chat/completions"); request.RequestUri = uriBuilder.Uri; } else if (request.RequestUri?.LocalPath == "/v1/embeddings") { uriBuilder = new UriBuilder(_uri + "/v1/embeddings"); } return await base.SendAsync(request, cancellationToken); } }using Microsoft.KernelMemory;var httpClientHandler = new OpenAIHttpClientHandler("https://api.token-ai.cn/");var key = "这里填写在https://api.token-ai.cn/创建的令牌";var embeddingModel = "text-embedding-3-small";var textModel = "gpt-3.5-turbo";var memory = new KernelMemoryBuilder .WithOpenAITextGeneration(new OpenAIConfig { APIKey = key, TextModel = textModel }, , new HttpClient(httpClientHandler)) .WithOpenAITextEmbeddingGeneration(new OpenAIConfig { APIKey = key, EmbeddingModel = embeddingModel, }, , false, new HttpClient(httpClientHandler)) .Build;Console.WriteLine("上传知识");var docId = await memory.ImportTextAsync(@"## Semantic Kernel介绍Semantic Kernel(语义内核)这个术语在不同的学术和技术领域中可能有不同的含义,但是它通常指的是与语义处理、语义理解或语义分析相关的核心算法或技术。在计算语言学、自然语言处理(NLP)、信息检索和相关领域中,Semantic Kernel可能指的是一种用于捕捉文本或单词之间语义关系的技术。在这些领域中,Kernel通常指的是一种函数,它可以将原始数据映射到一个新的特征空间中,以便于进行机器学习算法的处理。而当我们谈论Semantic Kernel时,我们通常指的是这种函数能够反映出数据中的语义信息。例如,在文本分类或情感分析等任务中,Semantic Kernel可以帮助算法理解单词或短语之间的意义和上下文关系,从而提高处理文本的能力。");Console.WriteLine($"- Document Id: {docId}");Console.WriteLine("提问:介绍一下Semantic Kernel");var answer = await memory.AskAsync("介绍一下Semantic Kernel", minRelevance: 0.76);Console.WriteLine("assistant:" + answer.Result);运行项目

运行项目,然后查看输出:

上传知识- Document Id: 2b2e2ace76eb411a800be7ee813f8c2d202405220215214437023提问:介绍一下Semantic Kernelassistant:Semantic Kernel(语义内核)是一个术语,通常用于描述与语义处理、语义理解或语义分析相关的核心算法或技术。在计算语言学、自然语言处理(NLP)、信息检索等领域中,Semantic Kernel指的是一种能够捕捉文本或单词之间语义关系的技术。通常,Kernel是指一种函数,用于将原始数据映射到新的特征空间,以便机器学习算法处理。而Semantic Kernel则是指这种函数能够反映出数据中 的语义信息,帮助算法理解单词或短语之间的意义和上下文关系,从而提高文本处理的能力。举例来说,在文本分类或情感分析任务中,Semantic Kernel可以帮助算法更好地理解文本数据的语义信息,从而提升算法的准确性和效率。第一步我们需要使用构建我们的MemoryServerless实例,然后注册了WithOpenAITextGeneration和WithOpenAITextEmbeddingGeneration解释-是用于KernelMemory的对话生成模型。解释-是用于KernelMemory的文本嵌入模型。- 当我们调用ImportTextAsync方法时,KernelMemory会将文本上传到嵌入模型中,然后吧文本转换为嵌入向量,得到向量会将其存储在内存中。- 当我们调用AskAsync方法时,KernelMemory会将问题转换为嵌入向量,然后与内存中的向量进行比较,找到最相似的文本,然后返回给我们。然后Build构建实例。

接着我们调用ImportTextAsync方法,将文本上传到嵌入模型中,然后返回文档ID。这个文档ID是我们上传文本的唯一标识。并且我们可以通过文档ID来检索文本。也可以在ImportTextAsync方法中增加一些标记,比如数据外链,数据引用等。

最后我们调用AskAsync方法,将问题转换为嵌入向量,然后与内存中的向量进行比较,找到最相似的文本,然后返回给我们。

这就完成了一个针对指定文本的提问与回答的过程,一个简单的Retrieval-augmented generation(RAG)。

在这个示例中,我们展示了如何使用KernelMemory来实现导入文件提问。我们首先创建了一个实例,然后注册了和,然后我们调用ImportTextAsync方法将文本上传到嵌入模型中,然后调用AskAsync方法将问题转换为嵌入向量,然后与内存中的向量进行比较,找到最相似的文本,然后返回给我们。

来源:opendotnet

相关推荐