rag-implementation について
外部知識に基づく AI の回答を生成する RAG システムの構築ガイドです。ドキュメント処理、検索設計、実装パターン、評価方法を扱います。
主な機能
- 01ベクトルデータベースの選択肢
- 02埋め込みモデルの選定
- 03密・疎・ハイブリッド検索
- 04ドキュメントの分割と取り込み
- 05検索と回答の評価
活用シーン
- 01社内文書を対象にした Q&A の構築
- 02ドキュメントアシスタントの作成
- 03調査ツールへの引用追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill rag-implementationインストール後、Claude Code で/rag-implementationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/vector-store-config.yamlreferences/document-chunking.mdembedding-models.mdlangchain4j-rag-guide.mdretrieval-strategies.mdvector-databases.md詳細
RAG の実装
外部のナレッジソースで AI の機能を拡張する、検索拡張生成システムを構築します。
概要
RAG(検索拡張生成)は、ナレッジベースから関連情報を検索し、それを AI の応答に組み込むことで AI アプリケーションを強化します。これにより、ハルシネーションを減らし、正確で根拠に基づいた回答を提供できます。
使用する場面
次のような場合に、このスキルを使用します。
- 独自のドキュメントを対象とする Q&A システムの構築
- 最新かつ事実に基づく情報を提供するチャットボットの作成
- 自然言語クエリによるセマンティック検索の実装
- 根拠に基づく応答によるハルシネーションの削減
- AI システムによるドメイン固有のナレッジへのアクセスの実現
- ドキュメントアシスタントの構築
- 出典を引用するリサーチツールの作成
- ナレッジ管理システムの開発
主要コンポーネント
ベクトルデータベース
セマンティック検索用のドキュメント埋め込みを保存し、効率的に検索します。
主な選択肢:
- Pinecone:マネージド型、スケーラブル、本番環境対応
- Weaviate:オープンソース、ハイブリッド検索機能
- Milvus:高性能、オンプレミス展開
- Chroma:軽量で、ローカル開発が容易
- Qdrant:高速、高度なフィルタリング
- FAISS:Meta のライブラリ、完全な制御が可能
埋め込みモデル
テキストを類似度検索用の数値ベクトルに変換します。
人気のモデル:
- text-embedding-ada-002(OpenAI):汎用、1536 次元
- all-MiniLM-L6-v2:高速、軽量、384 次元
- e5-large-v2:高品質、多言語対応
- bge-large-en-v1.5:最先端の性能
検索戦略
ユーザーのクエリに基づいて関連コンテンツを見つけます。
アプローチ:
- 密検索:埋め込みによるセマンティック類似度検索
- 疎検索:キーワード照合(BM25、TF-IDF)
- ハイブリッド検索:密検索と疎検索を組み合わせて最良の結果を得る
- マルチクエリ:複数のクエリのバリエーションを生成
- コンテキスト圧縮:関連する部分のみを抽出
クイック実装
基本的な RAG のセットアップ
// Load documents from file system
List<Document> documents = FileSystemDocumentLoader.loadDocuments("/path/to/docs");
// Create embedding store
InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
// Ingest documents into the store
EmbeddingStoreIngestor.ingest(documents, embeddingStore);
// Create AI service with RAG capability
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore))
.build();
ドキュメント処理パイプライン
// Split documents into chunks
DocumentSplitter splitter = new RecursiveCharacterTextSplitter(
500, // chunk size
100 // overlap
);
// Create embedding model
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
.apiKey("your-api-key")
.build();
// Create embedding store
EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.builder()
.host("localhost")
.database("postgres")
.user("postgres")
.password("password")
.table("embeddings")
.dimension(1536)
.build();
// Process and store documents
for (Document document : documents) {
List<TextSegment> segments = splitter.split(document);
for (TextSegment segment : segments) {
Embedding embedding = embeddingModel.embed(segment).content();
embeddingStore.add(embedding, segment);
}
}
実装パターン
パターン 1:シンプルなドキュメント Q&A
ドキュメントを対象とする基本的な Q&A システムを作成します。
public interface DocumentAssistant {
String answer(String question);
}
DocumentAssistant assistant = AiServices.builder(DocumentAssistant.class)
.chatModel(chatModel)
.contentRetriever(retriever)
.build();
パターン 2:メタデータでフィルタリングする検索
ドキュメントのメタデータに基づいて結果をフィルタリングします。
// Add metadata during document loading
Document document = Document.builder()
.text("Content here")
.metadata("source", "technical-manual.pdf")
.metadata("category", "technical")
.metadata("date", "2024-01-15")
.build();
// Filter during retrieval
EmbeddingStoreContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.7)
.filter(metadataKey("category").isEqualTo("technical"))
.build();
パターン 3:複数ソースからの検索
複数のナレッジソースからの結果を組み合わせます。
ContentRetriever webRetriever = EmbeddingStoreContentRetriever.from(webStore);
ContentRetriever documentRetriever = EmbeddingStoreContentRetriever.from(documentStore);
ContentRetriever databaseRetriever = EmbeddingStoreContentRetriever.from(databaseStore);
// Combine results
List<Content> allResults = new ArrayList<>();
allResults.addAll(webRetriever.retrieve(query));
allResults.addAll(documentRetriever.retrieve(query));
allResults.addAll(databaseRetriever.retrieve(query));
// Rerank combined results
List<Content> rerankedResults = reranker.reorder(query, allResults);
ベストプラクティス
ドキュメントの準備
- 取り込みの前にドキュメントをクリーニングして前処理する
- 無関係なコンテンツや書式のノイズを取り除く
- 一貫した処理ができるよう、ドキュメントの構造を統一する
- フィルタリングとコンテキスト付与に役立つメタデータを追加する
チャンキング戦略
- 最適なバランスを得るため、チャンクあたり 500~1000 トークンを使用する
- 境界でコンテキストを保持できるよう、10~20%のオーバーラップを設ける
- チャンク境界を決める際は、ドキュメントの構造を考慮する
- ユースケースに応じて、異なるチャンクサイズをテストする
検索の最適化
- k の値を大きめ(10~20)に設定してから、フィルタリングや再ランキングを行う
- メタデータフィルタリングを使用して関連性を高める
- 複数の検索戦略を組み合わせて、より広く情報をカバーする
- 検索品質とユーザーからのフィードバックを監視する
パフォーマンスに関する考慮事項
- 頻繁にアクセスされるコンテンツの埋め込みをキャッシュする
- ドキュメントの取り込みにはバッチ処理を使用する
- 規模に合わせてベクトルストアの設定を最適化する
- クエリのパフォーマンスとシステムリソースを監視する
よくある問題と解決策
検索品質が低い
問題:検索されたドキュメントがユーザーのクエリと一致しない 解決策:
- ドキュメントの前処理とクリーニングを改善する
- チャンクサイズとオーバーラップのパラメーターを調整する
- 別の埋め込みモデルを試す
- セマンティック検索とキーワード照合を組み合わせたハイブリッド検索を使用する
無関係な結果
問題:検索されたドキュメントには関連情報が含まれているものの、具体性が足りない 解決策:
- ドメイン固有の制約に合わせてメタデータフィルタリングを追加する
- クロスエンコーダーモデルによる再ランキングを実装する
- コンテキスト圧縮を使用して関連部分を抽出する
- 検索パラメーター(k の値、類似度のしきい値)を微調整する
パフォーマンスの問題
問題:検索時の応答が遅い 解決策:
- ベクトルストアの設定とインデックス作成を最適化します
- 頻繁に検索されるコンテンツをキャッシュします
- 推論を高速化するため、小型の埋め込みモデルを使用します
- 近似最近傍アルゴリズムを検討します
ハルシネーションの防止
問題:AI が検索されたドキュメントに含まれていない情報を生成します 解決策:
- 根拠に基づく回答を強調するよう、プロンプトエンジニアリングを改善します
- 回答が根拠と一致しているかを確認する検証手順を追加します
- 回答に信頼度スコアを含めます
- ファクトチェックの仕組みを導入します
評価フレームワーク
検索指標
- Precision@k:上位 k 件の結果に含まれる関連ドキュメントの割合
- Recall@k:上位 k 件の結果で見つかった、関連ドキュメント全体の割合
- Mean Reciprocal Rank (MRR):最初の関連結果の順位の平均
- Normalized Discounted Cumulative Gain (nDCG):ランキング品質の指標
回答品質の指標
- Faithfulness:回答が検索されたドキュメントにどの程度根拠を置いているか
- Answer Relevance:回答がユーザーの質問にどの程度適切に答えているか
- Context Recall:回答で使用された関連コンテキストの割合
- Context Precision:検索されたコンテキストのうち、関連するものの割合
ユーザー体験の指標
- Response Time:クエリから回答までの時間
- User Satisfaction:回答品質に対するフィードバック評価
- Task Completion:タスクを正常に完了した割合
- Engagement:システムに対するユーザーの操作パターン
リソース
リファレンスドキュメント
- ベクトルデータベースの比較 - ベクトルデータベースの選択肢を詳しく比較します
- 埋め込みモデルガイド - モデルの選択と最適化
- 検索戦略 - 高度な検索手法
- ドキュメントのチャンク分割 - チャンク分割の戦略とベストプラクティス
- LangChain4j RAG ガイド - 公式の実装パターン
アセット
assets/vector-store-config.yaml- さまざまなベクトルストアの設定テンプレートassets/retriever-pipeline.java- RAG パイプラインの完全な実装assets/evaluation-metrics.java- 評価フレームワークのコード
制約と制限事項
- トークン制限:モデルのコンテキストウィンドウの制限を遵守します
- API レート制限:外部 API のレート制限とコストを管理します
- データプライバシー:データ保護規制への準拠を確保します
- リソース要件:メモリ要件と計算要件を考慮します
- メンテナンス:定期的な更新とシステム監視を計画します
セキュリティに関する考慮事項
- ベクトルデータベースと埋め込みサービスへのアクセスを保護します
- 適切な認証と認可を実装します
- ユーザー入力を検証し、サニタイズします
- 不正利用や通常とは異なる使用パターンを監視します
- 定期的なセキュリティ監査と侵入テストを実施します
コメント
Markdown 対応