[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F1K00ACEJFT2NMCDNTM5KB":3,"skill-same:01M6F1K00ACEJFT2NMCDNTM5KB":81},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6F1K00ACEJFT2NMCDNTM5KB","rag-implementation",null,"Build Retrieval-Augmented Generation (RAG) systems for LLM applications with vector databases and semantic search. Use when implementing knowledge-grounded AI, building document Q&A systems, or integrating LLMs with external knowledge bases.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Frag-implementation\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"rag","implementation","rag implementation","bases","with","LLM Applications","retrieval","systems","generation","vector databases","build","document","search","llms","databases","use","knowledge","applications","semantic search","vector","2026-11-10 10:12:30",false,"---\nname: rag-implementation\ndescription: Build Retrieval-Augmented Generation (RAG) systems for LLM applications with vector databases and semantic search. Use when implementing knowledge-grounded AI, building document Q&A systems, or integrating LLMs with external knowledge bases.\n---\n\n# RAG Implementation\n\nMaster Retrieval-Augmented Generation (RAG) to build LLM applications that provide accurate, grounded responses using external knowledge sources.\n\n## When to Use This Skill\n\n- Building Q&A systems over proprietary documents\n- Creating chatbots with current, factual information\n- Implementing semantic search with natural language queries\n- Reducing hallucinations with grounded responses\n- Enabling LLMs to access domain-specific knowledge\n- Building documentation assistants\n- Creating research tools with source citation\n\n## Core Components\n\n### 1. Vector Databases\n**Purpose**: Store and retrieve document embeddings efficiently\n\n**Options:**\n- **Pinecone**: Managed, scalable, fast queries\n- **Weaviate**: Open-source, hybrid search\n- **Milvus**: High performance, on-premise\n- **Chroma**: Lightweight, easy to use\n- **Qdrant**: Fast, filtered search\n- **FAISS**: Meta's library, local deployment\n\n### 2. Embeddings\n**Purpose**: Convert text to numerical vectors for similarity search\n\n**Models:**\n- **text-embedding-ada-002** (OpenAI): General purpose, 1536 dims\n- **all-MiniLM-L6-v2** (Sentence Transformers): Fast, lightweight\n- **e5-large-v2**: High quality, multilingual\n- **Instructor**: Task-specific instructions\n- **bge-large-en-v1.5**: SOTA performance\n\n### 3. Retrieval Strategies\n**Approaches:**\n- **Dense Retrieval**: Semantic similarity via embeddings\n- **Sparse Retrieval**: Keyword matching (BM25, TF-IDF)\n- **Hybrid Search**: Combine dense + sparse\n- **Multi-Query**: Generate multiple query variations\n- **HyDE**: Generate hypothetical documents\n\n### 4. Reranking\n**Purpose**: Improve retrieval quality by reordering results\n\n**Methods:**\n- **Cross-Encoders**: BERT-based reranking\n- **Cohere Rerank**: API-based reranking\n- **Maximal Marginal Relevance (MMR)**: Diversity + relevance\n- **LLM-based**: Use LLM to score relevance\n\n## Quick Start\n\n```python\nfrom langchain.document_loaders import DirectoryLoader\nfrom langchain.text_splitters import RecursiveCharacterTextSplitter\nfrom langchain.embeddings import OpenAIEmbeddings\nfrom langchain.vectorstores import Chroma\nfrom langchain.chains import RetrievalQA\nfrom langchain.llms import OpenAI\n\n# 1. Load documents\nloader = DirectoryLoader('.\u002Fdocs', glob=\"**\u002F*.txt\")\ndocuments = loader.load()\n\n# 2. Split into chunks\ntext_splitter = RecursiveCharacterTextSplitter(\n    chunk_size=1000,\n    chunk_overlap=200,\n    length_function=len\n)\nchunks = text_splitter.split_documents(documents)\n\n# 3. Create embeddings and vector store\nembeddings = OpenAIEmbeddings()\nvectorstore = Chroma.from_documents(chunks, embeddings)\n\n# 4. Create retrieval chain\nqa_chain = RetrievalQA.from_chain_type(\n    llm=OpenAI(),\n    chain_type=\"stuff\",\n    retriever=vectorstore.as_retriever(search_kwargs={\"k\": 4}),\n    return_source_documents=True\n)\n\n# 5. Query\nresult = qa_chain({\"query\": \"What are the main features?\"})\nprint(result['result'])\nprint(result['source_documents'])\n```\n\n## Advanced RAG Patterns\n\n### Pattern 1: Hybrid Search\n```python\nfrom langchain.retrievers import BM25Retriever, EnsembleRetriever\n\n# Sparse retriever (BM25)\nbm25_retriever = BM25Retriever.from_documents(chunks)\nbm25_retriever.k = 5\n\n# Dense retriever (embeddings)\nembedding_retriever = vectorstore.as_retriever(search_kwargs={\"k\": 5})\n\n# Combine with weights\nensemble_retriever = EnsembleRetriever(\n    retrievers=[bm25_retriever, embedding_retriever],\n    weights=[0.3, 0.7]\n)\n```\n\n### Pattern 2: Multi-Query Retrieval\n```python\nfrom langchain.retrievers.multi_query import MultiQueryRetriever\n\n# Generate multiple query perspectives\nretriever = MultiQueryRetriever.from_llm(\n    retriever=vectorstore.as_retriever(),\n    llm=OpenAI()\n)\n\n# Single query → multiple variations → combined results\nresults = retriever.get_relevant_documents(\"What is the main topic?\")\n```\n\n### Pattern 3: Contextual Compression\n```python\nfrom langchain.retrievers import ContextualCompressionRetriever\nfrom langchain.retrievers.document_compressors import LLMChainExtractor\n\ncompressor = LLMChainExtractor.from_llm(llm)\n\ncompression_retriever = ContextualCompressionRetriever(\n    base_compressor=compressor,\n    base_retriever=vectorstore.as_retriever()\n)\n\n# Returns only relevant parts of documents\ncompressed_docs = compression_retriever.get_relevant_documents(\"query\")\n```\n\n### Pattern 4: Parent Document Retriever\n```python\nfrom langchain.retrievers import ParentDocumentRetriever\nfrom langchain.storage import InMemoryStore\n\n# Store for parent documents\nstore = InMemoryStore()\n\n# Small chunks for retrieval, large chunks for context\nchild_splitter = RecursiveCharacterTextSplitter(chunk_size=400)\nparent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)\n\nretriever = ParentDocumentRetriever(\n    vectorstore=vectorstore,\n    docstore=store,\n    child_splitter=child_splitter,\n    parent_splitter=parent_splitter\n)\n```\n\n## Document Chunking Strategies\n\n### Recursive Character Text Splitter\n```python\nfrom langchain.text_splitters import RecursiveCharacterTextSplitter\n\nsplitter = RecursiveCharacterTextSplitter(\n    chunk_size=1000,\n    chunk_overlap=200,\n    length_function=len,\n    separators=[\"\\n\\n\", \"\\n\", \" \", \"\"]  # Try these in order\n)\n```\n\n### Token-Based Splitting\n```python\nfrom langchain.text_splitters import TokenTextSplitter\n\nsplitter = TokenTextSplitter(\n    chunk_size=512,\n    chunk_overlap=50\n)\n```\n\n### Semantic Chunking\n```python\nfrom langchain.text_splitters import SemanticChunker\n\nsplitter = SemanticChunker(\n    embeddings=OpenAIEmbeddings(),\n    breakpoint_threshold_type=\"percentile\"\n)\n```\n\n### Markdown Header Splitter\n```python\nfrom langchain.text_splitters import MarkdownHeaderTextSplitter\n\nheaders_to_split_on = [\n    (\"#\", \"Header 1\"),\n    (\"##\", \"Header 2\"),\n    (\"###\", \"Header 3\"),\n]\n\nsplitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)\n```\n\n## Vector Store Configurations\n\n### Pinecone\n```python\nimport pinecone\nfrom langchain.vectorstores import Pinecone\n\npinecone.init(api_key=\"your-api-key\", environment=\"us-west1-gcp\")\n\nindex = pinecone.Index(\"your-index-name\")\n\nvectorstore = Pinecone(index, embeddings.embed_query, \"text\")\n```\n\n### Weaviate\n```python\nimport weaviate\nfrom langchain.vectorstores import Weaviate\n\nclient = weaviate.Client(\"http:\u002F\u002Flocalhost:8080\")\n\nvectorstore = Weaviate(client, \"Document\", \"content\", embeddings)\n```\n\n### Chroma (Local)\n```python\nfrom langchain.vectorstores import Chroma\n\nvectorstore = Chroma(\n    collection_name=\"my_collection\",\n    embedding_function=embeddings,\n    persist_directory=\".\u002Fchroma_db\"\n)\n```\n\n## Retrieval Optimization\n\n### 1. Metadata Filtering\n```python\n# Add metadata during indexing\nchunks_with_metadata = []\nfor i, chunk in enumerate(chunks):\n    chunk.metadata = {\n        \"source\": chunk.metadata.get(\"source\"),\n        \"page\": i,\n        \"category\": determine_category(chunk.page_content)\n    }\n    chunks_with_metadata.append(chunk)\n\n# Filter during retrieval\nresults = vectorstore.similarity_search(\n    \"query\",\n    filter={\"category\": \"technical\"},\n    k=5\n)\n```\n\n### 2. Maximal Marginal Relevance\n```python\n# Balance relevance with diversity\nresults = vectorstore.max_marginal_relevance_search(\n    \"query\",\n    k=5,\n    fetch_k=20,  # Fetch 20, return top 5 diverse\n    lambda_mult=0.5  # 0=max diversity, 1=max relevance\n)\n```\n\n### 3. Reranking with Cross-Encoder\n```python\nfrom sentence_transformers import CrossEncoder\n\nreranker = CrossEncoder('cross-encoder\u002Fms-marco-MiniLM-L-6-v2')\n\n# Get initial results\ncandidates = vectorstore.similarity_search(\"query\", k=20)\n\n# Rerank\npairs = [[query, doc.page_content] for doc in candidates]\nscores = reranker.predict(pairs)\n\n# Sort by score and take top k\nreranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)[:5]\n```\n\n## Prompt Engineering for RAG\n\n### Contextual Prompt\n```python\nprompt_template = \"\"\"Use the following context to answer the question. If you cannot answer based on the context, say \"I don't have enough information.\"\n\nContext:\n{context}\n\nQuestion: {question}\n\nAnswer:\"\"\"\n```\n\n### With Citations\n```python\nprompt_template = \"\"\"Answer the question based on the context below. Include citations using [1], [2], etc.\n\nContext:\n{context}\n\nQuestion: {question}\n\nAnswer (with citations):\"\"\"\n```\n\n### With Confidence\n```python\nprompt_template = \"\"\"Answer the question using the context. Provide a confidence score (0-100%) for your answer.\n\nContext:\n{context}\n\nQuestion: {question}\n\nAnswer:\nConfidence:\"\"\"\n```\n\n## Evaluation Metrics\n\n```python\ndef evaluate_rag_system(qa_chain, test_cases):\n    metrics = {\n        'accuracy': [],\n        'retrieval_quality': [],\n        'groundedness': []\n    }\n\n    for test in test_cases:\n        result = qa_chain({\"query\": test['question']})\n\n        # Check if answer matches expected\n        accuracy = calculate_accuracy(result['result'], test['expected'])\n        metrics['accuracy'].append(accuracy)\n\n        # Check if relevant docs were retrieved\n        retrieval_quality = evaluate_retrieved_docs(\n            result['source_documents'],\n            test['relevant_docs']\n        )\n        metrics['retrieval_quality'].append(retrieval_quality)\n\n        # Check if answer is grounded in context\n        groundedness = check_groundedness(\n            result['result'],\n            result['source_documents']\n        )\n        metrics['groundedness'].append(groundedness)\n\n    return {k: sum(v)\u002Flen(v) for k, v in metrics.items()}\n```\n\n## Resources\n\n- **references\u002Fvector-databases.md**: Detailed comparison of vector DBs\n- **references\u002Fembeddings.md**: Embedding model selection guide\n- **references\u002Fretrieval-strategies.md**: Advanced retrieval techniques\n- **references\u002Freranking.md**: Reranking methods and when to use them\n- **references\u002Fcontext-window.md**: Managing context limits\n- **assets\u002Fvector-store-config.yaml**: Configuration templates\n- **assets\u002Fretriever-pipeline.py**: Complete RAG pipeline\n- **assets\u002Fembedding-models.md**: Model comparison and benchmarks\n\n## Best Practices\n\n1. **Chunk Size**: Balance between context and specificity (500-1000 tokens)\n2. **Overlap**: Use 10-20% overlap to preserve context at boundaries\n3. **Metadata**: Include source, page, timestamp for filtering and debugging\n4. **Hybrid Search**: Combine semantic and keyword search for best results\n5. **Reranking**: Improve top results with cross-encoder\n6. **Citations**: Always return source documents for transparency\n7. **Evaluation**: Continuously test retrieval quality and answer accuracy\n8. **Monitoring**: Track retrieval metrics in production\n\n## Common Issues\n\n- **Poor Retrieval**: Check embedding quality, chunk size, query formulation\n- **Irrelevant Results**: Add metadata filtering, use hybrid search, rerank\n- **Missing Information**: Ensure documents are properly indexed\n- **Slow Queries**: Optimize vector store, use caching, reduce k\n- **Hallucinations**: Improve grounding prompt, add verification step\n","# RAG Implementation\n\nMaster Retrieval-Augmented Generation (RAG) to build LLM applications that provide accurate, grounded responses using external knowledge sources.\n\n## When to Use This Skill\n\n- Building Q&A systems over proprietary documents\n- Creating chatbots with current, factual information\n- Implementing semantic search with natural language queries\n- Reducing hallucinations with grounded responses\n- Enabling LLMs to access domain-specific knowledge\n- Building documentation assistants\n- Creating research tools with source citation\n\n## Core Components\n\n### 1. Vector Databases\n**Purpose**: Store and retrieve document embeddings efficiently\n\n**Options:**\n- **Pinecone**: Managed, scalable, fast queries\n- **Weaviate**: Open-source, hybrid search\n- **Milvus**: High performance, on-premise\n- **Chroma**: Lightweight, easy to use\n- **Qdrant**: Fast, filtered search\n- **FAISS**: Meta's library, local deployment\n\n### 2. Embeddings\n**Purpose**: Convert text to numerical vectors for similarity search\n\n**Models:**\n- **text-embedding-ada-002** (OpenAI): General purpose, 1536 dims\n- **all-MiniLM-L6-v2** (Sentence Transformers): Fast, lightweight\n- **e5-large-v2**: High quality, multilingual\n- **Instructor**: Task-specific instructions\n- **bge-large-en-v1.5**: SOTA performance\n\n### 3. Retrieval Strategies\n**Approaches:**\n- **Dense Retrieval**: Semantic similarity via embeddings\n- **Sparse Retrieval**: Keyword matching (BM25, TF-IDF)\n- **Hybrid Search**: Combine dense + sparse\n- **Multi-Query**: Generate multiple query variations\n- **HyDE**: Generate hypothetical documents\n\n### 4. Reranking\n**Purpose**: Improve retrieval quality by reordering results\n\n**Methods:**\n- **Cross-Encoders**: BERT-based reranking\n- **Cohere Rerank**: API-based reranking\n- **Maximal Marginal Relevance (MMR)**: Diversity + relevance\n- **LLM-based**: Use LLM to score relevance\n\n## Quick Start\n\n```python\nfrom langchain.document_loaders import DirectoryLoader\nfrom langchain.text_splitters import RecursiveCharacterTextSplitter\nfrom langchain.embeddings import OpenAIEmbeddings\nfrom langchain.vectorstores import Chroma\nfrom langchain.chains import RetrievalQA\nfrom langchain.llms import OpenAI\n\n# 1. Load documents\nloader = DirectoryLoader('.\u002Fdocs', glob=\"**\u002F*.txt\")\ndocuments = loader.load()\n\n# 2. Split into chunks\ntext_splitter = RecursiveCharacterTextSplitter(\n    chunk_size=1000,\n    chunk_overlap=200,\n    length_function=len\n)\nchunks = text_splitter.split_documents(documents)\n\n# 3. Create embeddings and vector store\nembeddings = OpenAIEmbeddings()\nvectorstore = Chroma.from_documents(chunks, embeddings)\n\n# 4. Create retrieval chain\nqa_chain = RetrievalQA.from_chain_type(\n    llm=OpenAI(),\n    chain_type=\"stuff\",\n    retriever=vectorstore.as_retriever(search_kwargs={\"k\": 4}),\n    return_source_documents=True\n)\n\n# 5. Query\nresult = qa_chain({\"query\": \"What are the main features?\"})\nprint(result['result'])\nprint(result['source_documents'])\n```\n\n## Advanced RAG Patterns\n\n### Pattern 1: Hybrid Search\n```python\nfrom langchain.retrievers import BM25Retriever, EnsembleRetriever\n\n# Sparse retriever (BM25)\nbm25_retriever = BM25Retriever.from_documents(chunks)\nbm25_retriever.k = 5\n\n# Dense retriever (embeddings)\nembedding_retriever = vectorstore.as_retriever(search_kwargs={\"k\": 5})\n\n# Combine with weights\nensemble_retriever = EnsembleRetriever(\n    retrievers=[bm25_retriever, embedding_retriever],\n    weights=[0.3, 0.7]\n)\n```\n\n### Pattern 2: Multi-Query Retrieval\n```python\nfrom langchain.retrievers.multi_query import MultiQueryRetriever\n\n# Generate multiple query perspectives\nretriever = MultiQueryRetriever.from_llm(\n    retriever=vectorstore.as_retriever(),\n    llm=OpenAI()\n)\n\n# Single query → multiple variations → combined results\nresults = retriever.get_relevant_documents(\"What is the main topic?\")\n```\n\n### Pattern 3: Contextual Compression\n```python\nfrom langchain.retrievers import ContextualCompressionRetriever\nfrom langchain.retrievers.document_compressors import LLMChainExtractor\n\ncompressor = LLMChainExtractor.from_llm(llm)\n\ncompression_retriever = ContextualCompressionRetriever(\n    base_compressor=compressor,\n    base_retriever=vectorstore.as_retriever()\n)\n\n# Returns only relevant parts of documents\ncompressed_docs = compression_retriever.get_relevant_documents(\"query\")\n```\n\n### Pattern 4: Parent Document Retriever\n```python\nfrom langchain.retrievers import ParentDocumentRetriever\nfrom langchain.storage import InMemoryStore\n\n# Store for parent documents\nstore = InMemoryStore()\n\n# Small chunks for retrieval, large chunks for context\nchild_splitter = RecursiveCharacterTextSplitter(chunk_size=400)\nparent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)\n\nretriever = ParentDocumentRetriever(\n    vectorstore=vectorstore,\n    docstore=store,\n    child_splitter=child_splitter,\n    parent_splitter=parent_splitter\n)\n```\n\n## Document Chunking Strategies\n\n### Recursive Character Text Splitter\n```python\nfrom langchain.text_splitters import RecursiveCharacterTextSplitter\n\nsplitter = RecursiveCharacterTextSplitter(\n    chunk_size=1000,\n    chunk_overlap=200,\n    length_function=len,\n    separators=[\"\\n\\n\", \"\\n\", \" \", \"\"]  # Try these in order\n)\n```\n\n### Token-Based Splitting\n```python\nfrom langchain.text_splitters import TokenTextSplitter\n\nsplitter = TokenTextSplitter(\n    chunk_size=512,\n    chunk_overlap=50\n)\n```\n\n### Semantic Chunking\n```python\nfrom langchain.text_splitters import SemanticChunker\n\nsplitter = SemanticChunker(\n    embeddings=OpenAIEmbeddings(),\n    breakpoint_threshold_type=\"percentile\"\n)\n```\n\n### Markdown Header Splitter\n```python\nfrom langchain.text_splitters import MarkdownHeaderTextSplitter\n\nheaders_to_split_on = [\n    (\"#\", \"Header 1\"),\n    (\"##\", \"Header 2\"),\n    (\"###\", \"Header 3\"),\n]\n\nsplitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)\n```\n\n## Vector Store Configurations\n\n### Pinecone\n```python\nimport pinecone\nfrom langchain.vectorstores import Pinecone\n\npinecone.init(api_key=\"your-api-key\", environment=\"us-west1-gcp\")\n\nindex = pinecone.Index(\"your-index-name\")\n\nvectorstore = Pinecone(index, embeddings.embed_query, \"text\")\n```\n\n### Weaviate\n```python\nimport weaviate\nfrom langchain.vectorstores import Weaviate\n\nclient = weaviate.Client(\"http:\u002F\u002Flocalhost:8080\")\n\nvectorstore = Weaviate(client, \"Document\", \"content\", embeddings)\n```\n\n### Chroma (Local)\n```python\nfrom langchain.vectorstores import Chroma\n\nvectorstore = Chroma(\n    collection_name=\"my_collection\",\n    embedding_function=embeddings,\n    persist_directory=\".\u002Fchroma_db\"\n)\n```\n\n## Retrieval Optimization\n\n### 1. Metadata Filtering\n```python\n# Add metadata during indexing\nchunks_with_metadata = []\nfor i, chunk in enumerate(chunks):\n    chunk.metadata = {\n        \"source\": chunk.metadata.get(\"source\"),\n        \"page\": i,\n        \"category\": determine_category(chunk.page_content)\n    }\n    chunks_with_metadata.append(chunk)\n\n# Filter during retrieval\nresults = vectorstore.similarity_search(\n    \"query\",\n    filter={\"category\": \"technical\"},\n    k=5\n)\n```\n\n### 2. Maximal Marginal Relevance\n```python\n# Balance relevance with diversity\nresults = vectorstore.max_marginal_relevance_search(\n    \"query\",\n    k=5,\n    fetch_k=20,  # Fetch 20, return top 5 diverse\n    lambda_mult=0.5  # 0=max diversity, 1=max relevance\n)\n```\n\n### 3. Reranking with Cross-Encoder\n```python\nfrom sentence_transformers import CrossEncoder\n\nreranker = CrossEncoder('cross-encoder\u002Fms-marco-MiniLM-L-6-v2')\n\n# Get initial results\ncandidates = vectorstore.similarity_search(\"query\", k=20)\n\n# Rerank\npairs = [[query, doc.page_content] for doc in candidates]\nscores = reranker.predict(pairs)\n\n# Sort by score and take top k\nreranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)[:5]\n```\n\n## Prompt Engineering for RAG\n\n### Contextual Prompt\n```python\nprompt_template = \"\"\"Use the following context to answer the question. If you cannot answer based on the context, say \"I don't have enough information.\"\n\nContext:\n{context}\n\nQuestion: {question}\n\nAnswer:\"\"\"\n```\n\n### With Citations\n```python\nprompt_template = \"\"\"Answer the question based on the context below. Include citations using [1], [2], etc.\n\nContext:\n{context}\n\nQuestion: {question}\n\nAnswer (with citations):\"\"\"\n```\n\n### With Confidence\n```python\nprompt_template = \"\"\"Answer the question using the context. Provide a confidence score (0-100%) for your answer.\n\nContext:\n{context}\n\nQuestion: {question}\n\nAnswer:\nConfidence:\"\"\"\n```\n\n## Evaluation Metrics\n\n```python\ndef evaluate_rag_system(qa_chain, test_cases):\n    metrics = {\n        'accuracy': [],\n        'retrieval_quality': [],\n        'groundedness': []\n    }\n\n    for test in test_cases:\n        result = qa_chain({\"query\": test['question']})\n\n        # Check if answer matches expected\n        accuracy = calculate_accuracy(result['result'], test['expected'])\n        metrics['accuracy'].append(accuracy)\n\n        # Check if relevant docs were retrieved\n        retrieval_quality = evaluate_retrieved_docs(\n            result['source_documents'],\n            test['relevant_docs']\n        )\n        metrics['retrieval_quality'].append(retrieval_quality)\n\n        # Check if answer is grounded in context\n        groundedness = check_groundedness(\n            result['result'],\n            result['source_documents']\n        )\n        metrics['groundedness'].append(groundedness)\n\n    return {k: sum(v)\u002Flen(v) for k, v in metrics.items()}\n```\n\n## Resources\n\n- **references\u002Fvector-databases.md**: Detailed comparison of vector DBs\n- **references\u002Fembeddings.md**: Embedding model selection guide\n- **references\u002Fretrieval-strategies.md**: Advanced retrieval techniques\n- **references\u002Freranking.md**: Reranking methods and when to use them\n- **references\u002Fcontext-window.md**: Managing context limits\n- **assets\u002Fvector-store-config.yaml**: Configuration templates\n- **assets\u002Fretriever-pipeline.py**: Complete RAG pipeline\n- **assets\u002Fembedding-models.md**: Model comparison and benchmarks\n\n## Best Practices\n\n1. **Chunk Size**: Balance between context and specificity (500-1000 tokens)\n2. **Overlap**: Use 10-20% overlap to preserve context at boundaries\n3. **Metadata**: Include source, page, timestamp for filtering and debugging\n4. **Hybrid Search**: Combine semantic and keyword search for best results\n5. **Reranking**: Improve top results with cross-encoder\n6. **Citations**: Always return source documents for transparency\n7. **Evaluation**: Continuously test retrieval quality and answer accuracy\n8. **Monitoring**: Track retrieval metrics in production\n\n## Common Issues\n\n- **Poor Retrieval**: Check embedding quality, chunk size, query formulation\n- **Irrelevant Results**: Add metadata filtering, use hybrid search, rerank\n- **Missing Information**: Ensure documents are properly indexed\n- **Slow Queries**: Optimize vector store, use caching, reduce k\n- **Hallucinations**: Improve grounding prompt, add verification step\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Frag-implementation",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill rag-implementation",{"tool":67,"command":68},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill rag-implementation",{"tool":70,"command":71},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill rag-implementation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Frag-implementation\u002FSKILL.md",true,[75],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"skill-report.json","REFERENCE","参考文档",13291,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Frag-implementation\u002Fskill-report.json",[82,92,102,111,117,124],{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":88,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[87],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[89,90,91],"model","model hierarchy","model hierarchy skill",{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":98,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[97],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[99,100,101],"MCP","zoom","zoom mcp",{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[108,109,110,100],"sdk","zoom apps sdk","apps",{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[113],{"skillNo":118,"name":119,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[122],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[119],{"skillNo":125,"name":126,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[126]]