界面已本地化;技能介绍与说明文档按所选语言由 AI 自动翻译,代码、命令、路径和专业术语保留原文,以原作者文档为准。
探索技能
文档与办公 · SKILL.md

rag-patterns

rag-patterns

【文档与办公】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 dat…

独立 GitHub 快照 · 自动分类 · 以原作者文档为准

技能说明

GitHub

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

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)
StrategyBest ForChunk Size
Fixed-size with overlapGeneral text500-1000 chars
Recursive characterStructured docs500-1000 chars
Semantic (by meaning)Long-form contentVariable
Document-aware (markdown headers)Technical docsSection-based

Metadata Enrichment

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)

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

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

# 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

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

MetricMeasuresTool
Context RelevanceAre retrieved docs relevant?RAGAS, manual
FaithfulnessDoes answer match context?RAGAS
Answer RelevanceDoes answer address question?RAGAS
Retrieval RecallAre correct docs retrieved?Custom eval set
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-PatternFix
Chunks too large (>1500 chars)Use 500-1000 char chunks with 200 overlap
No metadata on chunksStore source, section, page number
No retrieval evaluationBuild eval set, measure recall and precision
Stuffing all chunks in promptLimit to top-K (3-5), use re-ranking
Ignoring hybrid searchCombine BM25 + vector for better recall
No citation/source trackingPass 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
我的收藏