マルチベクトル検索(ColBERT)
ドキュメントごとに複数のベクトル(トークンごと、またはチャンクごと)をインデックス化し、きめ細かなマッチングを実現します。
「マルチベクトル検索(ColBERT)」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
1つのベクトルでは不十分
標準的なRAGでは、各チャンクを1つのベクトルに埋め込みます。そのベクトルにはチャンク内のすべての情報が平均化されるため、細かなシグナルが失われます。
マルチベクトル検索では、ドキュメントごとに複数のベクトルを保存し、より正確に照合します。
ColBERTの考え方
ColBERT(Khattab & Zaharia, 2020)は、ドキュメントの各TOKENとクエリの各トークンを埋め込み、その後、最大類似度を計算します。
score(q, d) = sum over q_token in q: max over d_token in d: cos(q_token, d_token)ColBERTが単一ベクトルを上回る理由
- ドキュメントの複数の側面を捉えられる(1つのベクトルでは不可能)
- 長いドキュメントをより適切に扱える
- まれな用語に対する再現率が高い
ColBERTのコスト
チャンクごとに1つのベクトルを保存する代わりに、トークンごとに1つのベクトルを保存します。
- チャンクに500トークンある場合、ストレージは500倍になります
- 検索のたびに、はるかに多くのペアを比較します
量子化と枝刈りによって10〜50分の1に削減できますが、それでもコストは高くなります。
ColBERTv2
ColBERTv2は残差圧縮を追加しています。トークンをセントロイドにクラスタリングし、各トークンを(セントロイドID、小さな残差)として保存します。ストレージを50分の1に削減できます。
ColBERTの実行
RAGatouilleライブラリを使うと簡単に実行できます。
# pip install ragatouille
from ragatouille import RAGPretrainedModel
rag = RAGPretrainedModel.from_pretrained('colbert-ir/colbertv2.0')
rag.index(collection=documents, index_name='my_corpus')
results = rag.search(query='What is the refund policy?', k=5)実際のマルチベクトル利用
ColBERT以外にも、マルチベクトルの手法には次のようなものがあります。
- 親子 — 小さなチャンクを埋め込み、大きな親チャンクを取得する
- 要約+チャンク — ドキュメントの要約と個々のチャンクの両方を埋め込む
- 仮想的な質問 — 各ドキュメントから合成したQ&Aペアを埋め込む
Hypothetical Questions Pattern
def index_with_hypos(doc):
# Generate 5 plausible questions this doc could answer
questions = llm.invoke(f'Write 5 questions answered by this doc:\n{doc}').content.split('\n')
for q in questions:
vector_db.add(embed(q), payload={'doc': doc, 'question': q})
# Now queries that match a stored hypothetical question retrieve the doc.Parent-Child with LangChain
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
store = InMemoryStore()
retriever = ParentDocumentRetriever(
vectorstore=child_vectorstore,
docstore=store,
child_splitter=child_splitter, # small
parent_splitter=parent_splitter # large
)
retriever.add_documents(documents)
# Indexes small chunks, returns large parents.ColBERTを使う場合
- 重要度の高い検索(法律、医療など)
- 長いドキュメント
- ストレージコストを許容できる場合
使わない場合
- 小規模なコーパス
- レイテンシが重要な処理経路
- コストに制約のあるプロジェクト
BM25とのハイブリッド
再現率を最大化するには、マルチベクトル検索と従来のBM25キーワード検索を組み合わせます。Reciprocal Rank Fusionを使って結果を統合します。
ColBERTのトレードオフ
ColBERT方式のマルチベクトル検索を使う場合の主なトレードオフは何でしょうか。
まとめ
チャンクごとに1つのベクトルだけを使うと情報が失われます。ColBERTはトークンごとのベクトルを保存し、より高い精度を実現します。RAGatouilleを使えば簡単に導入できます。再現率が重要で、コストを許容できる場合に使います。
よくある質問
「マルチベクトル検索(ColBERT)」レッスンは無料ですか?
はい。「マルチベクトル検索(ColBERT)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「マルチベクトル検索(ColBERT)」で何を学びますか?
ドキュメントごとに複数のベクトル(トークンごと、またはチャンクごと)をインデックス化し、きめ細かなマッチングを実現します。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「マルチベクトル検索(ColBERT)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Cross-Encoderによる再ランキング
- HyDE:仮想ドキュメントEmbedding
- マルチベクトル検索(ColBERT)
- RAG評価(RAGAS、Recall@K)