LangChain核心模块 Retrieval——文本嵌入模型、Vector stores

Text embedding models

  • 文本嵌入模型

检索的另一个关键部分是为文档创建嵌入。

Embeddings 类是设计用于与文本嵌入模型交互的类。

Embeddings创建一段文本的矢量表示,这样我们就可以在向量空间中思考文本,并执行语义搜索之类的操作,在向量空间中查找最相似的文本片段。

LangChain中的Embeddings基类提供了两种方法:

  • 用于嵌入文档,采用多个文本作为输入
  • 用于嵌入查询,采用单个文本作为输入

将它们作为两种单独方法的原因是,某些嵌入提供程序对文档(要搜索的)与查询(搜索查询本身)有不同的嵌入方法。

from langchain_openai import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings()
  1. embed_documents

    嵌入文本列表

    embeddings = embeddings_model.embed_documents(
        [
            "Hi there!",
            "Oh, hello!",
            "What's your name?",
            "My friends call me World",
            "Hello World!"
        ]
    )
    len(embeddings), len(embeddings[0])
    
  2. embed_query

    嵌入单个查询,嵌入一段文本是为了与其他嵌入的文本进行比较。

    embedded_query = embeddings_model.embed_query("What was the name mentioned in the conversation?")
    embedded_query[:5]
    

CacheBackedEmbeddings

embeddings可以被存储或临时缓存以避免需要重新计算它们。

缓存embeddings可以使用 CacheBackedEmbeddings 来完成。支持缓存的嵌入器是嵌入器的包装器,它将嵌入缓存在键值存储中。对文本进行哈希处理,并将哈希值用作缓存中的密钥。

初始化 CacheBackedEmbeddings 的主要支持方式是 from_bytes_store。它需要以下参数:

  • underlying_embedder(底层嵌入器):用于嵌入的嵌入器。
  • document_embedding_cache(文档嵌入缓存):任何用于缓存文档嵌入的 ByteStore
  • batch_size:(optional, defaults to None)要更新嵌入的文档数量。
  • namespace:(optional, defaults to "") 用于文档缓存的命名空间,该命名空间用于避免与其他缓存发生冲突。例如,将其设置为所使用的嵌入模型的名称。

请务必设置命名空间参数,以避免使用不同嵌入模型嵌入的相同文本发生冲突。

from langchain.embeddings import CacheBackedEmbeddings
Using with a Vector Store

首先,让我们看一个使用本地文件系统存储嵌入并使用 FAISS 矢量存储进行检索的示例。

%pip install --upgrade --quiet  langchain-openai faiss-cpu
from langchain.storage import LocalFileStore
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

underlying_embeddings = OpenAIEmbeddings()

store = LocalFileStore("./cache/")

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings, store, namespace=underlying_embeddings.model
)

嵌入之前缓存为空:

list(store.yield_keys())
[]

加载文档,将其分割成块,嵌入每个块并将其加载到向量存储中。

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)

创建向量存储:

%%time
db = FAISS.from_documents(documents, cached_embedder)
CPU times: user 218 ms, sys: 29.7 ms, total: 248 ms
Wall time: 1.02 s

如果我们尝试再次创建向量存储,它会快得多,因为它不需要重新计算任何嵌入。

%%time
db2 = FAISS.from_documents(documents, cached_embedder)
CPU times: user 15.7 ms, sys: 2.22 ms, total: 18 ms
Wall time: 17.2 ms

以下是创建的一些嵌入:

list(store.yield_keys())[:5]
['text-embedding-ada-00217a6727d-8916-54eb-b196-ec9c9d6ca472',
 'text-embedding-ada-0025fc0d904-bd80-52da-95c9-441015bfb438',
 'text-embedding-ada-002e4ad20ef-dfaa-5916-9459-f90c6d8e8159',
 'text-embedding-ada-002ed199159-c1cd-5597-9757-f80498e8f17b',
 'text-embedding-ada-0021297d37a-2bc1-5e19-bf13-6c950f075062']
Swapping the ByteStore
  • 交换字节存储

为了使用不同的 ByteStore,只需在创建 CacheBackedEmbeddings 时使用它即可。下面,我们创建一个等效的缓存嵌入对象,但使用非持久性InMemoryByteStore代替:

from langchain.embeddings import CacheBackedEmbeddings
from langchain.storage import InMemoryByteStore

store = InMemoryByteStore()

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings, store, namespace=underlying_embeddings.model
)

Vector stores

  • 矢量仓库

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

矢量存储负责存储嵌入数据并执行矢量搜索。

在这里插入图片描述

使用向量存储的一个关键部分是创建要放入其中的向量,这通常是通过嵌入创建的。

Asynchronous operations

  • 异步操作

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

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

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

pip install qdrant-client
from langchain_community.vectorstores import Qdrant
  1. 异步创建向量存储

    db = await Qdrant.afrom_documents(documents, embeddings, "http://localhost:6333")
    
  2. 相似性搜索

    query = "What did the president say about Ketanji Brown Jackson"
    docs = await db.asimilarity_search(query)
    print(docs[0].page_content)
    
  3. 通过vector进行相似性搜索

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

Maximum marginal relevance search (MMR)

  • 最大边际相关性搜索

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

query = "What did the president say about Ketanji Brown Jackson"
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")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解库和程序运行过程

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

Websocket + Vue使用

这里有一篇文档可以参考一下> 闪现 POM文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.0</version> </dependency> WebSocketConf…

IIS7/iis8/iis10安装II6兼容模块 以windows2022为例

因安全狗的提示 安全狗防护引|擎安装失败 可能原因是: IIS7及以上版本末安装1IS6兼容模块! .所以操作解决 如下. 在开始菜单中,找到服务器管理器.找到下图的IIS,右键添加角色和功能,找到web服务器的管理工具选项,iis6管理兼容性 打钩并安装. 如下图

力扣---最长回文子串---二维动态规划

二维动态规划思路&#xff1a; 首先&#xff0c;刚做完这道题&#xff1a;力扣---最长有效括号---动态规划&#xff0c;栈-CSDN博客&#xff0c;所以会有一种冲动&#xff0c;设立g[i]&#xff0c;表示以第i位为结尾的最长回文子串长度&#xff0c;然后再遍历一遍取最大长度即可…

Web前端-JS

JavaScript&#xff0c;简称js&#xff1a;负责网页的行为&#xff08;交互效果&#xff09;。是一门跨平台&#xff0c;面向对象的脚本语言&#xff08;编写出来的语言不需要编译&#xff0c;通过浏览器的解释就可以运行&#xff09; JS引入方式 1.内嵌样式 这样打开页面就会…

【CVPR2024】CricaVPR

【CVPR2024】CricaVPR: Cross-image Correlation-aware Representation Learning for Visual Place Recognition 这个论文提出了一种具有跨图像相关性的鲁棒全局表示方法用于视觉位置识别&#xff08;VPR&#xff0c;Visual Place Recognition &#xff09;任务&#xff0c;命…

Linux系统——iptables超细致解释

目录 内核如何处理数据包流程图 一、表 二、链 三、表、链、规则的关系 四、数据报文进/出节点经过哪些规则 五、NAT——网络地址转换 1.SNAT 2.DNAT 内核如何处理数据包流程图 规则是管理员对数据包制定的一种触发机制&#xff0c;即当数据包达到某种条件&#xff0c;…

【Linux杂货铺】进程控制

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 进程创建 &#x1f4c2; fork函数 &#x1f4c2; 写实拷贝 &#x1f4c2; 创建进程的目的 &#x1f4c2; 创建失败原因 &#x1f4c1; 进程终止 &#x1f4c2; 概念 &#x1f4c2; 场景 &#x1f4c2; 退出方法 …

欧几里得算法-----无聊的军官pro max版本

上篇文章末尾我们说学了欧几里得算法一定给大家更新。 今天它来了&#xff01; 欧几里得算法 欧几里得算法是一种求最小公倍数和最大公因数的算法。 我们看图&#xff1a; 我们把两个数看成长方形&#xff0c;在长方形内不断划分出小正方形&#xff0c;PS&#xff1a;第一个…

一图理解递归-算法通关村

一图理解递归-算法通关村 递归是我们算法进阶的基础&#xff0c;是必须要掌握的内容&#xff0c;只有掌握了递归才算真的会算法。与递归有关的问题有&#xff1a; 与树和二叉树相关的大部问题二分查找相关的问题快速排序、归并排序相关的问题所有回溯的问题所有动态规划的问题 …

scrapy爬虫框架

scrapy爬虫框架 一、scrapy的概念作用和工作流程1、scrapy的概念2、scrapy框架的作用3、scrapy的工作流程&#xff08;重点&#xff09;3.1 回顾之前的爬虫流程3.2 改写上述流程3.3 scrapy的流程3.4 scrapy的三个内置对象3.5 scrapy中每个模块的具体作用 二、scrapy的入门使用1…

【机器学习】无监督学习算法之:主成分分析

主成分分析 1、引言2、主成分分析2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 快&#xff0c;快。 小鱼&#xff1a;… 啥情况&#xff0c; 你可别乱喊。 小屌丝&#xff1a;额… 我的意思&#xff0c;是你该继…

【附订阅OnlyFans攻略】2024年AI:一个交织着创新与挑战的故事

2024年AI&#xff1a;一个交织着创新与挑战的故事 在2024年的一个清晨&#xff0c;阳光透过智能窗户的调节&#xff0c;柔和地洒在书房里。李华&#xff0c;一位年轻的科技创业者&#xff0c;坐在书桌前&#xff0c;凝视着电脑屏幕上不断跳动的数据和图像。他正在进行一项重要…

Flutter 项目架构技术指南

Flutter 项目架构技术指南 视频 https://www.bilibili.com/video/BV1rx4y127kN/ 前言 原文 https://ducafecat.com/blog/flutter-clean-architecture-guide 探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture&#xff0c;以及架构模式MVC…

qt 实现 轮播图效果,且还有 手动 上一页和下一页 已解决

QT中有 轮播图的需求&#xff0c;按照正常html版本 。只需要配置数组就能搞定&#xff0c;但是c qt版本 应该用什么了。 第一想到的是采用定时器。 // 定时器初始化{m_pTime new QTimer(this);m_pTime->start(4 * 1000);//启动定时器并设置播放时间间隔m_pAutoFlag true;/…

网络层(IP层)

IP协议的本质&#xff1a;有将数据跨网络传输的能力 而用户需要的是将数据从主机A到主机B可靠地跨网络传输 IP的组成&#xff1a;目标网络目标主机 IP由目标网络和目标主机两部分组成&#xff0c;IP报文要进行传输&#xff0c;要先到达目标网络&#xff0c;然后经过路由器转到…

使用阿里云服务器搭建网站教程,超简单10分钟网站上线

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网aliyunfuwuqi.com以搭建WordPress网站博客为例&#xff0c;来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流…

【算法设计与分析】实现Trie前缀树

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串…

【评分标准】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷 无线网络勘测设计

第一部分&#xff1a;无线网络勘测设计评分标准 序号评分项评分细项评分点说明评分方式分值1点位设计图AP编号AP编号符合“AP型号位置编号”完全匹配5AP型号独立办公室、小型会议室选用WALL AP110完全匹配5员工寝室选用智分&#xff0c;其他用放装完全匹配5其它区域选用放装AP…

睿考网:二建可以跨省考试吗?

二级建造师资格考试允许考生进行跨省报名&#xff0c;但是考试通过后的注册环节&#xff0c;必须在考试所在的省份完成。建议在初始注册过程中选择与报名信息相符的单位&#xff0c;以确保符合当地的职业要求规定。 关于二建的考试地点&#xff0c;考生可以选择在工作单位所在…