mcpField
R
rag-implementation

rag-implementation

github.com/wshobson開発41.9k14.1k 回インストール2 週間前に更新
リポジトリ

rag-implementation について

rag-implementation は、外部の知識に基づく回答を生成する LLM アプリの構築スキルです。Q&A、検索、ドキュメントアシスタントの開発者向けに、ベクトルデータベース、埋め込み、検索戦略、再ランキングを扱います。

主な機能

  1. 01ベクトルデータベースの選定
  2. 02テキスト埋め込みによる類似検索
  3. 03密ベクトル・疎検索・ハイブリッド検索
  4. 04マルチクエリと HyDE の活用
  5. 05検索結果の再ランキング

活用シーン

  1. 01社内文書を対象とする Q&A の構築
  2. 02自然言語によるセマンティック検索
  3. 03最新の事実に基づくチャットボット
  4. 04出典を引用するリサーチツールの作成

インストール

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

$npx skills add https://github.com/wshobson/agents --skill rag-implementation

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

同梱ファイルreferences/details.md

詳細

RAG の実装

Retrieval-Augmented Generation(RAG)を習得し、外部のナレッジソースを使用して正確で根拠のある回答を提供する LLM アプリケーションを構築しましょう。

このスキルを使用する場面

  • 独自のドキュメントに対する Q&A システムを構築する場合
  • 最新の事実情報を備えたチャットボットを作成する場合
  • 自然言語クエリによるセマンティック検索を実装する場合
  • 根拠のある回答によってハルシネーションを削減する場合
  • LLM がドメイン固有の知識にアクセスできるようにする場合
  • ドキュメントアシスタントを構築する場合
  • 出典引用を備えたリサーチツールを作成する場合

コアコンポーネント

1. ベクトルデータベース

目的: ドキュメントの埋め込みを効率的に保存および取得する

選択肢:

  • Pinecone: マネージド、スケーラブル、サーバーレス
  • Weaviate: オープンソース、ハイブリッド検索、GraphQL
  • Milvus: 高性能、オンプレミス
  • Chroma: 軽量、使いやすい、ローカル開発向け
  • Qdrant: 高速、フィルタ検索、Rust ベース
  • pgvector: PostgreSQL 拡張、SQL 統合
2. 埋め込み

目的: 類似度検索のためにテキストを数値ベクトルに変換する

モデル(2026年):

モデル次元数最適な用途
voyage-3-large1024Claude アプリ(Anthropic 推奨)
voyage-code-31024コード検索
text-embedding-3-large3072OpenAI アプリ、高精度
text-embedding-3-small1536OpenAI アプリ、コスト効率重視
bge-large-en-v1.51024オープンソース、ローカルデプロイ
multilingual-e5-large1024多言語サポート
3. 検索戦略

アプローチ:

  • 密検索(Dense Retrieval): 埋め込みによるセマンティック類似度
  • 疎検索(Sparse Retrieval): キーワードマッチング(BM25、TF-IDF)
  • ハイブリッド検索: 密検索 + 疎検索を重み付き融合で組み合わせる
  • マルチクエリ: 複数のクエリバリエーションを生成する
  • HyDE: より良い検索のために仮想ドキュメントを生成する
4. リランキング

目的: 結果を並べ替えて検索品質を向上させる

手法:

  • クロスエンコーダー: BERT ベースのリランキング(ms-marco-MiniLM)
  • Cohere Rerank: API ベースのリランキング
  • Maximal Marginal Relevance(MMR): 多様性 + 関連性
  • LLM ベース: LLM を使用して関連性をスコアリングする

LangGraph を使ったクイックスタート

from langgraph.graph import StateGraph, START, END
from langchain_anthropic import ChatAnthropic
from langchain_voyageai import VoyageAIEmbeddings
from langchain_pinecone import PineconeVectorStore
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_text_splitters import RecursiveCharacterTextSplitter
from typing import TypedDict, Annotated

class RAGState(TypedDict):
    question: str
    context: list[Document]
    answer: str

# Initialize components
llm = ChatAnthropic(model="claude-sonnet-5")
embeddings = VoyageAIEmbeddings(model="voyage-3-large")
vectorstore = PineconeVectorStore(index_name="docs", embedding=embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})

# RAG prompt
rag_prompt = ChatPromptTemplate.from_template(
    """Answer based on the context below. If you cannot answer, say so.

    Context:
    {context}

    Question: {question}

    Answer:"""
)

async def retrieve(state: RAGState) -> RAGState:
    """Retrieve relevant documents."""
    docs = await retriever.ainvoke(state["question"])
    return {"context": docs}

async def generate(state: RAGState) -> RAGState:
    """Generate answer from context."""
    context_text = "\n\n".join(doc.page_content for doc in state["context"])
    messages = rag_prompt.format_messages(
        context=context_text,
        question=state["question"]
    )
    response = await llm.ainvoke(messages)
    return {"answer": response.content}

# Build RAG graph
builder = StateGraph(RAGState)
builder.add_node("retrieve", retrieve)
builder.add_node("generate", generate)
builder.add_edge(START, "retrieve")
builder.add_edge("retrieve", "generate")
builder.add_edge("generate", END)

rag_chain = builder.compile()

# Use
result = await rag_chain.ainvoke({"question": "What are the main features?"})
print(result["answer"])

詳細なパターンと実例

詳細なパターンのドキュメントは references/details.md にあります。上記のナビゲーション階層では不十分な場合は、そのファイルを参照してください。

コメント