Skip to content
Back to skills

Rag Patterns

ASecurity

Retrieval-Augmented Generation architecture patterns. Chunking strategies, retrieval pipelines, re-ranking, hybrid search, evaluation, and production RAG system design. USE WHEN: user mentions "RAG", "retrieval augmented generation", "document Q&A", "knowledge base chatbot", "semantic search pipeline", "chunking strategy" DO NOT USE FOR: vector database specifics - use `vector-databases`; LangChain implementation - use `langchain`; direct LLM API calls - use Claude/OpenAI SDK skills

  • 31 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
ai-agentspythonrailsapidatabase

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 8, 2026

npx -y skills add claude-dev-suite/claude-dev-suite --skill rag-patterns --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Rag Patterns?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Rag Patterns
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/claude-dev-suite-rag-patterns/badge)](https://www.skillsdirectory.com/skills/claude-dev-suite-rag-patterns)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: rag-patterns
description: |
  Retrieval-Augmented Generation architecture patterns. Chunking strategies,
  retrieval pipelines, re-ranking, hybrid search, evaluation, and production
  RAG system design.

  USE WHEN: user mentions "RAG", "retrieval augmented generation", "document Q&A",
  "knowledge base chatbot", "semantic search pipeline", "chunking strategy"

  DO NOT USE FOR: vector database specifics - use `vector-databases`;
  LangChain implementation - use `langchain`;
  direct LLM API calls - use Claude/OpenAI SDK skills
allowed-tools: Read, Grep, Glob, Write, Edit
---
# RAG Patterns

## Standard RAG Pipeline

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

## Chunking Strategies

```python
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)
```

| Strategy | Best For | Chunk Size |
|----------|----------|------------|
| Fixed-size with overlap | General text | 500-1000 chars |
| Recursive character | Structured docs | 500-1000 chars |
| Semantic (by meaning) | Long-form content | Variable |
| Document-aware (markdown headers) | Technical docs | Section-based |

### Metadata Enrichment

```python
for chunk in chunks:
    chunk.metadata.update({
        "source": doc.metadata["source"],
        "section": extract_section_title(chunk),
        "doc_id": doc.metadata["id"],
        "chunk_index": i,
    })
```

## Retrieval Strategies

### Hybrid Search (keyword + semantic)

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

### Re-ranking

```python
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]
```

### Multi-query Retrieval

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

## Prompt Construction

```python
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)
```

## Evaluation

| Metric | Measures | Tool |
|--------|----------|------|
| Context Relevance | Are retrieved docs relevant? | RAGAS, manual |
| Faithfulness | Does answer match context? | RAGAS |
| Answer Relevance | Does answer address question? | RAGAS |
| Retrieval Recall | Are correct docs retrieved? | Custom eval set |

```python
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision

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

## Anti-Patterns

| Anti-Pattern | Fix |
|--------------|-----|
| Chunks too large (>1500 chars) | Use 500-1000 char chunks with 200 overlap |
| No metadata on chunks | Store source, section, page number |
| No retrieval evaluation | Build eval set, measure recall and precision |
| Stuffing all chunks in prompt | Limit to top-K (3-5), use re-ranking |
| Ignoring hybrid search | Combine BM25 + vector for better recall |
| No citation/source tracking | Pass metadata through pipeline |

## Production Checklist

- [ ] Chunking strategy tuned with eval set
- [ ] Hybrid search (BM25 + vector) enabled
- [ ] Re-ranking on retrieval results
- [ ] Source attribution in answers
- [ ] Guardrails for out-of-scope questions
- [ ] Monitoring: retrieval latency, answer quality scores
- [ ] Incremental indexing for new documents

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.