BlinkDL / ChatRWKV

ChatRWKV is like ChatGPT but powered by RWKV (100% RNN) language model, and open source.
Apache License 2.0
9.43k stars 699 forks source link

斗胆和大佬们讨论一个知识库相关的技术方案是否可行 #133

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下将大幅度提高工作能力和准确性。 当然,从此思路延伸,还有其他的方案可以优化效率和准确性。不过,不在此次本文的讨论范围内。 最后,不知道是否有研究者写过此类论文,如果没有,喜欢的可以拿去随便用,我没有相关需求,也不在乎。如果用得上的话,就拿走,给我发个消息,让我也高兴高兴!!

l15y commented 1 year ago

似乎就是将embedding 由现有的text2vec改为LLM的embedding 层,外加直接io向量。 我认为现在的主要面临问题还是LLM总结能力不够

maxadc commented 1 year ago

似乎就是将embedding 由现有的text2vec改为LLM的embedding 层,外加直接io向量。 我认为现在的主要面临问题还是LLM总结能力不够

嗯,差不多就是这个意思,我不会调大语言模型。这点上我没什么发言权,要会的话我就自己实践了,有了成果总比一篇帖子更有说服力。 LLM的能力这点不用考虑,这和本文也没冲突,就算GPT4在咱们手上,理论上也可以用这个方案增强其能力。 就好像人和装备的关系,人可以换,而帖子其实讨论的是装备,或者说怎么指定人和装备的接口,人和装备怎么样配合才可以发挥更强大的实力。 如果实践成功,等有了更好LLM,直接换LLM,并从新挂载知识库训练就可以了。