mcpField
R
rag-patterns

rag-patterns

github.com/claude-dev-suite开发4640 次安装2 天前更新
代码仓库

关于 rag-patterns

rag-patterns 是面向开发者的 RAG 设计与评估参考技能,涵盖分块、检索、提示词构建和生产检查。

主要功能

  1. 01文本分块策略
  2. 02元数据补充
  3. 03混合与多查询检索
  4. 04检索结果重排
  5. 05提示词构建与引用
  6. 06RAG 评估与生产检查

适用场景

  1. 01为技术文档选择分块方式
  2. 02通过混合检索提高召回率
  3. 03为生成答案添加来源归属
  4. 04评估检索与答案质量

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill rag-patterns

安装后在 Claude Code 中输入/rag-patterns确认已加载。

详细介绍

RAG 模式

标准 RAG 流水线

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

分块策略

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)
策略适用场景分块大小
固定大小并重叠通用文本500-1000 字符
递归字符分块结构化文档500-1000 字符
语义分块(按含义)长篇内容可变
文档感知分块(Markdown 标题)技术文档按章节划分
元数据增强
for chunk in chunks:
    chunk.metadata.update({
        "source": doc.metadata["source"],
        "section": extract_section_title(chunk),
        "doc_id": doc.metadata["id"],
        "chunk_index": i,
    })

检索策略

混合搜索(关键词 + 语义)
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],
)
重排序
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]
多查询检索
# 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))

提示词构建

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)

评估

指标衡量内容工具
上下文相关性检索到的文档是否相关?RAGAS、人工评估
忠实度答案是否与上下文一致?RAGAS
答案相关性答案是否回应了问题?RAGAS
检索召回率是否检索到了正确的文档?自定义评估集
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision

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

反模式

反模式修正方法
分块过大(>1500 字符)使用 500-1000 字符的分块,并设置 200 字符重叠
分块没有元数据存储来源、章节和页码
未评估检索效果构建评估集,衡量召回率和精确率
将所有分块塞入提示词限制为 top-K(3-5),并使用重排序
忽略混合搜索结合 BM25 + 向量搜索,以提升召回率
未追踪引用或来源在整个流水线中传递元数据

生产环境检查清单

  • 使用评估集调优分块策略
  • 启用混合搜索(BM25 + 向量)
  • 对检索结果进行重排序
  • 在答案中标注来源
  • 为超出范围的问题设置防护措施
  • 监控:检索延迟、答案质量评分
  • 为新文档建立增量索引

评论

支持 Markdown