AIエージェント活用実践編 / 状態管理とメモリ設計
知識ベース(KB)統合の基本
無料公開レッスン / 読了目安 8 分
学習のねらい
LLM は非常に広範な知識を持っていますが、その知識はモデルの学習データに限定されます。そのため、最新の情報、特定の企業の内部情報、あるいは専門性の高いニッチな情報については、LLM は知らないか、誤った情報を生成する可能性があります。 このレッスンでは、LLM の知識を補完するための「知識ベース(Knowledge Base、KB)統合」の基本的な考え方と、その最小実装である RAG (Retrieval Augmented Generation、検索拡張生成)について学びます。
LLM の限界と知識ベースの必要性
LLM は、学習データに含まれる情報に基づいて応答を生成します。しかし、以下のような限界があります。
- 鮮度: 学習データは常に過去のものであり、リアルタイムの情報や最新のトレンドには対応できません。
- 専門性: 特定の業界や企業に特化した専門知識、内部ドキュメントなどは学習データに含まれていません。
- ハルシネーション(Hallucination): 知らない情報について、あたかも知っているかのように事実ではない内容を生成してしまうことがあります。
これらの限界を克服し、LLM の応答の正確性と信頼性を高めるために、知識ベース(KB) を統合するアプローチが重要になります。
知識ベース(KB)統合の基本 — RAG (検索拡張生成)
RAG (Retrieval Augmented Generation、検索拡張生成) は、外部の知識ベースから関連情報を検索し、その情報を LLM のプロンプトに含めて応答を生成させる手法です。これにより、LLM は自身の内部知識だけでなく、最新かつ正確な外部情報を参照して応答できます。
RAG の最小実装は、以下のステップで構成されます。
1. ドキュメントの準備
LLM に参照させたい情報源(例: FAQ、製品マニュアル、社内規定など)をテキストデータとして準備します。
2. ドキュメントの埋め込み(Embedding)化
準備した各ドキュメントを、埋め込み(Embedding) と呼ばれる数値のベクトルに変換します。埋め込みは、テキストの意味内容を多次元空間上の点として表現したもので、意味的に近いテキストは空間的にも近くに配置される特性があります。
この埋め込みは、埋め込みモデル(Embedding Model) を使って生成します。
重要: Anthropic は公式に独自の Embedding モデルを提供しておらず、パートナーである Voyage AI の利用を推奨しています (公式ドキュメント: "Anthropic does not offer its own embedding model.")。Claude は文章生成専用、Embedding は Voyage AI / OpenAI / Cohere 等を組み合わせて使います。
import voyageai
# 環境変数 VOYAGE_API_KEY を設定して利用
vo = voyageai.Client()
text_to_embed = "これは埋め込みに変換したいテキストです。"
result = vo.embed(
[text_to_embed],
model="voyage-4", # 汎用・多言語向け (1024 次元)
input_type="document", # query / document を明示
)
embedding = result.embeddings[0]
# embedding は 1024 個の float のリスト (ベクトル)
print(len(embedding))
※ Voyage AI の推奨モデル: voyage-4-large (高品質) / voyage-4 (バランス) / voyage-4-lite (低コスト) / voyage-code-3 (コード特化) / voyage-finance-2 (金融) / voyage-law-2 (法務)。日本語を含む多言語にも対応。
3. ベクトルデータベースへの保存
生成された埋め込みベクトルは、ベクトルデータベース(Vector Database) に保存します。ベクトルデータベースは、高次元のベクトルデータを効率的に格納し、類似度検索を高速に実行することに特化したデータベースです。ChromaDB や Pinecone、Weaviate などがあります。簡易的なRAGでは、NumPy配列やリストとしてメモリ上に保持することもあります。
4. ユーザーからの質問の埋め込み化と類似度検索
ユーザーから質問が来たら、その質問も同様に埋め込みモデルでベクトルに変換します。次に、この質問ベクトルと、知識ベースに保存されているドキュメントのベクトルとの間の 類似度(Similarity) を計算します。類似度が高いドキュメントは、質問に関連性が高いと判断されます。
類似度計算には、コサイン類似度(Cosine Similarity) などがよく使われます。
5. 関連ドキュメントの取得とプロンプトへの追加
類似度検索で上位にランク付けされたいくつかのドキュメント(関連ドキュメント)を取得します。これらの関連ドキュメントを、ユーザーの質問とともに LLM へのプロンプトに含めます。
あなたは質問応答アシスタントです。以下の「参考情報」を元に、ユーザーの質問に答えてください。
参考情報:
[関連ドキュメント1の内容]
[関連ドキュメント2の内容]
...
ユーザーの質問: [ユーザーの質問内容]
6. LLM による応答生成
関連ドキュメントとユーザーの質問を含むプロンプトを受け取った LLM は、その情報を参照しながら、より正確で根拠のある応答を生成します。
メモリ検索 vs KB検索の使い分け
前レッスンで学んだ会話履歴(短期・長期メモリ)と、この知識ベース(KB)検索は、それぞれ異なる役割を持ちます。
- メモリ検索: 主に現在の会話の文脈や、ユーザー固有の過去のやり取りを覚えておくために使われます。ユーザーの意図や会話の流れを理解するのに役立ちます。
- KB検索: 一般的な事実、専門知識、最新情報など、LLM が直接知らない外部の知識を補完するために使われます。LLM の「知識源」を拡張するイメージです。
これらを適切に組み合わせることで、より賢く、より正確な LLM アプリケーションを構築できます。
まとめ
知識ベース(KB)統合は、LLM の知識の限界を補い、最新かつ正確な情報に基づいた応答を生成させるための強力な手法です。RAG の最小実装として、ドキュメントの埋め込み化、ベクトルデータベースへの保存、質問との類似度検索、そして関連ドキュメントをプロンプトに含めるという一連のステップを理解しましょう。会話の文脈を保つメモリと、外部知識を提供するKB検索を使い分けることで、LLM アプリケーションの能力を最大限に引き出すことができます。