Knowledge Bases for Amazon Bedrock 在新增、刪除、修改檔案時 Vector Database 的變化
![](https://d1.awsstatic.com/Developer%20Marketing/Twitch/orange-bar.990bc7b64340221a858ddb8eedee3b7e644cc1d9.png)
根據 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
![](https://d1.awsstatic.com/knowledge-base-01.ed760246fab048b9694729001ea9def15b87490f.jpg)
2. spec_2.csv
![](https://d1.awsstatic.com/knowledge-base-02.a35c345b069f94b7db07f72cd26ed2510bcd6b52.jpg)
目前 Knowledge Bases for Amazon Bedrock 的 Data Source
![](https://d1.awsstatic.com/knowledge-base-03.81f2731b907bfccef23c58df4aef1fdda96ec896.jpg)
測試一:編輯 data source 中的其中一個檔案 ( 只修改檔案中的一個單字 )
修改 “spec.csv” 文件中的 "Acer" 為 "Mac",並重新 sync data source。
![](https://d1.awsstatic.com/knowledge-base-04.5af66f8e2d88bee39c9bfa2d16341edc4b4c0f89.jpg)
![](https://d1.awsstatic.com/knowledge-base-05.5ec8ce958a0df4edd793b574c6c2ce0a4f36e2a9.jpg)
編輯檔案後:
我們使用 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"。
![](https://d1.awsstatic.com/knowledge-base-06.428d351dcca0a2849a02341c41d266761e170085.jpg)
左側為 "spec_1_origin.json" / 右側為 "spec_1_edit_a_word.json"
測試二:編輯 data source 中的其中一個檔案 ( 修改文件中的一筆資料 )
修改 "spec.csv" 中的一筆資料,即刪除 "螢幕, LED Monitor" 這一筆資料,並重新在 Knowledge Bases for Amazon Bedrock 中 sync data source。
![](https://d1.awsstatic.com/knowledge-base-07.27f4703071ce26631940e8187619b50f843d9861.jpg)
![](https://d1.awsstatic.com/knowledge-base-08.ca25bc358e6a0a2c61213fab4042b32f3c7104e5.jpg)
編輯後:
我們使用 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"。
![](https://d1.awsstatic.com/knowledge-base-09.57731c446eeb538f8bf2df3ecba3a6f9c0cef5c1.jpg)
左側為 "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”。
![](https://d1.awsstatic.com/knowledge-base-10.9a9d9c3723c7079851dcaeb6c3c758b506cb614c.jpg)
讓我們開始從 Knowledge Base 中刪除其中一個 data source。
在 AWS console 的 Knowledge Bases for Amazon Bedrock 中點選 "spec_2.csv" 的 data source,並按下刪除鍵以移除此 data source。
![](https://d1.awsstatic.com/knowledge-base-11.b7087c27ce94b836d8f5143fb7ede70e39a93f41.jpg)
記得勾選 “Delete underlying vector data” 以從 vector database 中刪除 data source。
( 在下一個測試,我們將測試如果不勾選此 checkbox 會發生什麼情況 )
![](https://d1.awsstatic.com/knowledge-base-12.70f8b46ff68e09df2c6d08334837f55984cb1ead.jpg)
刪除後:
在刪除此 data source 之後,可以看到現在 vector database 中只剩下一個 data source 了。
在我們刪除 "spec_2.csv" 之前,我們原本在 vector database 中有兩個 vector index,但是在我們刪除 "spec_2.csv" 之後,相應的 vector index 也從 vector database 中被刪除了,剩下一個 vector index。
![](https://d1.awsstatic.com/knowledge-base-13.f19e98ad51ee842df941d3e1faa57431ded4a0bb.jpg)
[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 被移除。
![](https://d1.awsstatic.com/knowledge-base-14.41c45d3e5a97a936409996224b00513ec8a43be1.jpg)
左側為 "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” 的選項。
![](https://d1.awsstatic.com/knowledge-base-15.d43a385bebd029495eea2d35eb1a590a60fa263a.jpg)
刪除後:
可以看到 "spec_2.csv" 的這個 vector index 仍保留在 vector database 中。
![](https://d1.awsstatic.com/knowledge-base-16.c03fa8b1f9f77c1ef8209fb3f29b99f059d461ad.jpg)
因此,我們仍然可以檢索 spec_2.csv 中的資料。
![](https://d1.awsstatic.com/knowledge-base-17.b7c802650246f11c4ef7f95a4662312e4591daaf.jpg)
測試四:刪除 data source 中的一個檔案
刪除一個 data source 其中的一個檔案 "spec_2.csv",觀察 vector database 會發生什麼變化。
![](https://d1.awsstatic.com/knowledge-base-18.ce90c025c41f079d3e216997eefb492e56450bd6.jpg)
檔案都在同一個 S3 資料夾底下
![](https://d1.awsstatic.com/knowledge-base-19.acec9aad713d00b2b37bf23d13644a643eac90d9.jpg)
Knowledge Base 的 Data source 為此 S3 的資料夾
刪除前:
就如同前一個測試,無論它們是否位於同一個 data source,在 vector database 中,他們都是兩個不同的 vector index。
![](https://d1.awsstatic.com/knowledge-base-20.e66584253dfc732148997e8ddcff19bbd3030246.jpg)
刪除後:
直接從 S3 Bucket 刪除檔案 “spec_2.csv”,所以目前 S3 資料夾底下只剩一個檔案。
![](https://d1.awsstatic.com/knowledge-base-21.b2e758b62c85f4c895258c835f2d91eb05bf87a7.jpg)
由於我們直接在 S3 bucket 刪除其中的檔案,因此可以直接點選 Knowledge Base 中的 "sync" 來同步 Knowledge Base。
![](https://d1.awsstatic.com/knowledge-base-22.11015845656d0a4b8cdcc7572bcbe3299f6444ae.jpg)
同步後,我們可以看到 vector database 只剩一個 vector index。
![](https://d1.awsstatic.com/knowledge-base-23.2ef346fb8741ee9785a4648aec94bd690384cb05.jpg)
也因為直接從 S3 刪除檔案,所以即使我在 "Data deletion policy" 選擇 "retain",也沒有出現之前的 "Delete underlying vector data" 的 pop-up 視窗。
因此,"Delete underlying vector data" 並沒有影響到這次的測試結果。
![](https://d1.awsstatic.com/knowledge-base-24.08284dd5eba32b7a6a66b57551a9b269cf2a96a2.jpg)
我們使用 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。
![](https://d1.awsstatic.com/knowledge-base-25.4a831c46033b46bc1a85a5a2e73fd1a50c500f91.jpg)
左側為 "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 中。
![](https://d1.awsstatic.com/knowledge-base-26.c12daba497d4db8306cf52438670c324a644630e.jpg)
覆蓋後:
為了覆蓋檔案,我們重新上傳同一個檔案到 S3,並在Knowledge Bases for Amazon Bedrock 中又重新 sync 該 data source。
重新 sync 後,我們可以看到 Last sync time 改變了。
![](https://d1.awsstatic.com/knowledge-base-27.5c264e774ff83bf2f99420b471468a183a8a71d1.jpg)
我們使用 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。
![](https://d1.awsstatic.com/knowledge-base-28.2d3a7921a8970299c80339e1ab0e32293aeff910.jpg)
左側為 "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" 這個文件。
![](https://d1.awsstatic.com/knowledge-base-29.8e7166561f3475f6585b981e5f073647b1c249c3.jpg)
並且在我們的 vector database 中也只有 1 個搜尋結果 (hit)。
![](https://d1.awsstatic.com/knowledge-base-30.94ef44da27568cf692de8c02d741e34a9e9418c7.jpg)
新增後:
現在我們把 "spec_2.csv" 新增並 sync 到我們的 Knowledge Base 中。
![](https://d1.awsstatic.com/knowledge-base-31.49931a1c81b20cb83aeed4828c31bab7477905b2.jpg)
發現在 vector database 中多了一筆從 "s3://product-inventory-bedrock-agent/kb/spec_2.csv" 來的 data source。
![](https://d1.awsstatic.com/knowledge-base-32.7e3d21ec3fb018115c2c083abfc8a9ebecdc4cbb.jpg)
那麼最初存在於 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 並沒有被重新生成。
![](https://d1.awsstatic.com/knowledge-base-33.1a938aae5e61eb742af3d37542bea71dc4d9bb61.jpg)
左側為 "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則維持原狀 |
![](https://d1.awsstatic.com/Developer%20Marketing/Twitch/orange-bar.990bc7b64340221a858ddb8eedee3b7e644cc1d9.png)
作者資訊
![](https://d1.awsstatic.com/Ginny%20Huang.59058e170ef3fcfe418290e9dcfdf25ffe299e65.jpg)
Ginny Huang, Associate Solutions Architect Intern, AWS
Ginny Huang 目前任職於台灣 AWS 的解決方案架構師部門擔任實習生。對生成式 AI 解決方案充滿熱情,並致力於了解客戶需求並協助客戶設計解決方案。
![](https://d1.awsstatic.com/Ting-Yao%20Chang.5cbf3672b6147919a1cbe3f28224be3df25aaccd.jpg)
Ting-Yao Chang, Solutions Architect, AWS
Ting-Yao Chang 是任職於台灣 AWS 的解決方案架構師,擅長了解客戶需求並設計架構,服務過許多大型企業;近期致力於生成式 AI 技術,協助客戶探索使用情境並提供解決方案建議。