rag について
rag は、文書 Q&A、セマンティック検索、専門分野向けアプリケーションの RAG システムを実装する開発者向けスキルです。文書処理、ベクトルストレージ、検索設定、パイプライン構築と評価を扱います。
主な機能
- 01文書の整形・分割・埋め込み
- 02ベクトルデータベース選定の指針
- 03密ベクトル・ハイブリッド・メタデータ検索
- 04再ランキングとコンテキスト注入
- 05検索と回答品質の評価
活用シーン
- 01社内文書を対象とする Q&A の構築
- 02ナレッジベース型チャットボットの回答根拠化
- 03自然言語によるセマンティック検索の実装
- 04根拠のない回答の削減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill ragインストール後、Claude Code で/ragを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/retriever-pipeline.javavector-store-config.yamlreferences/document-chunking.mdembedding-models.mdlangchain4j-rag-guide.mdretrieval-strategies.mdvector-databases.md詳細
RAG の実装
外部のナレッジソースで AI の機能を拡張する、検索拡張生成(RAG)システムを構築します。
概要
このスキルでは、ドキュメント処理、埋め込みの生成、ベクトルストレージ、検索設定、RAG パイプラインの実装を扱います。
使用するタイミング
- 独自のドキュメントを対象とした Q&A システムを構築するとき
- ナレッジベースの事実情報を使ったチャットボットを作成するとき
- 自然言語クエリによるセマンティック検索を実装するとき
- 根拠のある回答を生成して、ハルシネーションを抑えるとき
- ドキュメントアシスタントやリサーチツールを構築するとき
- AI システムが特定分野の知識にアクセスできるようにするとき
手順
ステップ 1:ベクトルデータベースを選択する
要件に基づいて選択します。
| 要件 | 推奨 |
|---|---|
| 本番環境でのスケーラビリティ | Pinecone, Milvus |
| オープンソース | Weaviate, Qdrant |
| ローカル開発 | Chroma, FAISS |
| ハイブリッド検索 | BM25 を使用する Weaviate |
ステップ 2:埋め込みモデルを選択する
| 用途 | モデル |
|---|---|
| 汎用 | text-embedding-ada-002 |
| 高速で軽量 | all-MiniLM-L6-v2 |
| 多言語対応 | e5-large-v2 |
| 最高のパフォーマンス | bge-large-en-v1.5 |
ステップ 3:ドキュメント処理パイプラインを実装する
- ソース(ファイルシステム、データベース、API)からドキュメントを読み込みます
- クリーニングと前処理を行います(書式を削除し、テキストを正規化します)
- 適切な方針でドキュメントをチャンクに分割します
- 各チャンクの埋め込みを生成します
- メタデータとともに、埋め込みをベクトルデータベースに保存します
検証:埋め込みが正常に生成されたことを確認します。
List<Embedding> embeddings = embeddingModel.embedAll(segments);
if (embeddings.isEmpty() || embeddings.get(0).dimension() != expectedDim) {
throw new IllegalStateException("Embedding generation failed");
}
ステップ 4:検索戦略を設定する
適切な戦略を選択します。
- 密検索:埋め込みによる意味的類似度検索(ほとんどのケースでのデフォルト)
- ハイブリッド検索:網羅性を高めるため、密検索と疎検索を組み合わせます
- メタデータフィルタリング:ドキュメントの属性で絞り込みます
- 再ランキング:高精度が求められる場合は、クロスエンコーダーで再ランキングします
ステップ 5:RAG パイプラインを構築する
- 埋め込みストアを使ってコンテンツ検索器を作成します
- 検索器とチャットメモリを使って AI サービスを設定します
- コンテキストを注入するプロンプトテンプレートを実装します
- 応答の検証と、根拠との整合性チェックを追加します
検証:既知のクエリでテストし、コンテキストが正しく注入されることを確認します。
エラー処理:バッチ取り込みでは、再試行ロジックで囲みます。
for (Document doc : documents) {
int attempts = 0;
while (attempts < 3) {
try {
store.add(embeddingModel.embed(doc).content(), doc.toTextSegment());
break;
} catch (EmbeddingException e) {
attempts++;
if (attempts == 3) throw new RuntimeException("Failed after 3 retries", e);
}
}
}
ステップ 6:評価して最適化する
- 検索指標(precision@k、recall@k、MRR)を測定します
- 回答の品質(忠実性、関連性)を評価します
- パフォーマンスとユーザーからのフィードバックを監視します
- チャンク分割、検索、プロンプトのパラメーターを反復的に調整します
例
例 1:基本的なドキュメント Q&A
List<Document> documents = FileSystemDocumentLoader.loadDocuments("/docs");
InMemoryEmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>();
EmbeddingStoreIngestor.ingest(documents, store);
DocumentAssistant assistant = AiServices.builder(DocumentAssistant.class)
.chatModel(chatModel)
.contentRetriever(EmbeddingStoreContentRetriever.from(store))
.build();
String answer = assistant.answer("What is the company policy on remote work?");
例 2:メタデータでフィルタリングした検索
EmbeddingStoreContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(store)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.7)
.filter(metadataKey("category").isEqualTo("technical"))
.build();
例 3:複数ソースの RAG パイプライン
ContentRetriever webRetriever = EmbeddingStoreContentRetriever.from(webStore);
ContentRetriever docRetriever = EmbeddingStoreContentRetriever.from(docStore);
List<Content> results = new ArrayList<>();
results.addAll(webRetriever.retrieve(query));
results.addAll(docRetriever.retrieve(query));
List<Content> topResults = reranker.reorder(query, results).subList(0, 5);
例 4:チャットメモリを使った RAG
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.contentRetriever(retriever)
.build();
assistant.chat("Tell me about the product features");
assistant.chat("What about pricing for those features?"); // Maintains context
ベストプラクティス
ドキュメントの準備
- 取り込む前にドキュメントをクリーニングし、不要なコンテンツや書式を削除します
- フィルタリングやコンテキスト付与に役立つメタデータを追加します
チャンク分割の方針
- バランスを最適化するため、チャンクあたり 500~1000 トークンを使用します
- 境界でコンテキストが失われないよう、10~20%重複させます
- 具体的な用途に合わせて、さまざまなサイズをテストします
検索の最適化
- k 値を大きめ(10~20)に設定して開始し、その後フィルタリングまたは再ランキングします
- メタデータフィルタリングを使って関連性を高めます
- 検索品質を監視し、ユーザーからのフィードバックに基づいて反復的に改善します
パフォーマンス
- 頻繁にアクセスされるコンテンツの埋め込みをキャッシュします
- ドキュメントの取り込みにはバッチ処理を使用します
- 規模に合わせてベクトルストアのインデックスを最適化します
制約と警告
システムの制約
- 埋め込みモデルには、ドキュメントあたりの最大トークン数に制限があります
- ベクトルデータベースのパフォーマンスを確保するには、適切なインデックス作成が必要です
- チャンクの境界で、複雑なドキュメントのコンテキストが失われる場合があります
- ハイブリッド検索には追加のインフラストラクチャが必要です
品質に関する警告
- 検索品質はチャンク分割の戦略に大きく左右されます
- 埋め込みモデルでは、ドメイン固有の意味を捉えられない場合があります
- メタデータによるフィルタリングには、適切なドキュメントの注釈付けが必要です
- 再ランキングを行うと、クエリへの応答に遅延が加わります
セキュリティに関する警告
- 認証情報をハードコードしないでください:API キーとパスワードには環境変数を使用してください
- 外部コンテンツを検証してください:ファイルシステム、API、またはウェブソースからのドキュメントには、悪意のあるコンテンツ(プロンプトインジェクション)が含まれている場合があります
- LLM に渡す前に、取得したドキュメントにコンテンツフィルタリングを適用してください
- 許可リストを使用して、許可するデータソースの URL とファイルパスを制限してください
リソース
参考ドキュメント
コメント
Markdown 対応