Kernel Memory 入門系列:快速開始

2023-12-21 09:00:28

Kernel Memory 入門:Quick Start

瞭解了使用者問答和檔案預處理的流程之後,我們就可以直接開始使用Kernel Memory了。

1. 安裝

專案中只需要通過NuGet安裝Microsoft.KernelMemory.Core包即可。

dotnet add package Microsoft.KernelMemory.Core

2. 構建

Kernel Memory的構建過程非常簡單,只需要呼叫KernelMemoryBuilderBuild方法即可。

var memory = new KernelMemoryBuilder()
                 .WithOpenAIDefaults(Env.Var("OPENAI_API_KEY"))
                 .Build<MemoryServerless>();

其中預設需要設定LLM和Embedding服務,如果使用OpenAI的服務,可以只需要通過WithOpenAIDefaults方法傳入OpenAI的API Key即可。

預設使用的是gpt-3.5-turbo-16k作為文字生成模型,使用text-embedding-ada-002作為Embedding模型。

如果想要自定義其他的模型的話,可以使用以下方式:

var memory = new KernelMemoryBuilder()
             .WithOpenAITextGeneration(new OpenAIConfig()
             {
                 APIKey = Env.Var("OPENAI_APIKEY"),
                 TextModel = "gpt-3.5-turbo"
             })
             .WithOpenAITextEmbeddingGeneration(new OpenAIConfig()
             {
                 APIKey = Env.Var("OPENAI_APIKEY"),
                 EmbeddingModel = "text-embedding-ada-002"
             })
             .Build<MemoryServerless>();

如果是使用的Azure OpenAI的話,通過以下方式設定:


var memory = new KernelMemoryBuilder()
             .WithAzureOpenAITextGeneration(new AzureOpenAIConfig(){
                 APIKey = Env.Var("AZURE_OPENAI_API_KEY"),
                 Auth = AzureOpenAIConfig.AuthTypes.APIKey,
                 Endpoint = Env.Var("AZURE_OPENAI_ENDPOINT"),APIType = AzureOpenAIConfig.APITypes.ChatCompletion,
                 Deployment = "gpt-35-turbo-16k"
             })
             .WithAzureOpenAITextEmbeddingGeneration(new AzureOpenAIConfig()
             {
                 APIKey = Env.Var("AZURE_OPENAI_API_KEY"),
                 Auth = AzureOpenAIConfig.AuthTypes.APIKey,
                 Endpoint = Env.Var("AZURE_OPENAI_ENDPOINT"),
                 APIType = AzureOpenAIConfig.APITypes.EmbeddingGeneration,
                 Deployment = "text-embedding-ada-002"
             })
             .Build<MemoryServerless>();

這裡忽略了檔案儲存、訊息佇列、向量資料庫的設定,預設會使用記憶體的方式進行儲存。

3. 內容匯入

Kernel Memory提供了三種內容的匯入的方式,第一種就是檔案匯入,最簡單的方法就是直接指定檔案的路徑,然後呼叫ImportDocumentAsync方法即可。

await memory.ImportDocumentAsync("./sample-SK-Readme.pdf");

如果不是本地檔案的話,也可以使用檔案流的方式進行匯入。

var fileStream = File.OpenRead("./sample-SK-Readme.pdf");
await memory.ImportDocumentAsync(fileStream, "sample-SK-Readme.pdf");

如果想一次性匯入多個檔案的話,可以使用Document的方式進行匯入。

var document = new Document();
document.AddFile("./sample-SK-Readme.pdf");
await memory.ImportDocumentAsync(document);

Document本身可以新增多個檔案,也可以新增檔案流。另外Document本身也可以新增篩選的標籤。

除了檔案的匯入,還可以直接匯入文字。

var text = """
           some content
           """;
await memory.ImportTextAsync(text);

還有一種就是直接匯入URL,這種方式會自動從URL中獲取內容。

var url = "https://raw.githubusercontent.com/microsoft/kernel-memory/main/README.md";
await memory.ImportWebPageAsync(url);

4. 問答和查詢

檔案匯入完成之後,就可以進行問答或者查詢了。

問答的話,只需要呼叫AskAsync方法即可。

var question = "What's Kernel Memory?";
var answer = await memory.AskAsync(question);

其中 answer 包含了答案的內容,以及相關檔案以及相關度。
例如使用以下方式獲取答案的內容:


Console.WriteLine(answer.Result + "\n");

foreach (var x in answer.RelevantSources)
{
    Console.WriteLine($"  * {x.SourceName} -- {x.Partitions.First().LastUpdate:D}");
}

/* OUTPUT */
/*
Kernel Memory is an open-source service and plugin specialized in the efficient indexing of datasets through custom continuous data hybrid pipelines. It enables natural language querying for obtaining answers from the indexed data, complete with citations and links to the original sources. Kernel Memory enhances data-driven features in applications built for popular AI platforms. It can be used as a library or as a Docker container.

  * content.url -- 2023年12月19日
  * sample-SK-Readme.pdf -- 2023年12月19日
*/

如果只想查詢有哪些相關檔案的話,可以使用SearchAsync 方法

var question = "What's Kernel Memory?";
var results = await memory.SearchAsync(question);

同樣的,從Results中可以獲取到相關的檔案。

foreach (var x in results.Results)
{
    Console.WriteLine($"  * {x.SourceName} -- {x.Partitions.First().LastUpdate:D}");
}
/* OUTPUT */
/*
  * content.url -- 2023年12月19日
  * sample-SK-Readme.pdf -- 2023年12月19日
*/

參考

  1. Kernel Memory README