文件更新怎麼同步:增量索引的基本設計
文件會改,索引不能每次都全量重建。這篇是最小可行的增量更新設計。
RAG 上線後最先遇到的維運問題是:來源文件更新了,索引還停在舊版。全量重建在文件多的時候不可行,得做增量。
用內容雜湊判斷變更
import hashlib
def doc_hash(text):
return hashlib.sha256(text.encode('utf-8')).hexdigest()
# 同步流程
for doc in source_docs():
h = doc_hash(doc.text)
if index.get_hash(doc.id) == h:
continue # 沒變,跳過
index.delete_by_doc(doc.id) # 先刪舊片段
index.insert(chunk_and_embed(doc), doc_hash=h)三個容易忽略的細節
- 先刪後插:否則同一份文件的新舊片段會同時被檢索到,互相矛盾。
- 刪除也要同步:來源文件被移除時,索引裡的片段必須跟著刪,這是最常漏掉的一條。
- 記錄同步時間:每份文件存
last_synced,才能查出哪些文件卡住沒更新。
排程與觸發
小型系統用排程定時掃描就夠;文件量大時改成由來源系統發事件通知,只處理變更的文件。
切塊或嵌入模型換版時,雜湊比對會失效——內容沒變但向量算法變了。這種情況必須全量重建,並在設定裡記錄「索引版本」以便判斷。