C# Kernel Memory使用方法 C#如何为AI应用构建长期记忆

来源:这里教程网 时间:2026-02-21 17:42:15 作者:

Kernel Memory是什么,它真能当AI的长期记忆用?

Kernel Memory(KM)不是C#原生库,而是微软开源的、面向AI应用的记忆抽象框架,底层用C#实现,但设计目标是跨语言。它不替代数据库,也不等同于缓存——它的核心价值在于把非结构化数据(PDF、网页、Markdown等)自动切块、向量化、索引,并支持语义检索。你不能把它当

Dictionary<string object></string>
来存取,也不能靠
Memory<t></t>
Span<t></t>
去优化它的内存占用。

如何在C#项目中正确引用并初始化Kernel Memory

直接通过NuGet安装最新稳定版即可,注意版本兼容性:当前(2024年中)推荐用

Microsoft.KernelMemory
7.x,它依赖
Microsoft.SemanticKernel
1.0+,若混用SK 0.27会因
IAIService
接口变更导致运行时找不到方法。

执行
dotnet add package Microsoft.KernelMemory --version 7.0.0
必须配置至少一个
IPipelineOrchestrator
实现,默认用
InProcessPipelineOrchestrator
,但生产环境建议换
RedisPipelineOrchestrator
防进程重启丢任务
向量存储必须显式指定,例如用
QdrantClient
AzureAISearchClient
;空配置下KM会抛
InvalidOperationException: No vector DB client configured
不要手动new
KernelMemoryBuilder()
——要用
KernelMemoryBuilder.BuildAsync()
,否则
ImportDocumentAsync
会静默失败

导入文档时常见的路径与格式陷阱

KM对文件路径敏感,尤其在Linux容器或.NET 8+默认启用

System.IO.UseLegacyPathHandling=false
时,
file://
前缀或反斜杠
\
会导致
FileNotFoundException
,即使文件明明存在。

统一用
Path.GetFullPath("docs/report.pdf")
生成绝对路径,再传给
ImportDocumentAsync
PDF解析依赖
Microsoft.KernelMemory.Pdf
扩展包,不引用则返回空内容,且无警告
网页导入需提前配置
WebContentExtractor
,否则只拿到HTML源码字符串,向量化后语义断裂
自定义分块逻辑必须继承
IDocumentPartitioningService
并注册,改
MaxTokensPerChunk
参数只是影响默认分块器,不生效于已注册的自定义实现

检索结果为什么总是不相关?关键在Embedding和Reranking配置

默认的

OpenAIEmbeddingGenerator
使用
text-embedding-ada-002
,但该模型已于2024年停产,若未更新为
text-embedding-3-small
,召回质量会断崖下降;更隐蔽的问题是:KM默认关闭reranking,而仅靠向量相似度排序,在多主题混合文档中极易把高余弦相似但低相关性的片段排前面。

必须显式设置
EnableReranking = true
,并注入
IReranker
实现(如
CohereReranker
或本地
MiniLMReranker
MaxResults
设为5不代表返回5个最相关结果——它是向量库初筛后的数量,reranker再从中重排,实际返回仍受
TopK
控制
查询文本若含特殊字符(如
"C# async/await"
),需先经
HtmlEncoder.Default.Encode()
预处理,否则Qdrant可能报
invalid UTF-8 sequence
别忽略
AnswerQuestionAsync
里的
AnswerPrompt
模板——它决定LLM如何整合检索片段,用默认模板在技术文档场景常产生虚构引用

真正难的不是接入,是让每一步的输出可验证:导入后查

km.MemoryIndex.ListDocumentsAsync()
确认文档状态,检索后打印
result.RelevanceScore
result.RerankScore
对比,否则你根本不知道问题出在embedding、分块还是rerank环节。

相关推荐