前言
最近有些实践,因为后面要去研究fine-tune了,想着记录一下chatgpt+向量数据库构建知识库的一些实操经验,不记我很快就忘了,哈哈。
首先,提一下为啥会出现向量数据库这个技术方案?
大家经过实践发现,如果通过简单的prompt与ChatGPT聊一下专业领域或实时性比较强的内容时,效果是很差的,比如公司有广告投放的业务,我们就需要一批同学去研究不同平台的广告投放文档,这些API文档实时性比较强,你让ChatGPT直接去生成代码,效果就很差。
为了让效果好一点,我们可以将页面的所有内容都复制出来,放到prompt中,类似于:
context:
{document content}
please base the context generate xxxx code use python.
我们将最新的内容放到prompt中,ChatGPT就会基于最新的内容去生成代码了,类似的方式,我们可以将公司内部的文档放到prompt中,让ChatGPT基于文档内容回答。
但,ChatGPT有Tokens数量限制,我常用的GPT-3.5-16k,就是有16k的tokens限制,即单次request+response的tokens数不能超过16k,超过则会报错,所以如果文档内容稍微多一点,就无法全丢到prompt中。
目前的折中的解决方案就是使用向量数据库,其原理就是对文本进行embed后,再进行相似度运算。
关于embeddings原理,网上内容很多,我就不费篇章了,推荐一篇比较系统讲embed的文章:https://www.featureform.com/post/the-definitive-guide-to-embeddings
向量数据库基本使用
比较火的例子就是让ChatGPT基于你的PDF文件来聊天,这里的PDF文件可以有多个,比如100个PDF,那变通一下,就可以基于这套来构建公司的知识库。
我找了一张图,来自视频:https://www.youtube.com/watch?v=TLf90ipMzfE

我简单描述一下:
首先要做预处理:
1.你需要将所有的PDF中的内容都抽成纯文档,如果PDF中是不可编辑的图片,你就需要使用OCR来获得内容。
2.获得纯文本后,你需要对文本进行切块,太多内容放在一起生成一个embed vector(嵌入向量)效果是不好的。
3.存入向量数据库
当用户提问时,定义问题为A,首先会将问题A通过同样的embed model转成embed vector,然后再计算问题A的embed vector与之前所有PDF生成的一系列embed vector的相似度(你可以用余弦来算,也可以用其他计算向量距离的算法来算)。
计算后,会获得当前PDF中与问题A最相近的内容(向量在空间上距离最近的),然后将这部分PDF内容和问题A一同输入给ChatGPT,其实就是为ChatGPT提供了上下文,让ChatGPT基于上下文回答。
一些细节:
Q:为何太多内容一起生成一个embed vector效果不好?
A:理论上是,内容多时,一般意思就多(信息多),此时对embed vector做相似计算时,获得一堆意思很多的内容给ChatGPT,生成的效果