1.词向量
1.定义
词向量(Word Vector)是将单词表示为向量形式的技术,是自然语言处理(NLP)中的一种常用方法。通过将单词转化为向量,计算机能够更好地理解和处理语言。简单来说,词向量就是将单词表示为一组数字,通常是高维空间中的点,每个单词都有一个独特的向量表示。
2.目的
为什么需要将单词转化为词向量呢,因为他能够捕捉单词之间的语义相似性。如果数据库中存放的是文字,那么我们可能需要去一个个比对,比对关键字相同的数量或两个单词是否完全一致。但是如果使用向量的方式进行表达,可以通过计算来获取数据在语义层面上的相似度,且计算效率更高。
2.向量数据库
1.定义及特点
检索和管理高维向量数据的数据库。随着机器学习、自然语言处理(NLP)和计算机视觉等领域的发展,向量数据库在处理复杂数据类型(如图像、文本和音频)的相似性搜索和推荐系统中变得越来越重要。
向量数据库能够有效存储高维向量数据,且支持快速地相似性搜索,可以在大量向量中找到与查询向量最相似的向量。最重要的一点就是向量数据库使用特定的索引结构,加快检索效率。
2.常见的向量数据库
1.Pinecone
2.Faiss
3.Chroma
3.对RAG的意义
向量数据库在RAG算法中通过高效存储和检索大规模文档的向量表示,显著提升了检索相关文档的效率和质量,支持大规模数据处理,加速生成过程,从而使生成的答案更加准确和相关,满足实时性要求高的应用需求。
3.调用Embedding API
我使用的环境是Python3.11
需要安装langchain_community库
今天我尝试了调用星火大模型的Embedding API,使用demo调用成功。
后续我尝试使用SparkLLMTextEmbeddings对后面的向量化数据库存储的数据进行向量化操作。官方文档如下图所示:
编写代码如下:
4.数据读取与处理
为了构建我的本地知识库,需要对多种类型存储的本地文档进行处理,读取本地文档并通过前文描述的 Embedding 方法将本地文档的内容转化为词向量来构建向量数据库。后续我使用的是一个随意的pdf文档进行处理。
1.读取pdf文档
我们可以使用 LangChain 的 PyMuPDFLoader 来读取知识库的 PDF 文件。PyMuPDFLoader 是 PDF 解析器中速度最快的一种,结果会包含 PDF 及其页面的详细元数据,并且每页返回一个文档。
以下是我的一个代码过程:
读取之后需要调用load()方法,是因为读取的内容还是字符串类型的,为了后续的操作,我们需要调用load方法将类型转换为document类型,才能进行后续操作。
2.数据清洗
我提供的pdf文档中,只存在着少量的空行,因此这里的处理,我模仿文档中的处理方式,将一些无关空行\n进行删除。
3.文档分割
为什么需要文档分割呢,假如我们将文档作为大模型的一个输入,并且希望大模型能利用输入作为背景知识,解决一些专业领域内的知识,但是我们都知道对于token一般都会有限制,如果发送的token超过了大模型api输入的最大token就会报错。此时我们的文档是十分庞大的,因此需要对文档进行分割,将文档按照固定的长度分为若干个chunk。
以下是文档分割的代码:
其中的参数:
chunk_size:表示分割后每一块chunk的大小。
chunk_overlap表示块与块之间的重叠大小。指的是分割后的每个chunk里包含多少上一个chunk结尾的内容,主要是为了保持每个chunk之间的上下文关联性。比如chunk_overlap设置为2,此时上一块chunk的结尾为aaaaa,那么下一块chunk的开头就是aabbbbbb。
Langchain 还提供了多种文档分割方式,区别在怎么确定块与块之间的边界、块由哪些字符/token组成、以及如何测量块大小。但是这些方法我还未来得及尝试:
RecursiveCharacterTextSplitter(): 按字符串分割文本,递归地尝试按不同的分隔符进行分割文本。
CharacterTextSplitter(): 按字符来分割文本。
MarkdownHeaderTextSplitter(): 基于指定的标题来分割markdown 文件。
TokenTextSplitter(): 按token来分割文本。
SentenceTransformersTokenTextSplitter(): 按token来分割文本
Language(): 用于 CPP、Python、Ruby、Markdown 等。
NLTKTextSplitter(): 使用 NLTK(自然语言工具包)按句子分割文本。
SpacyTextSplitter(): 使用 Spacy按句子的切割文本。
4.搭建向量数据库
对于分割后的文档,我们就可以将每一块文档转换为向量,存储到向量数据库中了。这里我尝试了Chroma数据库。一开始我还不太了解Chroma数据库,认为他是和MySQL那样的数据库类似,通过调研发现,他类似于sqlite,是一个可以存储在本地的文件。以下是我搭建Chroma向量数据库的代码,首先需要pip install chroma:
对于这一块内容,我尝试了一天,一直在报错,还未搭建起来,通过搜索与调研。我尝试更换Python环境,当我将Python环境更换到12时,又会出现数据库无法安装的报错,尝试安装后,又会提示不存在Chroma库。当我把环境换回11时,还是出现了key error报错我认为主要的问题可能出现在Embedding那一块。后序的话我打算尝试改变Embedding API调用后,再继续更新该笔记。