news 2026/5/1 7:41:17

Semantic Kernel 实战系列(六) - Memory与向量存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Semantic Kernel 实战系列(六) - Memory与向量存储

目录

1 Memories 的核心机制

2 向量存储集成

3 RAG(Retrieval-Augmented Generation)模式

4 内存管理和优化

5 实际应用:一个知识库聊天机器人


在上几篇文章中,我们探讨了Semantic Kernel的规划器如何自动化多步任务,让AI像传统工作流一样高效运行。作为一个专注.NET开发的博主,我发现Memory机制是让系统真正“聪明”的基础。它不是简单的缓存,而是能让AI记住上下文、检索知识,就像传统数据库在应用中的角色,但添加了语义理解。

上一篇文章,经圣杰大佬的提醒:随着fc能力的逐步提升,planner已经在官方文档中明确表示即将废弃,大家注意一下。

接下来我们会从Memory的核心机制开始,逐步到向量存储集成、RAG模式、内存管理和实际应用。通过C#示例,你能看到如何在项目中落地这些功能,比如构建一个知识库系统,结合现有SQL数据库,提升查询智能。

1 Memories 的核心机制

Semantic Kernel中的Memory系统分为语义Memory和短期Memory,前者存储长期知识,后者处理即时上下文。这与传统.NET开发中的持久化存储和会话状态类似,但通过嵌入模型(Embedding Models)实现语义匹配,让检索更接近人类思考。

语义Memory聚焦于事实、概念和关系,比如产品规格或用户偏好。它用向量表示数据,允许基于相似度搜索,而非精确匹配。到2025年,Semantic Kernel已弃用旧的Memory Stores,转向Vector Stores,这让语义Memory更标准化,支持多种数据库。 嵌入模型如Azure OpenAI的text-embedding-ada-002,将文本转为高维向量(通常1536维),存储后能计算相似度。

短期Memory则像ChatHistory,维护对话状态,避免重复输入。它不持久化,但能与语义Memory结合,比如在聊天中检索长期知识补充响应。这在Web应用中实用,你可以用ASP.NET Core的ISession存储短期上下文,语义部分推到向量存储。

核心机制在于嵌入生成和检索:先用模型生成向量,存入集合(Collection),查询时生成查询向量,找最近邻。这优化了传统全文搜索的局限,能处理模糊查询。在C#中,定义数据模型是起点:

using Microsoft.SemanticKernel.Data; [VectorStoreRecordDefinition] publicclassKnowledgeItem { [VectorStoreRecordKey] publicstring Id { get; set; } [VectorStoreRecordData(IsFilterable = true)] publicstring Category { get; set; } [VectorStoreRecordVector(Dimensions = 1536, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)] public ReadOnlyMemory<float>? Embedding { get; set; } }

这个模型像Entity Framework的实体,但加了向量属性。机制的灵活性让它适合企业应用,你能将遗留数据向量化,构建智能搜索引擎,减少手动过滤代码。

Semantic Kernel的Memory还支持混合模式:短期Memory引导语义检索,比如用户问“上次推荐的产品怎么样”,短期回忆对话,语义拉取产品详情。这转变开发方式,从静态数据访问到动态知识融合。

2 向量存储集成

向量存储是Semantic KernelMemory的后台,支持多种集成,从本地In-Memory到云端Azure AI Search或MongoDB Atlas。这让.NET开发者像选择ORM一样选存储,配置简单,通过NuGet包实现。

In-Memory存储适合快速原型或测试,无需外部服务:

using Microsoft.SemanticKernel.Connectors.InMemory; var vectorStore = new InMemoryVectorStore(); var collection = vectorStore.GetCollection<string, KnowledgeItem>("knowledge"); await collection.CreateCollectionIfNotExistsAsync();

这像用Dictionary缓存,但支持向量操作。实际中,在单元测试中用它模拟生产环境,避免依赖云。

Azure AI Search是企业级选择,支持大规模索引和AI增强搜索。 配置需Azure SDK:

using Microsoft.SemanticKernel.Connectors.AzureAISearch; var searchClient = new AzureSearchIndexClient(new Uri("https://your-search-service.search.windows.net"), new AzureKeyCredential("your-key")); var vectorStore = new AzureAISearchVectorStore(searchClient); var collection = vectorStore.GetCollection<string, KnowledgeItem>("index-name");

集成后,你能用Azure的内置嵌入生成,减少本地计算。MongoDB Atlas类似,支持云托管向量:

using Microsoft.SemanticKernel.Connectors.MongoDB; var client = new MongoClient("mongodb+srv://your-connection-string"); var database = client.GetDatabase("your-db"); var vectorStore = new MongoDBVectorStore(database); var collection = vectorStore.GetCollection<string, KnowledgeItem>("collection-name");

这些集成通过抽象IVectorStore统一API,让切换存储像换连接字符串一样简单。 在.NET项目中,这意味着你能在Startup.cs注册VectorStore服务,注入到控制器或服务层,实现无缝数据流动。

本地存储如SQLite或Postgres也支持,向量字段用扩展实现。这在边缘计算或隐私敏感场景中落地,比如移动App用SQLite存储用户笔记,向量化后智能搜索。

整体集成强调可扩展性,你能结合传统数据库:用SQL存储结构数据,向量存储非结构知识,桥接两者提升应用智能。

3 RAG(Retrieval-Augmented Generation)模式

RAG模式是Memory系统的杀手级应用,通过检索增强生成,让AI输出更准确、更有据。它先从向量存储检索相关信息,再喂给LLM生成响应,这避免了模型幻觉,类似于传统查询后渲染视图。

在Semantic Kernel中,构建RAG用VectorStoreTextSearch包装集合:

using Microsoft.SemanticKernel.TextSearch; using Microsoft.SemanticKernel.Embeddings; var embeddingService = kernel.GetRequiredService<ITextEmbeddingGenerationService>(); var textSearch = new VectorStoreTextSearch<KnowledgeItem>(collection, embeddingService, item => item.Content);

然后,创建搜索插件:

var searchPlugin = textSearch.CreateWithGetTextSearchResults("SearchKnowledge", new TextSearchOptions { Top = 3 }); kernel.ImportPluginFromObject(searchPlugin);

在提示中调用:{{SearchKnowledge.Search $query}},AI自动检索。 这在C#控制台或Web API中落地,比如用户查询“Semantic Kernel最新功能”,RAG检索文档片段,生成总结。

构建完整系统:先嵌入数据:

var item = new KnowledgeItem { Id = "1", Content = "Semantic Kernel is an AI framework.", Embedding = await embeddingService.GenerateEmbeddingAsync("Semantic Kernel is an AI framework.") }; await collection.UpsertAsync(item);

查询时:

var query = "What is Semantic Kernel?"; var results = await textSearch.GetTextSearchResultsAsync(query); await foreach (var result in results.Results) { Console.WriteLine(result.Name); // 输出相关文档 }

RAG的模式让输出接地气,在客服系统中,你能检索历史票单生成个性化回复,结合传统CRM API,提升响应质量。

Semantic Kernel的RAG还支持函数调用行为,让模型决定何时检索。这在复杂应用中实用,比如报告生成,先RAG拉数据,再规划步骤。

4 内存管理和优化

内存管理在向量存储中至关重要,包括索引构建、相似度计算和隐私保护,确保系统高效、安全。

索引用HNSW(Hierarchical Navigable Small World)算法,加速近似最近邻搜索。在模型定义中指定IndexKind = IndexKind.Hnsw,Semantic Kernel自动处理。 这像SQL索引,减少查询时间,在大集合中从O(n)降到O(log n)。

相似度搜索默认CosineSimilarity,适合文本向量。你能自定义DistanceFunction,优化特定领域如图像。

管理还涉及批量操作:UpsertBatchAsync批量插入,DeleteBatchAsync清理旧数据。这在ETL流程中落地,用定时任务维护集合,避免膨胀。

隐私方面,Semantic Kernel支持过滤器字段:[VectorStoreRecordData(IsFilterable = true)],查询时加条件如category == "public",防止敏感数据泄露。结合Azure的RBAC,确保访问控制。

优化技巧包括嵌入维度选择(低维快但准确低)和阈值过滤:SearchAsync(new VectorSearchOptions { MinRelevanceScore = 0.8 })。在.NET中,这集成到服务层,你能用Telemetry追踪查询性能,调整参数。

数据隐私还需加密向量,或用私有模型生成嵌入,避免云泄露。在合规项目中,这让RAG系统符合GDPR,实际价值在于企业部署无忧。

整体优化让Memory系统从玩具转为生产级,你能在高负载App中用它,结合缓存短期结果,平衡速度和准确。

5 实际应用:一个知识库聊天机器人

现在,来个完整应用:知识库聊天机器人,用向量存储实现RAG查询。这在内部Wiki或客服工具中很常见。

先设置Kernel和存储(用Azure AI Search):

var kernel = Kernel.CreateBuilder() .AddAzureOpenAIChatCompletion("gpt-4o", endpoint, apiKey) .AddAzureOpenAITextEmbeddingGeneration("text-embedding-ada-002", endpoint, apiKey) .Build(); var searchClient = new AzureSearchIndexClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); var vectorStore = new AzureAISearchVectorStore(searchClient); var collection = vectorStore.GetCollection<string, KnowledgeItem>("knowledge-base");

嵌入知识:

var docs = new[] { new KnowledgeItem { Id = "doc1", Content = "Semantic Kernel supports vector stores for RAG." } }; var embeddings = await kernel.GetRequiredService<ITextEmbeddingGenerationService>().GenerateEmbeddingsAsync(docs.Select(d => d.Content)); for (int i = 0; i < docs.Length; i++) { docs[i].Embedding = embeddings[i]; await collection.UpsertAsync(docs[i]); }

构建聊天:

var textSearch = new VectorStoreTextSearch<KnowledgeItem>(collection, kernel.GetRequiredService<ITextEmbeddingGenerationService>(), item => item.Content); var searchPlugin = textSearch.CreateWithGetTextSearchResults("SearchKB"); kernel.ImportPluginFromObject(searchPlugin); var history = new ChatHistory(); while (true) { Console.Write("User: "); var input = Console.ReadLine(); history.AddUserMessage(input); var settings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }; var response = await kernel.GetRequiredService<IChatCompletionService>().GetChatMessageContentAsync(history, settings); Console.WriteLine($"AI: {response.Content}"); history.AddAssistantMessage(response.Content); }

机器人查询时自动RAG:模型调用SearchKB,检索相关知识生成回答。

  • 扩展:在Blazor App中,做成UI界面,用户聊天时后台检索公司文档。

  • 优化:加过滤器确保隐私,批量嵌入新知识。

这个应用落地价值大,能改造传统搜索框为智能助手,减少用户翻页时间。测试中,用模拟数据验证召回率,确保准确。通过这个案例,可以让你看到Memory如何提升交互,融合向量存储与聊天。

Memory与向量存储让Semantic Kernel更强大,我相信在紧密结合传统开发的基础上,一定能够开启知识驱动应用开发的新天地。

引入地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:11:53

震惊!云服务器代理商性价比排行,这3家让你省下千万预算!

震惊&#xff01;云服务器代理商性价比排行&#xff0c;这3家让你省下千万预算&#xff01;在数字化转型浪潮席卷各行各业的今天&#xff0c;云服务器已成为企业IT架构的基石。然而&#xff0c;面对市场上琳琅满目的云服务商和代理商&#xff0c;如何选择一家兼具高性能、高稳定…

作者头像 李华
网站建设 2026/5/1 5:11:27

搞跨端渲染?你绕不开的HarfBuzz原理

文是HarfBuzz系列的第二篇&#xff1a;在这里插入图片描述本文概述在这里插入图片描述一、关键概念与结构1.1 scriptHarfBuzz 中 script 指的是文字系统的类型&#xff0c;注意不是指语言&#xff0c;不同语言也可能属于同一类书写系统&#xff0c;比如&#xff1a;hb_script 举…

作者头像 李华
网站建设 2026/5/1 5:09:07

DX12-1-DirectX3D初始化

什么是 Direct3D 12?DirectX 12 引入了 Direct3D 的下一个版本&#xff0c;即 DirectX 的核心 3D 图形 API。此版本的 Direct3D 比任何以前的版本更快、更高效。Direct3D 12 可实现更丰富的场景、更多的对象、更复杂的效果&#xff0c;以及充分利用现代 GPU 硬件。若要为 Wind…

作者头像 李华
网站建设 2026/4/30 20:20:43

RFSOC学习记录(六)混频模式分析

混频混频器&#xff08;Mixer&#xff09;是RFSOC通过ip核实现在数字域的频率搬移&#xff0c;主要功能是在不改变采样率的情况下&#xff0c;把信号的频谱中心移动到目标频率附近他主要通过一个数控振荡器&#xff0c;生成复指数信号与本振信号相乘&#xff0c;在ip核设置的过…

作者头像 李华
网站建设 2026/5/1 5:09:54

大模型应用开发面经汇总+学习资料包,助你轻松拿下30K+AI岗位!

本文作者分享了近半年面试阿里、腾讯等20多家大模型相关公司的经验&#xff0c;指出大模型应用面试更注重实践而非高深理论&#xff0c;RAG、微调和Agent是重点考察内容。掌握微调原理并实际操作是提升面试通过率的关键。作者还提供了面试准备建议和不同公司的岗位特点&#xf…

作者头像 李华
网站建设 2026/5/1 5:10:05

Chapter-1 Memory Management (section 1.1-1.5)

操作系统为什么需要内存管理&#xff1f;这应该是一个很经典的问题&#xff0c;内存池 (Memory Pool) 也可以认为是一种内存管理的方式&#xff0c;所以关于内存管理四个字有点像谜底就在谜面上&#xff0c;更多的只是你如何管理的方式。比如 FreeRTOS 中的好几种分配方式&…

作者头像 李华