Build production-grade Retrieval Augmented Generation systems. Covers chunking, embedding, vector search, reranking, evaluation, and RAG pipelines.
Scanned 9/10/2026
Install to Claude Code
npx -y skills add luokai0/ai-agent-skills-by-luo-kai --skill rag-systems-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Rag Systems Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/luokai0-rag-systems-expert)More formats (shields.io, HTML) on the badges page.
---
name: rag-systems-expert
version: 1.0.0
description: Build production-grade Retrieval Augmented Generation systems. Covers chunking, embedding, vector search, reranking, evaluation, and RAG pipelines.
author: luo-kai
tags: [rag, retrieval, embeddings, vector-search, llm, production, langchain]
---
# RAG Systems Expert
## Before Starting
1. What documents are you indexing — PDFs, web pages, code, structured data?
2. Query type — factual lookup, summarization, multi-hop reasoning?
3. Latency requirements — real-time or batch acceptable?
## Core Expertise Areas
### Document Processing and Chunking
Chunking strategy determines retrieval quality more than model choice.
Fixed-size: simple but breaks context mid-sentence.
Sentence-based: cleaner but variable size.
Semantic: chunk by topic shift — highest quality, highest cost.
Recursive character splitting: best general-purpose approach.
Overlap: 10 to 20 percent overlap between chunks prevents context loss at boundaries.
### Embedding Models
OpenAI text-embedding-3-small: 1536 dims, cheap, strong general performance.
OpenAI text-embedding-3-large: 3072 dims, better for complex semantic queries.
Cohere embed-v3: strong multilingual, good for diverse document types.
Sentence-transformers: free open-source, good for on-premise or zero-budget.
Embed queries and documents with the same model — never mix.
### Vector Databases
Pinecone: managed, fast, production-ready, free tier available.
Weaviate: open-source option, good hybrid search.
Chroma: lightweight, runs locally, perfect for development and small scale.
pgvector: Postgres extension — use if already on Postgres.
Qdrant: fast, open-source, good filtering support.
### Retrieval and Reranking
Semantic search: cosine similarity on embeddings — good baseline.
Hybrid search: semantic + BM25 keyword — better for factual queries.
Reranking: use Cohere Rerank or cross-encoder after initial retrieval.
Top-k: retrieve 10 to 20 candidates, rerank to top 3 to 5.
MMR (Maximal Marginal Relevance): reduces redundancy in multi-doc retrieval.
### RAG Pipeline Evaluation
Faithfulness: does the answer reflect the retrieved context?
Answer relevance: does the answer address the question?
Context relevance: are the retrieved chunks actually relevant?
Tools: RAGAS framework, Trulens, DeepEval.
Baseline: run 50 golden QA pairs before and after changes.
## Key Patterns
### Basic RAG Pipeline
```python
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. Load and chunk documents
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", " ", ""]
)
chunks = splitter.split_documents(documents)
# 2. Embed and store
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 3. Retrieve and generate
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
response = qa_chain.run("What are the main topics covered?")
```
### Hybrid Search with Reranking
```python
import cohere
from langchain.retrievers import BM25Retriever, EnsembleRetriever
# Sparse retriever (BM25 keyword search)
bm25_retriever = BM25Retriever.from_documents(chunks)
bm25_retriever.k = 10
# Dense retriever (semantic)
dense_retriever = vectorstore.as_retriever(search_kwargs={"k": 10})
# Ensemble: combine both
ensemble = EnsembleRetriever(
retrievers=[bm25_retriever, dense_retriever],
weights=[0.4, 0.6]
)
# Rerank top results
co = cohere.Client()
docs = ensemble.get_relevant_documents(query)
reranked = co.rerank(
query=query,
documents=[d.page_content for d in docs],
top_n=3,
model="rerank-english-v3.0"
)
```
### RAG Evaluation with RAGAS
```python
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_relevancy
# Build evaluation dataset
from datasets import Dataset
eval_data = Dataset.from_dict({
"question": questions,
"answer": generated_answers,
"contexts": retrieved_contexts,
"ground_truth": golden_answers
})
# Run evaluation
results = evaluate(eval_data, metrics=[
faithfulness,
answer_relevancy,
context_relevancy
])
print(results)
# Target: faithfulness > 0.85, answer_relevancy > 0.80
```
## Best Practices
- Start with recursive character splitting — it beats fixed size in most cases
- Always include chunk overlap — prevents context loss at boundaries
- Retrieve more than you need then rerank — quality beats raw retrieval count
- Evaluate before and after every pipeline change — track regression
- Add metadata to chunks — enables filtered retrieval and better context
## Common Pitfalls
| Pitfall | Consequence | Fix |
|---------|-------------|-----|
| Chunks too large | Diluted retrieval relevance | Keep chunks 500 to 1500 tokens |
| Chunks too small | Missing context, incoherent answers | Minimum 200 tokens with overlap |
| No reranking | Top-k not actually most relevant | Add reranker after initial retrieval |
| No evaluation | Regressions go undetected | Run RAGAS on 50+ golden pairs |
| Embedding model mismatch | Poor similarity scores | Always embed queries and docs with same model |
## Related Skills
- llm-engineering-expert
- vector-databases-expert
- deep-learning-expert
- agent-memory-expert
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!