【人工智能】文本嵌入:向量存储与数据查询的智慧交织(12)

在当今信息激增的时代,将中文存储到向量数据库(如Redis等)并实现向量检索,正成为解决日常应用中文信息处理难题的关键利器。这项技术不仅赋予计算机对中文语义的理解能力,更让我们能够以更智能、高效的方式处理和检索中文文本。在接下来的内容中,我们将揭晓这项技术的神秘面纱,探究中文向量化及检索的魅力所在。跟随我们一同踏上这场数字化探险,发现中文在向量空间中的无限可能。

文档拆分

因为中文是及其复杂的,并且语义内容十分丰富,所以需要进行词汇拆分,最常用的就是 RecursiveCharacterTextSplitter 分词器,这里重点关注按照字符递归拆分方式 RecursiveCharacterTextSplitter ,这种方式会将语义最相关的文本片段放在一起。

以下是 RecursiveCharacterTextSplitter 的基本原理:

  1. 递归划分: 文本被递归地分割成字符片段,直到每个片段都包含一个字符。这确保了对文本的细粒度划分。
  2. 字符边界识别: 在每个递归步骤中,工具识别字符边界,确保在拆分过程中不会损失字符的完整性。
  3. 生成字符片段: 通过递归过程生成的字符片段形成最终的拆分结果。每个片段都包含一个或多个字符,保留了文本的原始结构。

RecursiveCharacterTextSplitter 的优势在于对文本进行细粒度的拆分,确保即使在字符级别,也能保留文本的完整性。这对于某些文本处理任务,如字符级别的文本分析或特定领域的信息提取,可能会有很大的帮助。

文本嵌入

嵌入包含两个方法,一个用于嵌入文档,接受多个文本作为输入;一个用于嵌入查询,接受单个文本。文档中示例使用了OpenAI的嵌入模型text-embedding-ada-002,但提供了很多第三方嵌入模型集成可以按需查看。

需要根据文本内容进行相似匹配查找。它利用了语言嵌入技术来实现。首先定义好嵌入模型,这里使用OpenAI提供的文本嵌入模型。然后有两种方法可以获取文本向量:传入多篇文本,同时获取所有文本的嵌入向量表示。仅传入单篇文本,获取其嵌入向量。嵌入向量可以用于计算文本间的相似程度,从而实现内容查找。

向量存储

这个就是对常用矢量数据库(FAISS,Milvus,Pinecone,PGVector等)封装接口的说明,详细的可以前往嵌入专题查看。大概流程都一样:初始化数据库连接信息——>建立索引——>存储矢量——>相似性查询,下面以 Pinecone为例:

文本搜索系统需要对大量文档进行索引,以实现相关性搜索。它首先使用文本加载器读取文本内容,然后用分词器将长文本分割成短语。接着调用嵌入模型为每段文本生成向量表示。系统利用Pinecone这类向量数据库创建索引,并存入所有文本向量。后续只需传入查询词语,调用相似性搜索接口,就可以快速找到与查询最相关的文本片段。

向量是一个有方向和长度的量,可以用数学中的坐标来表示。例如,可以用二维坐标系中的向量表示一个平面上的点,也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中,向量通常用于表示数据的特征。

而文本嵌入是一种将文本这种离散数据映射到连续向量空间的方法,嵌入技术可以将高维的离散数据降维到低维的连续空间中,并保留数据之间的语义关系,从而方便进行机器学习和深度学习的任务。

例如:

"机器学习"表示为 [1,2,3]
"深度学习"表示为[2,3,3]
"英雄联盟"表示为[9,1,3]
使用余弦相似度(余弦相似度是一种用于衡量向量之间相似度的指标,可以用于文本嵌入之间的相似度)在计算机中来判断文本之间的距离:

“机器学习”与“深度学习”的距离:

img

“机器学习”与“英雄联盟“的距离”:

img

“机器学习”与“深度学习”两个文本之间的余弦相似度更高,表示它们在语义上更相似。

以下是 RecursiveCharacterTextSplitter 的基本原理:

  1. 递归划分: 文本被递归地分割成字符片段,直到每个片段都包含一个字符。这确保了对文本的细粒度划分。
  2. 字符边界识别: 在每个递归步骤中,工具识别字符边界,确保在拆分过程中不会损失字符的完整性。
  3. 生成字符片段: 通过递归过程生成的字符片段形成最终的拆分结果。每个片段都包含一个或多个字符,保留了文本的原始结构。

RecursiveCharacterTextSplitter 的优势在于对文本进行细粒度的拆分,确保即使在字符级别,也能保留文本的完整性。这对于某些文本处理任务,如字符级别的文本分析或特定领域的信息提取,可能会有很大的帮助。

文本嵌入算法

文本嵌入算法是指将文本数据转化为向量表示的具体算法,通常包括以下几个步骤:

  • 分词:将文本划分成一个个单词或短语。
  • 构建词汇表:将分词后的单词或短语建立词汇表,并为每个单词或短语赋予一个唯一的编号。
  • 计算词嵌入:使用预训练的模型或自行训练的模型,将每个单词或短语映射到向量空间中。
  • 计算文本嵌入:将文本中每个单词或短语的向量表示取平均或加权平均,得到整个文本的向量表示。

常见的文本嵌入算法包括 Word2Vec、GloVe、FastText 等。这些算法通过预训练或自行训练的方式,将单词或短语映射到低维向量空间中,从而能够在计算机中方便地处理文本数据。

数据查询

这节重点关注数据压缩,目的是获得相关性最高的文本带入prompt上下文,这样既可以减少token消耗,也可以保证LLM的输出质量。

问答系统需要从大量文本快速检索与用户问题相关的内容。它先采用向量检索技术获取初步文档,然后利用LLM迭代提取相关段落进行数据压缩。另外,系统也可以在压缩结果上再进行向量相似度过滤,进一步优化结果。同时,为提升效率,系统还实现了基于结构化metadata和概要进行主动查询,而不是索引所有文本内容。

针对基础检索得到的文档再做一次向量相似性搜索进行过滤,也可以取得不错的效果。

最后一点就是自查询(SelfQueryRetriever)的概念,其实就是结构化查询元数据,因为对文档的元信息查询和文档内容的概要描述部分查询效率肯定是高于全部文档的。

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

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

相关文章

BUUCTF-Real-[ThinkPHP]IN SQL INJECTION

目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间&#xff1a; 2018-09-04 CVE 参考&#xff1a;CVE-2018-16385 最高严重级别&#xff1a;低风险 受影响的系统&#xff1a;ThinkPHP < 5.1.23 漏洞描述&#xff1a; ThinkPHP是一款快速、兼容、简单的轻量级国产P…

【Flink入门修炼】1-1 为什么要学习 Flink?

流处理和批处理是什么&#xff1f; 什么是 Flink&#xff1f; 为什么要学习 Flink&#xff1f; Flink 有什么特点&#xff0c;能做什么&#xff1f; 本文将为你解答以上问题。 一、批处理和流处理 早些年&#xff0c;大数据处理还主要为批处理&#xff0c;一般按天或小时定时处…

鸿蒙ArkUI实现开关switch组件

鸿蒙ArkUI官方提供的toggle组件实现了开关的样式&#xff0c;但在使用过程中还是非常的不方便。 DIY可视化对鸿蒙ArkUI实现开关switch组件扩展后满足基本的switch需求&#xff0c;支持绑定值、设置标题文本、整个背景样式等。 /*** 开关*/ Component export default struct Di…

【发票识别】新增针对图片发票的识别(升级中)

说明 为了完善发票识别的功能&#xff0c;目前发票识别支持发票图片格式的识别&#xff0c;增加可用性。 体验 体验地址&#xff1a;https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票&#xff0c;可以下载上传识别或者复制url地址进行识别。 技术栈…

Java 获取操作时区 ZonedDateTime

Java 获取操作时区 ZonedDateTime package com.zhong.timeaddress;import java.time.Clock; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Set;public class TimeAddress {public static void main(String[] args) {// 获取系统默认时区ZoneId…

下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置

自己编译 OpenCV 挺麻烦的&#xff0c;配置需要耗费很长时间&#xff0c;编译也需要很长时间&#xff0c;而且无法保证能全部编译通过。利用 OpenCV 官网提供的已编译的 OpenCV 库可以节省很多时间。下面介绍安装配置方法。 1. OpenCV 官网 地址是&#xff1a;https://opencv…

7.0 Zookeeper 客户端基础命令使用

zookeeper 命令用于在 zookeeper 服务上执行操作。 首先执行命令&#xff0c;打开新的 session 会话&#xff0c;进入终端。 $ sh zkCli.sh 下面开始讲解基本常用命令使用&#xff0c;其中 acl 权限内容在后面章节详细阐述。 ls 命令 ls 命令用于查看某个路径下目录列表。…

MySQL 架构和性能优化

重点&#xff1a; 视图&#xff0c;函数&#xff0c;存储过程&#xff0c;触发器&#xff0c;事件&#xff08; 了解 &#xff09; 用户管理&#xff0c;密码管理 grant revoke 权限管理 MySQL 架构&#xff08; 了解 &#xff09; 存储引擎&#xff1a;MyISAM 和 InnoDB …

PyTorch识别验证码

## 一、生成测试集数据pip install captcha common.py import random import time captcha_array list("0123456789abcdefghijklmnopqrstuvwxyz") captcha_size 4from captcha.image import ImageCaptchaif __name__ __main__:for i in range(10):image ImageC…

为后端做准备

这里写目录标题 flask 文件上传与接收flask应答&#xff08;接收请求&#xff08;文件、数据&#xff09;flask请求&#xff08;上传文件&#xff09;传递参数和文件 argparse 不从命令行调用参数1、设置default值2、"从命令行传入的参数".split()3、[--input,内容] …

肿瘤免疫分型

Elements of cancer immunity and the cancer-immune set point - PubMed (nih.gov) Daniel S Chen , Ira Mellman 人类的抗癌免疫可分为三种主要表型&#xff1a;免疫沙漠表型&#xff08;棕色&#xff09;、免疫排除表型&#xff08;蓝色&#xff09;和免疫炎症型&#xff0…

深刻理解树状数组--树状数组构造定义与动态维护区间和的合理性证明

文章目录 一.树状数组概览二.树状数组构造定义lowbit运算树状数组的结点值的定义树状数组结点层次的定义树状数组父子结点关系定义 三.关于树状数组结构的重要证明引理1引理2树状数组模板题 一.树状数组概览 树状数组的下标从1开始标识,其物理结构是线性表,逻辑结构是一颗多叉…

c++入门学习④——对象的初始化和清理

目录 对象的初始化和清理&#xff1a; why? 如何进行初始化和清理呢&#xff1f; 使用构造函数和析构函数​编辑 构造函数语法: 析构函数语法: 构造函数的分类&#xff1a; 两种分类方式&#xff1a; 三种调用方法&#xff1a; 括号法&#xff08;默认构造函数调用&…

Meta开源大模型LLaMA2的部署使用

LLaMA2的部署使用 LLaMA2申请下载下载模型启动运行Llama2模型文本补全任务实现聊天任务LLaMA2编程Web UI操作 LLaMA2 申请下载 访问meta ai申请模型下载&#xff0c;注意有地区限制&#xff0c;建议选其他国家 申请后会收到邮件&#xff0c;内含一个下载URL地址&#xff0c;…

Redis -- set集合

挑战自己&#xff0c;每天进步一点点&#xff0c;成就将属于不停止脚步的你。 目录 Redis集合&#xff1f; 集合基本命令 sadd smembers sismember scard spop srandmember smove srem 集合间操作 sinter sinterstore sunion sdiff sdiifstore Redis集合&#…

Webpack源码浅析

webpack启动方式 webpack有两种启动方式&#xff1a; 通过webpack-cli脚手架来启动&#xff0c;即可以在Terminal终端直接运行&#xff1b; webpack ./debug/index.js --config ./debug/webpack.config.js通过require(webpack)引入包的方式执行&#xff1b;其实第一种方式最终…

vue3前端开发,element-plus前端框架探秘:scope对象

vue3前端开发&#xff0c;element-plus前端框架探秘:scope对象&#xff01;我们经常需要对当前行的数据进行操作&#xff0c;比如增加&#xff0c;删除&#xff0c;编辑等&#xff0c;为此我们需要传递当前行所对应的唯一主键,通常情况下&#xff0c;当前行对应的业务主键是id属…

CTFshow web(php特性 105-108)

web105 <?php /* # -*- coding: utf-8 -*- # Author: Firebasky # Date: 2020-09-16 11:25:09 # Last Modified by: h1xa # Last Modified time: 2020-09-28 22:34:07 */ highlight_file(__FILE__); include(flag.php); error_reporting(0); $error你还想要flag嘛&…

WPF控件-ItemsControl

介绍 ItemsControl是用于展示一组项的控件。我们常见的列表&#xff08;ListBox&#xff09;、数据表格&#xff08;DataGrid&#xff09;等都是继承自ItemsControl。可用于自定义样式展示各种批量的数据集合。 常见使用示例&#xff1a; <ItemsControl ItemsSource"…

Docker进阶篇-Docker网络

一、描述 1、docker不启动&#xff0c;默认网络情况 查看网卡情况使用&#xff0c;ifconfig或者ip addr ens33&#xff1a;本机网卡 lo&#xff1a;本机回环网络网卡 virbr0:在CentoS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现 …