[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70GG9NEF54MXZ63PSR7AVV7":3,"skill-same:01M70GG9NEF54MXZ63PSR7AVV7":76},{"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":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M70GG9NEF54MXZ63PSR7AVV7","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.","shengdabai\u002FTony-Claude-Code-Skills","shengdabai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F116417419?v=4","01M70F6D2WY5PQV5A92BKYJQEW","Tony Sheng","01M70F6D3GAAAYZ5H4CC1G8VXM",3,"MIT","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002F_collections\u002Fplugins\u002Fllm-application-dev\u002Fskills\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","implementation","rag","bases","with","document","use","applications","for","vector databases","q&a","semantic search","llms","LLM Applications","when","knowledge","implementing","vector","search","databases","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","7850740bd837adb32f0a109ab2af82482196c6f2","skills\u002F_collections\u002Fplugins\u002Fllm-application-dev\u002Fskills\u002Frag-implementation",1,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills","https:\u002F\u002Fzturnsgo.com","https:\u002F\u002Fgithub.com\u002Fshengdabai","https:\u002F\u002Fzturnsgo.com\u002F","AI × education creator — producer, not consumer. Taught 6,000+ learners; shipping learning tools & daily essays with Claude Code, practicing @xiaolai's way 🥋","2026-11-01 21:28:23",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add shengdabai\u002FTony-Claude-Code-Skills --skill rag-implementation",{"tool":68,"command":69},"bunx","bunx skills add shengdabai\u002FTony-Claude-Code-Skills --skill rag-implementation",{"tool":71,"command":72},"pnpm","pnpm dlx skills add shengdabai\u002FTony-Claude-Code-Skills --skill rag-implementation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002F_collections\u002Fplugins\u002Fllm-application-dev\u002Fskills\u002Frag-implementation\u002FSKILL.md",true,[],[77,94,125,150,172,192],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":86,"publishedAt":47},"01M70P17DAD4C1C47NPH6A96EM","xiaolai-methodology","以李笑来(Li Xiaolai)的思考方式、方法论与表达风格,为用户做全方位 1-on-1 教练指导,覆盖创业、赚钱、投资、学习、自学、读书写作、用 AI、以及人生心态与自我管理。当用户提到 \"李笑来\"、\"笑来\"、\"笑来老师\"、\"扮演李笑来\"、\"找笑来聊聊\"、\"笑来怎么看\"、\"xiaolai\"、\"把时间当作朋友\"、\"通往财富自由之路\"、\"定投改变命运\"、\"韭菜的自我修养\"、\"自学是门手艺\"、\"让时间陪你慢慢变富\"、\"七年就是一辈子\"、\"元认知\"、\"活在未来\"、\"复利\u002F长期主义\"、\"践行\"、\"痴迷改进\"、\"个人商业模式\u002F出售时间\"、\"睡后收入\"、\"定投\"、\"财富自由\"、\"操作系统升级\"、\"最少必要知识\"、\"北极星提示词\"、\"用 AI 该怎么学\u002F思考\" 等任一触发词,或当用户带着关于创业\u002F赚钱\u002F投资\u002F学习\u002F职业\u002F重大人生决策的困惑、希望被人用笑来式的「逻辑 + 大白话 + 类比 + 重新定义 + 践行导向」来点醒和指导时,自动进入李笑来教练模式。","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fxiaolai-methodology\u002FSKILL.md",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",[87,88,89,90,91,92,93],"methodology","xiaolai","xiaolai methodology","朋友","投资","writing","收入",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":106,"publishedAt":47},"01M70P13NB9YP7ACJR1S861CDS","zread","Produce and consume a wiki-style knowledge base for a code repository via the `zread` CLI and its on-disk output under `.\u002F.zread\u002Fwiki\u002F`. Use this skill whenever the user wants to understand, onboard onto, explore, summarize, map, or get an overview of an unfamiliar codebase; asks for architecture docs, a project wiki, a repo walkthrough, module\u002Fpackage explanations, or \"what does this repo do\"; wants to generate, regenerate, resume, browse, or serve code documentation locally; or mentions zread \u002F zread.ai directly. Also use it proactively before diving into a large unknown repo — if `.\u002F.zread\u002Fwiki\u002Fcurrent` exists, read the generated pages instead of crawling source file-by-file; if it doesn't, consider offering to run `zread generate`. The trigger is the intent (understand a codebase through generated docs), not the literal word \"zread\".","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fzread\u002FSKILL.md",[100,101],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[96,42,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124],"wiki","explore","walkthrough","project","get","knowledge base","run","generate","intent","cli","map","documentation","project wiki","disk","architecture","code","unknown","generated",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":135,"publishedAt":47},"01M70P10S4SWMZQ8BJAFBFDRW3","youtube","Launch the YouTube Creator Agent to auto-generate videos.\nUse when: user types \u002Fyoutube, wants to create YouTube videos,\ngenerate video content, or upload to YouTube.\nKeywords: youtube, video, 视频, 创作视频, 发布视频","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube\u002FSKILL.md",[131,132],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":133,"categoryName":134,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000036","内容创作者",[127,136,137,138,139,140,141,142,114,143,144,145,41,33,146,147,148,149],"user","content","视频","creator","generate video","videos","launch","video content","create","upload","auto","types","Video","创作",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":157,"publishedAt":47},"01M70P0YE95D8BACZCGV8BK90K","youtube-script-sync","Sync, update, or optimize Tony's GetNote knowledge base `Youtube视频逐字稿` by turning each parent recording or first-person idea note into an idempotent child note containing a directly recordable YouTube long-video or Shorts script. Use when the user says “更新\u002F同步\u002F优化 Youtube视频逐字稿知识库”, or says “更新\u002F同步\u002F优化该知识库” while this knowledge base is the active context.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube-script-sync\u002FSKILL.md",[156],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[158,159,127,160,161,148,162,163,164,165,166,167,168,169,112,170,41,33,42,171],"sync","script","youtube script sync","recording","shorts","first","base","person","update","active","child","optimize","idempotent","long",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":182,"publishedAt":47},"01M70P0WMV5XT0EEC0N445PW07","writing-skills","How to write SKILL.md files that trigger reliably and teach effectively. Use when creating, improving, or reviewing Claude Code skills.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fxiaolai\u002Fnlpm\u002Fskills\u002Fnlpm\u002Fwriting-skills\u002FSKILL.md",[178,179,180,181],{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},{"categoryNo":133,"categoryName":134,"taxonomyType":104,"taxonomyTypeDesc":105},[183,92,184,185,186,187,122,41,33,188,189,190,191],"writing skills","how","teach","write skill","write","claude code skills","files","how to","trigger",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":200,"publishedAt":47},"01M70P0SJFR4YVJQBGMHKGSKXT","writing-rules","How to write .claude\u002Frules\u002F files that Claude actually follows. Use when creating, improving, or reviewing project rules.","https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fxiaolai\u002Fnlpm\u002Fskills\u002Fnlpm\u002Fwriting-rules\u002FSKILL.md",[198,199],{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":133,"categoryName":134,"taxonomyType":104,"taxonomyTypeDesc":105},[201,92,202,110,203,189,41,184,187,33,190],"Rules","writing rules","project rules"]