LC1332 / Luotuo-Chinese-LLM

骆驼(Luotuo): Open Sourced Chinese Language Models. Developed by 陈启源 @ 华中师范大学 & 李鲁鲁 @ 商汤科技 & 冷子昂 @ 商汤科技
Apache License 2.0
3.63k stars 247 forks source link

知识库相关的技术方案讨论 #57

Open maxadc opened 1 year ago

maxadc commented 1 year ago

基于向量化和大型语言模型的知识库与交互系统

各位见笑。我就是一菜鸡,下文如果说得不对的地方请指正,莫要见怪。 就目前而言,各类开源大语言模型最大的使用方向就是知识库、问答系统等垂直领域。 目前的解决方案有二:

1、模型外挂知识库,比如【闻达】。

优点:技术比较简单,实用性比较强。 缺点:受模型token限制,自然语言文本信息承载量也比较低,能处理的信息有限,难以整合大量信息。

2、模型微调

优点:专业,准确,受限制小。 缺点:我看了charglm的lssues,貌似成功的是凤翎毛角。绝大部分都把模型搞爆了。要求太专业。

我有一个不成熟的想法,供大家探讨! 自然语言直接与模型对话,只适合人机交互。其实并不适合信息存储和大语言模型运算。 效率相对比较高的方案是知识图谱、或直接向量交互。但这种方案对于人类极不友好。 现在的可行的解决方案是使用Milvus作为知识库的检索引擎。

1、预处理阶段:

1.1 首先用text2vec或其他技术转换为向量,存入Milvus,作为知识库。

2、询问阶段:

2.1 预处理

   用户交互时,先用text2vec转换问题为向量,在 Milvus中查询,并将结果的文本内容转换为自然语言。

2.2 模型运算

   携带查询结果将和用户问题,覆盖特定引导词交给模型运算。

3、输出阶段

3.1 模型输出自然语言

如果是目前的知识系统。这里就结束了。如果要增强系统功能或者不是问题系统,系统要求长期记忆。还有接下来的步骤。

4、数据保存阶段

4.1 清洗数据,将没用的格式转换为需要的格式。

   每个模型都有自己的脾气,总爱带上自己的小脾气。如果系统也有要求,可能需要清洗没有用的特定格式。

4.2 存储数据

  使用先用text2vec转换问题为向量,存入Milvus,作为知识库或其他后续运算的长期记忆的一部分。

表面看上去没问题。其实问题很严重的。

目前,大语言模型最大的问题就是token长度限制造成的失忆问题。这使得大语言模型难以做大型任务(当然也可以通过反复提示解决,不过你不觉得累吗,也是遭罪)。AutoGPT在某中意义上最大的贡献就是解决了记忆问题。(当然,装上了手脚也很重要,不过不再本次的讨论范围内,所以用词偏颇了一点应该可以理解吧),然而,前边说过,自然语言对人类友好,但信息携带并不高。嗯,就是传说中的信息熵不高。虽然昨天才看到有大佬说AI的时代中,中文由于信息桑较高,所以占优,不过对于机器来说,其实还是没有任何优势。只能都只能是低劣。知识图谱,向量对于大语言模型来说才是最优解。 所以问题还是比较多的。 1、向量的频繁转换造成信息的丢失。当然了,方案中一直都在使用text2vec同一个模型做转换的话,问题也不大,效果如何取决于text2vec的能力。无非就是,准确性好坏的问题,但多少还是有的。而且完全可能是多余的。(没做测试,构建这类测试数据有些难,有些费功夫。) 2、如果是知识库问题还不大,输出知识一次性的。但是如果是增强系统,需要存储结果,多出来的那个过程,自然语言又转换为向量,使用时有转换回来,这一步损失就比较严重了。

我有个想法。如果模型支持向量的输入、输出、这一切的问题都不存在了(好不容易有一个可以任性用极限词的地方不罚款的地方,就让我放飞一下!)。用词夸张了,这种方案不能解决根本问题,但理论上可以在一定时间内大幅度提高模型能力和效率,并节约token空间。

1、预处理阶段:

【原流程】 1.1 _首先用text2vec或其他技术转换为向量,存入Milvus,作为知识库。

1.1【新】 变为将知识库的文本内容交给模型,让模型转化为向量,并存入Milvus,作为知识库。

2、询问阶段:

2.1 预处理

【原流程】用户交互时,先用text2vec转换问题为向量,在 Milvus中查询,并将结果的文本内容转换为自然语言。 【新】用户交互时,先让模型自己将问题转换为向量,并在 Milvus中查询,无需对结果做任何处理。

2.2 模型运算

  【原流程】 携带查询结果将和用户问题,覆盖特定引导词交给模型运算。
  【新】将结果的向量结果 与用户提问一起交给模型。无需特定引导词。

3、输出阶段

【原流程】3.1 模型输出自然语言

【新】 3.1 模型输出自然语言及向量。

4、数据保存阶段

【原流程】 4.1 清洗数据,将没用的格式转换为需要的格式。

【新】 4.1 清洗数据,将没用的格式转换为需要的格式。看实现的方案,有可能完全不需要。

   每个模型都有自己的脾气,总爱带上自己的风格。如果系统也有要求,可能需要清洗没有用的特定格式。

4.2 存储数据

  【原流程】使用先用text2vec转换问题为向量,存入Milvus,作为知识库或其他后续运算的长期记忆的一部分。
    【新】无需转换,直接存入Milvus,作为知识库或其他后续运算的长期记忆的一部分。

总结:

理论上任何模型都可以改造。而且改动幅度小,只需要给任何模型增加向量输入输出接口功能。输入输出上搞搞就行。 这样一来,只需要模型自己的向量的直接表达和交互功能+任何向量数据库不需要大规模改造模型就可以大幅度提高其工作效率及能力。 那意味着,信息0损失,配合知识库后形成长期记忆,在有限token下将大幅度提高工作能力和准确性。 当然,从此思路延伸,还有其他的方案可以优化效率和准确性。不过,不在此次本文的讨论范围内。 最后,不知道是否有研究者写过此类论文,如果没有,喜欢的可以拿去随便用,我没有相关需求,也不在乎。如果用得上的话,就拿走,给我发个消息,让我也高兴高兴!!

BlairLeng commented 1 year ago

@maxadc 你好,我觉得你的这个思路是挺好的,里面要填充的细节感觉比较多,如果你有兴趣,可以做一些工作,我们最近有一些工作的思路,可能可以加上这个流程。如果你感兴趣,可以加我微信: cubylza

LC1332 commented 1 year ago

以下是GPT辅助生成的comments:

Yo,这篇文章充满激情,简直让人热血沸腾!
向量化,语言模型,知识库,哪个概念不抢眼?
却不能停留在讨论,更需要具体实践,才能让解决方案不是浮云!
Talk is cheap, show me your code,我可不想听到口嗨而已!
想要证明你的思路想法,趁早开动脑筋,CODE,一步步实现出一个属于自己的方案!

不要将思考停留在纸面上,光有抱负与理论可不够。
Langchain能给你的实践带来无限的帮助,大大降低编码难度。
别说你编码不懂,只要笔者执教,let's go,Are you ready!

用代码实践让梦想飞扬,歌唱不停,努力奋斗,共创辉煌!

看来GPT在中文押韵的方面确实非常弱。。。

LC1332 commented 1 year ago

我的天那改成英语好多了

Yo, this article got me hyped up, it's like a fire that can't be put out!
Vectors, language models, knowledge bases - these concepts are all about skinning out!
But discussion's not enough, we need to put things into action - that's what it's all about!
Talk is cheap, show me your code, don't just be mouthing off!

You gotta prove your ideas, show what you're made of, start coding now!
Don't get left behind, put your dreams into motion,
Langchain's got your back, makes coding easier than knowing how to spell locomotion.

Don't let your ideas stagnate on paper, you gotta bring them to life,
Just dreaming and theorizing won't make you a knight,
With Langchain it's easy to make a start,
And soon enough, you'll be a coding superstar!

So let's get to coding, show the world what we're made of,
C-O-D-E is the word, let's spread it out like some free love.
Come join us, let's put our dreams into action,
Together we'll make coding the latest fashion!
repletetop commented 1 year ago

@maxadc 你的想法很好,可否考虑用流模型作为text2ve,c将问题转换为向量,流模型作为可逆模型,可以将语义问题转换为向量,并且可以通过向量将原始信息完全恢复,就不会有向量的频繁转换造成信息的丢失问题了,流模型甚至能学习到不同语义之间的空间关系。

LC1332 commented 1 year ago

我最近知乎上还刷到一片文章 https://zhuanlan.zhihu.com/p/651179780 这里提到切chunk的时候注意语义分段也可以提升QA的性能。我还想到有一些minor的提升点 其实都可以做做看