langchain 文本向量化存储,并检索相似 topK

目录

chroma 检索

faiss 检索

检索器

相似性

最大相关性mmr

相似数阈值


txt 有多行,我的这份数据有 67 行,样例如下:

字段1\t值1\n

字段2\t值2\n

...

chroma 检索

pip install langchain-chroma

在本地下载了 embedding 模型,使用去向量化,并检索 top3

指定向量化后的数据库保存到哪里 persist_directory

from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.vectorstores import Chromafilepath = 'data/专业描述.txt'
raw_documents = TextLoader(filepath, encoding='utf8').load()# 按行分割块
text_splitter = CharacterTextSplitter(chunk_size=100,chunk_overlap=20,separator="\n",length_function=len,is_separator_regex=True,
)
documents = text_splitter.split_documents(raw_documents)
# 加载本地 embedding 模型
embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
# 创建向量数据库
db = Chroma.from_documents(documents, embedding, persist_directory=r"./chroma/")
db.persist()  # 确保嵌入被写入磁盘
'''
如果已经创建好了,可以直接读取
db = Chroma(persist_directory=persist_directory, embedding_function=embedding)
'''# 直接传入文本
query = "材料科学与工程是一门研究材料的组成、性质、制备、加工及应用的多学科交叉领域。它涵盖了金属、无机非金属"
docs = db.similarity_search(query, k=3)
# docs = db.similarity_search_with_score(query, k=3)  # 带分数的
print(docs[0].page_content)# 传入向量去搜索
embedding_vector = embedding.embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector, k=3)
print(docs[0].page_content)

faiss 检索

pip install faiss-cpu

感觉 faiss 向量化要快一些

from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.vectorstores import Chromafilepath = 'data/专业描述.txt'
raw_documents = TextLoader(filepath, encoding='utf8').load()# 按行分割块
text_splitter = CharacterTextSplitter(chunk_size=100,chunk_overlap=20,separator="\n",length_function=len,is_separator_regex=True,
)
documents = text_splitter.split_documents(raw_documents)
# 加载本地 embedding 模型
embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
# 创建向量数据库
db = FAISS.from_documents(documents, embedding)
# 保存
db.save_local("./faiss_index")
'''
如果已经创建好了,可以直接读取
db = FAISS.load_local("./faiss_index", embeddings)
'''# 直接传入文本
query = "材料科学与工程是一门研究材料的组成、性质、制备、加工及应用的多学科交叉领域。它涵盖了金属、无机非金属"
docs = db.similarity_search(query, k=3)
# docs = db.similarity_search_with_score(query, k=3)  # 带分数的
print(docs[0].page_content)# 传入向量去搜索
embedding_vector = embedding.embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector, k=3)
print(docs[0].page_content)

检索器

相似性

在上面默认情况下,向量存储检索器使用相似性搜索

我们在用上面的例子,使用 faiss 已经创建好了向量数据库,我们在最后面修改检索的代码

选取 top30

from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.vectorstores import Chromafilepath = 'data/专业描述.txt'
raw_documents = TextLoader(filepath, encoding='utf8').load()# 按行分割块
text_splitter = CharacterTextSplitter(chunk_size=100,chunk_overlap=20,separator="\n",length_function=len,is_separator_regex=True,
)
documents = text_splitter.split_documents(raw_documents)
# 加载本地 embedding 模型
embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
# # 创建向量数据库
# db = FAISS.from_documents(documents, embedding)
# # 保存
# db.save_local("./faiss_index")# 如果已经创建好了,可以直接读取
db = FAISS.load_local("./faiss_index", embedding, allow_dangerous_deserialization=True)# 直接传入文本
query = "材料科学与工程是一门研究材料的组成、性质、制备、加工及应用的多学科交叉领域。它涵盖了金属、无机非金属"
retriever = db.as_retriever(search_kwargs={'k': 30})  # 构建检索器
docs = retriever.get_relevant_documents(query)
print(docs)

最大相关性mmr

retriever = db.as_retriever(search_type="mmr", search_kwargs={'k': 30})  # 构建检索器

会发现我指定 top30,只返回了 20 个

fetch_k 默认是 20,数据库提取的候选文档数量,理解为 mmr 算法使用时内部操作的参数就可以了

想取出 30 那,只需要设置大于 30 即可

retriever = db.as_retriever(search_type="mmr", search_kwargs={'k': 30, 'fetch_k': 50})  # 构建检索器

相似数阈值

相似度大于 0.5 的拿出来

retriever = db.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.5})  # 构建检索器

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

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

相关文章

SpringBoot 集成H2数据库,启动执行sql, 中文乱码

目录 H2数据库介绍 SpringBoot版本:SpringBoot 2.1.12.RELEASE 快速集成H2,maven依赖 快速集成H2,数据源及关键参数配置 spring.datasource.schema参数(建表SQL脚本) spring.datasource.data参数(更新、…

深入探索Linux中的libgdbus:GDBus库的应用和实现

引言 在Linux系统中,DBus是一种高效的进程间通信(IPC)机制,广泛应用于桌面环境和系统服务之间的通信。GDBus是基于GLib库的DBus实现,作为libgdbus的一部分提供。它旨在提供一种简洁、高效的方式来实现DBus通信。通过深…

cocos2dx4.0 vs编译报错

1.版本 vs2017cocos 4.0 2.问题 不知道为什么编译运行cocos项目的时候报错了 错误信息如下: 15> 已完成执行任务“GetOutOfDateItems”的操作。 15> 由于 false 条件,已跳过任务“ParallelCustomBuild”;(‘(_ParallelCustomBuild)’…

vue3-element-admin二次开发遇到的问题总结,持续更新中

vue3-element-admin 是基于 Vue3 Vite5 TypeScript5 Element-Plus Pinia 等主流技术栈构建的免费开源的后台管理前端模板(配套后端源码)。 一、定制Element-Plus主题 1.创建 variables.scss 变量文件 /*variables.scss*/ /*覆盖element-plus变量*/…

前端面试复习大纲

在准备前端面试时,以下是一些可能会被问到的题目类型和概念,可以根据这些内容进行复习和准备: HTML/CSS基础 HTML5的新特性CSS盒模型响应式设计Flex布局和Grid布局浮动和定位CSS预处理器(如Sass、Less) JavaScript基础…

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

代码随想录算法训练营第三十六天|435. 无重叠区间、763.划分字母区间、56.合并区间

贪心 文章目录 一、无重叠区间二、划分字母区间三、合并区间总结 一、无重叠区间 求移除重叠区间&#xff0c;等于所有区间减去重叠区间&#xff0c;也就是重叠空间个数 class Solution { public:static bool cmp (vector<int>& a, vector<int>& b) {ret…

Nacos-默认token.secret.key-配置不当权限绕过漏洞复现

漏洞描述&#xff1a; Nacos 身份认证绕过漏洞(QVD-2023-6271)&#xff0c;开源服务管理平台 Nacos在默认配置下未对 token.secret.key 进行修改&#xff0c;导致远程攻击者可以绕过密钥认证进入后台&#xff0c;造成系统受控等后果。 漏洞信息 公开时间&#xff1a;2023-03…

MYSQL原理学习篇简记(五)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小周同志&#xff0c;25届双非校招生Java选手&#xff0c;很高兴认识大家 &#x1f4d5;学习出处&#xff1a;本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 &#x1f525;如果感觉博主的文章还不错的…

11 Php学习:函数

PHP 内建函数Array 函数 PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。 创建 PHP 函数 当您需要在 PHP 中封装一段可重复使用的代码块时&#xff0c;可以使用函数。下面详细解释如何创建 PHP 函数并举例说明。 创建 PHP 函数的语法 PHP 函数的基…

【数据结构】图简介

目录 1. 简介2. 存储2.1 矩阵存储2.2 邻接表3 图的遍历3.1 深度优先搜索的方法3.2 广度优先搜索的方法1. 简介 图(graph)是用于表示物体和物体之间存在某种关系的结构。数学抽象后的“物体”称为节点或顶点(Vertex,node或 point)。节点之间的相关关系称作边(edge),根据…

生成式AI对UiPath来说是机遇还是挑战?

企业争相通过技术革新来领跑市场&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;技术更是将企业的效率和成本控制推向了新的高度。但当人工智能&#xff08;AI&#xff09;的最新进展——生成式AI登上舞台时&#xff0c;它不仅带来了变革的可能&#xff0c;还提出了一…

Vue3---基础2(component)

主要讲解 component 的创建 以及vue插件的安装 Vue.js Devtools 为谷歌浏览器的Vue插件&#xff0c;可以在调试工具内查看组件的数据等 下载 有两种下载方式 1. 谷歌应用商店 打开Chrome应用商店去下载&#xff0c;这个方法需要魔法 2. 极简插件 极简插件官网_Chrome插件下载_…

[C++][算法基础]n-皇后问题(DFS)

n−皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n。 输出…

android 源码环境配置

如何配置自己的源码调试环境 1 编译源码 repo sync -j8 --fail-fast .build/envsetup.sh lunch 选73 make -j8 emulator 2 配置android studio sudo apt install openjdk-9-jre-headless //安装java https://developer.android.google.cn/studio//下载studio 解压后打开bin里…

APP开发教学:开发同城O2O外卖跑腿系统源码详解

同城O2O外卖跑腿系统&#xff0c;满足了人们对于外卖送餐和生活服务的需求。今天&#xff0c;小编将为您讲解如何开发同城O2O外卖跑腿系统源码。 1.前期准备 首先&#xff0c;我们需要明确系统的功能需求和用户需求&#xff0c;包括外卖订购、配送员接单、支付功能等。其次&am…

matlab多核程序如何共享内存和数据

在MATLAB中&#xff0c;多核程序共享内存和数据主要依赖于MATLAB的并行计算工具箱&#xff08;Parallel Computing Toolbox&#xff09;。这个工具箱提供了多种机制来在多个工作进程&#xff08;workers&#xff09;之间共享数据&#xff0c;这些工作进程可能运行在同一台机器的…

MySQL、Maria数据库用户管理(创建、修改、删除用户)常用操作

一. 前言 MySQL 在安装时&#xff0c;会默认创建一个名为 root 的用户&#xff0c;该用户拥有超级权限&#xff0c;可以控制整个 MySQL 服务器。 在对 MySQL 的日常管理和操作中&#xff0c;为了避免有人恶意使用 root 用户控制数据库&#xff0c;我们通常创建一些具有适当权…

(78)删除有序数组中的重复项(79)排序矩阵查找

文章目录 1. 每日一言2. 题目(78)删除有序数组中的重复项2.1 解题思路2.2 代码 3. 题目(79)排序矩阵查找3.1 解题思路3.1.1 暴力查找暴力查找代码 3.1.2 二分查找二分查找代码 3.1.3 贪心贪心代码 4. 结语 1. 每日一言 水晶帘动微风起&#xff0c;满架蔷薇一院香。 —高骈- 2.…

minio-docker单节点部署SDK测试文件上传下载

目录 一&#xff0c;docker部署minio单节点单磁盘 二&#xff0c;SDK测试上传下载 一&#xff0c;docker部署minio单节点单磁盘 1.拉取镜像 # 下载镜像 docker pull minio/minio 2.查看镜像 docker images 3.启动minio(新版本) 创建本机上的挂载目录&#xff0c;这个可以…