langchain教程-9.Retriever/检索器

前言

该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial

我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容

这是教程清单

VectorStore-backed Retriever

基于VectorStore的检索器 是一种文档检索系统,它利用向量存储根据文档的向量表示来进行搜索。这种方法使得基于相似度的搜索变得高效,特别适用于处理非结构化数据。

RAG系统中的文档搜索和响应生成步骤包括:

  1. 文档加载:导入原始文档。
  2. 文本切分:将文本切分成可管理的块。
  3. 向量嵌入:使用嵌入模型将文本转换为数值向量。
  4. 存储到向量数据库:将生成的嵌入向量存储到向量数据库中,以便高效检索。

在查询阶段:

  • 流程:用户查询 → 嵌入 → 在向量存储中搜索 → 检索相关块 → LLM生成响应
  • 用户的查询被转化为一个嵌入向量,使用嵌入模型。
  • 该查询嵌入向量与向量数据库中存储的文档向量进行比较,以 检索最相关的结果
  • 检索到的文档块被传递给大语言模型(LLM),该模型基于检索到的信息生成最终响应。
import faiss
from langchain_core.documents import Document
from langchain_community.vectorstores import FAISS
from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_openai import OpenAIEmbeddings

openai_embedding = OpenAIEmbeddings(
	model="bge-m3",
	base_url='http://localhost:9997/v1',
	api_key='cannot be empty',
	# dimensions=1024,
)

embed_dim = len(openai_embedding.embed_query("hello world"))
texts = [
    "AI helps doctors diagnose diseases faster, improving patient outcomes.",
    "AI can analyze medical images to detect conditions like cancer.",
    "Machine learning predicts patient outcomes based on health data.",
    "AI speeds up drug discovery by predicting the effectiveness of compounds.",
    "AI monitors patients remotely, enabling proactive care for chronic diseases.",
    "AI automates administrative tasks, saving time for healthcare workers.",
    "NLP extracts insights from electronic health records for better care.",
    "AI chatbots help with patient assessments and symptom checking.",
    "AI improves drug manufacturing, ensuring better quality and efficiency.",
    "AI optimizes hospital operations and reduces healthcare costs."
]

documents = [
	Document(text, metadata={
   
   "source":text})
	for text in texts
]

db = FAISS.from_documents(documents, openai_embedding)

一旦向量数据库创建完成,就可以使用检索方法,如 相似度搜索最大边际相关性(MMR),加载并查询数据库,从中搜索相关的文本。

as_retriever 方法允许你将一个向量数据库转换为一个检索器,从而实现从向量库中高效地搜索和检索文档。

工作原理

  • as_retriever() 方法将一个向量库(如 FAISS)转换为一个检索器对象,使其与 LangChain 的检索工作流兼容。
  • 这个检索器可以直接用于 RAG 流水线,或与大型语言模型(LLM)结合,用于构建智能搜索系统。
retriever = db.as_retriever()

高级检索器配置

as_retriever 方法允许你配置高级检索策略,如 相似度搜索最大边际相关性(MMR)基于相似度分数阈值的过滤

参数:

  • **kwargs:传递给检索函数的关键字参数:
    • search_type:指定搜索方法。
      • "similarity":基于余弦相似度返回最相关的文档。
      • "mmr":利用最大边际相关性算法,平衡 相关性多样性
      • "similarity_score_threshold":返回相似度分数超过指定阈值的文档。
    • search_kwargs:其他用于微调结果的搜索选项:
      • k:返回的文档数量(默认值:4)。
      • score_threshold:用于 "similarity_score_threshold" 搜索类型的最小相似度分数(例如:0.8)。
      • fetch_k:在 MMR 搜索过程中最初检索的文档数量(默认值:20)。
      • lambda_mult:控制 MMR 结果中的多样性(0 = 最大多样性,1 = 最大相关性,默认值:0.5)。
      • filter:用于选择性文档检索的元数据过滤。

返回值:

  • VectorStoreRetriever:初始化后的检索器对象,可以直接用于文档搜索任务。

注意事项:

  • 支持多种搜索策略(similarityMMRsimilarity_score_threshold)。
  • MMR 通过减少结果中的冗余,提升结果多样性同时保持相关性。
  • 元数据过滤使得根据文档属性选择性地检索文档成为可能。
  • tags 参数可以用于给检索器加标签,以便更好地组织和识别。

警告:

  • 使用 MMR 时的多样性控制:
    • 小心调整 fetch_k(最初检索的文档数量)和 lambda_mult(多样性控制因子)以获得最佳平衡。
    • lambda_mult
      • 较低值(< 0.5)→ 优先考虑多样性。
      • 较高值(> 0.5)→ 优先考虑相关性。
    • 为有效的多样性控制,设置 fetch_k 大于 k
  • 阈值设置:
    • 使用较高的 score_threshold(例如 0.95)可能会导致没有结果。
  • 元数据过滤:
    • 在应用过滤器之前,确保元数据结构已经定义好。
  • 平衡配置:
    • 为了获得最佳的检索性能,保持 search_typesearch_kwargs 设置之间的适当平衡。
retriever = db.as_retriever(
    search_type="similarity_score_threshold", 
    search_kwargs={
   
   
        "k": 5,  # Return the top 5 most relevant documents
        "score_threshold": 0.5  # Only return documents with a similarity score of 0.4 or higher
    }
)

query = "How does AI improve healthcare?"
results = retriever.invoke(query)

# Display search results
for doc in results:
    print(doc.page_content)
No relevant docs were retrieved using the relevance score threshold 0.5

检索器的 invoke() 方法

invoke() 方法是与检索器交互的主要入口点。它用于根据给定的查询搜索并检索相关的文档。

工作原理:

  1. 查询提交:用户提交查询字符串作为输入。
  2. 嵌入生成:如果需要,查询会被转换成向量表示。
  3. 搜索过程:检索器使用指定的搜索策略(如相似度、MMR 等)在向量数据库中进行搜索。
  4. 结果返回:该方法返回一组相关的文档片段。

参数:

  • input(必需):

    • 用户提供的查询字符串。
    • 查询会被转换成向量,并与存储的文档向量进行相似度比较,以进行基于相似度的检索。
  • config(可选):

    • 允许对检索过程进行细粒度控制。
    • 可用于指定 标签、元数据插入和搜索策略
  • **kwargs(可选):

    • 允许直接传递 search_kwargs 进行高级配置。
    • 示例选项包括:
      • k:返回的文档数量。
      • score_threshold:文档被包括的最低相似度分数。
      • fetch_k:MMR 搜索中最初检索的文档数量。

返回值:

  • List[Document]
    • 返回包含检索到的文本和元数据的文档对象列表。
    • 每个文档对象包括:
      • page_content:文档的主要内容。
      • metadata:与文档相关联的元数据(例如,来源、标签)。

用例 1

docs = retriever.invoke("What is an embedding?")

for doc in docs:
    print(doc.page_content)
    print("=========================================================")
Machine learning predicts patient outcomes based on health data.
=========================================================
AI monitors patients remotely, enabling proactive care for chronic diseases.
=========================================================
AI chatbots help with patient assessments and symptom checking.
=========================================================

用例 2

# search options: top 5 results with a similarity score ≥ 0.7
docs = retriever.invoke(
    "What is a vector database?",
    search_kwargs={
   
   "k": 5, "score_threshold": 0.7}
### LangChain4j 中 RAG 的概念介绍 检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了检索和生成模型的技术,旨在通过从外部数据源中提取相关信息来提高自然语言处理任务的效果。在 LangChain4j 中,RAG 是一种用于构建智能问答系统的强大工具[^2]。 #### 1. RAG 的基本原理 RAG 技术的核心在于将传统的基于生成的语言模型与信息检索机制相结合。具体来说,在生成最终响应之前,系统会先从存储的知识库或文档集合中检索出与当前查询最相关的片段。这些片段作为上下文输入提供给大语言模型(LLM),从而帮助其生成更加精确、有依据的回答[^3]。 #### 2. LangChain4j 对 RAG 的支持 LangChain4j 提供了一套灵活的 API 和组件来简化 RAG 应用程序的开发过程。以下是几个关键部分: - **DefaultRetrievalAugmentor**: 它是一个默认实现类,负责执行整个检索流程并将其结果传递至后续阶段。该模块的设计灵感来源于一篇学术论文《Deconstructing RAG》(https://arxiv.org/pdf/2312.10997)[^1]。 - **Easy RAG 功能**: 开发者可以通过引入 `langchain4j-easy-rag` Maven 依赖快速搭建基础版 RAG 流程。这种方式虽然功能有限,但对于初学者或者仅需创建原型项目而言非常实用。 ```xml <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-easy-rag</artifactId> <version>0.34.0</version> </dependency> ``` - **加载文档**: 使用内置工具如 `FileSystemDocumentLoader` 来读取本地文件夹内的资料,并转换成适合进一步处理的形式——即一组 Document 实体对象列表。 ```java List<Document> documents = FileSystemDocumentLoader.loadDocuments("/path/to/documents"); ``` #### 3. 高级定制选项 尽管 Easy RAG 能够满足初步需求,但在实际生产环境中往往还需要针对特定场景做更多优化调整。例如修改相似度计算算法、更换底层向量数据库引擎等操作都可以显著提升性能表现。 --- ### 示例代码展示简易 RAG 构建方式 下面给出一段简单的 Java 示例代码演示如何利用上述提到的功能点完成一次完整的交互体验: ```java import dev.langchain4j.data.document.Document; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.retriever.Retriever; public class SimpleRAGExample { public static void main(String[] args) { // 初始化必要的组成部分 Retriever retriever = ... ; // 自定义检索器实例化逻辑省略 ChatLanguageModel llm = ... ; // 大型预训练模型接入细节忽略 String userQuestion = "Spring Boot 如何配置多环境?"; // 执行检索动作获取关联材料 List<Document> retrievedDocs = retriever.retrieve(userQuestion); // 将检索所得内容拼接形成提示词前缀 StringBuilder contextBuilder = new StringBuilder(); for (Document doc : retrievedDocs){ contextBuilder.append(doc.content()).append("\n---\n"); } String promptWithContext = String.format( "%s请根据以上背景知识回答:%s", contextBuilder.toString(), userQuestion ); // 请求大型语言模型作答 String aiResponse = llm.generate(promptWithContext); System.out.println(aiResponse); } } ``` 此脚本展示了从接收用户提问到最后返回解答的整体链条运作情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值