Knowledge Bases for Amazon Bedrock 在新增、刪除、修改檔案時 Vector Database 的變化
根據 Knowledge Bases for Amazon Bedrock(以下簡稱 Knowledge Base)文件 [1] 的說明:「每次您在 data source 的 S3 中新增、修改或刪除檔案時,您必須同步該 data source,使其在 Knowledge Base 中重新建立 index。同步是累加的,因此 Amazon Bedrock 僅會處理自上次同步後新增、修改或刪除的物件。」
本篇文章的目的便是為了驗證並觀察在 Knowledge Base 中新增、刪除或修改檔案時 vector database 的變化。
測試案例
- 編輯 data source 中的其中一個檔案 ( 只修改檔案中的一個單字 )
- 編輯 data source 中的其中一個檔案 ( 修改檔案中的一筆資料 )
- 刪除 Knowledge Base 中的一個 data source
- 刪除 data source 中的一個檔案
- 覆蓋一個檔案而不修改其內容
- 在 data source 中新增一個新檔案
資料準備
1. spec.csv
2. spec_2.csv
目前 Knowledge Bases for Amazon Bedrock 的 Data Source
測試一:編輯 data source 中的其中一個檔案 ( 只修改檔案中的一個單字 )
修改 “spec.csv” 文件中的 "Acer" 為 "Mac",並重新 sync data source。
編輯檔案後:
我們使用 Visual Studio Code 來比較 Knowledge Bases for Amazon Bedrock 在修改資料前後所產生的 vector index。
在我們修改 "spec.csv" 之前,vector index 的內容可以參考 "spec_1_origin.json"。
在我們修改 "spec.csv" 之後,vector index 的內容可以參考 "spec_1_edit_a_word.json"。
藉由此測試,我們可以看到即使我們只修改其中的一個單詞,vector database 也重新生成了整個 vector index,包括 "id" 和 "bedrock-knowledge-base-default-vector"。
左側為 "spec_1_origin.json" / 右側為 "spec_1_edit_a_word.json"
測試二:編輯 data source 中的其中一個檔案 ( 修改文件中的一筆資料 )
修改 "spec.csv" 中的一筆資料,即刪除 "螢幕, LED Monitor" 這一筆資料,並重新在 Knowledge Bases for Amazon Bedrock 中 sync data source。
編輯後:
我們使用 Visual Studio Code 比較修改數據前後 Knowledge Bases for Amazon Bedrock 生成的索引。
在我們修改 "spec.csv" 之前,vector index 的內容可以參考 "spec_1_edit_a_word.json"。
在我們修改 "spec.csv" 之後,vector index 的內容可以參考 "spec_1_edit_a_row.json"。
藉由此測試,我們可以看到即使只刪除文件中的一筆資料,vector database 也重新生成了整個 vector index,包括 "id" 和 "bedrock-knowledge-base-default-vector"。
左側為 "spec_1_edit_a_row.json"/ 右側為 "spec_1_edit_a_word.json
測試三:刪除 Knowledge Base 中的一個 data source
刪除其中一個 data source “spec_2.csv” 後 ,觀察在 vector database 中會發生什麼變化。
刪除前:
目前我們在 vector database 及 Knowledge Bases for Amazon Bedrock 中有 2 個 data source:“spec.csv” 及 “spec_2.csv”。
讓我們開始從 Knowledge Base 中刪除其中一個 data source。
在 AWS console 的 Knowledge Bases for Amazon Bedrock 中點選 "spec_2.csv" 的 data source,並按下刪除鍵以移除此 data source。
記得勾選 “Delete underlying vector data” 以從 vector database 中刪除 data source。
( 在下一個測試,我們將測試如果不勾選此 checkbox 會發生什麼情況 )
刪除後:
在刪除此 data source 之後,可以看到現在 vector database 中只剩下一個 data source 了。
在我們刪除 "spec_2.csv" 之前,我們原本在 vector database 中有兩個 vector index,但是在我們刪除 "spec_2.csv" 之後,相應的 vector index 也從 vector database 中被刪除了,剩下一個 vector index。
[console screenshot]
同時,我們也可以驗證在同一個 vector database 中刪除其中一個 data source 後,剩餘的 vector index 是否有被重新生成。
我們使用 Visual Studio Code 來比對在刪除其中一個 data source 之前和之後,Knowledge Bases for Amazon Bedrock 所生成的 index。
在我們刪除 "spec_2.csv" 之前,vector index 的內容可以參考 "spec_1_before_delete.json"。
在我們刪除 "spec_2.csv" 之後,vector index 的內容可以參考 "spec_1_after_delete.json"。
藉由此測試,我們可以觀察到在刪除 data source 之後,"spec.csv" 的 vector index 並沒有發生變化。
這意味著當我們從 Knowledge Base 中刪除一個 data source 時,只有相應的 index 被移除。
左側為 "spec_1_before_delete.json" / 右側為 "spec_1_after_delete.json"
那如果不勾選 “Delete underlying vector data” 的 checkbox 呢?
關於勾選 “Delete underlying vector data” 選項的額外小測試。
如果在刪除 Knowledge Bases for Amazon Bedrock 中的其中一個 data source 時,我們不勾選這個選項會發生什麼事?
刪除前:
與前面一個測試相同的情況,我們想要刪除 data source "spec_2.csv"。
但這次我們沒有勾選 “Delete underlying vector data” 的選項。
刪除後:
可以看到 "spec_2.csv" 的這個 vector index 仍保留在 vector database 中。
因此,我們仍然可以檢索 spec_2.csv 中的資料。
測試四:刪除 data source 中的一個檔案
刪除一個 data source 其中的一個檔案 "spec_2.csv",觀察 vector database 會發生什麼變化。
檔案都在同一個 S3 資料夾底下
Knowledge Base 的 Data source 為此 S3 的資料夾
刪除前:
就如同前一個測試,無論它們是否位於同一個 data source,在 vector database 中,他們都是兩個不同的 vector index。
刪除後:
直接從 S3 Bucket 刪除檔案 “spec_2.csv”,所以目前 S3 資料夾底下只剩一個檔案。
由於我們直接在 S3 bucket 刪除其中的檔案,因此可以直接點選 Knowledge Base 中的 "sync" 來同步 Knowledge Base。
同步後,我們可以看到 vector database 只剩一個 vector index。
也因為直接從 S3 刪除檔案,所以即使我在 "Data deletion policy" 選擇 "retain",也沒有出現之前的 "Delete underlying vector data" 的 pop-up 視窗。
因此,"Delete underlying vector data" 並沒有影響到這次的測試結果。
我們使用 Visual Studio Code 來比對在刪除其中一個 data source 之前和之後,Knowledge Bases for Amazon Bedrock 所生成的 index。
在我們刪除 "spec_2.csv" 之前,vector index 的內容可以參考 "spec_1_before_delete_sb.json"。
在我們刪除 "spec_2.csv" 之後,vector index 的內容可以參考 "spec_1_after_delete_sb.json"。
藉由此測試,我們可以觀察到,無論是不是在刪除同一個 S3 Bucket 的 data source,對於其 vector index 都沒有影響。
這代表當我們從 Knowledge Base 中刪除同一個 S3 Bucket 中的資料時,vector database只會移除對應的 index,而不會影響到其他 data source 在 vector database 中的 index。
左側為 "spec_1_before_delete_sb.json" / 右側為 "spec_1_after_delete_sb.json"
測試五:覆蓋一個檔案而不修改其內容
現在這個測試,我們想知道當我們覆蓋一個檔案而不修改此檔案內容時,我們的 vector database 是否會重新生成 vector index。
覆蓋前:
在覆蓋之前,我們上傳了 "spec.csv" 到 S3 後,新增並 sync 到 Knowledge Bases for Amazon Bedrock 的 Data source 中。
覆蓋後:
為了覆蓋檔案,我們重新上傳同一個檔案到 S3,並在Knowledge Bases for Amazon Bedrock 中又重新 sync 該 data source。
重新 sync 後,我們可以看到 Last sync time 改變了。
我們使用 Visual Studio Code 來比對在覆蓋檔案之前和之後,Knowledge Bases for Amazon Bedrock 所生成的 index。
在我們覆蓋 "spec.csv" 之前,vector index 的內容可以參考 "spec_1_before_overwrite.json"。
在我們覆蓋 "spec.csv" 之後,vector index 的內容可以參考 "spec_1_after_overwrite.json"。
藉由此測試,我們可以看到在覆蓋檔案後,"spec.csv" 的 vector index 中的 "id" 仍然保持不變。
這意味著當我們在 Knowledge Base 中覆蓋檔案而不修改它時,vector database 不會重新生成 vector index。
左側為 "spec_1_before_delete_sb.json" / 右側為 "spec_1_after_delete_sb.json"
測試六:在 Data Source 中新增一個新檔案
如果我們在 Knowledge Bases for Amazon Bedrock 中新增一個新檔案,vector database會有什麼變化呢?
新增前:
在我們新增新文件之前,可以看到我們目前的 Knowledge Base 中只有 "spec.csv" 這個文件。
並且在我們的 vector database 中也只有 1 個搜尋結果 (hit)。
新增後:
現在我們把 "spec_2.csv" 新增並 sync 到我們的 Knowledge Base 中。
發現在 vector database 中多了一筆從 "s3://product-inventory-bedrock-agent/kb/spec_2.csv" 來的 data source。
那麼最初存在於 vector database 中的 "spec.csv" 會怎麼樣呢?
我們可以驗證在同一個 vector database 中新增了新 data source 之後,原有的 vector index 是否被重新生成。
我們使用 Visual Studio Code 來比對在新增新文件之前和之後,Knowledge Bases for Amazon Bedrock 所生成的 index。
在我們新增 "spec_2.csv" 之前,vector index 的內容可以參考 "spec_1_before_add.json"。
在我們新增 "spec_2.csv" 之後,vector index 的內容可以參考 "spec_1_after_add.json"。
藉由此測試,我們可以觀察到在新增新文件後,data source "spec.csv" 的 vector index沒有任何變化,甚至 "id" 也保持不變。
這意味著當我們從 Knowledge Base 中新增新檔案時,只有對應的 vector index 被新增,原有的 index 並沒有被重新生成。
左側為 "spec_1_after_add.json" / 右側為 "spec_1_before_add.json"
結論
經過以上六個測驗,我們可以證明在 sync data source 之後,Knowledge Bases for Amazon Bedrock 只會處理在 S3 中被新增、刪除或修改的物件。此外,一旦某個文件被修改過,該文件的 vector index 會在 vector database 中被重新生成。
測試案例 |
測試結果 |
編輯data source中的其中一個檔案 |
Knowledge Base重新生成該檔案的 vector index在vector database中 其餘的vector index則維持原狀 |
編輯data source中的其中一個檔案 |
Knowledge Base重新生成該檔案的 vector index在vector database中 其餘的vector index則維持原狀 |
刪除Knowledge Base中的一個data source |
[ 勾選 “Delete underlying vector data” ] Knowledge Base刪除該data source在vector database的vector index 其餘的vector index則維持原狀 |
[ 不勾選 “Delete underlying vector data” ] 不會刪除該data source在vector database的vector index,所有的vector index維持原狀 |
|
刪除data source中的一個檔案 |
Knowledge Base刪除該data source在vector database的vector index 其餘的vector index則維持原狀 |
覆蓋一個檔案而不修改其內容 |
Vector index維持原狀 |
在data source中新增一個新檔案 |
Knowledge Base新增該檔案的vector index在vector database中 其餘的vector index則維持原狀 |
作者資訊
Ginny Huang, Associate Solutions Architect Intern, AWS
Ginny Huang 目前任職於台灣 AWS 的解決方案架構師部門擔任實習生。對生成式 AI 解決方案充滿熱情,並致力於了解客戶需求並協助客戶設計解決方案。
Ting-Yao Chang, Solutions Architect, AWS
Ting-Yao Chang 是任職於台灣 AWS 的解決方案架構師,擅長了解客戶需求並設計架構,服務過許多大型企業;近期致力於生成式 AI 技術,協助客戶探索使用情境並提供解決方案建議。