Kernel Memory 入门系列:文档的管理
Kernel Memory 入門系列: 文檔的管理
在Quick Start中我們了解到如何快速直接地上傳文檔。當(dāng)時(shí)實(shí)際中,往往會(huì)面臨更多的問題,例如文檔如何更新,如何劃定查詢范圍等等。這里我們將詳細(xì)介紹在Kernel Memory文檔的管理。
使用Document管理一組文件
當(dāng)我們需要批量上傳一組文件的時(shí)候,可以使用Document來管理。
var document = new Document();
document.AddFile("./sample-SK-Readme.pdf");
document.AddFile("./sample-KM-Readme.md");
await memory.ImportDocumentAsync(document);
其中Document 作為一個(gè)對象,可以將多個(gè)文件歸結(jié)到一起,可以自行指定對應(yīng)的DocumentId,如果不指定的話,會(huì)生成一個(gè)隨機(jī)的DocumentId,這個(gè)DocumentId后續(xù)可以用來查詢文檔的處理狀態(tài)或者用于更新刪除文檔。
后續(xù)的使用和管理,將會(huì)以Document為基本的文檔單位進(jìn)行管理。
使用Tag進(jìn)行文檔標(biāo)記
當(dāng)我們需要對上傳的文檔進(jìn)行范圍劃定時(shí),可以使用Tag來進(jìn)行標(biāo)記。Tag可以理解為一個(gè)文檔的屬性,可以充分的自定義,例如標(biāo)記文檔的類型、標(biāo)記文檔的來源、上傳的用戶、所屬的項(xiàng)目、所屬的領(lǐng)域等等。
var document = new Document();
document.AddFile("./sample-SK-Readme.pdf");
document.AddTag("type", "pdf");
document.AddTag("domain", "llm");
document.AddTag("user", "xbotter");
await memory.ImportDocumentAsync(document);
如果導(dǎo)入的是單文件,或者文件流的話,可以通過另外一種方式來添加Tag。
var tags = new TagCollection();
tags.Add("type", "pdf");
tags.Add("domain", "llm");
tags.Add("user", "xbotter");
await memory.ImportFileAsync("./sample-SK-Readme.pdf", tags: tags);
同樣也適用于文本和網(wǎng)頁的導(dǎo)入:
var tags = new TagCollection();
await memory.ImportTextAsync("這是一段文本", tags: tags);
await memory.ImportUrlAsync("https://www.github.com", tags: tags);
檢索時(shí)進(jìn)行篩選
使用Tag標(biāo)記的最大用途就是在檢索時(shí)候進(jìn)行范圍的篩選,例如我們可以指定,僅在所有pdf文檔范圍內(nèi)搜索:
await memory.AskAsync("What's the SK?", filters: MemoryFilters.ByTag("type", "pdf"));
當(dāng)然也可以指定文檔進(jìn)行篩選:
await memory.AskAsync("What's the SK?", filters: MemoryFilters.ByDocument("documentId"));
復(fù)雜篩選條件
當(dāng)我們需要復(fù)雜的篩選條件時(shí),可以使用MemoryFilters來實(shí)現(xiàn)And和Or的組合方式。MemoryFilters多次的添加ByTag條件,表示為And的關(guān)系。
await memory.AskAsync("What's the SK?", filters: MemoryFilters.ByTag("type", "pdf")
.ByTag("domain", "llm"));
添加多個(gè)MemoryFilters,表示為Or的關(guān)系。
await memory.AskAsync("What's the SK?", filters: new List<MemoryFilter>() {
MemoryFilters.ByTag("type", "pdf"),
MemoryFilters.ByTag("domain", "llm")
});
更新文檔
前面提及Document概念的時(shí)候已經(jīng)提到,DocumentId用來指定一個(gè)文檔,當(dāng)我們需要更新文檔的時(shí)候,可以直接指明DocumentId,然后上傳新的文檔即可。
var document = new Document(docId);
document.AddFile("./sample-SK-Readme.pdf");
await memory.ImportDocumentAsync(document);
此時(shí),Kernel Memory會(huì)自動(dòng)將原有的文檔進(jìn)行替換,實(shí)現(xiàn)文檔的更新。
刪除文檔
當(dāng)我們需要?jiǎng)h除文檔的時(shí)候,可以使用DeleteDocumentAsync方法,指定DocumentId即可。
await memory.DeleteDocumentAsync(docId);
使用Index進(jìn)行隔離
上傳文檔和搜索的時(shí)候,另外一個(gè)需要指定的參數(shù)是index,index在向量存儲(chǔ)中,可以理解為一個(gè)命名空間,可以用來隔離不同的文檔,而且在檢索的時(shí)候,也是無法跨index進(jìn)行檢索的。
當(dāng)上傳和檢索文檔時(shí)未指定index的時(shí)候,會(huì)使用默認(rèn)的index。
參考
- SECURITY_FILTERS
總結(jié)
以上是生活随笔為你收集整理的Kernel Memory 入门系列:文档的管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海底两万里的研究论文
- 下一篇: 一篇可供参考的 K8S 落地实践经验