Semantic Kernel开发实践:使用Embedding和语义内存利用企业知识库,检索增强生成

前言

最近在捣鼓研究Semantic Kernel,对如何在AI对话中引用私有的知识库比较感兴趣。目前比较常见的做法是fine-tuning或embedding。这篇文章就来看看我是如何使用semantic kernel搭配embeddings模型的。

示例采用控制台应用,编程语言是C#,使用的是.net 8.0。

GPT模型使用的是Azure OpenAI GPT-3.5-turbo。
embeddings简单来说,是将非结构化的文本通过embedding转换为数值向量的方法。这些向量反映了文本的语义和关系。

操作演示

下面开始演示操作步骤:

1、首先确认已经在Azure OpenAI服务中部署了两个模型,分别是GPT-3.5-turbo和text-embedding-3-small。

2、创建控制台应用kmdemo01

3、引入包

semantic kernel相关的包

csharp 复制代码
dotnet add package Microsoft.KernelMemory.Core
dotnet add package Microsoft.SemanticKernel

读取环境配置的包

csharp 复制代码
dotnet add package dotenv.net

4、修改program.cs文件,这里我使用的是无服务模式

ini 复制代码
using Microsoft.KernelMemory;
using Microsoft.SemanticKernel;
​
DotEnv.Load();
​
var env = DotEnv.Read();
var embeddingConfig = new AzureOpenAIConfig()
{
    APIKey = env["API_KEY"],
    Deployment = env["EMBEDDING_NAME"],
    Endpoint = env["ENDPOINT"],
    APIType = AzureOpenAIConfig.APITypes.EmbeddingGeneration,
    Auth = AzureOpenAIConfig.AuthTypes.APIKey
};
var textConfig = new AzureOpenAIConfig()
{
    APIKey = env["API_KEY"],
    Deployment = env["TEXT_NAME"],
    Endpoint = env["ENDPOINT"],
    APIType = AzureOpenAIConfig.APITypes.ChatCompletion,
    Auth = AzureOpenAIConfig.AuthTypes.APIKey
};
var kernel = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion(env["TEXT_NAME"], env["ENDPOINT"], env["API_KEY"])
    .Build();
​
var memory = new KernelMemoryBuilder()
    .WithAzureOpenAITextEmbeddingGeneration(embeddingConfig)
    .WithAzureOpenAITextGeneration(textConfig)
    .WithSimpleVectorDb()
    .Build<MemoryServerless>();
​
await memory.ImportWebPageAsync("https://raw.githubusercontent.com/microsoft/kernel-memory/main/README.md");
await memory.ImportWebPageAsync("https://juejin.cn/post/7323408577709080610");
Console.WriteLine("文档已经准备好,开始提问吧!");
while (true)
{
    var userInput = Console.ReadLine();
    var answer = await memory.AskAsync(userInput);
    Console.WriteLine(answer.Result);
    Console.WriteLine("参考:");
    foreach (var source in answer.RelevantSources)
    {
        Console.WriteLine($" - {source.SourceName}, {source.Link}[{source.Partitions.First()}{source.Partitions.First().LastUpdate:D}]");
    }
}

运行程序,在控制台可以看到如下面截图所示的内容,这里就是导入文本到语义内存里的过程。

下面是我根据代码中导入的文档进行问答的截图

结语

这篇文章展示了通过kernel memory导入私有知识库来检索增强生成。embeddings保证了知识库的隐私,又利用了大模型的能力,相比fine-turning来说,则它是成本更低并且效果很好的一种方式。通过semantic kernel来开发,操作起来也是非常的简单。

相关推荐
..过云雨6 分钟前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
南山乐只37 分钟前
【Spring AI 开发指南】ChatClient 基础、原理与实战案例
人工智能·后端·spring ai
小程故事多_802 小时前
Spring AI 赋能 Java,Spring Boot 快速落地 LLM 的企业级解决方案
java·人工智能·spring·架构·aigc
努力的小雨2 小时前
从“Agent 元年”到 AI IDE 元年——2025 我与 Vibe Coding 的那些事儿
后端·程序员
源码获取_wx:Fegn08952 小时前
基于springboot + vue小区人脸识别门禁系统
java·开发语言·vue.js·spring boot·后端·spring
wuxuanok3 小时前
Go——Swagger API文档访问500
开发语言·后端·golang
用户21411832636023 小时前
白嫖Google Antigravity!Claude Opus 4.5免费用,告别token焦虑
后端
da_vinci_x3 小时前
【2D场景】16:9秒变21:9?PS “液态缩放” + AI 补全,零成本适配全面屏
前端·人工智能·游戏·aigc·设计师·贴图·游戏美术
爬山算法3 小时前
Hibernate(15)Hibernate中如何定义一个实体的主键?
java·后端·hibernate