嘉盛集团 财经资讯 Azure OpenAI 入门教程 – LangChain 篇 :实战 – 构建企业内部知识库问答机器人 – 向量搜索

Azure OpenAI 入门教程 – LangChain 篇 :实战 – 构建企业内部知识库问答机器人 – 向量搜索

终于到了构建本地知识库的环节了。 我们之所以要学 LangChain 就是为了这一天。 在前面的《构建企业内部…

终于到了构建本地知识库的环节了。

我们之所以要学 LangChain 就是为了这一天。

在前面的《构建企业内部问答机器人的解决思路》中,我们提到了构建企业内部知识库问答机器人的思路就是获取文档信息,拆分后通过进行向量化存储。再配合向量搜索实现内部问答机器人。

为什么向量搜索可以实现内部问答机器人

要想实现内部问答机器人,关键就在于如何让 LLM 可以和你的大量文档进行交互。

这里第一个关键问题就在于 LLM受限于 Token 每次只能传递几千个文字,这时如果有大量文档,要如何让 LLM 可以回答这些文档的里面内容。

这里面的关键就在于 Embeding 和 向量。

之前我们讲过 Embedding ,这里再复习下。

Embedding 可以将一段文字转化为一组数字,这组数字表示的就是该段落的语义。

如果一段内容从语义来讲说的是类似的事情,那么他们被 Embedding 转化后的数字也会非常接近。

比如下图中第一句和第二句说的都是跟宠物相关的事情,他俩被 Embedding转换后的数字就会非常相似。

而这一组数字被称为 Vector 向量。

利用上述的功能,我们可以找出哪些文本从语义上是彼此相近的,这时候你就可以只把相似的文本片段传递给语言模型让其回答当前问题,而不是把所有文档都给它。

而这整个过程 LangChain 都提供了便捷的解决方案。

我们今天就来一探究竟。

在 LangChain 中实现

第一步还是初始化 AzureOpenAI

获取文档信息

接下来是关键,这里我们要开始加载本地文档库了。

之前提到 LangChain 中提供了大量现成的文档加载器,其中的 document_loaders 提供了市面上常见文件类型的加载方式。我这里用到的是其中的 DirectoryLoader 来加载指定目录中的所有文件。

这里使用到了 glob 参数来控制只加载 .txt 文件。

将文档拆分成多个块

加载完成文件后,我们就有了 documents 对象,这个对象目前存储的就是所有文件。

接下来需要借助上一期提到的文本拆分器,将documents 拆分,拆分的目的在于Azure OpenAI 不管是GPT 模型还是 Embeddigns 模型,都有 Token 限制,无法直接将所有文本全部丢给 OpenAI 处理,必须拆分后分块丢给Azure OpenAI ,具体多少字符分成一块,就看我们的实际需求了,我这里是按照100字符拆分成1块。

向量化

拆分成块以后,文件数据就准备好了,后面就需要使用 Embeddings 模型将拆分后的块进行向量化。

这里为什么要通过向量化存储文档,而不是直接保存呢,主要是因为用户在对知识库提问时并不是通过关键词匹配的内容,而是通过语义。

这时传统的搜索就没办法解决问题了,因为过去的搜索都是通过关键词匹配,找到正确答案。而向量做的是语义层面的模糊匹配,能够帮我们找到概率上意思最接近的答案。

通过将文本向量化存储可以将文字转化为一组向量,这时候问题和知识库文档中的语义越接近,向量就会越相似。那么用户提问的时候,就可以在背后通过向量搜素的方式匹配到语音最相似的几个文本块。从而将这些文本块丢给AzureOpenAI 进行处理。

我这里用的是 Azure OpenAI Embedings 进行文本的向量化,所以需要指定部署名。

上面只是初始化模型,下面才是真正的使用。

向量数据库

这时我们会涉及到另外一个概念,Vector Database 向量数据库。

大量文本被转化为的向量需要有个地方进行存储,向量数据库就是专门用来存储向量的数据库。当我们将大量文档拆分为小块,再将每个文本块进行向量化后,就需要将对应的向量存储在向量数据库。

向量数据库在市面上有很多个产品,这里我们是加载了 Chroma ,这是一个本地的向量数据库,用来存储向量化后的结果。加载后,使用 Chroma.from_documents 将要进行向量化的文本,以及要使用的Embedding模型传递进来。

问答

现在一切准备工作都已经就绪,文件已经向量化存储到 Chroma 中,接下来就是去问答了。

问答的过程是需要将用户输入的问题先通过Embedding 转化为向量,通过向量搜索从向量数据库中匹配到相似的文档块,再拿到对应文档中的信息丢给Azure OpenAI 进行处理。

可以发现过程还是比较复杂的,但 LangChain 提供了一个 Chain 叫做 VectorDBQA,可以帮助我们轻松实现这个问答过程。

VectorDBQA是一个专门用于对向量数据库进行提问的链条,需要我们指定大语言模型,设置 chain type ,这个 chain

type 前面讲过很多次了是用来定义文字如何丢给Azure OpenAI 的方法,vectorstore 是用来指定向量存储,最后的 return soruce documents 表示要返回来源文档。

最后就是提问,调用qa 进行提问,提问时的结果就是来源于我们的本地文档

总结

至此,一个简单的企业内部知识库问答机器人就完成了,其中涉及到的文档拆分器,向量化等功能都属于LangChain的 Indexes 模块,当然你肯定还会有很多问题,我们下一期会进一步优化这个系统。

END

本文来自网络,不代表嘉盛集团立场,转载请注明出处:http://www.tuban.cc/1821/.html

作者: admin

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部