mcpField
R
rag-patterns

rag-patterns

github.com/claude-dev-suite開発4640 回インストール2 日前に更新
リポジトリ

rag-patterns について

rag-patterns は、RAG パイプラインの設計と評価を行う開発者向けのリファレンススキルです。チャンク分割、検索、プロンプト構築、運用前の確認項目を扱います。

主な機能

  1. 01チャンク分割戦略
  2. 02メタデータの付与
  3. 03ハイブリッド・複数クエリ検索
  4. 04検索結果のリランキング
  5. 05プロンプト構築と出典表示
  6. 06RAG 評価と運用チェックリスト

活用シーン

  1. 01技術文書の分割方法の選定
  2. 02ハイブリッド検索による再現率向上
  3. 03生成回答への出典情報の追加
  4. 04検索と回答の品質評価

インストール

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

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill rag-patterns

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

詳細

RAG のパターン

標準的な RAG パイプライン

Documents → Chunk → Embed → Store (vector DB)
Query → Embed → Retrieve → Augment prompt → Generate answer

チャンク分割戦略

from langchain_text_splitters import RecursiveCharacterTextSplitter

# Recommended defaults
splitter = RecursiveCharacterTextSplitter(
    chunk_size=800,      # chars (not tokens)
    chunk_overlap=200,
    separators=["\n\n", "\n", ". ", " ", ""],
)
chunks = splitter.split_documents(docs)
戦略最適な用途チャンクサイズ
固定サイズ(オーバーラップあり)一般的なテキスト500~1000 文字
再帰的な文字分割構造化されたドキュメント500~1000 文字
セマンティック(意味に基づく)長文コンテンツ可変
ドキュメント構造対応(Markdown ヘッダー)技術ドキュメントセクション単位
メタデータの拡充
for chunk in chunks:
    chunk.metadata.update({
        "source": doc.metadata["source"],
        "section": extract_section_title(chunk),
        "doc_id": doc.metadata["id"],
        "chunk_index": i,
    })

検索戦略

ハイブリッド検索(キーワード+セマンティック)
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever

bm25 = BM25Retriever.from_documents(docs, k=5)
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

hybrid = EnsembleRetriever(
    retrievers=[bm25, vector_retriever],
    weights=[0.3, 0.7],
)
再ランキング
from cohere import Client

cohere = Client(api_key=COHERE_API_KEY)

def rerank(query: str, documents: list[str], top_n: int = 5):
    response = cohere.rerank(
        model="rerank-english-v3.0",
        query=query,
        documents=documents,
        top_n=top_n,
    )
    return [documents[r.index] for r in response.results]
マルチクエリ検索
# Generate multiple query variations for better recall
prompt = """Generate 3 different versions of this question
to retrieve relevant documents: {question}"""

queries = llm.invoke(prompt).split("\n")
all_docs = set()
for q in queries:
    all_docs.update(retriever.invoke(q))

プロンプトの構築

SYSTEM_PROMPT = """Answer based only on the provided context.
If the context doesn't contain the answer, say "I don't have enough information."
Cite sources using [Source: filename] format.

Context:
{context}"""

def format_context(docs, max_tokens=3000):
    context_parts = []
    for doc in docs:
        source = doc.metadata.get("source", "unknown")
        context_parts.append(f"[Source: {source}]\n{doc.page_content}")
    return "\n\n---\n\n".join(context_parts)

評価

指標測定内容ツール
コンテキストの関連性検索されたドキュメントは関連性がありますか?RAGAS、手動
忠実性回答はコンテキストと一致していますか?RAGAS
回答の関連性回答は質問に答えていますか?RAGAS
検索再現率正しいドキュメントが検索されていますか?カスタム評価セット
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision

result = evaluate(dataset, metrics=[faithfulness, answer_relevancy, context_precision])

アンチパターン

アンチパターン対策
チャンクが大きすぎる(>1500 文字)500~1000 文字のチャンクを使い、200 文字をオーバーラップさせます
チャンクにメタデータがないソース、セクション、ページ番号を保存します
検索を評価していない評価セットを作成し、再現率と適合率を測定します
すべてのチャンクをプロンプトに詰め込む上位 K 件(3~5 件)に制限し、再ランキングを使います
ハイブリッド検索を無視するBM25 とベクトルを組み合わせて再現率を高めます
引用元/ソースを追跡していないパイプラインを通してメタデータを渡します

本番環境向けチェックリスト

  • 評価セットを使ってチャンク分割戦略を調整済み
  • ハイブリッド検索(BM25+ベクトル)を有効化済み
  • 検索結果に再ランキングを適用済み
  • 回答に出典を明記済み
  • 対象範囲外の質問に対するガードレールを設定済み
  • モニタリング:検索レイテンシ、回答品質スコア
  • 新しいドキュメントの増分インデックス作成

コメント