这里只能给出思路,代码无法给出

RAG模式本质上就是在提问的时候,根据问题从自己的个人知识库找到对应的相关文档,然后把问题和这些相关文档返回给大模型,让大模型拥有我们个人的一些知识,回答的更加准确,

举个例子,我问大模型我家今天中午吃什么,大模型肯定是不知道的,因此我要附带一些参考信息,我妈妈今天中午煮了香喷喷的米饭,大模型会根据参考信息更好的回答你的结果。那么就可以继续扩展了,如果你希望大模型引用到你们公司的专业业务上,你就需要把你的知识库都导入到向量库里面

RAG主要是分成两个接口,一个是向量化接口,一个是问答接口

向量化接口主要流程就是:接收文件->使用java的POI库去处理文件提取文本内容->文本切块->调用向量化的接口(百度千帆、通义都有这个接口)进行向量化->把向量化的数组、向量化的文本、文档名都存入ES库中作为一条文档

问答接口主要流程是:传入问题和对应要查的ES库->问题进行向量化->使用ES的cos余弦函数算法实现查找相关性文档->这里的文档要做限制(因为大模型支持传入的token是有限的,token就是传入的内容单位)->问题和召回内容都传入prompt中组合成传给大模型的信息

这里之所以要向量化是因为向量化有一个NLP语义识别的作用,比如你搜供方,你ES里存着3条文档,供方,承包商,提供者,这三者在向量召回的时候,和问题的相关性都十分接近。

RAG模式的实现本身并不难,难的是知识库的建立,文本切块如何切块

如果你文本切块处理的不好,那么就会导致存入ES中的文档可能那句话说一半就断开存入了,可想而知,当这句说一半的话传给大模型时,你得到的回复也不会想你预期的一般

下图就是RAG模式的一个大致流程,我个人觉得预训练和RAG模式一起使用可能会导致一些问题,比如我预训练的数据中把LLM训练成一个厨师,然后我提问的时候,召回的信息都是法律信息,那么大模型肯定会乱掉,传回的信息肯定质量也出问题

然后下图是RAG模式目前存在的一些缺点和解决方法

我觉得总结的很好,也是目前RAG模式存在的困境,如果知识库要存入的量很大,不可避免的存在文本的切块导致有用文档没有被返回,后面我了解到GraphRAG能够很大程度解决有用文本被切块导致没有返回的问题,但是由于目前GraphRAG都只要python语言去实现,因为要用到知识图谱、聚类分析等算法,pyhton这些语言在数据处理这块领域还是比较好实现的,如果使用java实现的话,也可以,按照原理去引入第三方库,还是可以实现的,只是考虑到开发难度和成本问题,我司就没有准备继续向下实现GraphRAG,想玩一下的话,可以去调用OpenAI提供的接口,直接可以尝试使用,不过价格很贵

最佳实践|本地跑GraphRAG_python graphrag-CSDN博客

有具体想了解的也可以私聊我,代码是公司知识产权一部分,不便公开

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐