ドキュメントセットのインデックス作成
すべてのチャンクをEmbeddingし、ベクトルをインデックスに保存します。これはRAGシステムのオフライン準備工程です。
「ドキュメントセットのインデックス作成」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
取り込みパイプライン
オフラインのRAGパイプラインは、次の4ステップで構成されます。
- ドキュメント(PDF、HTML、MD)を読み込む
- 各ドキュメントをチャンク化する
- 各チャンクを埋め込む
- ベクトルとメタデータをインデックスに保存する
ステップ1:ドキュメントを読み込む
形式ごとに専用のローダーを使用します。
# PDFs
from pypdf import PdfReader
text = ''
for page in PdfReader('doc.pdf').pages:
text += page.extract_text()
# HTML
from bs4 import BeautifulSoup
text = BeautifulSoup(html, 'html.parser').get_text()
# Markdown — just read the file
text = open('doc.md').read()ステップ2:チャンク化する
前のレッスンで使用したスプリッターを使います。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_text(text)ステップ3:バッチで埋め込む
1回のAPI呼び出しで複数のチャンクを埋め込みます。
from openai import OpenAI
client = OpenAI()
def embed_batch(texts, batch_size=100):
vectors = []
for i in range(0, len(texts), batch_size):
batch = texts[i:i + batch_size]
resp = client.embeddings.create(model='text-embedding-3-small', input=batch)
vectors.extend(d.embedding for d in resp.data)
return vectorsステップ4:保存する
1万〜5万チャンクであれば、FAISSまたはChromaで十分です。
import chromadb
client = chromadb.Client()
collection = client.create_collection('docs')
collection.add(
ids=[f'doc-{i}' for i in range(len(chunks))],
embeddings=vectors,
documents=chunks,
metadatas=[{'source': 'doc.pdf', 'page': i} for i in range(len(chunks))]
)冪等な取り込み
取り込みを安全に再実行できるようにします。コンテンツのハッシュなど決定論的なIDを使用すると、再実行しても重複しません。
import hashlib
def chunk_id(source, text):
h = hashlib.sha256(text.encode()).hexdigest()[:16]
return f'{source}:{h}'
print(chunk_id('handbook.pdf', 'Employees get 20 vacation days per year.'))
print(chunk_id('handbook.pdf', 'Employees get 20 vacation days per year.'))
増分更新
ドキュメントが変更された場合は、次の手順を実行します。
- 新しいチャンクを計算する
- 既存のIDとの差分を取る
- 削除されたものを削除し、新しいものを追加し、変更されていないものは維持する
すべて削除して再挿入する単純な方法は、小規模なコーパスなら問題ありませんが、埋め込みAPIの呼び出しを無駄にします。
フィルタリング用メタデータ
後でフィルタリングに使う可能性がある項目は、すべて含めておきます。
metadata = {
'source': '/docs/handbook.pdf',
'page': 42,
'department': 'engineering',
'updated_at': '2024-08-12',
'access_level': 'internal'
}
for k, v in metadata.items():
print(f"{k}: {v}")
進捗とチェックポイント
大規模な取り込みでは、進捗を記録してチェックポイントを作成します。
for i, batch in enumerate(batches):
embed_and_store(batch)
if i % 10 == 0:
save_checkpoint(i)
print(f'Processed {i * 100} chunks')レート制限
OpenAIの埋め込みAPIには高いレート制限がありますが、制限がないわけではありません。セマフォまたは`tenacity`によるリトライを使用します。
from asyncio import Semaphore
sem = Semaphore(10) # 10 concurrent embed calls max
async def safe_embed(batch):
async with sem:
return await client.embeddings.create(...)インデックスの健全性を確認する
取り込み後、いくつかのテストクエリを実行し、結果を手動で確認します。関連する結果が何も出てこない場合は、チャンク化または埋め込みに問題があります。ユーザーが気付く前に原因を突き止めてください。
インデックスのバージョン管理
インデックスをバージョン管理しておけば、ダウンタイムなしで新しいチャンク化方法や埋め込みモデルに切り替えられます。
collection = client.create_collection(f'docs-v2-{date.today()}')
# old collection stays live until new one is validated冪等なID
チャンクIDにコンテンツのハッシュを使うのはなぜですか。
まとめ
読み込み -> チャンク化 -> 埋め込み -> 保存という流れを、冪等なIDとメタデータとともに実行します。インデックスは、その後のすべての検索処理の基盤です。
よくある質問
「ドキュメントセットのインデックス作成」レッスンは無料ですか?
はい。「ドキュメントセットのインデックス作成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「ドキュメントセットのインデックス作成」で何を学びますか?
すべてのチャンクをEmbeddingし、ベクトルをインデックスに保存します。これはRAGシステムのオフライン準備工程です。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ドキュメントセットのインデックス作成」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- RAGが解決すること(Knowledge Cut-off、Hallucinations)
- チャンク分割戦略(固定、文単位、意味単位)
- ドキュメントセットのインデックス作成
- FAISSまたはChromaで素朴なRAGを構築する