rag-implementation について
rag-implementation は、外部の知識に基づく回答を生成する LLM アプリの構築スキルです。Q&A、検索、ドキュメントアシスタントの開発者向けに、ベクトルデータベース、埋め込み、検索戦略、再ランキングを扱います。
主な機能
- 01ベクトルデータベースの選定
- 02テキスト埋め込みによる類似検索
- 03密ベクトル・疎検索・ハイブリッド検索
- 04マルチクエリと HyDE の活用
- 05検索結果の再ランキング
活用シーン
- 01社内文書を対象とする Q&A の構築
- 02自然言語によるセマンティック検索
- 03最新の事実に基づくチャットボット
- 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-large | 1024 | Claude アプリ(Anthropic 推奨) |
| voyage-code-3 | 1024 | コード検索 |
| text-embedding-3-large | 3072 | OpenAI アプリ、高精度 |
| text-embedding-3-small | 1536 | OpenAI アプリ、コスト効率重視 |
| bge-large-en-v1.5 | 1024 | オープンソース、ローカルデプロイ |
| multilingual-e5-large | 1024 | 多言語サポート |
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 にあります。上記のナビゲーション階層では不十分な場合は、そのファイルを参照してください。
コメント
Markdown 対応