背景
在网络上自学过机器学习和深度学习的朋友们应该对李沐这个名字并不陌生。大家都心照不宣的称呼他为导师,我也不例外。对于我来说,最开始他的动手学深度学习以及后续的很多论文精读系列对我的帮助确实很大。当然,除了他之外,朱毅老师在多模态领域的讲解也非常精彩。
前段时间,李沐分享了他在大模型创业中的一些经历,又分享了 Llama 3.1 的精读系列,最近他回母校又做了一场关于大模型和个人职业发展的分享会,虽然没能亲身去听,但从大家放出的资料上看,确实是又拓宽了自己的眼界。
正好也是从北京回来快半年了,最近搞的也是大模型相关的事情,看完分享后,有了不少的感触,所以索性跟一笔,简单聊一下这段时间的一些经验和体会。
数据侧
这段时间我主要是负责集团内的两个大模型项目,一个用于话术对练,一个用于话术评价。我的应用场景是通话对话,说白了这两个需求,一个是用于角色扮演,模拟客户与员工的对话,主要是为新人培训和练习提供真实的互动场景;另一个则是用于评价通话,主要是用于评估员工在对话过程中的专业性,并给出改进的建议。
首先先聊一下话术对练任务,其实说白了就是角色扮演。当我拿到实际的通话录音的时候,确实是感觉会面临很大的挑战。因为通话数据要比普通的文本数据复杂很多。首先就是 ASR 转录的效果,我实际抽样对比了几下,一些开源的 ASR 模型在我的场景下效果不是很令人满意,所以就基于业务数据训了一个 ASR 模型。这期间不可避免的遇到了方言、口语化、象形字转录易错、音轨穿轨、单音轨声纹分离等问题。对于前几点,暂时是通过一些工程化的方式根据规则去清洗修正了一下。对于音轨和声纹的问题,好在是比较顺利的找到了去年年底的几篇开源工作,效果还不错,我也大概抽了一眼,都是用 Transformer 和 LSTM 去做的,等有空了写下笔记。ASR 和一些问题修正后,还涉及到 TTS 的部分,好在现在的开源工作效果都不错,能够让我拿来即用。
清洗完数据后,面临的一个拿不定的问题就是数据配比的问题,看了一些文章和综述,最终拿定的结论就是采用九一开的方式。找了很多通用领域的数据,主要是单轮、多轮的对话以及一些角色扮演的数据,最后再混入清洗好的业务通话数据,构成了话术对练任务的训练语料。
话术对练任务和话术评价任务的数据还不太一样。对于对练而言,只需要准备好足够多的多轮对话数据即可。但是对于评价来说,需要更高质量的、标注好的评价数据。因为离不开人工标注的参与,我这的标注同学也没有标过这部分的数据,所以需要业务那边的培训和支持,但是她们的积极性并不高。也可以理解,毕竟大模型并不能立竿见影的很快看到结果,所以和业务拉扯、开会就费了很大的力气。这期间先是熟悉了业务对话的流程,然后很费劲的细化、量化了评价要求标准,然后制定了详细的 CoT 的标注框架流程。
因为评价要求标注有好几个维度、对话场景又可以分为多个,所以不确定不同子任务对于总损失的贡献情况,于是我又 fork 了 llama-factory 修改实现了 channel loss,确保能够看到不同子任务对于总损失的影响。
我去年几乎没怎么关注过大模型,因为我在上一家公司做的是数字人和视频生成相关的事,所以为了避免少走弯路,这期间看了大量的资料。在垂域的场景下,数据的质量真的是至关重要,毕竟丹方的质量好才能确保炼出一颗好丹。并且它并不像是通用大模型那样对数据多样性要求很高,反而垂域下的数据更要与实际业务充分的贴合。比如我这边的话术对练任务,ASR、TTS 的效果直接影响训练和实际使用,并且不可避免的会遇到一些方言、口语化、音轨等问题。再比如话术评价任务,需要结合业务去细化和量化出一个评价的要求,才能更好的实现对通话的评价,这其中不光牵扯到对业务的理解,还牵扯到和业务方的沟通。
这些都是需要去操心的点,因此,垂域大模型并不是说简单的混一混数据然后通过 LoRA Finetune 或者 SFT 就可以的,它需要更加细致的数据准备,以及和实际业务需求更深刻的理解和贴合。
模型侧
刚刚聊完了关于数据相关的点,接下来聊聊关于模型的部分。
对于话术对练任务,拿数据训完之后,暴露出的一个问题就是说话的风格过于机器化。其实按照我之前的知识储备直接就想到了 RLHF,但是毕竟过去 1 年了,所以又看了其它的一些资料,比如 RLAF、DPO、simPO 等等,还看过阿里关于对齐的综述,包括比较火的直接编辑表征空间解决对齐这些方法。最后权衡了一下,还是决定先试一下 RLHF 的方法,毕竟奖励模型和强化学习的策略从理论上来讲确实是合理的,只不过将 PPO 进行了替换,最后的效果也确实有了很大的改善,能够流利的去对话了,只不过偶尔还是会出现一些只回答嗯和答非所问的问题。其实这个问题的出现我能够猜到,在实际的对话语料中,存在了不少的这种回答,比如员工在说问题 3,客户在说问题 1,在单轮场景下是答非所问的。我还不清楚是不是和 llama factory 关于 history 损失计算那有关系。先存疑吧,目前是先用着积累一下数据和反馈。
对于话术评价任务,最开始的想法太过于理想化,直接来大尺寸的模型 + 大量的高质量 CoT 数据,但实际上数据标注难度太大,并且也不可能标那么多的通话。所以就退而求其次,采用两阶段的方式。一阶段先细化、量化好话术评价要求,然后调不同大模型的 API 来调试不同的提示词,得到一个业务觉得认可的结果。然后二阶段的时候再批量去生成评价,然后人工再去复标,这样会极大的节省人工的精力和提高效率。
关于话术评价这边的训练,目前还没进展到。初步的想法就是先拿尺寸小一些模型来试试效果,当然稠密的模型和 MoE 架构的模型我也一定会试的,并且还有一个可行的方案是会尝试用大模型蒸馏,比如用一个 32/72B 的模型去做教师。
RAG 也是一个不错的想法,通过 few-shot 的方式提供示例,但是目前这些开源的 RAG 项目其实用起来并不是很舒服,光 PDF 识别这一块就问题很多,并且知识库的存储方式我也想换,所以之前讨论了一下,决定是重构 RAG,但是人手不够所以就暂时搁置了,先弄完话术评价二阶段的训练再去重构,同时集团那边也有智能文档问答的需求,所以为了可重复利用还会给 Agent 留出一些地方来,不过这都是后话了。


