在当今信息激增的时代,将中文存储到向量数据库(如Redis等)并实现向量检索,正成为解决日常应用中文信息处理难题的关键利器。这项技术不仅赋予计算机对中文语义的理解能力,更让我们能够以更智能、高效的方式处理和检索中文文本。在接下来的内容中,我们将揭晓这项技术的神秘面纱,探究中文向量化及检索的魅力所在。跟随我们一同踏上这场数字化探险,发现中文在向量空间中的无限可能。
文档拆分
因为中文是及其复杂的,并且语义内容十分丰富,所以需要进行词汇拆分,最常用的就是 RecursiveCharacterTextSplitter 分词器,这里重点关注按照字符递归拆分方式 RecursiveCharacterTextSplitter ,这种方式会将语义最相关的文本片段放在一起。
以下是 RecursiveCharacterTextSplitter
的基本原理:
- 递归划分: 文本被递归地分割成字符片段,直到每个片段都包含一个字符。这确保了对文本的细粒度划分。
- 字符边界识别: 在每个递归步骤中,工具识别字符边界,确保在拆分过程中不会损失字符的完整性。
- 生成字符片段: 通过递归过程生成的字符片段形成最终的拆分结果。每个片段都包含一个或多个字符,保留了文本的原始结构。
RecursiveCharacterTextSplitter
的优势在于对文本进行细粒度的拆分,确保即使在字符级别,也能保留文本的完整性。这对于某些文本处理任务,如字符级别的文本分析或特定领域的信息提取,可能会有很大的帮助。
文本嵌入
嵌入包含两个方法,一个用于嵌入文档,接受多个文本作为输入;一个用于嵌入查询,接受单个文本。文档中示例使用了OpenAI的嵌入模型text-embedding-ada-002,但提供了很多第三方嵌入模型集成可以按需查看。
需要根据文本内容进行相似匹配查找。它利用了语言嵌入技术来实现。首先定义好嵌入模型,这里使用OpenAI提供的文本嵌入模型。然后有两种方法可以获取文本向量:传入多篇文本,同时获取所有文本的嵌入向量表示。仅传入单篇文本,获取其嵌入向量。嵌入向量可以用于计算文本间的相似程度,从而实现内容查找。
向量存储
这个就是对常用矢量数据库(FAISS,Milvus,Pinecone,PGVector等)封装接口的说明,详细的可以前往嵌入专题查看。大概流程都一样:初始化数据库连接信息——>建立索引——>存储矢量——>相似性查询,下面以 Pinecone为例:
文本搜索系统需要对大量文档进行索引,以实现相关性搜索。它首先使用文本加载器读取文本内容,然后用分词器将长文本分割成短语。接着调用嵌入模型为每段文本生成向量表示。系统利用Pinecone这类向量数据库创建索引,并存入所有文本向量。后续只需传入查询词语,调用相似性搜索接口,就可以快速找到与查询最相关的文本片段。
向量是一个有方向和长度的量,可以用数学中的坐标来表示。例如,可以用二维坐标系中的向量表示一个平面上的点,也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中,向量通常用于表示数据的特征。
而文本嵌入是一种将文本这种离散数据映射到连续向量空间的方法,嵌入技术可以将高维的离散数据降维到低维的连续空间中,并保留数据之间的语义关系,从而方便进行机器学习和深度学习的任务。
例如:
"机器学习"表示为 [1,2,3]
"深度学习"表示为[2,3,3]
"英雄联盟"表示为[9,1,3]
使用余弦相似度(余弦相似度是一种用于衡量向量之间相似度的指标,可以用于文本嵌入之间的相似度)在计算机中来判断文本之间的距离:“机器学习”与“深度学习”的距离:
“机器学习”与“英雄联盟“的距离”:
“机器学习”与“深度学习”两个文本之间的余弦相似度更高,表示它们在语义上更相似。
以下是 RecursiveCharacterTextSplitter
的基本原理:
- 递归划分: 文本被递归地分割成字符片段,直到每个片段都包含一个字符。这确保了对文本的细粒度划分。
- 字符边界识别: 在每个递归步骤中,工具识别字符边界,确保在拆分过程中不会损失字符的完整性。
- 生成字符片段: 通过递归过程生成的字符片段形成最终的拆分结果。每个片段都包含一个或多个字符,保留了文本的原始结构。
RecursiveCharacterTextSplitter
的优势在于对文本进行细粒度的拆分,确保即使在字符级别,也能保留文本的完整性。这对于某些文本处理任务,如字符级别的文本分析或特定领域的信息提取,可能会有很大的帮助。
文本嵌入算法
文本嵌入算法是指将文本数据转化为向量表示的具体算法,通常包括以下几个步骤:
- 分词:将文本划分成一个个单词或短语。
- 构建词汇表:将分词后的单词或短语建立词汇表,并为每个单词或短语赋予一个唯一的编号。
- 计算词嵌入:使用预训练的模型或自行训练的模型,将每个单词或短语映射到向量空间中。
- 计算文本嵌入:将文本中每个单词或短语的向量表示取平均或加权平均,得到整个文本的向量表示。
常见的文本嵌入算法包括 Word2Vec、GloVe、FastText 等。这些算法通过预训练或自行训练的方式,将单词或短语映射到低维向量空间中,从而能够在计算机中方便地处理文本数据。
数据查询
这节重点关注数据压缩,目的是获得相关性最高的文本带入prompt上下文,这样既可以减少token消耗,也可以保证LLM的输出质量。
问答系统需要从大量文本快速检索与用户问题相关的内容。它先采用向量检索技术获取初步文档,然后利用LLM迭代提取相关段落进行数据压缩。另外,系统也可以在压缩结果上再进行向量相似度过滤,进一步优化结果。同时,为提升效率,系统还实现了基于结构化metadata和概要进行主动查询,而不是索引所有文本内容。
针对基础检索得到的文档再做一次向量相似性搜索进行过滤,也可以取得不错的效果。
最后一点就是自查询(SelfQueryRetriever)的概念,其实就是结构化查询元数据,因为对文档的元信息查询和文档内容的概要描述部分查询效率肯定是高于全部文档的。