【LangChain】向量存储(Vector stores)

news2024/11/17 20:23:34

概要

存储和搜索非结构化数据的最常见方法之一是嵌入它并存储生成的嵌入向量,然后在查询时嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。向量存储负责存储嵌入数据并为您执行向量搜索。

在这里插入图片描述

内容

本篇讲述与 VectorStore 相关的基本功能。使用向量存储的一个关键部分是创建要放入其中的向量,这通常是通过嵌入创建的。因此,建议您在深入研究之前熟悉文本嵌入模型接口

有许多很棒的向量存储选项,以下是一些免费、开源且完全在本地计算机上运行的选项。查看许多出色的托管产品的所有集成。

文本嵌入模型接口

我们想要使用 OpenAIEmbeddings,因此我们必须获取 OpenAI API 密钥。

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')

下面展示三个嵌入文本模型接口

Chroma

本篇讲述使用Chroma向量数据库,该数据库作为一个库在本地计算机上运行。

pip install chromadb

我们想要使用 OpenAIEmbeddings,因此我们必须获取 OpenAI API 密钥。

from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma

# 加载文档,将其分割成块,嵌入每个块并将其加载到向量存储中。
raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
# 注意这里
db = Chroma.from_documents(documents, OpenAIEmbeddings())

FAISS

本演练使用 FAISS 矢量数据库,该数据库利用 Facebook AI 相似性搜索 (FAISS) 库。

pip install faiss-cpu
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS

# 加载文档,将其分割成块,嵌入每个块并将其加载到向量存储中。
raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = FAISS.from_documents(documents, OpenAIEmbeddings())

Lance

本笔记本展示了如何使用与基于 Lance 数据格式的 LanceDB 矢量数据库相关的功能。

pip install lancedb
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import LanceDB

import lancedb
# 基于 Lance 数据格式
db = lancedb.connect("/tmp/lancedb")
table = db.create_table(
    "my_table",
    data=[
        {
            "vector": embeddings.embed_query("Hello World"),
            "text": "Hello World",
            "id": "1",
        }
    ],
    mode="overwrite",
)

# 加载文档,将其分割成块,嵌入每个块并将其加载到向量存储中。
raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
# 创建嵌入的向量存储
db = LanceDB.from_documents(documents, OpenAIEmbeddings(), connection=table)

相似性搜索

query = "总统对科坦吉·布朗·杰克逊说了些什么"
docs = db.similarity_search(query)
print(docs[0].page_content)

结果:

    今晚。我呼吁参议院: 通过《投票自由法案》。通过约翰·刘易斯投票权法案。当你这样做的时候,通过《披露法案》,这样美国人就可以知道谁在资助我们的选举。
	
	今晚,我要向一位毕生为这个国家服务的人表示敬意:斯蒂芬·布雷耶法官——退伍军人、宪法学者、即将退休的美国最高法院法官。布雷耶法官,感谢您的服务。
	
	总统最重要的宪法责任之一是提名某人在美国最高法院任职。
	
	四天前,当我提名巡回上诉法院法官科坦吉·布朗·杰克逊时,我就这样做了。我们国家最顶尖的法律头脑之一,他将继承布雷耶大法官的卓越遗产。

通过向量进行相似性搜索(Similarity search by vector)

还可以使用similarity_search_by_vector 与给定嵌入向量相似的文档进行搜索,该向量接受嵌入向量作为参数而不是字符串。

embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)

查询相同,所以结果也相同。

    Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections.

    Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service.

    One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.

    And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.

异步操作(Asynchronous operations)

向量存储通常作为需要一些 IO 操作的服务,一般是单独运行的,因此它们可能会被异步调用。这会带来性能优势,因为您不必浪费时间等待外部服务的响应。如果您使用异步框架(例如 FastAPI),这一点也可能很重要。

Langchain 支持向量存储上的异步操作。所有方法都可以使用其异步对应方法进行调用,前缀 a 表示异步。

Qdrant 是一个向量存储,它支持所有异步操作,因此将在本节中使用它。

# 单独执行安装
pip install qdrant-client
# 引入模块
from langchain.vectorstores import Qdrant

异步创建向量存储(Create a vector store asynchronously)

db = await Qdrant.afrom_documents(documents, embeddings, "http://localhost:6333")

(相似性搜索)Similarity search

query = "总统对科坦吉·布朗·杰克逊说了些什么"
docs = await db.asimilarity_search(query)
print(docs[0].page_content)

结果:

今晚。我呼吁参议院: 通过《投票自由法案》。通过约翰·刘易斯投票权法案。当你这样做的时候,通过《披露法案》,这样美国人就可以知道谁在资助我们的选举。
今晚,我要向一位毕生为这个国家服务的人表示敬意:斯蒂芬·布雷耶法官——退伍军人、宪法学者、即将退休的美国最高法院法官。布雷耶法官,感谢您的服务。
总统最重要的宪法责任之一是提名某人在美国最高法院任职。
四天前,当我提名巡回上诉法院法官科坦吉·布朗·杰克逊时,我就这样做了。我们国家最顶尖的法律头脑之一,他将继承布雷耶大法官的卓越遗产。

通过向量进行相似性搜索(Similarity search by vector)

embedding_vector = embeddings.embed_query(query)
docs = await db.asimilarity_search_by_vector(embedding_vector)

最大边际相关性搜索 (MMR)(最大边际相关性搜索 (MMR))

最大边际相关性优化了所选文档之间查询的相似性和多样性。异步 API 也支持它。

query = "总统对科坦吉·布朗·杰克逊说了些什么"
found_docs = await qdrant.amax_marginal_relevance_search(query, k=2, fetch_k=10)
for i, doc in enumerate(found_docs):
    print(f"{i + 1}.", doc.page_content, "\n")

结果:

1. 今晚。我呼吁参议院: 通过《投票自由法案》。通过约翰·刘易斯投票权法案。当你这样做的时候,通过《披露法案》,这样美国人就可以知道谁在资助我们的选举。
今晚,我要向一位毕生为这个国家服务的人表示敬意:斯蒂芬·布雷耶法官——退伍军人、宪法学者、即将退休的美国最高法院法官。布雷耶法官,感谢您的服务。
总统最重要的宪法责任之一是提名某人在美国最高法院任职。
四天前,当我提名巡回上诉法院法官科坦吉·布朗·杰克逊时,我就这样做了。我们国家最顶尖的法律头脑之一,他将继承布雷耶大法官的卓越遗产。
2.我们无法改变我们之间的分歧。但我们可以改变我们前进的方式——在 COVID-19 和我们必须共同面对的其他问题上。
最近,在威尔伯特·莫拉警官和他的搭档杰森·里维拉警官的葬礼几天后,我访问了纽约市警察局。
他们当时正在接听 9-1-1 的电话,一名男子用偷来的枪开枪打死了他们。
莫拉警官当时 27 岁。
里维拉警官当时22岁。
这两位多米尼加裔美国人都在同一条街道上长大,后来他们选择担任警察巡逻。
我与他们的家人交谈,告诉他们,我们永远欠他们的牺牲,我们将继续履行他们的使命,恢复每个社区应有的信任和安全。
我已经研究这些问题很长时间了。
我知道什么是有效的:投资于预防犯罪和社区警察,他们会遵守规则,了解社区,并且能够恢复信任和安全。

总结

本篇主要讲述的内容,其实都在这幅图里:
在这里插入图片描述

  1. 加载数据
  2. 通过embed,转成向量存储
  3. 查询条件进行embed
  4. 在3的基础上,再进行向量存储库的搜索

参考地址:

https://python.langchain.com/docs/modules/data_connection/vectorstores/

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

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

相关文章

【Git】远程仓库的创建、SSH协议克隆、拉取、推送

目录 一、创建远程仓库 二、HTTPS协议克隆仓库 三、SSH协议克隆仓库 四、向远程仓库推送 五、从远程仓库拉取 六、忽略特殊文件 七、配置命令别名 一、创建远程仓库 首先我们可以从GitHub或者Gitee中创建自己的个人仓库 工作台 - Gitee.comhttps://gitee.com/ 二、HTT…

Sestra 实用教程(三)输入与输出

目 录 一、前言二、分析流程三、输入文件3.1 模型与荷载3.2 分析控制数据 四、输出文件五、参考文献 一、前言 SESAM (Super Element Structure Analysis Module)是由挪威船级社(DNV-GL)开发的一款有限元分析(FEA&…

关于在VS2017中编译Qt项目遇到的问题

关于在VS2017中编译Qt项目遇到的问题 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。如何在VS2017里部署的Qt Designer上编辑槽函数 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。 链接 如何在VS2017里部署的Qt Design…

【LeetCode】解码方法

这里写目录标题 题目描述算法流程编程代码代码优化 链接: 解码方法 题目描述 算法流程 编程代码 class Solution { public:int numDecodings(string s) {int n s.size();vector<int> dp(n);dp[0] s[0] ! 0;if(n 1) return dp[0];if(s[1] < 9 && s[1] >…

python之编写form表单提交到后端

一、环境配置 我们先去python的框架中下载Flask&#xff0c;具体的配置我给大家找了一篇博客讲解&#xff0c;环境调试没问题后&#xff0c;开始我们form表单提交的过程 Python之flask框架_python flask_【网络星空】的博客-CSDN博客 二、前端代码 在VScode里编写前端的代码为…

移动端加入购物车界面设计

效果图 源码如下 页面设计 <template><div class"container"><!--商品详情 start--><van-image class"goods-item-image" :src"goods.goodsHeadImg"></van-image><div class"goods-price">&…

【安装vue脚手架报错:npm install -g @vue-cli pm ERR! code EINVALIDTAGNAME 】

当我们执行npm install -g vue-cli时候会报错&#xff1a; npm ERR! Invalid tag name “vue-cli” of package “vue-cli”: Tags may not have any characters that encodeURIComponent encodes. npm ERR! A complete log of this run can be found in: /Users/wuwenlu/.npm/…

【MySQL】MySQL索引、事务、用户管理

20岁的男生穷困潦倒&#xff0c;20岁的女生风华正茂&#xff0c;没有人会一直风华正茂&#xff0c;也没有人会一直穷困潦倒… 文章目录 一、MySQL索引特性&#xff08;重点&#xff09;1.磁盘、OS、MySQL&#xff0c;在进行数据IO时三者的关系2.索引的理解3.聚簇索引&#xff0…

仿找靓机链接生成 独立后台管理

教程&#xff1a;修改数据库账号密码直接使用。 源码带有教程! 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

软考A计划-系统集成项目管理工程师-项目采购管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

《Java面向对象程序设计》学习笔记

最近因考研专业课&#xff0c;在学习耿祥义老师的《Java面向对象程序设计&#xff08;第3版&#xff09;-微课视频版》 就打算放一些自己的学习笔记&#xff0c;可能不会及时更新&#xff0c;见谅。 计划弄个专栏&#xff0c;书上的每章对应专栏里的一篇文章。 专栏&#xf…

【并发专题】深入理解并发可见性、有序性、原子性与JMM内存模型

目录 课程内容一、JMM模型1.什么是JMM模型2.JMM内存区域模型3.JMM内存模型与硬件内存架构的关系4.JMM存在的必要性5.数据同步八大原子操作6.指令重排现象与并发编程的可见性&#xff0c;原子性与有序性问题 学习总结 课程内容 一、JMM模型 1.什么是JMM模型 Java内存模型&…

eda、gnm、anm究竟是个啥?

安装prody pip install prody -i https://pypi.tuna.tsinghua.edu.cn/simpleeda、anm、gnm eda(essential dynamics analysis) 另一个名字PCA(Principal Component Analysis) 或 NMA(Normal Mode Analysis)。 eda分析可以帮助人们理解生物大分子基本的运动模式和构象变化。…

【JavaSE】Java方法的使用

【本节目标】 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 4. 掌握递归 目录 1.方法概念及使用 1.1什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 3. 递归 3.…

Beyond Compare和git merge、git rebase

文章目录 各个分支线将dev1 rebase进 dev2将dev1 merge进dev2 各个分支线 将dev1 rebase进 dev2 gitTest (dev2)]$ git rebase dev1local: 是rebase的分支dev1remote&#xff1a;是当前的分支dev2base&#xff1a;两个分支的最近一个父节点 将dev1 merge进dev2 gitTest (dev…

SpringBootAdmin介绍

一、SpringBootAdmin 简介 1.1 概述 SpringBootAdmin 是一个非常好用的监控和管理的开源组件&#xff0c;该组件能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供实时警报功能。 1.2 功能特性 显示应用程序…

初识DBT以及搭建第一个DBT工程

DBT是什么&#xff1a; 按照官方的说法&#xff0c;DBT 是一个数据转换流编排工具。个人理解就是&#xff0c;DBT是帮你编排SQL用的&#xff0c;你可以按照DBT的结构&#xff0c;构建好一个SQL的pipeline&#xff0c;然后让DBT帮你执行这个pipeline。我这里说的SQL pipeline的意…

Android 面试题 应用程序结构 十

&#x1f525; Intent 传递数据 &#x1f525; Activity、Service、BroadcastReceiver之间的通信载体 Intent 来传递数据。而ContentProvider则是共享文件。 Intent可传递的数据类型&#xff1a; a. 8种基本数据类型&#xff08;boolean byte char short int long float double…

【雕爷学编程】MicroPython动手做(21)——掌控板之磁场传感器

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

hooks复杂前端业务解题之道

hooks 大势所趋 2019年年初&#xff0c;react 在 16.8.x 版本正式具备了 hooks 能力&#xff0c;同年6月&#xff1b;尤雨溪在 vue/github-issues 里提出了关于 vue3 Component API 的提案&#xff08;vue hooks的基础&#xff09;。在Vue3的组合式API出现后&#xff0c;githu…