mcpField
R
rag-implementation

rag-implementation

github.com/giuseppe-trisciuoglio开发36670 次安装7 周前更新
代码仓库

关于 rag-implementation

面向 RAG 系统构建的技能指南,介绍如何用外部知识为 AI 回答提供依据,涵盖文档处理、检索设计、实现模式与评估。

主要功能

  1. 01向量数据库选项
  2. 02嵌入模型选择
  3. 03稠密、稀疏与混合检索
  4. 04文档分块与导入
  5. 05检索和答案评估

适用场景

  1. 01构建专有文档问答系统
  2. 02创建文档助手
  3. 03为研究工具添加引用

安装

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

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill rag-implementation

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

包含的文件

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

assets/
vector-store-config.yaml
references/
document-chunking.md
embedding-models.md
langchain4j-rag-guide.md
retrieval-strategies.md
vector-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):排名质量指标
答案质量指标
  • 忠实度:答案以检索文档为依据的程度
  • 答案相关性:答案回应用户问题的程度
  • 上下文召回率:答案中使用的相关上下文所占的百分比
  • 上下文精确率:检索到的上下文中相关内容所占的百分比
用户体验指标
  • 响应时间:从查询到获得答案所需的时间
  • 用户满意度:用户对答案质量的反馈评分
  • 任务完成率:成功完成任务的比例
  • 参与度:用户与系统的交互模式

资源

参考文档
资源文件
  • assets/vector-store-config.yaml - 适用于不同向量存储的配置模板
  • assets/retriever-pipeline.java - 完整的 RAG 流水线实现
  • assets/evaluation-metrics.java - 评估框架代码

约束和限制

  1. 令牌限制:遵守模型上下文窗口限制
  2. API 速率限制:管理外部 API 的速率限制和成本
  3. 数据隐私:确保符合数据保护法规
  4. 资源要求:考虑内存和计算资源需求
  5. 维护:规划定期更新和系统监控

安全注意事项

  • 安全访问向量数据库和嵌入服务
  • 实施适当的身份验证和授权
  • 验证并清理用户输入
  • 监控滥用行为和异常使用模式
  • 定期进行安全审计和渗透测试

评论

支持 Markdown