关于 rag-agent-builder
rag-agent-builder 是用于构建检索增强生成应用的技能,面向需要让 LLM 基于外部文档回答问题的开发者。内容涵盖文档处理、向量检索、多种 RAG 架构,以及检索和答案质量评估。
主要功能
- 01构建文档分块、嵌入与检索流程
- 02使用向量数据库管理知识来源
- 03实现混合搜索、重排与过滤
- 04采用 Agentic RAG 和 Corrective RAG
- 05评估检索与答案质量
适用场景
- 01构建 PDF 文档问答应用
- 02搜索内部文档和企业数据
- 03为特定领域构建上下文问答
- 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.mdexamples/agentic_rag.pybasic_rag.pyretrieval_strategies.pyscripts/embedding_management.pyrag_evaluation.pyvector_db_manager.py详细介绍
RAG Agent 构建器
构建强大的检索增强生成(RAG)应用,通过外部知识源增强大模型能力,从而生成准确且符合上下文的 AI 回答。
快速入门
通过示例和实用工具开始实现 RAG:
-
示例:查看
examples/目录中的完整实现:basic_rag.py- 简单的分块、嵌入、检索和生成流程retrieval_strategies.py- 混合搜索、重排序和筛选agentic_rag.py- 由 Agent 控制的检索与迭代优化
-
实用工具:查看
scripts/目录中的辅助模块:embedding_management.py- 嵌入生成、归一化和缓存vector_db_manager.py- 向量数据库抽象和工厂rag_evaluation.py- 检索和回答质量指标
概览
RAG 系统结合了三个关键组件:
- 文档检索 - 从知识库中查找相关信息
- 上下文整合 - 将检索到的上下文传递给大模型
- 回答生成 - 基于检索到的信息生成答案
本技能介绍如何使用各种框架和方法构建可用于生产环境的 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 实现:
- 将文档拆分为片段
- 为每个片段生成嵌入
- 存入向量数据库
- 为查询检索最相似的 top-k 个片段
- 将片段作为上下文传递给大模型
优点:简单、快速,适用于直接的问答 缺点:可能遗漏相关上下文,无法优化
模式 2:Agentic RAG
由 Agent 控制检索:
- Agent 接收用户问题
- 决定是否检索文档
- 构造检索查询(可能与原始问题不同)
- 检索相关文档
- 可以迭代或使用工具
- 生成最终回答
优点:更适合复杂问题,可迭代改进 缺点:更复杂,成本更高
模式 3:纠正式 RAG(CRAG)
验证检索到的文档:
- 为问题检索文档
- 评估每个文档的相关性
- 如果相关性较低:
- 尝试不同的检索策略
- 扩大搜索范围
- 从不同来源检索
- 根据已验证的上下文生成回答
优点:回答质量更高,可针对失败进行调整 缺点: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 等)
框架
- LangChain:https://python.langchain.com/
- LlamaIndex:https://www.llamaindex.ai/
- HayStack:https://haystack.deepset.ai/
向量数据库
- Pinecone:https://www.pinecone.io/
- Weaviate:https://weaviate.io/
- Qdrant:https://qdrant.tech/
嵌入模型
- OpenAI:https://platform.openai.com/docs/guides/embeddings
- Hugging Face:https://huggingface.co/models?pipeline_tag=sentence-similarity
后续步骤
- 选择技术栈:确定要使用的框架(LangChain、LlamaIndex 等)
- 准备文档:处理并拆分知识库
- 选择嵌入模型:选择适合你所在领域的嵌入模型
- 选择向量数据库:选择满足扩展需求的存储方案
- 构建管道:实现检索与生成
- 评估:使用示例问题进行测试并迭代
- 监控:在生产环境中跟踪质量指标
评论
支持 Markdown