第8章:LangChain检索增强生成RAG--2.3Naive RAG
Naive RAG 是一种基本的 RAG 实现,它通过向量搜索从嵌入存储中检索相关内容,并将其注入到提示(prompt)中,以便语言模型能够生成更准确的回答
Naive RAG(简单 RAG)
一旦我们的文档被摄取(参见前面的部分),我们可以创建一个 EmbeddingStoreContentRetriever 来启用简单的 RAG(检索增强生成)功能。
当使用 AI 服务时,可以按照以下方式配置简单的 RAG:
ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5) // 最多返回 5 个结果
.minScore(0.75) // 最小相似度分数为 0.75
.build();
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model) // 使用指定的语言模型
.contentRetriever(contentRetriever) // 使用配置好的内容检索器
.build();
深度解析
1. Naive RAG 的核心组件
Naive RAG 的实现依赖于以下核心组件:
- EmbeddingStore:存储嵌入向量的数据库,也称为向量数据库。
- EmbeddingModel:将文本转换为嵌入向量的模型。
- ContentRetriever:从嵌入存储中检索相关内容的工具。
2. 配置 EmbeddingStoreContentRetriever
EmbeddingStoreContentRetriever 是一个用于从嵌入存储中检索内容的工具。它可以通过以下方式配置:
- embeddingStore:指定嵌入存储实例。
- embeddingModel:指定嵌入模型实例。
- maxResults:指定返回的最大结果数。默认值为 3,但可以根据需要调整。
- minScore:指定返回结果的最小相似度分数。默认值为 0,但可以通过设置更高的值来过滤掉不那么相似的结果。
ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5) // 最多返回 5 个结果
.minScore(0.75) // 最小相似度分数为 0.75
.build();
3. 配置 AI 服务
在 LangChain4j 中,可以通过 AiServices 构建一个 AI 服务,该服务使用配置好的 ContentRetriever 来检索相关内容,并将其注入到语言模型的提示中。
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model) // 使用指定的语言模型
.contentRetriever(contentRetriever) // 使用配置好的内容检索器
.build();
4. 示例代码
以下是一个完整的示例,展示如何配置和使用 Naive RAG:
// 创建嵌入存储实例
EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>();
// 创建嵌入模型实例
EmbeddingModel embeddingModel = new OpenAiEmbeddingModel("your-api-key", "text-embedding-ada-002");
// 配置内容检索器
ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5) // 最多返回 5 个结果
.minScore(0.75) // 最小相似度分数为 0.75
.build();
// 配置 AI 服务
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model) // 使用指定的语言模型
.contentRetriever(contentRetriever) // 使用配置好的内容检索器
.build();
// 使用 AI 服务
String userMessage = "How to do Naive RAG with LangChain4j?";
String answer = assistant.chat(userMessage);
System.out.println("Answer: " + answer);
5. 总结
Naive RAG 是一种简单但有效的 RAG 实现,适用于需要快速启用 RAG 功能的场景。通过配置 EmbeddingStoreContentRetriever 和 AiServices,可以轻松地将文档内容检索功能集成到 AI 服务中。这种方法虽然简单,但在许多场景下已经足够有效,尤其是在需要快速原型开发和概念验证时。
官方示例