前言
Kernel Memory可以讓我們快速建立 RAG(Retrieval-Augmented Generation)服務。
支持多種文件格式的文本(如 Image、Office、Pdf、Text 和 WebPages)的提取和分塊,並使用 LLM 嵌入生成器提取嵌入,將嵌入保存到 Vector DB 中。
文件處理到儲存到 Vector DB 的過程,是透過DataPipeline中的Steps來處理,預設的 Pipleline 是 PipelineStepsExtract, PipelineStepsPartition, PipelineStepsGenEmbeddings, PipelineStepsSaveRecords,就是 1.取得檔案內容,2.切 Chunks ,3.轉成嵌入,4.存到 Vector DB 。
Vector DB 也可以存到AzureAISearch, Qdrant, Postgres, Redis, SimpleVectorDb及 SqlServer …
當這些文件知識庫存到 Vector DB 後,使用者就可以透過 Filter 來進行 RAG 問答及摘要功能。
以下使用相容 OpenAI 的本地小模型(llama.cpp),並將嵌入保存到本地的 MSSQL 中。
實作
設定 Kernel Memory as a Service
參考Kernel Memory as a Service,直接在本地運行。
在跑之前,要調整Service 專案中的appsettings.json檔案。
使用相容 OpenAI 的地端小模型(llama.cpp)並將嵌入保存到地端的 MSSQL,TextGeneratorType 設定為 OpenAI
在 DataIngestion 區段,OrchestrationType 設定成 InProcess,EmbeddingGenerationEnabled 設定為 true,EmbeddingGeneratorTypes 設定為 [ "OpenAI" ],MemoryDbTypes 設定為 [ "SqlServer" ],TextPartitioning 可以依需求去設定
Retrieval 區段,EmbeddingGeneratorType 設定為 OpenAIMemoryDbType 設定為 SqlServer
Services 區段中,
OpenAI區段設定地端的 url 及 apikey,
1 | "OpenAI": { |
SimpleFileStorage 區段中的 StorageType 改成 Disk
SqlServer 區段,設定 ConnectionString
設定好後,可以把程式跑起來,Console 的結果如下,
透過以上的設定,RAG Service 就完成了哦~
接下來透過 MemoryWebClient 來檔案成為知識庫,並進行查詢來看看效果怎麼樣。
透過 MemoryWebClient 來操作
Kernel Memory Service 跑起來後,
當然,您也可以執行 dotnet run setup 來透過詢問來設定 Config 值。
接下來透過 MemoryWebClient 這個類別,來將檔案上傳成為知識庫,並進行查詢來看看效果怎麼樣。
1.加入Microsoft.KernelMemory Nuget 套件
2.建立 MemoryWebClient Instance
1 | using Microsoft.KernelMemory; |
如果部署到正式環境,請記得調整 kmServiceEndpoint 的值。
3.呼叫ImportDocumentAsync來匯入文件
1 | var docPath = @"C:\Projects\請假規則.docx"; |
註: documentId 可以讓它自動產生,或是指定一個值給它(最好給英數字,不要給中文哦~)
4.透過IsDocumentReadyAsync來查看是否匯入完成
1 | var isDocReady = await kmClient.IsDocumentReadyAsync(documentId, tenantId); |
5.進行問答
1 | var question = "請假6天,需要簽到那位主管核准? 要事前幾天請呢?"; |
從上圖可以發現,可以從知識庫中找到對應的資訊並回覆給使用者
在單欄的 PDF Table 也可以查得到哦。
例如花蓮觀光糖廠參考資料,
我查詢 7 月份的房價,是可以正常回覆的,如下,
查到的 Chunk 資料如下,
註: 在本機可以使用
OrchestrationType為InProcess,如果是大檔或是正式機,請使用Distributed
參考資源
Kernel Memory
rrg92/text-embeddings-enus - 文字轉成嵌入 Demo 網頁
The error "Invalid non-ASCII or control character in header: 0x82B1" occurs during the MemoryWebClient.ImportDocumentAsync operation.