mcpField
R
rag-agent-builder

rag-agent-builder

github.com/qodex-ai开发47251 次安装42 周前更新
代码仓库

关于 rag-agent-builder

rag-agent-builder 是用于构建检索增强生成应用的技能,面向需要让 LLM 基于外部文档回答问题的开发者。内容涵盖文档处理、向量检索、多种 RAG 架构,以及检索和答案质量评估。

主要功能

  1. 01构建文档分块、嵌入与检索流程
  2. 02使用向量数据库管理知识来源
  3. 03实现混合搜索、重排与过滤
  4. 04采用 Agentic RAG 和 Corrective RAG
  5. 05评估检索与答案质量

适用场景

  1. 01构建 PDF 文档问答应用
  2. 02搜索内部文档和企业数据
  3. 03为特定领域构建上下文问答
  4. 04评估和改进 RAG 检索效果

安装

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

$npx skills add https://github.com/qodex-ai/ai-agent-skills --skill rag-agent-builder

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

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
examples/
agentic_rag.py
basic_rag.py
retrieval_strategies.py
scripts/
embedding_management.py
rag_evaluation.py
vector_db_manager.py

详细介绍

RAG Agent 构建器

构建强大的检索增强生成(RAG)应用,通过外部知识源增强大模型能力,从而生成准确且符合上下文的 AI 回答。

快速入门

通过示例和实用工具开始实现 RAG:

概览

RAG 系统结合了三个关键组件:

  1. 文档检索 - 从知识库中查找相关信息
  2. 上下文整合 - 将检索到的上下文传递给大模型
  3. 回答生成 - 基于检索到的信息生成答案

本技能介绍如何使用各种框架和方法构建可用于生产环境的 RAG 应用。

核心概念

什么是 RAG?

RAG 使用外部数据扩展大模型的知识:

  • 不使用 RAG:大模型依赖训练数据(可能过时或有限)
  • 使用 RAG:大模型使用实时的自定义知识和训练知识
何时使用 RAG
  • 文档问答:回答有关 PDF、书籍和报告的问题
  • 知识库搜索:查询内部文档和 wiki
  • 企业搜索:搜索公司的专有数据
  • 特定上下文的助手:客户支持、HR 助手
  • 事实密集型应用:法律文档、医疗记录、财务数据
何时可能不需要 RAG
  • 常识问题(类似 ChatGPT 的问题)
  • 不断变化的实时数据(改用工具)
  • 非常简单的查找任务(改用数据库查询)

架构模式

基本 RAG 流程
Documents → Chunks → Embeddings → Vector DB
                                        ↓
User Question → Embedding → Retrieval → LLM → Answer
                              ↑         ↓
                         Vector DB    Context
高级 RAG 模式
1. Agentic RAG
  • Agent 决定检索什么以及何时检索
  • 可迭代地优化查询
  • 更适合复杂推理
2. 分层 RAG
  • 多层级文档结构
  • 按不同的详细程度进行搜索
  • 组织方式更加灵活
3. 混合搜索 RAG
  • 结合关键词搜索(BM25)和语义搜索(嵌入)
  • 同时捕捉精确匹配和语义
  • 更适合混合查询类型
4. 纠正式 RAG(CRAG)
  • 评估检索到的文档是否相关
  • 必要时检索其他来源
  • 确保上下文质量较高

实现组件

1. 文档处理

分块策略:

# Simple fixed-size chunks
chunks = split_text(doc, chunk_size=1000, overlap=100)

# Semantic chunks (group by meaning)
chunks = semantic_chunking(doc, max_tokens=512)

# Hierarchical chunks (different levels)
chapters = split_by_heading(doc)
chunks = split_each_chapter(chapters, size=1000)

关键注意事项:

  • 分块大小会影响检索质量和成本
  • 重叠有助于保持分块之间的上下文
  • 语义分块能更好地保留含义
2. 嵌入生成

常用嵌入模型:

  • OpenAI:text-embedding-3-small、text-embedding-3-large
  • 开源:all-MiniLM-L6-v2、all-mpnet-base-v2
  • 领域专用:针对专业知识训练的嵌入模型

最佳实践:

  • 检索和查询使用一致的嵌入模型
  • 使用归一化向量存储嵌入
  • 文档更改时更新嵌入
3. 向量数据库

热门选项:

  • Pinecone:托管式、无服务器、易于扩展
  • Weaviate:开源、可自托管、灵活
  • Milvus:开源、高性能
  • Chroma:轻量,适合原型开发
  • Qdrant:适用于生产环境、高性能

选择标准:

  • 规模要求(数据量、每秒查询数)
  • 延迟需求(实时还是批处理)
  • 成本考量
  • 部署偏好(托管式还是可自托管)
4. 检索策略

检索方法:

# Similarity search (most common)
results = vector_db.query(question_embedding, k=5)

# Hybrid search (keyword + semantic)
keyword_results = bm25.search(question, k=3)
semantic_results = vector_db.query(embedding, k=3)
results = combine_and_rank(keyword_results, semantic_results)

# Reranking (improve relevance)
retrieved = initial_retrieval(query)
reranked = rerank_by_relevance(retrieved, query)

检索参数:

  • k(结果数量):平衡上下文和相关性
  • 相似度阈值:过滤掉相关性较低的结果
  • 多样性:返回多样化的结果,而非最佳匹配
5. 上下文集成

上下文窗口管理:

# Fit retrieved documents into context window
def prepare_context(retrieved_docs, max_tokens=3000):
    context = ""
    for doc in retrieved_docs:
        if len(tokenize(context + doc)) <= max_tokens:
            context += doc
        else:
            break
    return context

提示词设计:

You are a helpful assistant. Answer the question based on the provided context.

Context:
{retrieved_documents}

Question: {user_question}

Answer:
6. 响应生成

生成策略:

  • 直接生成:大模型根据上下文回答
  • 摘要:先汇总多个检索到的文档
  • 事实依据:确保回答引用来源
  • 迭代优化:根据用户反馈优化

实现模式

模式 1:基础 RAG

最简单的 RAG 实现:

  1. 将文档拆分为片段
  2. 为每个片段生成嵌入
  3. 存入向量数据库
  4. 为查询检索最相似的 top-k 个片段
  5. 将片段作为上下文传递给大模型

优点:简单、快速,适用于直接的问答 缺点:可能遗漏相关上下文,无法优化

模式 2:Agentic RAG

由 Agent 控制检索:

  1. Agent 接收用户问题
  2. 决定是否检索文档
  3. 构造检索查询(可能与原始问题不同)
  4. 检索相关文档
  5. 可以迭代或使用工具
  6. 生成最终回答

优点:更适合复杂问题,可迭代改进 缺点:更复杂,成本更高

模式 3:纠正式 RAG(CRAG)

验证检索到的文档:

  1. 为问题检索文档
  2. 评估每个文档的相关性
  3. 如果相关性较低:
    • 尝试不同的检索策略
    • 扩大搜索范围
    • 从不同来源检索
  4. 根据已验证的上下文生成回答

优点:回答质量更高,可针对失败进行调整 缺点:API 调用更多,速度更慢

热门框架

LangChain
from langchain.document_loaders import PDFLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.chains import RetrievalQA

# Load documents
loader = PDFLoader("document.pdf")
docs = loader.load()

# Create RAG chain
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(docs, embeddings)
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(),
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

answer = qa.run("What is the document about?")
LlamaIndex
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader

# Load documents
documents = SimpleDirectoryReader("./data").load_data()

# Create index
index = GPTVectorStoreIndex.from_documents(documents)

# Query
response = index.as_query_engine().query("What is the main topic?")
使用 RAG 的 CrewAI
from crewai import Agent, Task, Crew
from tools import retrieval_tool

researcher = Agent(
    role="Research Assistant",
    goal="Research topics using knowledge base",
    tools=[retrieval_tool]
)

research_task = Task(
    description="Research the topic: {topic}",
    agent=researcher
)

最佳实践

文档准备
  • ✓ 清理并规范化文本(移除页眉、页脚)
  • ✓ 尽可能保留文档结构
  • ✓ 添加元数据(来源、日期、类别)
  • ✓ 对扫描版 PDF 使用 OCR
  • ✓ 针对你的领域测试片段大小
嵌入策略
  • ✓ 为索引和查询使用相同的嵌入模型
  • ✓ 根据领域特定需求微调嵌入
  • ✓ 规范化嵌入,确保一致性
  • ✓ 监控嵌入质量指标
检索优化
  • ✓ 根据使用场景调整 k(结果数量)
  • ✓ 使用重排序提升质量
  • ✓ 实现相关性过滤
  • ✓ 监控检索精确率和召回率
  • ✓ 缓存频繁检索的文档
生成质量
  • ✓ 在回答中包含来源引用
  • ✓ 提示大模型标明置信度
  • ✓ 要求引用具体文档
  • ✓ 为较长的上下文生成摘要
  • ✓ 根据上下文验证回答
监控与评估
  • ✓ 跟踪检索指标(精确率、召回率、MRR)
  • ✓ 监控回答质量和相关性
  • ✓ 记录检索失败情况以便改进
  • ✓ 收集用户反馈
  • ✓ 根据失败情况迭代优化

常见挑战与解决方案

挑战:检索结果不相关

解决方案:

  • 改进分块策略
  • 使用更好的嵌入模型
  • 在查询中添加文档元数据
  • 实现重排序
  • 使用混合搜索
挑战:上下文过大

解决方案:

  • 减小片段大小
  • 减少检索结果数量(减小 k)
  • 汇总检索到的上下文
  • 使用分层检索
  • 按相关性分数过滤
挑战:信息缺失

解决方案:

  • 增大 k 值(检索更多内容)
  • 改进嵌入模型
  • 改进预处理
  • 使用多种搜索策略
  • 添加文档层级结构
挑战:性能缓慢

解决方案:

  • 使用托管式向量数据库
  • 缓存嵌入
  • 批量处理文档
  • 优化分块大小
  • 使用更小的嵌入模型来提升速度

评估指标

检索指标:

  • 精确率:检索到的文档中相关文档所占的百分比
  • 召回率:相关文档中被检索到的百分比
  • MRR(平均倒数排名):首个相关结果的排名
  • NDCG(归一化折损累计增益):排名质量

答案质量指标:

  • 相关性:答案是否回应了问题?
  • 正确性:答案在事实上是否准确?
  • 依据性:答案是否有上下文支持?
  • 用户满意度:用户是否会认为答案有帮助?

高级技术

1. 查询扩展
# Expand query with related terms
expanded_query = query + " " + synonym_expansion(query)
results = retrieve(expanded_query)
2. 文档压缩
# Compress retrieved docs before passing to LLM
compressed = compress_documents(retrieved_docs, query)
context = format_context(compressed)
3. 主动检索
# Iteratively refine retrieval based on LLM output
query = user_question
while iterations < max:
    results = retrieve(query)
    answer = generate_with_context(results)
    if answer_complete(answer):
        break
    query = refine_query(answer)
4. 多模态 RAG
# Retrieve both text and images
text_results = text_retriever.query(question)
image_results = image_retriever.query(question)
context = combine_multimodal(text_results, image_results)

资源与参考资料

重要论文
  • “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”(Lewis 等)
  • “REALM: Retrieval-Augmented Language Model Pre-Training”(Guu 等)
框架
向量数据库
嵌入模型

后续步骤

  1. 选择技术栈:确定要使用的框架(LangChain、LlamaIndex 等)
  2. 准备文档:处理并拆分知识库
  3. 选择嵌入模型:选择适合你所在领域的嵌入模型
  4. 选择向量数据库:选择满足扩展需求的存储方案
  5. 构建管道:实现检索与生成
  6. 评估:使用示例问题进行测试并迭代
  7. 监控:在生产环境中跟踪质量指标

评论

支持 Markdown