LangChain 0.2 - 矢量存储和检索器

本文翻译整理自:Vector stores and retrievers
https://python.langchain.com/v0.2/docs/tutorials/retrievers/

文章目录

    • 一、说明
      • 概念
    • 二、文件
    • 三、Vector stores
      • 示例
    • 四、Retrievers
    • 五、了解更多


一、说明

本教程将让您熟悉 LangChain 的向量存储和检索器抽象。
这些抽象旨在支持从(向量)数据库和其他来源检索数据,以便与法学硕士工作流程集成。
它们对于获取要作为模型推理的一部分进行推理的数据的应用程序非常重要,例如检索增强生成或 RAG(请参阅此处的RAG 教程)。


概念

本指南重点介绍文本数据的检索。我们将涵盖以下概念:

  • Documents;
  • Vector stores;
  • Retrievers.

项目设置可参考 之前文章第二部分


二、文件

LangChain 实现了文档抽象,旨在表示文本单元和相关元数据。它有两个属性:

  • page_content:代表内容的字符串;
  • metadata:包含任意元数据的字典。

metadata属性可以捕获有关文档来源、其与其他文档的关系以及其他信息的信息。
请注意,单个Document对象通常代表较大文档的一部分。


让我们生成一些示例文档:

from langchain_core.documents import Documentdocuments = [Document(page_content="Dogs are great companions, known for their loyalty and friendliness.",metadata={"source": "mammal-pets-doc"},),Document(page_content="Cats are independent pets that often enjoy their own space.",metadata={"source": "mammal-pets-doc"},),Document(page_content="Goldfish are popular pets for beginners, requiring relatively simple care.",metadata={"source": "fish-pets-doc"},),Document(page_content="Parrots are intelligent birds capable of mimicking human speech.",metadata={"source": "bird-pets-doc"},),Document(page_content="Rabbits are social animals that need plenty of space to hop around.",metadata={"source": "mammal-pets-doc"},),
]


API参考:

  • Document

在这里,我们生成了五个文档,其中包含指示三个不同“来源”的元数据。


三、Vector stores

矢量搜索是存储和搜索非结构化数据(例如非结构化文本)的常用方法。
这个想法是存储与文本关联的数字向量。
给定一个查询,我们可以将其嵌入为相同维度的向量,并使用向量相似性度量来识别存储中的相关数据。

LangChain VectorStore对象包含向Document存储添加文本和对象以及使用各种相似性度量查询它们的方法。
它们通常使用嵌入模型进行初始化,该模型决定如何将文本数据转换为数字向量。

LangChain 包含一套与不同矢量存储技术的集成。
一些矢量存储由提供商(例如,各种云提供商)托管,并且需要特定的凭据才能使用;有些(例如Postgres)在单独的基础设施中运行,可以在本地或通过第三方运行;其他可以在内存中运行以处理轻量级工作负载。
在这里,我们将使用Chroma演示 LangChain VectorStores 的用法,其中包括内存中实现。

为了实例化向量存储,我们通常需要提供嵌入模型来指定如何将文本转换为数字向量。

这里我们将使用OpenAI 嵌入。

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddingsvectorstore = Chroma.from_documents(documents,embedding=OpenAIEmbeddings(),
)


API参考:

  • OpenAIEmbeddings

调用 .from_documents 此处会将文档添加到矢量存储中。
VectorStore实现了添加文档的方法,这些方法也可以在实例化对象后调用。
大多数实现将允许您连接到现有的向量存储——例如,通过提供客户端、索引名称或其他信息。
有关更多详细信息,请参阅特定集成的文档。

一旦我们实例化了VectorStore包含文档的,我们就可以查询它。 VectorStore包含查询方法:

  • 同步和异步;
  • 按字符串查询和按向量查询;
  • 有或没有返回相似度分数;
  • 通过相似性和最大边际相关性(以平衡查询的相似性和检索结果的多样性)。

这些方法通常会在其输出中包含Document对象的列表。


示例

根据与字符串查询的相似性返回文档:

vectorstore.similarity_search("cat")

[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

异步查询:

await vectorstore.asimilarity_search("cat")

[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

返回分数:

# Note that providers implement different scores; Chroma here
# returns a distance metric that should vary inversely with
# similarity.vectorstore.similarity_search_with_score("cat")

[(Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),0.3751849830150604),(Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),0.48316916823387146),(Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),0.49601367115974426),(Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'}),0.4972994923591614)]

根据与嵌入查询的相似性返回文档:

embedding = OpenAIEmbeddings().embed_query("cat")vectorstore.similarity_search_by_vector(embedding)

[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

了解更多:

  • API reference
  • How-to guide
  • Integration-specific docs

四、Retrievers

LangChain VectorStore对象没有 Runnable 子类,因此不能立即集成到 LangChain 表达语言链 中。

LangChain Retrievers 是 Runnables,因此它们实现了一组标准方法(例如,同步和异步invoke以及batch操作),并被设计为合并到 LCEL 链中。

我们可以自己创建一个简单的版本,无需子类化Retriever
如果我们选择希望使用什么方法来检索文档,我们可以轻松创建一个可运行程序。
下面我们将围绕该similarity_search方法构建一个:

from typing import Listfrom langchain_core.documents import Document
from langchain_core.runnables import RunnableLambdaretriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)  # select top resultretriever.batch(["cat", "shark"])

API参考

  • Document
  • RunnableLambda
[[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'})],[Document(page_content='Goldfish are popular pets for beginners, requiring relatively simple care.', metadata={'source': 'fish-pets-doc'})]]

Vectorstore 实现了as_retriever一个生成 Retriever 的方法,特别是 VectorStoreRetriever。
这些检索器包括特定的search_typesearch_kwargs 属性,用于标识要调用的底层向量存储的哪些方法以及如何参数化它们。
例如,我们可以用以下内容复制上面的内容:

retriever = vectorstore.as_retriever(search_type="similarity",search_kwargs={"k": 1},
)retriever.batch(["cat", "shark"])

[[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'})],[Document(page_content='Goldfish are popular pets for beginners, requiring relatively simple care.', metadata={'source': 'fish-pets-doc'})]]

VectorStoreRetriever 支持搜索类型 "similarity"(默认)、"mmr"(最大边际相关性,如上所述)和"similarity_score_threshold"
我们可以使用后者根据相似度得分对检索器输出的文档进行阈值化。

检索器可以轻松融入更复杂的应用程序,例如检索增强生成 (RAG) 应用程序,该应用程序将给定的问题与检索到的上下文结合到 LLM 提示中。
下面我们展示了一个最小示例。

pip install -qU langchain-openai

import getpass
import osos.environ["OPENAI_API_KEY"] = getpass.getpass()from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-3.5-turbo-0125")

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthroughmessage = """
Answer this question using the provided context only.{question}Context:
{context}
"""prompt = ChatPromptTemplate.from_messages([("human", message)])rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm

API参考:

  • ChatPromptTemplate
  • RunnablePassthrough
response = rag_chain.invoke("tell me about cats")print(response.content)

Cats are independent pets that often enjoy their own space.

五、了解更多

检索策略可能丰富且复杂。例如:

  • 我们可以从查询中推断出硬规则和过滤器 (例如,“使用 2020 年之后发布的文档”);
  • 我们可以以某种方式返回链接到检索到的上下文的文档 (例如,通过某些文档分类法);
  • 我们可以为每个上下文单元生成多个嵌入;
  • 我们可以整合 来自多个检索器的结果;
  • 我们可以为文档分配权重,例如,对最近的文档赋予更高的权重。

操作指南的 检索器 部分涵盖了这些和其他内置检索策略。
扩展 BaseRetriever类以实现自定义检索器也很简单。
请参阅操作指南 : https://python.langchain.com/v0.2/docs/how_to/custom_retriever/。


2024-05-22(三)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型LLM 相关知识汇总

大型语言模型(LLM)在设计和应用时需要遵守一系列的道德和法律标准,以确保不会输出不当内容。以下是一些LLM通常不应该对外输出的内容类型: 个人隐私信息:包括但不限于个人身份信息(PII)&#x…

Echarts 实现将X轴放在图表顶部并且自动播放展示提示信息内容

文章目录 需求分析效果预览需求 如下图所示,实现柱状图中反转倒着绘制 分析 使用 ECharts 来实现对 Y 轴的倒序排序时,可以通过设置 yAxis 的 inverse 属性为 true 来实现。以下是一个简单的示例,演示了如何使用 ECharts 来创建一个柱状图,并将 Y 轴进行倒序排序:并且…

前缀和算法:提升编程效率的秘密武器(Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

代码审计--一道简单的文件包含题目的多种利用方式

NO.1 传统方法 首先来看下代码 <?php error_reporting(0); if(isset($_GET["file"])){include($_GET["file"]); }else{highlight_file(__FILE__);phpinfo(); } ?>看完代码后再来学习学习函数吧&#xff0c;毕竟菜啊&#xff01;&#xff01;&…

IronPython和C#交互

在C#环境中动态调用IronPython脚本&#xff0c;可以通过以下步骤实现&#xff1a; 安装IronPython: 首先&#xff0c;确保你的项目中已经安装了IronPython。可以通过NuGet包管理器来安装IronPython。 创建IronPython运行环境: 在C#代码中&#xff0c;你需要创建一个ScriptEngi…

NASA数据集——阿尔法喷气式大气实验甲醛(HCHO)数据

Alpha Jet Atmospheric eXperiment Formaldehyde Data 简介 阿尔法喷气式大气实验甲醛数据 阿尔法喷气式大气实验&#xff08;AJAX&#xff09;是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达和太平洋沿岸地区的…

【NOIP2014普及组复赛】题4:子矩阵

题3&#xff1a;子矩阵 【题目描述】 给出如下定义&#xff1a; 1.子矩阵&#xff1a;从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵&#xff08;保持行与列的相对顺序&#xff09;被称为原矩阵的一个子矩阵。 例如&#xff0c;下面左图中选取第 2 、 4 2、4 2、…

vue项目中使用json编辑器

实现效果&#xff1a; 借助插件json-editor-vue3实现效果如图一&#xff0c;如果嫌丑可以通过类名改一下样式如图二。 实现过程&#xff1a; 安装插件&#xff1a;npm install json-editor-vue3 文档链接&#xff1a;GitCode - 开发者的代码家园 <script setup name&quo…

Golang发送POST请求并传递JSON数据

客户端 package mainimport ("c02_get_param/common""fmt""zdpgo_resty" )func main() {// Create a Resty Clientclient : zdpgo_resty.New()// 设置字符串resp, err : client.R().SetHeader("Content-Type", "application/jso…

AcWing 3466. 清点代码库(STL:map,vector)

3466. 清点代码库 需要求有几种不同数列&#xff0c;每种有多少个&#xff0c;可以想到用map。它的键是一个数列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要满足要求的输出序列&#xff0c;就要想把它放在其他容器&#xff0c;或数组里&…

mac清理缓存的命令

mac清理缓存的命令 在macOS中&#xff0c;你可以使用以下命令来清理缓存&#xff1a; 清理DNS缓存&#xff1a; sudo killall -HUP mDNSResponder 清理Metal缓存&#xff1a; mkdir ~/Library/Caches/com.apple.Metal 清理文件系统元数据缓存&#xff1a; sudo find /private/…

Vite + Vue3 部署 GitHub

因为静态资源是可以部署到 GitHub 上&#xff0c;自己顺便学习部署网站 因为我使用的是 Vite 工具&#xff0c;官方有提供相应 Demo 部署静态站点 | Vite 官方中文文档 新建文件夹 .github 然后再建一个文件夹 workflows 新建文件 main.yml 文件 直接使用官方文档 demo #…

什么是spring 的组件扫描?

Spring的组件扫描&#xff08;Component Scanning&#xff09;是Spring框架提供的一种机制&#xff0c;用于自动寻找和注册应用程序中的组件&#xff0c;进而减少显式的配置。这些组件通常是标有特定注解&#xff08;如Component, Service, Repository, Controller等&#xff0…

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…

Java-MySql:JDBC

目录 JDBC概述 JDBC搭建 1、导入mysql开发商提供的jar包 2、注册驱动 3、与数据库连接 注解&#xff1a; Statement&#xff1a; 代码 运行 PreparedStatement&#xff1a; 代码 运行 PreparedStatement和Statement Statement 增 代码 运行 删 代码 运…

九、图形化脚本

多年来&#xff0c; shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时&#xff0c;就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。 9.1 创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户…

AI遇上遥感,未来会怎样?

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

初识GPT

初识GPT GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的预训练语言模型&#xff0c;由人工智能研究公司OpenAI开发。GPT模型使用了一种称为“自回归”&#xff08;autoregressive&#xff09;的方法来生成文本&#xff0c;这意味…

Oracle执行DELETE语句后,回滚(还原)数据

--第一步&#xff1a;删除数据 DELETE FROM "EMPLOYEER" WHERE id 123 --第二步&#xff1a;查看数据列表(判断第一步中数据是否被删除) SELECT * FROM "EMPLOYEER" AS OF timestamp to_timestamp( 2024-05-22 11:51:00, yyyy-mm-dd hh24:mi:ss ) --第…

基于MetaGPT构建LLM多智能体

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我们用了两万多字详细拆解了单个Agent的组成&#xff0c;并通过Github Trending订阅智能体理解MetaGPT框架的订阅模块如何解决应用问题&#xff0c;但是对于复杂&#xff0c;并行的任务&#xff0c;单…