微信扫码
添加专属顾问
我要投稿
Semantic Kernel的内存管理系统让AI真正拥有了"记忆"能力,通过分层架构和嵌入技术实现智能化的上下文感知。核心内容: 1. 分层内存架构设计:长期语义记忆与短期对话记忆的协同工作 2. 嵌入技术如何将多模态数据转换为可理解的向量表示 3. 向量存储集成与配置实现持久化知识管理
Note
如果你觉得文章对你有用,可以点一下广告,这对我很有帮助。
Memory是Semantic Kernel框架中让AI应用真正具备"智能"的核心组件。与传统计算的缓存机制不同,Semantic Kernel的Memory系统模仿了人类的记忆过程,能够让AI模型记住历史交互、检索相关知识,并在后续决策中利用这些信息。
在Semantic Kernel中,Memory不是简单的数据存储,而是一个分层的信息处理系统。它通过嵌入模型(Embedding Models)将文本、图像等多模态数据转换为向量表示,使AI能够基于语义相似性而非精确匹配来检索信息。这种设计让AI应用能够理解上下文,形成连贯的对话体验,并基于历史经验做出更智能的决策。
Semantic Kernel采用分层内存模型,主要包含两个关键层次:
语义Memory(长期记忆)专注于存储事实、概念和关系,如产品规格或用户偏好。它使用向量表示数据,支持基于相似度的智能搜索,信息会持久化到向量数据库中。
短期Memory 类似于ChatHistory,维护对话状态和即时上下文,避免重复输入。它不持久化,但能与语义Memory结合,如在聊天中检索长期知识来补充响应。
Embedding技术的核心是将文本或其他数据转换为高维空间中的向量表示。每个维度对应语言的一个学习特征或属性,使得语义上相似的内容在向量空间中的位置也更接近。[1]
using Microsoft.Extensions.VectorData;
namespace SemanticKernelMemory;
public class KnowledgeItem
{
[VectorStoreKey]
public string Id { get; set; }
[VectorStoreData(IsFullTextIndexed = true)]
public string Text { get; set; }
[VectorStoreVector(Dimensions: 1536, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? TextEmbedding { get; set; }
}
常用的嵌入模型如Azure OpenAI的text-embedding-ada-002能将文本转为1536维的向量,从而实现对文本语义的深度理解和相似性计算。
向量存储是Semantic Kernel Memory的持久化后端,支持多种数据库集成,让开发者能根据需求灵活选择存储方案。
Semantic Kernel通过统一的VectorStore抽象基类,支持多种向量数据库后端:
| Azure AI Search | ||
| Qdrant | ||
| Chroma | ||
| PostgreSQL | ||
| SQL Server |
内存存储(适合开发和测试)[2]
using Microsoft.SemanticKernel.Connectors.InMemory;
var vectorStore = new InMemoryVectorStore();
var collection = vectorStore.GetCollection<string, KnowledgeItem>("knowledge");
await collection.EnsureCollectionExistsAsync();
Azure AI Search(生产环境)[3]
using Microsoft.SemanticKernel.Connectors.AzureAISearch;
string azureAISearchUri = "https://your-search-service.search.windows.net";
string secret = "your-secret";
var vectorStore = new AzureAISearchVectorStore(
new SearchIndexClient(
new Uri(azureAISearchUri),
new AzureKeyCredential(secret)));
var collection = new AzureAISearchCollection<string, KnowledgeItem>(
new SearchIndexClient(new Uri(azureAISearchUri), new AzureKeyCredential(secret)),
"knowledge");
MongoDB Atlas集成[4]
using Microsoft.SemanticKernel.Connectors.MongoDB;
using MongoDB.Driver;
using SemanticKernelMemory;
string connectionString = "mongodb+srv://your-username:your-password@your-cluster.mongodb.net/?retryWrites=true&w=majority";
string databaseName = "your-database";
var mongoClient = new MongoClient(connectionString);
var database = mongoClient.GetDatabase(databaseName);
var collection = new MongoCollection<string, KnowledgeItem>(database, "knowledge");
这些集成通过统一的API接口,使得在不同存储方案间切换如同更改连接字符串一样简单。
Semantic Kernel提供了一套完整的内存操作接口,使开发者能够方便地进行信息的存储、检索和管理。
public abstract class VectorStoreCollection<TKey, TRecord>
{
// 保存记忆项
public abstract Task UpsertAsync(IEnumerable<TRecord> records, CancellationToken cancellationToken = default (CancellationToken));
// 检索记忆项
public abstract IAsyncEnumerable<TRecord> GetAsync(
Expression<Func<TRecord, bool>> filter,
int top,
FilteredRecordRetrievalOptions<TRecord>? options = null,
CancellationToken cancellationToken = default (CancellationToken));
// 搜索相似记忆
public abstract IAsyncEnumerable<VectorSearchResult<TRecord>> SearchAsync<TInput>(
TInput searchValue,
int top,
VectorSearchOptions<TRecord>? options = null,
CancellationToken cancellationToken = default (CancellationToken)) where TInput : notnull;
// 删除记忆项
public abstract Task DeleteAsync(TKey key, CancellationToken cancellationToken = default (CancellationToken));
}
存储信息到Memory中涉及将文本通过嵌入模型转化为向量,并保存到指定的集合:
var vectorStore = new InMemoryVectorStore();
var collection = vectorStore.GetCollection<string, KnowledgeItem>("knowledge");
await collection.EnsureCollectionExistsAsync();
await collection.UpsertAsync(new KnowledgeItem { Id = "doc1", Text = "Semantic Kernel支持向量存储用于RAG。" });
搜索是Memory系统的核心功能,它基于语义相似性而非关键字匹配:
string endpoint = "http://127.0.0.1:1234/v1";
string apiKey = "your-api-key";
var openAIClientCredential = new ApiKeyCredential(apiKey); var openAIClientOption = new OpenAIClientOptions {
Endpoint = new Uri(endpoint)
};
OpenAIClient openAIClient = new OpenAIClient(openAIClientCredential, openAIClientOption);
var embeddingGenerator =openAIClient.GetEmbeddingClient(model: embeddingModelName);
#region 内存存储(适合开发和测试)
var vectorStore = new InMemoryVectorStore();
var collection = vectorStore.GetCollection<string, KnowledgeItem>("knowledge");
await collection.EnsureCollectionExistsAsync();
#endregion
var searchString = "Semantic Kernel支持向量存储的用途";
var searchVector = (await embeddingGenerator.GenerateEmbeddingAsync(searchString)).Value.ToFloats();
var resultRecords = await collection.SearchAsync(searchVector, transform: translateY( 1).ToListAsync();
Console.WriteLine("Search string: " + searchString);
Console.WriteLine("Result: " + resultRecords.First().Record.Text);
搜索结果会按相关性排序,开发者可以通过设置minRelevanceScore阈值来过滤低质量结果。
RAG是Memory系统最具价值的应用模式,通过检索相关知识来增强LLM的生成能力,有效减少模型幻觉问题。
RAG模式的核心思想是先检索后生成,具体流程如下:
var searchString = "Semantic Kernel支持向量存储的用途";
var searchVector = (await embeddingGenerator.GenerateEmbeddingAsync(searchString)).Value.ToFloats();
var resultRecords = await collection.SearchAsync(searchVector, transform: translateY( 1).ToListAsync();
在最新版本的Semantic Kernel中,推荐使用VectorStore来实现RAG模式:[5]
#region 内存存储(适合开发和测试)
var vectorStore = new InMemoryVectorStore();
var collection = vectorStore.GetCollection<string, KnowledgeItem>("knowledge");
await collection.EnsureCollectionExistsAsync();
#endregion
var embeddingService = kernel.GetRequiredService<IEmbeddingGenerator<string, Embedding<float>>>();
// 创建搜索插件
var searchPlugin = new SearchPlugin(collection, embeddingService);
kernel.ImportPluginFromObject(searchPlugin, "SearchKnowledge");
索引优化
使用HNSW(Hierarchical Navigable Small World)算法加速近似最近邻搜索,在大规模数据集中将查询时间从O(n)优化到O(log n):
[VectorStoreRecordVector(Dimensions = 1536,
DistanceFunction = DistanceFunction.CosineSimilarity,
IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? Embedding { get; set; }
下面我们通过一个完整的实战案例,展示如何使用Semantic Kernel的Memory系统构建智能知识库聊天机器人。
// 创建Kernel并配置AI服务
string endpoint = "http://127.0.0.1:1234/v1";
string apiKey = "your-api-key";
var openAIClientCredential = new ApiKeyCredential(apiKey); var openAIClientOption = new OpenAIClientOptions {
Endpoint = new Uri(endpoint)
};
// 定义配置常量
const string chatModelName = "DeepSeek-r1-distill-qwen-7b";
const string embeddingModelName = "Qwen/Qwen3-Embedding-0.6B-GGUF";
OpenAIClient openAIClient = new OpenAIClient(openAIClientCredential, openAIClientOption);
var kernelBuilder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(chatModelName, openAIClient);
#pragma warning disable SKEXP0010
kernelBuilder = kernelBuilder.AddOpenAIEmbeddingGenerator(embeddingModelName, openAIClient);
var kernel = kernelBuilder.Build();
#region 内存存储(适合开发和测试)
var vectorStore = new InMemoryVectorStore();
var collection = vectorStore.GetCollection<string, KnowledgeItem>("knowledge");
await collection.EnsureCollectionExistsAsync();
#endregion
// 准备知识库文档
var docs = new[] {
new KnowledgeItem { Id = "doc1", Text = "Semantic Kernel支持向量存储用于RAG。" },
new KnowledgeItem { Id = "doc2", Text = "Memory系统分为语义记忆和短期记忆。" },
new KnowledgeItem { Id = "doc3", Text = "嵌入模型将文本转换为高维向量表示。" }
};
// 批量生成嵌入并存储
for (int i = 0; i < docs.Length; i++)
{
docs[i].TextEmbedding = (await embeddingService.GenerateAsync(docs[i].Text)).Vector;
if (await collection.GetAsync(docs[i].Id) == null)
{
await collection.UpsertAsync(docs[i]);
}
}
var embeddingService = kernel.GetRequiredService<IEmbeddingGenerator<string, Embedding<float>>>();
// 创建搜索插件
var searchPlugin = new SearchPlugin(collection, embeddingService);
kernel.ImportPluginFromObject(searchPlugin, "SearchKnowledge");
// 实现对话循环
var history = new ChatHistory();
while (true)
{
Console.Write("User: ");
var input = Console.ReadLine();
history.AddUserMessage(input);
// 配置自动函数调用,让AI智能决定何时检索知识库
var settings = new OpenAIPromptExecutionSettings
{
// ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
var response = await kernel.GetRequiredService<IChatCompletionService>()
.GetChatMessageContentAsync(history, settings, kernel);
history.AddAssistantMessage(response.Content);
Console.WriteLine("Assistant: " + response.Content);
Console.WriteLine();
}
User: 搜索Semantic Kernel支持向量存储,不用思考总结,直接返回搜索结果
Assistant: <think>
嗯,用户刚刚让我用“ Semantic Kernel 支持向量存储”这个查询调用了搜索工具,结果告诉我它用于RAG。看来他可能是在做信息检索或者机器学习相关的项目。
首先,我需要理解什么是RAG。RAG是检索增强生成模型的缩写,主要用于生成更精确的回答,通过结合生成模型和外部文档库。现在,用户提到Semantic Kernel使用支持向量存储在RAG中,这意味着它可能作为知识库的一部分帮助生成回答。
接下来,我要考虑用户的实际需求是什么。他可能希望得到关于 Semantic Kernel 如何具体应用到RAG中的信息,或者想了解其在机器学习或自然语言处理中的作用。因此,在回应时应该详细解释支持向量存储的作用和RAG的机制,帮助用户理解其在实际应用中的意义。
另外,我还需要确保使用正确的术语,并且用简洁明了的语言表达出来,让用户能够清晰地理解和支持向量存储如何提升生成模型的效果。同时,可能需要提到用户可以进一步查询或提供更多信息来获取更详细的支持。
</think>
[TOOL_RESULT]Semantic Kernel支持向量存储用于RAG,以提高信息检索和生成模型的性能。支持向量存储是一种高效的数据结构,能够在高维空间中有效组织和检索数据点,特别适用于需要快速响应和精确匹配的应用场景。在RAG框架中, Semantic Kernel 的支持向量存储可以帮助构建更强大的知识图谱,从而提升生成模型对复杂问题的理解和回答能力。[END_TOOL_RESULT]
User: 搜索Semantic Kernel支持向量存储,不用思考总结
Assistant: <think>
好的,现在用户再次请求搜索“Semantic Kernel 支持向量存储”,并且明确说明不需要思考,只需要直接返回结果。这表明用户希望快速获取信息而不需要详细的解释或分析。
回顾之前的对话,我已经使用了SearchKnowledge_search_knowledge工具,得到了关于 Semantic Kernel 支持向量存储用于RAG的信息,并将其作为结果返回给用户。现在用户再次调用同一工具,但这次明确要求不思考总,这可能意味着用户希望保持回复的 一致性和效率。
考虑到用户的多次请求,我需要确保每次调用工具时都准确无误地执行任务,避免重复或遗漏信息。同时,用户对结果的格式有明确的要求:直接返回结果,不添加额外内容。
因此,在回应用户时,我会再次使用SearchKnowledge_search_knowledge工具,并严格按照用户的指示,不进行任何解释性的内容,只提供直接的信息。
</think>
[TOOL_RESULT]Semantic Kernel支持向量存储用于RAG。[END_TOOL_RESULT]
在实际项目中应用Semantic Kernel Memory时,遵循以下最佳实践可以确保系统的高效稳定运行。
分层存储策略
向量维度优化
根据实际需求选择合适的嵌入模型维度(通常384-1536维),平衡精度和性能需求。较高的维度能捕捉更细微的语义差异,但会增加计算和存储开销。
本章深入探讨了Semantic Kernel内存管理系统的各个方面。Memory系统通过向量数据库集成和检索增强生成技术,为AI应用提供了强大的记忆能力,是构建真正智能应用的核心基础。
关键知识点总结:
本文源码:https://github.com/huangmingji/semantic-kernel-memory
1. https://learn.microsoft.com/zh-cn/semantic-kernel/concepts/vector-store-connectors/defining-your-data-model?pivots=programming-language-csharp↩︎2. https://learn.microsoft.com/zh-cn/semantic-kernel/concepts/vector-store-connectors/out-of-the-box-connectors/inmemory-connector?pivots=programming-language-csharp↩︎3. https://learn.microsoft.com/zh-cn/semantic-kernel/concepts/vector-store-connectors/out-of-the-box-connectors/azure-ai-search-connector?pivots=programming-language-csharp↩︎4. https://learn.microsoft.com/zh-cn/semantic-kernel/concepts/vector-store-connectors/out-of-the-box-connectors/mongodb-connector?pivots=programming-language-csharp↩︎5. https://learn.microsoft.com/zh-cn/semantic-kernel/concepts/plugins/using-data-retrieval-functions-for-rag↩︎
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-01-28
AgentSkills 揭示的真相:上下文工程走错了三年
2026-01-25
Langgraph从零开始构建第一个Agentic RAG 系统
2026-01-24
大模型在需求分析与设计中的提效实践
2026-01-23
GraphRAG:让 RAG 看见"关系网络"的技术进化
2026-01-22
企业级 AI 知识库问答,是不是面子工程? – 是也不是
2026-01-21
SentGraph:一句一句把多跳RAG“画”成图
2026-01-21
增强型RAG还是Agentic RAG?一场关于检索增强生成系统的全面对比实验
2026-01-20
别再用向量数据库给AI灌"迷魂汤"了
2025-10-31
2025-12-04
2025-12-03
2025-11-04
2025-11-13
2025-12-02
2025-11-13
2025-11-05
2025-11-06
2025-12-07
2026-01-19
2026-01-12
2026-01-08
2026-01-02
2025-12-23
2025-12-21
2025-12-10
2025-11-23