AI--向量的存储和检索

step1 Document

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

  • 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"},),
]

step2 向量检索

向量检索是一种常见的存储和检索非结构化数据的方式,主要思路是存储文本的数据向量,给出一个查询,我们编码查询成同一个维度的数据向量,然后使用相似度去查找相关数据
LangChain VectorStore对象包含用于将文本和Document对象添加到存储区以及使用各种相似度指标查询它们的方法。它们通常使用嵌入模型进行初始化,这些模型决定了如何将文本数据转换为数字向量。

下面我是使用bce-embedding模型作为编码模型,地址下载

from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores.utils import DistanceStrategy# init embedding model
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'batch_size': 64, 'normalize_embeddings': True}embed_model = HuggingFaceEmbeddings(model_name=EMBEDDING_PATH,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs)
vetorstore = Chroma.from_documents(documents,embedding=embed_model,
)vetorstore.similarity_search("cat")

输出结果为:

[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=‘Dogs are great companions, known for their loyalty and friendliness.’, metadata={‘source’:‘mammal-pets-doc’}),
Document(page_content=‘Parrots are intelligent> birds capable of mimicking human speech.’, metadata={‘source’:‘bird-pets-doc’})]

搜索返回相似度分数

vetorstore.similarity_search_with_score("cat")

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

上面结果返回的score,越小表示越接近

基于向量查询

embedding = embed_model.embed_query("cat")
vetorstore.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=‘Goldfish are popular pets for beginners, requiring relatively simple care.’, metadata={‘source’: ‘fish-pets-doc’}),
Document(page_content=‘Dogs are great companions, known for their loyalty and friendliness.’, metadata={‘source’: ‘mammal-pets-doc’}),
Document(page_content=‘Parrots are intelligent birds capable of mimicking human speech.’, metadata={‘source’: ‘bird-pets-doc’})]

step3 检索

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

LangChain Retrievers是 Runnable,因此它们实现了一组标准方法(例如同步和异步invoke操作batch)并且旨在纳入 LCEL 链。

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

from typing import Listfrom langchain_core.documents import Document
from langchain_core.runnables import RunnableLambdaretriever = RunnableLambda(vetorstore.similarity_search).bind(k=1)print(retriever.invoke("cat"))
print(retriever.batch(["cat","dog"]))

输出结果

[Document(page_content=‘Cats are independent pets that often enjoy their own space.’, 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=‘Dogs are great companions, known for their loyalty and friendliness.’, metadata={‘source’: ‘mammal-pets-doc’})]]

Vectorstore 实现了as_retriever一个生成 Retriever 的方法,特别是VectorStoreRetriever。这些检索器包括特定的search_type属性search_kwargs,用于标识要调用的底层向量存储的哪些方法以及如何参数化它们。

retriever = vetorstore.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’})]]

检索器可以轻松地合并到更复杂的应用程序中,例如检索增强生成(RAG)应用程序,

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthroughchat = ChatOpenAI()message = """
Answer this question using the provided context only.{question}Context:
{context}
"""retriever = vetorstore.as_retriever(search_type="similarity",search_kwargs={"k": 1},
)prompt = ChatPromptTemplate.from_messages([("human",message),]
)rag_chat = {"context":retriever,"question":RunnablePassthrough()} | prompt |chatresponse = rag_chat.invoke("tell me about cats")
print(response.content)

输出结果

Cats are independent pets that often enjoy their own space.

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

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

相关文章

pl/sql基础语法操作

oracle pl/sql语言(procedural language/sql)是结合了结构化查询与oracle自身过程控制为一体的强大语言。 语法执行块 语法结构: [ declare 可选 声明变量部分--declaration statements (1);]begin --执行部分--executable statements (2)…

CentOS-9配置静态IP地址

查看配置命令nmcli CentOS 9 使用 nmcli 命令行工具进行网络配置。以下是配置静态 IP 地址的步骤和示例代码:相对以前centos7之类的,9版本的默认的网络是NetworkManager,网络配置也有较大改变 nmcli con show用vim进行编辑配文件 cd /etc/…

SSL证书有效期缩短有影响吗?

SSL证书是一种用于加密网络通信的安全协议,它可以确保用户在访问网站时,数据传输过程中不会被第三方恶意窃取或篡改。SSL证书通常都有一个有效期限,该期限可以长达几年。然而,最近一些SSL证书颁发机构开始缩短证书的有效期限&…

JavaScript基础(九)

冒泡排序 用例子比较好理解: var arry[7,2,6,3,4,1,8]; //拿出第一位数7和后面依次比较,遇到大的8就换位,8再与后面依次比较,没有能和8换位的数,再从下一位2依次与下面的数比较。 console.log(排列之前:arry); for (…

AWS迁移与传输之SCT

AWS Schema Conversion Tool(AWS SCT)是一款用于数据库迁移的工具,旨在帮助用户将现有的数据库模式(包括表、视图、存储过程等)从一个数据库引擎转换到另一个数据库引擎。 AWS提供两种模式转换解决方案,使…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

Web测试面试题(二)

一:简述HTTP协议的状态码包含哪些? 2XX,表示成功 3XX,表示重定向 4XX,表示客户端错误 5XX,表示服务器错误 二:HTTP和HTTPS的区别? 《1》安全性上的区别: HTTPS&#x…

AWS 信息资料

EKS 组件信息:Amazon EKS 附加组件 - Amazon EKS,主要用于程序管理插件。 AWS 区域和可用区信息:全球基础设施区域和可用区 如何解决创建 Amazon S3 桶时出现的错误:如何解决创建 Amazon S3 桶时出现的错误 创建 AWS EC2 实例时 userdata使…

LeetCode题解:9. 回文数,翻转一半数字,JavaScript,详细注释

原题链接 9. 回文数 解题思路 翻转数字 利用循环,每次将x右移一位将移出的数字存储到reversed的个位中每次存储前,需要将reversed左移一位 判断结果 当原x的长度为偶数,翻转后的结果相等当原x的长度为奇数,reversed一定比翻转后…

自养号测评是什么?亚马逊产品评价的全新策略

1、什么是亚马逊测评: 亚马逊测评,简而言之,是基于亚马逊购物平台的一种特定活动。他的核心在于模拟国外消费者的购物行为,并在完成购买后,对所获得的产品进行真实、中肯的评价。这种测评不仅为消费者提供了购物参考&…

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样?微软今天给出了蓝图。 今天凌晨,微软召开了Microsoft Build 2024 开发者大会,同前两天的Google I/O开发者大会一样,本次大会的核心词还是“AI”,其中最主要的内容是最新的Copilot…

成都爱尔胡建斌院长提醒近视超过600度,记得每年检查眼底!

高度近视是指近视度数在600度及以上的一种屈光不正的状态。 近视的眼睛必定是变形的。在正常情况下,人的眼球类似球体,但随着近视加深,眼轴变长,眼球体积逐渐增大,整个眼球从圆球型向椭圆球形发展,而眼球壁…

Linux:top命令的每一列的具体含义

Linux:top命令的每一列的具体含义 文章目录 Linux:top命令的每一列的具体含义图片显示top命令的概念语法显示字段的含义顶部字段第二行第三行第四行第五行每列字段的含义 图片显示 top命令的概念 top命令上一个常用的Linux命令行工具,用于实…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞,我刷题还是太少了,所以很多例子来自ctfshow,以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中,有两中判断相等的符号,和&…

位运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的,因此,需要先将要执行运算的数据转换为二进制,然后才能进行执行运算。…

确保数据可视化的准确性:后校验的重要性和方法

前言 在数据可视化项目中,选择合适的图表类型并确定数据字段是首要步骤,但这些步骤本身并不能保证最终的图表能够有效地传达正确的信息。数据的质量和特性可能会影响图表的解释性和准确性。因此,进行后校验以确保数据的适用性和一致性对于避…

[建堆堆排序的时间复杂度推导]向上建堆向下建堆堆排序的时间复杂度分析推导

💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到动画详解数据结构系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

ai电销机器人智能的原理和优势,如何帮助企业来提高销售效率的?

随着人工智能技术的发展,越来越多的企业开始选择使用ai智能外呼系统替代传统的人工拨打电话模式!通过精准语音平台群呼潜在客户群体,精准筛选出意向客户并进行分类,实现无缝对接,节省80%人力成本,电销机器人…

hypermesh二次开发tcl脚本

hypermesh二次开发tcl脚本 1、tcl读csv文件,得到list,再转成二维数组2、tcl写csv文件3、hypermesh tcl根据读入的节点坐标建节点, 再显示节点号4、hypermesh tcl根据节点号建节点set5、hypermesh tcl根据节点set读取节点号,再根据节点号读取节点坐标,再将…

为什么别人写的SCI文章,容易接收?有技巧?

这篇文章是写给想发期刊文章的,但是导师没有时间去指导的人看的,无论是SCI还是EI、核心这类的,都适用。 想发文章,首先你得有文章!以下从写论文的新手内心历程来解答。 paper怎么来呢?那肯定是找创新点,找…