关于 rag-implementation
面向 RAG 系统构建的技能指南,介绍如何用外部知识为 AI 回答提供依据,涵盖文档处理、检索设计、实现模式与评估。
主要功能
- 01向量数据库选项
- 02嵌入模型选择
- 03稠密、稀疏与混合检索
- 04文档分块与导入
- 05检索和答案评估
适用场景
- 01构建专有文档问答系统
- 02创建文档助手
- 03为研究工具添加引用
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill rag-implementation安装后在 Claude Code 中输入/rag-implementation确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/vector-store-config.yamlreferences/document-chunking.mdembedding-models.mdlangchain4j-rag-guide.mdretrieval-strategies.mdvector-databases.md详细介绍
RAG 实现
构建检索增强生成系统,通过外部知识源扩展 AI 能力。
概述
RAG(检索增强生成)通过从知识库中检索相关信息,并将其纳入 AI 回复,增强 AI 应用,减少幻觉并提供准确、有依据的答案。
适用场景
在以下情况下使用此技能:
- 基于专有文档构建问答系统
- 创建提供最新事实信息的聊天机器人
- 使用自然语言查询实现语义搜索
- 通过有依据的回复减少幻觉
- 让 AI 系统能够访问特定领域的知识
- 构建文档助手
- 创建附带来源引用的研究工具
- 开发知识管理系统
核心组件
向量数据库
存储并高效检索文档嵌入,用于语义搜索。
主要选项:
- Pinecone:托管、可扩展、适用于生产环境
- Weaviate:开源,支持混合搜索
- Milvus:高性能,支持本地部署
- Chroma:轻量,便于本地开发
- Qdrant:速度快,支持高级筛选
- FAISS:Meta 的库,提供完全控制
嵌入模型
将文本转换为数值向量,用于相似性搜索。
常用模型:
- text-embedding-ada-002(OpenAI):通用,1536 维
- all-MiniLM-L6-v2:快速、轻量,384 维
- e5-large-v2:高质量,多语言
- bge-large-en-v1.5:业界领先的性能
检索策略
根据用户查询查找相关内容。
方法:
- 稠密检索:通过嵌入进行语义相似度匹配
- 稀疏检索:关键词匹配(BM25、TF-IDF)
- 混合搜索:结合稠密检索和稀疏检索,以获得最佳结果
- 多查询:生成多个查询变体
- 上下文压缩:仅提取相关部分
快速实现
基本 RAG 设置
// Load documents from file system
List<Document> documents = FileSystemDocumentLoader.loadDocuments("/path/to/docs");
// Create embedding store
InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
// Ingest documents into the store
EmbeddingStoreIngestor.ingest(documents, embeddingStore);
// Create AI service with RAG capability
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore))
.build();
文档处理管道
// Split documents into chunks
DocumentSplitter splitter = new RecursiveCharacterTextSplitter(
500, // chunk size
100 // overlap
);
// Create embedding model
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
.apiKey("your-api-key")
.build();
// Create embedding store
EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.builder()
.host("localhost")
.database("postgres")
.user("postgres")
.password("password")
.table("embeddings")
.dimension(1536)
.build();
// Process and store documents
for (Document document : documents) {
List<TextSegment> segments = splitter.split(document);
for (TextSegment segment : segments) {
Embedding embedding = embeddingModel.embed(segment).content();
embeddingStore.add(embedding, segment);
}
}
实现模式
模式 1:简单文档问答
基于文档创建基本的问答系统。
public interface DocumentAssistant {
String answer(String question);
}
DocumentAssistant assistant = AiServices.builder(DocumentAssistant.class)
.chatModel(chatModel)
.contentRetriever(retriever)
.build();
模式 2:按元数据筛选检索结果
根据文档元数据筛选结果。
// Add metadata during document loading
Document document = Document.builder()
.text("Content here")
.metadata("source", "technical-manual.pdf")
.metadata("category", "technical")
.metadata("date", "2024-01-15")
.build();
// Filter during retrieval
EmbeddingStoreContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.7)
.filter(metadataKey("category").isEqualTo("technical"))
.build();
模式 3:多源检索
合并来自多个知识源的结果。
ContentRetriever webRetriever = EmbeddingStoreContentRetriever.from(webStore);
ContentRetriever documentRetriever = EmbeddingStoreContentRetriever.from(documentStore);
ContentRetriever databaseRetriever = EmbeddingStoreContentRetriever.from(databaseStore);
// Combine results
List<Content> allResults = new ArrayList<>();
allResults.addAll(webRetriever.retrieve(query));
allResults.addAll(documentRetriever.retrieve(query));
allResults.addAll(databaseRetriever.retrieve(query));
// Rerank combined results
List<Content> rerankedResults = reranker.reorder(query, allResults);
最佳实践
文档准备
- 在导入前清理并预处理文档
- 移除无关内容和格式残留
- 统一文档结构,确保处理一致
- 添加相关元数据,以便筛选和提供上下文
分块策略
- 每个分块使用 500–1000 个 token,以获得最佳平衡
- 添加 10–20% 的重叠,以保留边界处的上下文
- 确定分块边界时考虑文档结构
- 针对具体使用场景测试不同的分块大小
检索优化
- 从较高的 k 值(10–20)开始,然后进行筛选或重排
- 使用元数据筛选提高相关性
- 结合多种检索策略,提升覆盖面
- 监控检索质量和用户反馈
性能注意事项
- 缓存经常访问内容的嵌入
- 使用批处理导入文档
- 根据使用规模优化向量存储配置
- 监控查询性能和系统资源
常见问题及解决方案
检索质量差
问题:检索到的文档与用户查询不匹配
解决方案:
- 改进文档预处理和清理
- 调整分块大小和重叠参数
- 尝试不同的嵌入模型
- 使用结合语义匹配与关键词匹配的混合搜索
结果不相关
问题:检索到的文档包含相关信息,但不够具体
解决方案:
- 添加元数据筛选,限定特定领域的约束
- 使用交叉编码器模型实现重排
- 使用上下文压缩提取相关部分
- 微调检索参数(k 值、相似度阈值)
性能问题
问题:检索响应时间过长 解决方案:
- 优化向量存储配置和索引
- 为频繁检索的内容实施缓存
- 使用更小的嵌入模型,以加快推理速度
- 考虑使用近似最近邻算法
防止幻觉
问题:AI 生成检索文档中不存在的信息 解决方案:
- 改进提示词工程,强调以检索内容为依据
- 添加验证步骤,检查答案与检索内容的一致性
- 为回答添加置信度评分
- 实施事实核查机制
评估框架
检索指标
- Precision@k:前 k 个结果中相关文档所占的百分比
- Recall@k:前 k 个结果中找到的相关文档占全部相关文档的百分比
- Mean Reciprocal Rank (MRR):第一个相关结果排名的平均倒数
- Normalized Discounted Cumulative Gain (nDCG):排名质量指标
答案质量指标
- 忠实度:答案以检索文档为依据的程度
- 答案相关性:答案回应用户问题的程度
- 上下文召回率:答案中使用的相关上下文所占的百分比
- 上下文精确率:检索到的上下文中相关内容所占的百分比
用户体验指标
- 响应时间:从查询到获得答案所需的时间
- 用户满意度:用户对答案质量的反馈评分
- 任务完成率:成功完成任务的比例
- 参与度:用户与系统的交互模式
资源
参考文档
- 向量数据库对比 - 详细比较不同的向量数据库选项
- 嵌入模型指南 - 模型选择与优化
- 检索策略 - 高级检索技术
- 文档分块 - 分块策略与最佳实践
- LangChain4j RAG 指南 - 官方实现模式
资源文件
assets/vector-store-config.yaml- 适用于不同向量存储的配置模板assets/retriever-pipeline.java- 完整的 RAG 流水线实现assets/evaluation-metrics.java- 评估框架代码
约束和限制
- 令牌限制:遵守模型上下文窗口限制
- API 速率限制:管理外部 API 的速率限制和成本
- 数据隐私:确保符合数据保护法规
- 资源要求:考虑内存和计算资源需求
- 维护:规划定期更新和系统监控
安全注意事项
- 安全访问向量数据库和嵌入服务
- 实施适当的身份验证和授权
- 验证并清理用户输入
- 监控滥用行为和异常使用模式
- 定期进行安全审计和渗透测试
评论
支持 Markdown