背景
「新規または変更されたコンテンツ」のみをembeddingし、毎回すべてのドキュメントを再処理しない。
1. 増分更新の3つのレベル
| レベル | 粒度 | 推奨度 |
|---|---|---|
| ファイルレベル | ⭐⭐⭐⭐ | |
| ページレベル | ページ | ⭐⭐⭐ |
| チャンクレベル | 段落 | ⭐⭐⭐⭐⭐ |
推奨されるワークフロー:
プライベートAPI
↓
ファイル取得
↓
PDFのハッシュ計算
↓
新規ファイルか判定
├── いいえ → スキップ
└── はい
↓
テキスト抽出
↓
チャンク分割
↓
チャンクハッシュ計算
↓
存在確認
├── はい → スキップ
└── いいえ
↓
embedding
↓
ベクターデータベース
方法1: ファイルハッシュ
import hashlib
def file_hash(file_bytes):
return hashlib.md5(file_bytes).hexdigest()
データベース保存例:
file_hash
file_name
processed_at
方法2: ページごとのハッシュ
PDFをページごとに分割し、ページごとにハッシュを計算
データベース保存例:
file_id
page_number
page_hash
方法3: チャンクハッシュ(エンタープライズ向け)
def chunk_hash(text):
return hashlib.sha1(text.encode()).hexdigest()
データベース保存例:
chunk_id
chunk_hash
vector
metadata
ベクターデータベースのメタデータ設計(方法1と方法3)
推奨メタデータ:
{
file_id: "pdf123",
file_hash: "...",
chunk_hash: "...",
page: 3,
source: "Louis_pdf"
}
メリット:
- ファイル削除が可能
- ファイル更新が容易
- ソースフィルタリングが可能
2. 重複排除戦略(重複embeddingを防ぐ)
方法1: 段落ごとの重複排除
多くのPDFに含まれる内容:
免責事項
フッター
会社紹介
方法2: セマンティック重複排除
2つのチャンクの類似度が 0.95 超え
方法3: テキスト近似重複排除
使用ツール:datasketch
適用対象:Webページ、メール、FAQ
3. Embeddingキャッシュ(非常に有効)
text_hash → embeddingをキャッシュとして構築
チャンク
↓
ハッシュ化
↓
キャッシュを検索
キャッシュが存在すれば、直接embeddingを利用