PluginBench
Skill
Fail
Audit score 45

rag-architect

jeffallan/claude-skills

Design and implement production-grade RAG systems with chunking, embeddings, vector stores, hybrid search, and retrieval evaluation.

What is rag-architect?

RAG Architect guides you through building retrieval-augmented generation systems from requirements analysis through evaluation. Use it when designing vector databases, implementing semantic search pipelines, optimizing document retrieval, or building knowledge-grounded AI applications.

  • Analyze retrieval requirements, latency constraints, and scale needs
  • Design vector store schemas, indexing strategies, and sharding approaches
  • Develop chunking strategies with semantic boundaries and metadata enrichment
  • Build hybrid search pipelines combining vector and keyword retrieval with reranking
  • Measure and optimize retrieval quality using precision@k, recall@k, MRR, and NDCG metrics

How to install rag-architect

npx skills add https://github.com/jeffallan/claude-skills --skill rag-architect
Prerequisites
  • Python environment with langchain, qdrant-client, or equivalent vector DB SDK
  • OpenAI API key or alternative embedding model access
  • Cohere API key for reranking (optional but recommended for production)
  • Labeled evaluation dataset for retrieval quality assessment
Claude Code
Cursor
Windsurf
Cline

How to use rag-architect

  1. 1.Analyze your retrieval requirements: latency SLAs, accuracy targets, expected scale, and multi-tenancy needs
  2. 2.Select a vector database (Pinecone, Weaviate, Chroma, pgvector, Qdrant) based on trade-offs
  3. 3.Design and validate chunking strategy: test chunk_size, overlap, and separators on domain data
  4. 4.Implement embedding generation and indexing with idempotent deduplication using deterministic IDs
  5. 5.Build hybrid search combining vector similarity and BM25, then apply reranking to top-k results
  6. 6.Establish evaluation metrics (context_precision >= 0.7, context_recall >= 0.6) and monitor over time

Use cases

Good for
  • Building a multi-tenant knowledge base with semantic search and tenant isolation filters
  • Implementing hybrid search combining dense embeddings and BM25 for improved relevance
  • Evaluating embedding models on domain-specific data before production deployment
  • Designing ingestion pipelines with idempotent deduplication and metadata tracking
  • Optimizing retrieval latency and quality through reranking before LLM context augmentation
Who it's for
  • ML/data engineers designing RAG systems
  • Backend architects building knowledge-grounded applications
  • Teams implementing vector database solutions
  • Developers optimizing semantic search and document retrieval

rag-architect FAQ

What chunk size should I use?

Never use default 512 blindly. Evaluate chunk_size (typically 600–1200 tokens) on your domain data, considering semantic boundaries and retrieval accuracy. Test with your embedding model and evaluation set.

Should I use vector search alone or hybrid search?

Use hybrid search (vector + BM25 with reciprocal rank fusion) for production systems. Vector-only search misses keyword-exact matches; keyword-only misses semantic relevance. Combine both for robustness.

How do I handle embedding model migration?

Version embeddings in metadata, store the model name with each vector, and plan a migration window. Re-embed old documents with the new model and gradually shift queries to the new embedding space.

What retrieval metrics matter most?

Track context_precision (relevance of retrieved docs), context_recall (coverage of ground truth), and MRR (ranking quality). Target precision >= 0.7 and recall >= 0.6 before LLM integration.

How do I implement multi-tenant isolation?

Add tenant_id to chunk metadata, use metadata filters in vector search queries, and enforce tenant_id checks in retrieval pipelines. Never return results across tenant boundaries.

Full instructions (SKILL.md)

Source of truth, from jeffallan/claude-skills.


name: rag-architect 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. license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: data-ml triggers: RAG, retrieval-augmented generation, vector search, embeddings, semantic search, vector database, document retrieval, knowledge base, context retrieval, similarity search role: architect scope: system-design output-format: architecture related-skills: python-pro, database-optimizer, monitoring-expert, api-designer

RAG Architect

Core Workflow

  1. Requirements Analysis — Identify retrieval needs, latency constraints, accuracy requirements, and scale
  2. Vector Store Design — Select database, schema design, indexing strategy, sharding approach
  3. Chunking Strategy — Document splitting, overlap, semantic boundaries, metadata enrichment
  4. Retrieval Pipeline — Embedding selection, query transformation, hybrid search, reranking
  5. Evaluation & Iteration — Metrics tracking, retrieval debugging, continuous optimization

For each step, validate before moving on (see checkpoints below).

Reference Guide

Load detailed guidance based on context:

TopicReferenceLoad When
Vector Databasesreferences/vector-databases.mdComparing Pinecone, Weaviate, Chroma, pgvector, Qdrant
Embedding Modelsreferences/embedding-models.mdSelecting embeddings, fine-tuning, dimension trade-offs
Chunking Strategiesreferences/chunking-strategies.mdDocument splitting, overlap, semantic chunking
Retrieval Optimizationreferences/retrieval-optimization.mdHybrid search, reranking, query expansion, filtering
RAG Evaluationreferences/rag-evaluation.mdMetrics, evaluation frameworks, debugging retrieval

Implementation Examples

1. Chunking Documents

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],
)

Checkpoint: assert all(c.metadata.get("source") for c in chunks), "Missing source metadata"

2. Generating Embeddings & Indexing

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)

Checkpoint: assert qdrant.count("knowledge_base").count == len(set(p.id for p in points)), "Deduplication failed"

3. Hybrid Search (Vector + 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]]

Checkpoint: assert len(hybrid_search("test query", tenant_id="demo")) > 0, "Hybrid search returned no results"

4. Reranking Top-K Results

Load provider API keys from environment variables or a secrets manager; never commit them to source code.

import os

import cohere

co = cohere.Client(os.environ["COHERE_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. Retrieval Evaluation

# 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)

Checkpoint: Target context_precision >= 0.7 and context_recall >= 0.6 before moving to LLM integration.

Constraints

MUST DO

  • Evaluate multiple embedding models on your domain data before committing
  • Implement hybrid search (vector + keyword) for production systems
  • Add metadata filters for multi-tenant or domain-specific retrieval
  • Measure retrieval metrics (precision@k, recall@k, MRR, NDCG)
  • Use reranking for top-k results before passing context to LLM
  • Implement idempotent ingestion with deduplication (deterministic IDs)
  • Monitor retrieval latency and quality over time
  • Version embeddings and plan for model migration

MUST NOT DO

  • Use default chunk size (512) without evaluation on your domain data
  • Skip metadata enrichment (source, timestamp, section)
  • Ignore retrieval quality metrics in favor of only LLM output quality
  • Store raw documents without preprocessing/cleaning
  • Use cosine similarity alone for complex multi-domain retrieval
  • Deploy without testing on production-like data volumes
  • Forget to handle edge cases (empty results, malformed docs)
  • Couple the embedding model tightly to application code

Output Templates

When designing RAG architecture, deliver:

  1. System architecture diagram (ingestion + retrieval pipelines)
  2. Vector database selection with trade-off analysis
  3. Chunking strategy with examples and rationale
  4. Retrieval pipeline design (query → results flow)
  5. Evaluation plan with metrics, benchmarks, and pass/fail thresholds

Documentation