[DataWhale大模型应用开辟]学习笔记1-尝试搭建向量数据库 ...

瑞星  金牌会员 | 2024-7-23 11:52:43 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 971|帖子 971|积分 2913

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调用后,再继承更新该笔记。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表