微信扫码
与创始人交个朋友
我要投稿
写在前面
在上篇文章中笔者介绍了垂类下RAG 的目标和面临的问题,并表示了知识注入这个方法在垂类中的重要性。上篇文章直达入口如下:
于是笔者后续就在知识注入这一块进行查询和尝试,现把这段时间的进展记录如下。
首先知识注入,我们在这里指的是知识定义类的学习,也有人称之为元知识学习,模型编辑等,叫法可能有差别,但这里我们暂且称之为知识注入,后续的文章将不再对此名词进行解释。
解决方案思考
笔者思考了一下,想要让模型学习到指定的知识,把方法从头到尾进行梳理的话,那么可能的方法如下:
从头训练一个大模型,并嵌入指定的垂类知识。但会面临一个问题,如果需要学习的定义类知识数量较少的情况下,毕竟这类垂类知识相对来说在垂类领域占比也是很低的。那么从头开始训,首先就面临数据不够的情况,那么这个问题就变成了小样本学习这一范畴了。反之,如果数据足够多的话,这也是一个解决方案。
接着方法一中提到的小样本学习,我们可能会想到微调,比如lora,adapter等一些办法。
前面两个办法都是从模型本身不具有该类的知识角度进行展开,那么如果垂类的深度不是触底的话,很多我们称之为垂类的数据其实都被涵盖在预训练数据集中的,那么问题就变成了如何将该类知识进行引出,或者运用在比较,过滤等一些其他环节。
笔者暂时只想到了以上三种类型的办法。读者有其他方案的话,欢迎补充。
部分方案尝试
笔者在qwen-7B上进行了lora 的微调尝试,知识定义类微调数据构建的形式为:
// #################################
// 直接定义描述
{
"question": "介绍一下关于xx的信息",
"answer": "xx是..."
}
// 测试的问题类似为:
{
"test_question": "如果遇到xx的情况,能用哪些信息用来辅助"
}
除了例子中的描述,笔者还尝试了多种数据构建的方式,比如问题是定义知识的描述、举例说明等方式,遵循的一个标准是测试问题是定义知识的泛化延伸。最终效果挺差的,远远没达到我的预期。笔者也在思考,是lora的方法本身的局限性,还是使用的方式不对,如果读者也有类似的经验,请留言告诉下笔者。
在经历了这个方法的尝试后,笔者接着就开始兜兜转转地找资料了,以下是微软的一篇论文,建议对这方面感兴趣的读者都精读一下。
论文解读
论文标题:Fine-Tuning or Retrieval? Comparing Knowledge Injection in LLMs
笔者在论文中发现了一些描述和观点,很有借鉴意义,比如:
If a model knows a fact, it can accurately and consistently answer questions about it. Furthermore, it can reliably distinguish between true and false statements related to this fact. We can then extend this definition to a whole knowledge base, not just a single fact.
如果一个模型知道一个事实,它就可以准确、一致地回答有关它的问题。此外,它可以可靠地区分与此事实相关的真假陈述。然后,我们可以将这个定义扩展到整个知识库,而不仅仅是一个单一的事实。
One important distinction to make is between knowledge that the model has been exposed to before during pre-training as opposed to entirely new facts. Considering the size of modern LLM training sets, they cover a vast amount of information available through web-sourced text. .....
一个重要的区别是模型在预训练期间接触到的知识与完全新的事实之间的区别。考虑到现代大型语言模型训练集的规模,它们覆盖了通过网络文本可获得的大量信息。因此,即使在小众领域,知识注入的目标不一定是教给模型完全新的事实,而更多是通过诱导模型偏向特定领域来“刷新”它的记忆。(这个和我在思考解决方案中的第三条保持了极高的一致)
Instruction tuning has been shown to be very effective at improving the overall quality of the model, with a particular emphasis on its zero-shot and reasoning capabilities. However, despite these advantages, instruction tuning does not necessarily teach the model new knowledge........
指令调优已被证明在提高模型的整体质量方面非常有效,特别是在其零样本学习和推理能力方面。然而,尽管有这些优势,指令调优并不一定会教会模型新的知识。因此,仅仅依靠指令调优并不是解决知识注入问题的可行方案。(和我lora 微调实验的结论对应上了),另外论文还否定了RLHF,DPO,PPO的技术路线。这么下来可选的路线就已经很窄了......
看到这里,待尝试的方式就只剩继续预训练了。(对应本文前面的解决方案一)
注意观察上图中我标红的两列,在这里笔者需要再次重申一下做这个探索的目的为:为了提高检索的质量,辅助检索器进行检索。在最终的环节中,我们会采用大参数模型(比如gpt, qwen-72)进行RAG 回答的基座,而采用较小参数模型去辅助检索器(比如告诉检索器从哪个方面去检索)。举一个例子吧:
问题: 我想知道牛奶A 和牛奶B 的区别是什么?
检索环节:现有的检索器,query处理的结果是”牛奶A“,”牛奶B“, ”区分“再加上权重,另外再加上同义词的情况,比如牛奶A还有个名字是牛奶AAA,区别还有差别等,总之是在当前词的扩展,而不是问题语义的扩展,如果有文章恰好介绍了这两者的差别,那么最后生成的效果质量就受限于这个文章的质量(因为人写的文章是带有主观偏向的,且不能保证质量),而如果没有类似的文章的话,那么最终的结果堪忧。而笔者期望的效果是,提前让模型学习牛奶A,B的数据,然后告诉检索器,去检索牛奶A,B的价格,产地等信息。如果真能做到笔者期望的这一步,那真的会重塑现有的搜索。
所以笔者一直在寻求一个办法,如何让模型能做到告诉检索器这一步。
言归正传,我们接着来看论文比较的数据,ft 后的模型在直接回答问题上,总体来说是优于base 的,那么现在就只剩一个点,ft-model 在检索指导上带来的收益指标具体是多少,这个收益会最终影响整体的效果。剩下就是具体做实验了
这次笔者捋出了一个方案就是继续预训练,下一篇文章会从知识编辑的角度入手探索可能的解决方案,等梳理了知识编辑后,笔者会从可能的方案中挑选一个进行实验。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-05-06
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19