Kernel Memory 讓 SK 記住更多內(nèi)容
Kernel Memory (KM) 是一種多模態(tài) AI 服務(wù),專(zhuān)注于通過(guò)自定義的連續(xù)數(shù)據(jù)混合管道高效索引數(shù)據(jù)集。它支持檢索增強(qiáng)生成(RAG)、合成記憶、提示工程以及自定義語(yǔ)義記憶處理。KM 支持自然語(yǔ)言查詢(xún),從已索引的數(shù)據(jù)中獲取答案,并提供完整的引用和原始來(lái)源鏈接。
通過(guò) KM 我們可以讓 LLM 認(rèn)識(shí)更多新的知識(shí)。比如認(rèn)識(shí)新的文本內(nèi)容,WORD文檔,PDF, PPT,甚至是直接爬取一個(gè)網(wǎng)頁(yè)然后進(jìn)行 embedding,連爬蟲(chóng)都幫你寫(xiě)好了。


KM 看起來(lái)是專(zhuān)為 RAG 設(shè)計(jì)的一套框架。很多同學(xué)可能已經(jīng)知道 SK 里面有 Semantic Memory (SM),它可以用來(lái)做 RAG。咋一看很容易就把 KM 當(dāng)作了 SM。但其實(shí) KM 跟 SM 并不是一回事。雖然 KM 是從 SM 發(fā)展而來(lái)的。但現(xiàn)在 KM 已經(jīng)可以脫離 SK 獨(dú)立運(yùn)行。
KM 現(xiàn)在可以方便的集成進(jìn) .NET Backend/Console/Desktop 應(yīng)用程序里面,使這些程序立馬獲得本地識(shí)別文檔的能力。這種模式叫做Synchronous Memory API (aka “serverless”)。

如果你的場(chǎng)景是想要搭建大規(guī)模的文檔識(shí)別跟問(wèn)答平臺(tái)那么你可能需要把 KM 作為一個(gè)完整的服務(wù),異步來(lái)處理這些文檔與問(wèn)答請(qǐng)求。這種模式叫做Memory as a Service - Asynchronous API。

使用 KM 導(dǎo)入文本
使用 KM 還是需要搭配 LLM 的能力。這里還是使用本地的 Ollama 來(lái)運(yùn)行 llama3.1:8b 的模型。下面讓我們看看怎么使 KM 認(rèn)識(shí)以下這段我剛編的關(guān)于 QIQI 動(dòng)物園的文字。
Qiqi Zoo features 10 monkeys, 8 tigers, 6 elephants, 4 horses, 100 ostriches, and 99 koalas.\n\n" +
"Ticket Prices:\n\n" +
"Adults: 100 RMB\n" +
"Children: 50 RMB\n" +
"Contact: 13813818188\n" +
"Address: 999 Xinghu Street, Suzhou Industrial Park, Jiangsu, China.
以下代碼我們指示了使用 ollama 來(lái)進(jìn)行文本生成跟文本 embedding 生成。同時(shí)指定了使用一個(gè)簡(jiǎn)易的內(nèi)存數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)跟檢索向量。然后把 Qiqi zoo 的文本內(nèi)容導(dǎo)入進(jìn)去,之后就可以問(wèn)相關(guān)的問(wèn)題了。
var modelName = "llama3.1:8b";
var ollamaEndpoint = "http://localhost:11434";
var ollamaApiClient = new OllamaApiClient(new Uri(ollamaEndpoint), modelName);
var ollamaModelConfig = new OllamaModelConfig() { ModelName = modelName };
var textEmbeddingGenerator = new OllamaTextEmbeddingGenerator(ollamaApiClient, ollamaModelConfig);
var memory = new KernelMemoryBuilder()
.WithOllamaTextGeneration(modelName, ollamaEndpoint)
.WithOllamaTextEmbeddingGeneration(modelName, ollamaEndpoint)
#pragma warning disable KMEXP03
.AddIngestionMemoryDb(new SimpleVectorDb(SimpleVectorDbConfig.Volatile, textEmbeddingGenerator))
#pragma warning restore KMEXP03
.Build<MemoryServerless>();
var text = "Qiqi Zoo features 10 monkeys, 8 tigers, 6 elephants, 4 horses, 100 ostriches, and 99 koalas.\n\n" +
"Ticket Prices:\n\n" +
"Adults: 100 RMB\n" +
"Children: 50 RMB\n" +
"Contact: 13813818188\n" +
"Address: 999 Xinghu Street, Suzhou Industrial Park, Jiangsu, China.";
await memory.ImportTextAsync(text, "doc01");
var query = Console.ReadLine();
while (!string.IsNullOrEmpty(query))
{
var answer = await memory.AskAsync(query);
Console.WriteLine(answer);
query = Console.ReadLine();
}
問(wèn)幾個(gè)關(guān)于這段文字的問(wèn)題,回答的非常精準(zhǔn)。

導(dǎo)入文檔
我們還可以使用 KM 來(lái)直接識(shí)別 word,ppt,pdf 等文檔。你都不用自己預(yù)處理這些文檔,微軟簡(jiǎn)直太貼心了。
await memory.ImportDocumentAsync(new Document("file001").AddFile("memory/QiqiZoo.docx"));

導(dǎo)入網(wǎng)頁(yè)
除了本地的文本,文檔這些內(nèi)容,KM 還能直接從遠(yuǎn)程網(wǎng)頁(yè)上獲取內(nèi)容。簡(jiǎn)直了,爬蟲(chóng)都不用自己寫(xiě)了。
await memory.ImportWebPageAsync("http://www.rzrgm.cn/kklldog/p/18538651", "web001");
總結(jié)
KM 是微軟從 SK Semantic memory 的開(kāi)發(fā)經(jīng)歷與用戶(hù)反饋總結(jié)孵化出來(lái)的一個(gè)框架。它提供了許多開(kāi)箱即用的能力來(lái)讓開(kāi)發(fā)者獲取 RAG 的能力。它支持導(dǎo)入多種多樣的文檔(docx,pdf,ppt,json,html...)。它可以直接集成進(jìn)你的應(yīng)用內(nèi),也可以作為后端服務(wù)提供更強(qiáng)大的處理與擴(kuò)展能力。如果你想快速構(gòu)建一個(gè)問(wèn)答知識(shí)庫(kù),不妨試試 Kernel Memory。
QQ群:1022985150 VX:kklldog 一起探討學(xué)習(xí).NET技術(shù)
作者:Agile.Zhou(kklldog)
出處:http://www.rzrgm.cn/kklldog/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

浙公網(wǎng)安備 33010602011771號(hào)