rag-architect
ドキュメントの分割、埋め込み生成、ベクトルストアの構築、ハイブリッド検索パイプラインの構成、リランキングの適用、検索品質の評価などを通じて、本番環境対応のRAGシステムを設計・実装します。セマンティック検索、ドキュメント検索、コンテキスト拡張、類似度検索、埋め込みベースのインデックスが必要なRAGシステム、ベクトルデータベース、知識ベースのAIアプリケーションの構築時に活用できます。
description の原文を見る
Designs and implements production-grade RAG systems by chunking documents, generating embeddings, configuring vector stores, building hybrid search pipelines, applying reranking, and evaluating retrieval quality. Use when building RAG systems, vector databases, or knowledge-grounded AI applications requiring semantic search, document retrieval, context augmentation, similarity search, or embedding-based indexing.
SKILL.md 本文
RAG アーキテクト
コアワークフロー
- 要件分析 — 検索ニーズ、レイテンシ制約、精度要件、スケールを特定する
- ベクトルストア設計 — データベース選択、スキーマ設計、インデックス戦略、シャーディング方式
- チャンキング戦略 — ドキュメント分割、オーバーラップ、セマンティック境界、メタデータ補強
- 検索パイプライン — エンベディング選択、クエリ変換、ハイブリッド検索、リランキング
- 評価と反復 — メトリクス追跡、検索デバッグ、継続的な最適化
各ステップで次に進む前に検証してください(以下のチェックポイントを参照)。
リファレンスガイド
コンテキストに基づいて詳細なガイダンスを読み込みます:
| トピック | リファレンス | 読み込む場合 |
|---|---|---|
| ベクトルデータベース | references/vector-databases.md | Pinecone、Weaviate、Chroma、pgvector、Qdrantを比較する場合 |
| エンベディングモデル | references/embedding-models.md | エンベディングの選択、ファインチューニング、次元のトレードオフ |
| チャンキング戦略 | references/chunking-strategies.md | ドキュメント分割、オーバーラップ、セマンティックチャンキング |
| 検索最適化 | references/retrieval-optimization.md | ハイブリッド検索、リランキング、クエリ拡張、フィルタリング |
| RAG評価 | references/rag-evaluation.md | メトリクス、評価フレームワーク、検索デバッグ |
実装例
1. ドキュメントのチャンキング
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Evaluate chunk_size on your domain data — never use 512 blindly
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=100,
separators=["\n\n", "\n", ". ", " "],
)
chunks = splitter.create_documents(
texts=[doc.page_content for doc in raw_docs],
metadatas=[{"source": doc.metadata["source"], "timestamp": doc.metadata.get("timestamp")} for doc in raw_docs],
)
チェックポイント: assert all(c.metadata.get("source") for c in chunks), "Missing source metadata"
2. エンベディング生成とインデックス作成
from openai import OpenAI
import qdrant_client
from qdrant_client.models import VectorParams, Distance, PointStruct
client = OpenAI()
qdrant = qdrant_client.QdrantClient("localhost", port=6333)
# Create collection
qdrant.recreate_collection(
collection_name="knowledge_base",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
def embed_chunks(chunks: list[str], model: str = "text-embedding-3-small") -> list[list[float]]:
response = client.embeddings.create(input=chunks, model=model)
return [r.embedding for r in response.data]
# Idempotent upsert with deduplication via deterministic IDs
import hashlib, uuid
points = []
for i, chunk in enumerate(chunks):
doc_id = str(uuid.UUID(hashlib.md5(chunk.page_content.encode()).hexdigest()))
embedding = embed_chunks([chunk.page_content])[0]
points.append(PointStruct(id=doc_id, vector=embedding, payload=chunk.metadata))
qdrant.upsert(collection_name="knowledge_base", points=points)
チェックポイント: assert qdrant.count("knowledge_base").count == len(set(p.id for p in points)), "Deduplication failed"
3. ハイブリッド検索(ベクトル + BM25)
from qdrant_client.models import Filter, FieldCondition, MatchValue, SparseVector
from rank_bm25 import BM25Okapi
def hybrid_search(query: str, tenant_id: str, top_k: int = 20) -> list:
# Dense retrieval
query_embedding = embed_chunks([query])[0]
tenant_filter = Filter(must=[FieldCondition(key="tenant_id", match=MatchValue(value=tenant_id))])
dense_results = qdrant.search(
collection_name="knowledge_base",
query_vector=query_embedding,
query_filter=tenant_filter,
limit=top_k,
)
# Sparse retrieval (BM25)
corpus = [r.payload.get("text", "") for r in dense_results]
bm25 = BM25Okapi([doc.split() for doc in corpus])
bm25_scores = bm25.get_scores(query.split())
# Reciprocal Rank Fusion
ranked = sorted(
zip(dense_results, bm25_scores),
key=lambda x: 0.6 * x[0].score + 0.4 * x[1],
reverse=True,
)
return [r for r, _ in ranked[:top_k]]
チェックポイント: assert len(hybrid_search("test query", tenant_id="demo")) > 0, "Hybrid search returned no results"
4. 上位K件結果のリランキング
import cohere
co = cohere.Client("YOUR_API_KEY")
def rerank(query: str, results: list, top_n: int = 5) -> list:
docs = [r.payload.get("text", "") for r in results]
reranked = co.rerank(query=query, documents=docs, top_n=top_n, model="rerank-english-v3.0")
return [results[r.index] for r in reranked.results]
5. 検索評価
# Run precision@k and recall@k against a labeled evaluation set
# python evaluate.py --metrics precision@10 recall@10 mrr --collection knowledge_base
from ragas import evaluate
from ragas.metrics import context_precision, context_recall, faithfulness, answer_relevancy
from datasets import Dataset
eval_dataset = Dataset.from_dict({
"question": questions,
"contexts": retrieved_contexts,
"answer": generated_answers,
"ground_truth": ground_truth_answers,
})
results = evaluate(eval_dataset, metrics=[context_precision, context_recall, faithfulness, answer_relevancy])
print(results)
チェックポイント: LLM統合に進む前に、context_precision >= 0.7およびcontext_recall >= 0.6を目指してください。
制約事項
必ず実施すること
- ドメインデータに対して複数のエンベディングモデルを評価した後にコミットする
- 本番システムにはハイブリッド検索(ベクトル + キーワード)を実装する
- マルチテナントまたはドメイン固有の検索のためにメタデータフィルタを追加する
- 検索メトリクス(precision@k、recall@k、MRR、NDCG)を測定する
- コンテキストをLLMに渡す前に、上位k件結果のリランキングを使用する
- 決定論的IDを使用して重複排除を含むべき等な取り込みを実装する
- 検索レイテンシと品質を時系列で監視する
- エンベディングをバージョン管理し、モデル移行を計画する
してはいけないこと
- ドメインデータでの評価なしにデフォルトのチャンクサイズ(512)を使用する
- メタデータ補強(ソース、タイムスタンプ、セクション)をスキップする
- LLM出力品質だけを優先して検索品質メトリクスを無視する
- 前処理/クリーニングなしで生ドキュメントを保存する
- 複雑なマルチドメイン検索にコサイン類似度だけを使用する
- 本番環境のようなデータ量でのテストなしにデプロイする
- エッジケース(空の結果、不正形式のドキュメント)の処理を忘れる
- エンベディングモデルをアプリケーションコードに密に結合する
出力テンプレート
RAGアーキテクチャを設計する場合、以下を提供してください:
- システムアーキテクチャ図(取り込みおよび検索パイプライン)
- トレードオフ分析を含むベクトルデータベース選択
- 例と根拠を含むチャンキング戦略
- 検索パイプライン設計(クエリ → 結果フロー)
- メトリクス、ベンチマーク、合格/不合格しきい値を含む評価計画
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cedriclefoudelatech
- ライセンス
- MIT
- 最終更新
- 2026/5/10
Source: https://github.com/cedriclefoudelatech/TIMLEMEILLEURIDF / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。