AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


LLM应用:长上下文的会议纪要总结
发布日期:2024-04-16 10:20:35 浏览次数: 2919 来源:宅码


本文介绍实践中,用LLM做长文本会议纪要总结的过程和心得。不足之处,还望批评指正。



在很多场景,会需要对超长上下文的文本做总结,比如对长达小时级的会议做会议纪要,对一本书做读后感等,因为LLM支持不了太长的上下文,所以一股脑喂入query是不现实的。而且,之前也有提到:很多开源LLM对过长的上下文的理解能力很差,即使在它上下文token数量限制内。就算有些模型声称能支持超长文本,但实际体验后,会发现效果不好,下图就很好地说明问题:


(实践体会:有时输入太多上下文,连prompt都听不太懂了…)


关于总结,LangChain提供的load_summarize_chain的解决方案有3种:[4] [6]


- Stuff:只需将所有文档“塞入”一个提示中即可,可以考虑更大的上下文窗口模型,如16k token的OpenAIgpt-3.5-turbo-1106和100k tokens的Anthropic Claude-2,一般来说,中文字符一个token,一个英文单词一个token);


- Map-reduce:在“映射”步骤中单独总结每个文档,然后将摘要“缩减”为最终摘要;


- Refine:通过根据第一个文档生成初始总结,然后循环其余文档以完善其总结来折叠文档。这是顺序操作的,因此不能并行化。



除此之外,还可以通过聚类的方式做,如下图所示,优点是速度快,缺点是聚类存在信息丢失的风险。[5]



我个人在实践中的一个实现框架,如下图所示,其实就是分块多轮总结:



注:qwen14b最长上下文长度为8K


在重复再总结时,我是设计了个函数f(文本块数)获取输出长度限制,并配合提示词控制输出长度不超过一定范围,保证每轮总结后,token数都能显著减少。


此外,针对会议场景,我还尝试规整下会议数据,以提供给大模型。这在一定程度上有提高,但效果优化还是十分有限。对会议数据做规整的出发点是因为我发现在多人会议时,语音识别的效果会变差,而且很多ASR输出的结果不带标点符号,没做角色分离(语音分离+声音聚类),导致转写文本可读性差,信息杂乱。为此,我调用了WhisperX开源项目[7],并做了一些后处理优化,如下所示:



其中,上图中“合并因讲话者分配错误的句子”,是通过观察当前句和上一句是否被分配为同一个讲话者,若不是,再看当前句有多少字,若字数<某阈值,我就默认它被误检了,于是将当前句合并到上一句当中。其实,这个做法不完美,后续可以基于前后句子的讲话者和当前句子长度做判断,或者用我上一篇文章提到的用BERT算句子的is_next_word的概率去判断是否合并。


在WhisperX项目中,对英文是有加标点符号的,而中文不支持,所以我调用了paddle的atuo_punc文本标点符号恢复的模型[8]:



但该模型使用时,要注意3点:

- 输入长度有限制,不同输入过长,建议提前max_length分段;

- 不支持粤语(有时whisper会偏好识别出一些粤语字),输入粤语繁体会输出[UNK]标识符,建议提前用Opencc转简体;

- 会把英文词之间的空格剔除,导致英文字无缝连接,我是用正则匹配到中英文部分后,用wordninja库对英文做分割。


最后,稍微后处理下格式,结合提示词模板,便能得到如下格式的query让LLM总结:


请扮演会议纪要整理助手,请您简洁专业地总结以下会议内容(不得超过1000个字,不允许在答案中添加任何编造成分)
<会议内容>> Speaker0: xxxx> Speaker1: xxxx> Speaker2: xxxx<会议内容>


如果会议对话过长,可以分块。如果你不想这么麻烦,然后你LLM又贼厉害,那直接ASR不用做讲话者分离,直接将原始识别文本,段落分割后,再喂入LLM也行。关于段落分割,其实是想解决对长会议ASR生成的文本缺乏段落结构的问题以方便语义切分。为了能按段落切块保证文本块内信息的完整性,需要做文本段落分割。这里采用阿里语音实验室在IEEE ASRU 2021技术论文上提出的SeqModel 模型[1] [2] [3],如下图所示,SeqModel先分句,然后对句子分词,获取token、segment、position embedding后做element-wise求和,再加上发音embedding后喂入BERT编码器,对输出做平均池化,接入softmax输出分类判断每个句子是否为段落边界。



由于ASR会出现写转写错误,比如发音相似但含义不同的声学混淆词等。所以把字的发音信息(通过中文发音表查)来增强文本分割模型输入的表征向量(即phone embedding)。


同时,提出了自适应滑窗提升推理速度,就是基于模型预测的段落分割点,去滑动窗口,如下图所示。



训练代码没开源,但可通过modelscope去调用:


# 段落分割# https://modelscope.cn/models/iic/nlp_bert_document-segmentation_chinese-base/summaryfrom modelscope.outputs import OutputKeysfrom modelscope.pipelines import pipelinefrom modelscope.utils.constant import Tasks
p = pipeline(    task=Tasks.document_segmentation,    model='damo/nlp_bert_document-segmentation_chinese-base')
documents = ''.join(annot_dfs['transcription'].astype(str).values.tolist())result = p(documents=documents)paragraphs = result[OutputKeys.TEXT]paragraphs = paragraphs.split('\t')


虽然上述框架合理,但实践中,若大模型的长文本总结能力差,最终会议总结的效果也不见得很好。如果看过综艺的朋友应该了解传声游戏,同理,在LLM多轮总结的同时会丢失细节,甚至补充些见解,而且这里还更复杂,因为LLM每轮总结的时候,要面临前一轮多个总结内容,相当于多人同时传话给你,所以信息丢失或总结后结果的整体性较差。欢迎其他朋友找我讨论,看除了更换长文本总结能力强的LLM,还有什么额外的优化方式。


日后有机会,我也研究下怎么训练出支持超长文本的模型方法,其实主要集中在self-attention模块的算法优化还有工程上训练推理的优化,目前已知一些方法有:位置编码外推,小模型、滑窗抛弃前问,对上下文降采样或稀疏注意力,配合RAG对部分输入做自注意力计算,对上下文分组计算。留几篇阅读资料[9][10]。唉,感觉还是得从模型出发,不要过多停留在表面的套壳优化…



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询