mcpField
R
rag-implementation

rag-implementation

github.com/giuseppe-trisciuoglio開発36670 回インストール7 週間前に更新
リポジトリ

rag-implementation について

外部知識に基づく AI の回答を生成する RAG システムの構築ガイドです。ドキュメント処理、検索設計、実装パターン、評価方法を扱います。

主な機能

  1. 01ベクトルデータベースの選択肢
  2. 02埋め込みモデルの選定
  3. 03密・疎・ハイブリッド検索
  4. 04ドキュメントの分割と取り込み
  5. 05検索と回答の評価

活用シーン

  1. 01社内文書を対象にした Q&A の構築
  2. 02ドキュメントアシスタントの作成
  3. 03調査ツールへの引用追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill rag-implementation

インストール後、Claude Code で/rag-implementationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
vector-store-config.yaml
references/
document-chunking.md
embedding-models.md
langchain4j-rag-guide.md
retrieval-strategies.md
vector-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:システムに対するユーザーの操作パターン

リソース

リファレンスドキュメント
アセット
  • assets/vector-store-config.yaml - さまざまなベクトルストアの設定テンプレート
  • assets/retriever-pipeline.java - RAG パイプラインの完全な実装
  • assets/evaluation-metrics.java - 評価フレームワークのコード

制約と制限事項

  1. トークン制限:モデルのコンテキストウィンドウの制限を遵守します
  2. API レート制限:外部 API のレート制限とコストを管理します
  3. データプライバシー:データ保護規制への準拠を確保します
  4. リソース要件:メモリ要件と計算要件を考慮します
  5. メンテナンス:定期的な更新とシステム監視を計画します

セキュリティに関する考慮事項

  • ベクトルデータベースと埋め込みサービスへのアクセスを保護します
  • 適切な認証と認可を実装します
  • ユーザー入力を検証し、サニタイズします
  • 不正利用や通常とは異なる使用パターンを監視します
  • 定期的なセキュリティ監査と侵入テストを実施します

コメント