【论文阅读】UniLog: Automatic Logging via LLM and In-Context Learning


由于其公司的保密政策,本文没有公开源代码,数据是公开的。

文章目录

  • 摘要
  • 一、介绍
  • 二、背景和动机
    • 2.1、日志语句生成
    • 2.2、大语言模型
    • 2.3、上下文学习(In-Context Learning,ICL)
  • 三、UNILOG
    • 3.1、模型骨干
    • 3.2、提示策略
      • 3.2.1、提示格式
      • 3.2.1、提示样例
    • 3.3、预热策略
  • 四、评估
    • 4.1、UniLog与现有的基于LLM的日志方法相比如何
    • 4.2、与微调相比,ICL能给日志记录带来多少改进
    • 4.3、不同的ICL策略如何影响日志记录的有效性
  • 五、讨论
    • 5.1、有效性威胁
    • 5.2、道德问题
    • 5.3、误差分析
  • 六、总结


摘要

问题

  • 许多自动日志工具被设计用来帮助开发人员完成日志任务之一。这些工具在某些情况下很有用,但通常不能提供全面的日志解决方案。
  • 尽管最近的研究已经开始探索端到端日志,但它仍然在很大程度上受到微调的高成本的限制,阻碍了它在软件开发中的实际用途。

创新点

  • UniLog是一个基于大型语言模型(llm)的上下文学习(ICL)范式的自动日志框架。
  • UniLog可以生成一个适当的日志记录语句,该语句只包含一个提示符,其中包含五个演示示例,而不需要任何模型调优。
  • UniLog在预热后只需要几百个随机样本,就可以进一步增强其记录能力。

效果

  • 测井位置选择准确率76.9%
  • 预测冗余程度准确率72.3%
  • 在生成日志消息时BLEU-4评分27.1
  • UniLog所需的参数调优时间不到调优相同LLM所需参数调优时间的4%

一、介绍

  随着软件规模和复杂性的快速增长,日志记录越来越成为软件可靠性保证不可或缺的实践。目前构建日志记录的研究主要聚焦于三个子任务上:

  • 确定日志记录位置
  • 设置详细级别(Verbosity level)
  • 生成日志消息

  虽然以前的日志记录方法在不同的子任务上得到了较好的结果,但它们并没有将日志记录任务作为一个整体来考虑。目前一种用于日志记录的一体化解决方案LANCE能够从整体的角度来考虑这三个子任务,但是在涉及模型调优的两个阶段–多任务预训练和微调时需要大量的时间和计算资源。
  因此本文认为现有方法的实际意义有限,对端到端、轻量级和与代码相关的日志解决方案的需求很大。


二、背景和动机

2.1、日志语句生成

  长期以来,对该方面的三个子问题都没有作为一个整体来解决,因此在实际场景中实用性较差。最近提出的LANCE,试图通过使用LLM以端到端方式解决日志问题。然而,由于训练成本较大。从实践的角度看仍然具有局限性。

2.2、大语言模型

  自LLM出现以来,NLP已经发展成为一种新的学习范式,即预训练和微调。在这种范例中,人们选择在不同的下游场景中使用特定任务的数据对预训练的LLM进行微调,而不是以一种非常昂贵的方式从头开始训练LLM。相比预训练,微调所需的计算资源要少得多,因此更节省成本
  具体来说,在软件工程领域,LLM与微调技术一起,在代码评审生成、模糊测试用例生成、自动程序修复和根本原因分析等任务中取得了巨大的成就。

2.3、上下文学习(In-Context Learning,ICL)

  ICL的优势在于:

  • ICL不需要进行架构工程和目标工程
  • 所有的指令和描述都是自然语言,便于用户理解
  • 直接利用了预训练和提示演示的信息,避免了由于过度依赖下游特定任务数据而导致的微调过拟合问题。

  由此提出了UniLog。具体来说,UniLog不再需要从消耗大量日志数据的训练过程中显式地学习日志记录。相反,它利用llm的类比推理能力,从提示词中提供的代码示例直接推断出预期的日志记录语句


三、UNILOG

  UniLog建立在大型语言模型Codex的上下文学习范式(ICL)之上,本章主要介绍了骨干(3.1)、提示(3.2)和可选预热(3.3)的设计细节,以下为整个模型的流程图
在这里插入图片描述

3.1、模型骨干

  本文选择Codex作为UniLog的支柱,Codex是基于GPT-3的LLM,它利用GitHub上的大量存储库来增强代码生成能力。通过采用Codex作为主干,UniLog可以充分利用Codex模型的知识,减轻由于这种差异而导致的性能下降。此外,由于Codex的参数规模很大,预训练中使用的数据量很大,UniLog可以直接从提示中推断答案,而不需要对模型进行微调。
  UniLog以黑盒方式使用LLM,因此可以随意替换主干。但是当使用不提供微调api的闭源模型(例如GPT-4)时,UniLog不能执行模型预热,这可能会影响性能。

3.2、提示策略

3.2.1、提示格式

  尽管大多数LLM的预训练目标包括文本生成任务,但它们并没有明确考虑生成的文本应该插入到哪里。为了使llm能够完成“记录到哪里”的任务,一种直观的解决方案是将日志任务转换为代码完成任务:预测每行代码之后是否应该生成日志语句。然而,如果这种范式在目标代码片段有二进制的行,模型将需要执行二进制的推断,从而导致效率低下。此外,在日志和非日志语句之间的代码行比例上存在明显的不平衡,日志语句的数量远远少于非日志语句。例如,马斯特罗帕罗等人指出,几乎96%的Java方法不包含日志记录语句。这些样本中的不平衡可能导致低召回率,这意味着几乎每一行都更有可能被预测为不需要日志记录语句,这可能严重损害我们的日志记录性能。

  所以,本文的做法为在每个换行符位置添加一个特殊的标记来表示行ID,然后将代码片段平展为序列格式。
在这里插入图片描述
  在指令中,UniLog要求模型提供生成的日志语句和要插入的目标行ID。

3.2.1、提示样例

  在UniLog中,我们选择了KATE,一种简单的kNN-based采样算法,在实践中不会涉及太多的计算开销,用于上下文示例扩增。具体地说,我们首先将训练数据中的所有候选代码段纳入向量表示 v v v。然后,对于每个向量化查询 v q v_q vq,我们计算它与所有候选查询之间的相似度指标 d ( v q , v ) d(v_q, v) d(vq,v),输出前5个结果作为示例。

在这里插入图片描述

3.3、预热策略

  预热与微调有着截然不同的目的与做法:

  • 微调通过使用相关样本进行训练来提高llm在特定任务上的性能,使用不记录语句(即完整提示中的查询)的代码片段进行训练。
  • 预热则增强了llm的一般类比能力,即根据提示中的每条指令找到有限上下文示例的共同特征。使用完整提示作为输入,每个提示包括一条指令、几个演示示例和一个查询。

  在UNILOG的实现中,我们将所有预热样例的指令设置为相同的目标(即,日志语句生成),并将标记的代码片段设置为提示示例,以特定于任务的方式提高ICL能力。因此,整个预热过程如下:

  • 默认情况下,UniLog首先从验证集中随机选择500个样本作为预热提示的查询。
  • 然后,对于每个查询,UniLog采用KNN算法在训练集中再搜索5个最相似的样本作为提示例,附加它们的groundtruth标签,并与固定的指令一起打包成一个完整的提示。
  • 之后,所有的提示将被提交给Codex进行批量参数调整。

四、评估

  本文设置了以下三个研究问题:

  • UniLog与现有的基于llm的日志方法相比如何?
  • 与 微调相比,ICL能给日志记录带来多少改进?
  • 不同的ICL策略如何影响日志记录的有效性?

4.1、UniLog与现有的基于LLM的日志方法相比如何

  为了证明UniLog在日志语句生成任务中的有效性,我们采用了带和不带预热的两个版本的UniLog(即,UniLog-w/ warmUniLog-w/o warm)来与专门为日志任务设计的其他日志方法进行比较。考虑到重现基于LLM的方法需要微调的难度,所以直接使用了LANCE原论文中报告的评估结果,而不是再次对其进行重新训练。由于原论文没有采用BLEU进行评价,因此在结果表中用N/A代替了该指标。

在这里插入图片描述

  在没有模型调优的情况下,UniLog在所有指标中都优于LANCE。

4.2、与微调相比,ICL能给日志记录带来多少改进

  实验结果如表2所示,表明Codex-ICL优于Codex-FT, MA优势14.3%,BLEU优势16.3。这些结果清楚地表明了Codex-ICL在日志消息生成方面的优越性。

在这里插入图片描述

然而,我们观察到Codex-ICL在较简单的任务中没有取得显着优势,即位置预测和水平预测。
日志位置预测分析
  尽管CodexFT显示出10%的高PA,但该度量本身的实际指导作用有限,因为在大多数实际场景中,将日志语句移动几行并不会产生显著差异。因此,我们利用位置距离来进一步评估预测与实际情况之间的行间隔。例如,如果预测行ID为<line4>,真实线ID为<line3>,则位置距离为1。
在这里插入图片描述
  如图6所示,误差预测在位置(即非零位置距离)上的位置距离分布用累积分布函数(CDF)表示。这说明在Codex-ICL和Codex-FT之间的分布没有显著差异。

详细级别(Verbosity level)预测分析
  详细级别预测分析数据集中有五个日志详细级别:致命(fatal)、错误(error)、警告(warn)、信息(info)和调试(debug)。
  这些级别服务于不同的目的。例如,Fatal和Error处理严重问题并生成错误消息,而Info和Debug在大多数情况下提供可忽略或琐碎的信息。
  然而,对于级别评估来说,LA是不够的,因为将Debug预测为Info或Fatal在实践中可能会产生截然不同的影响。因此,我们引入水平距离来细粒度量化预测水平与真实水平之间的差距。例如,如果预测结果为Debug,真值也为Debug,则距离为0;如果预测结果为Debug,而真实值为Error,则级别距离为3,因为它们之间有三个级别。如图6所示,Codex-ICL和Codex-FT之间的能级距离分布相似。例如,这两个主要预测与基本事实(约90.0%)仅相差一个水平。然而,Codex-ICL仍然产生更高比例的精确匹配预测(即LA)。因此,我们认为基于ICL的方法在水平预测方面有轻微的优势。

4.3、不同的ICL策略如何影响日志记录的有效性

  本节将分析不同配置对日志记录有效性的四个方面的影响:(1)模型主干的类型,(2)提示示例的数量,(3)提示示例的排列方法,(4)预热示例的数量。

模型主干的类型

  为了确保ICL范式能够被利用,LLM的大小必须保证足够大。因此,在实验中,我们将不考虑规模相对较小的LLM。为了确保规模(即>100M)和结构(即仅解码器)的公平性,我们选择了GPT-3系列中的型号作为骨干,即GPT-3- a、GPT-3- b、GPT-3- c和Codex。
在这里插入图片描述

  实验结果如表4所示。可以看出,与其他llm相比,UniLog在使用Codex作为主干时具有相对较大的精度优势。例如,在测井位置方面,Codex的精度比GPT-3系列高30%左右,而BLEU的精度甚至是其他系列的两倍以上。结果表明,使用与代码相关的模型作为主干极大地影响了UniLog的性能,而简单地增加通用LLM的参数并不能有效地提高日志记录能力。

提示示例的数量

  为了研究提示示例数的影响,我们考虑了比较实验中示例数的五个层次:1、3、5、10和15。特别是,我们观察到,当示例数量超过15时,有效性指标没有显着改善。因此,我们选择不将这些结果包含在表中。
在这里插入图片描述
  实验结果如表5所示。随着提示示例数量的增加,所有指标都会逐渐改善。但随着提示示例数量超过5个,指标的增长速度逐渐放缓,出现饱和趋势。例如,当提示示例数从5个增加到10个时,BLEU略有下降;当数字增加到15时,其BLEU与数字为5时保持相同。此外,更多的提示示例可能导致更重的模型计算消耗和更慢的推理速度,从而导致实际效率低下。因此,我们最终设计的UniLog只有5个提示示例。

提示示例的排列方法
文中主要选择三种方法进行对比实验

  • (1)随机选择然后随机排序(即随机)
  • (2)根据KNN相似度选择然后升序排序(即𝑘NN-ascend)
  • (3)根据KNN相似度选择然后降序排序(即𝑘NN-descend)。

在这里插入图片描述

  实验结果如表6所示。我们发现𝑘NN-ascend在所有指标中都优于其他两种选择策略,这表明它在UniLog提示符中起着不可或缺的作用。

预热示例的数量
  本文考虑了五个层次的样本数进行比较实验:100、300、500、700和900。特别是,我们观察到,当样本数量超过900时,有效性指标没有显着改善。因此,我们选择不将这些结果包含在表中。
在这里插入图片描述

  实验结果如表7所示。当样本数量大于500时,总体指标不再有明显改善,有些指标甚至出现下降,这表明UniLog通过热身提高的有效性是有限的,趋于饱和。例如,当样品数量从500个增加到700个时,MA没有增加,CMA和BLEU都略有下降。此外,随着样本数量的增加,训练开销逐渐增加,不再满足第1节所示的快速部署需求。因此,考虑到计算成本,我们最终只设计了500个样本的UniLog


五、讨论

5.1、有效性威胁

  • 数据泄露
    CodeX是使用2020年5月前的数据进行预训练,而本文的数据用的是2022年收集的,如果在此期间数据库中有些代码没有变动的话,则会导致数据泄露
  • 随机性
    随机性可能在两个方面影响性能:(1)llm推理中的随机性;(2)RQ3中随机选择提示演示和预热样本所引入的随机性。

5.2、道德问题

  UniLog可能会遇到与LLM使用相关的道德问题,即

  • (1)使用第三方LLM模型作为骨干可能会导致代码或日志的隐私泄露。
  • (2)使用包含刻板印象或种族偏见的代码作为候选人可能会产生有害的日志信息。

5.3、误差分析

  本文将错误消息分为以下三种情况:(1)具有相似语义的消息,(2)具有不同记录的消息,以及(3)具有无意义信息的消息。

具有相似语义的消息
  基于精确匹配标准,由于同义词替换、词序变化或包含更简洁或详细的描述,这些语义相同的消息被认为是错误的。尽管表达式并不完全相同,但它们具有相似的语义。因此,我们认为它在开发过程中可能不会产生重大影响

具有不同记录的消息
  在我们提取的错误日志消息中,116条(23.2%)错误消息涉及错误的位置预测,导致记录的变量或描述与真实情况完全不同。然而,我们发现这些信息可能仍然有用。为了进一步提高LLM在正确位置插入日志的能力,我们建议引入更多不同日志位置的预热样例,从而提高LLM对日志位置的敏感性

具有无意义信息的消息
  我们发现167条错误消息(33.4%)重新编码了无用的变量或提供了完全无意义的描述。在分析它们的提示输入后,我们发现这是由于演示和查询之间编码风格的显著差异。编码风格的差异会阻碍UniLog通过ICL推理和与演示的类比来有效地学习日志。为了缓解这些问题,我们建议增加候选集的多样性,合并更多具有不同编码风格的代码片段,以提高对各种查询的提示演示的质量v


六、总结

  • 本文介绍了UniLog,这是一种采用大型语言模型(llm)的上下文学习(ICL)范式的新型日志框架。UniLog以端到端方式执行自动日志记录,包括选择日志记录位置、预测详细级别和生成日志消息。

  • UniLog不需要在每次使用之前对目标代码样式进行微调。UniLog已经对从1,465个GitHub存储库中提取的12,012个代码片段进行了评估,并在所有日志任务中实现了SOTA精度。

  • UniLog所需的参数调优时间不到SOTA方法所需的4%。作为第一个在日志记录中采用ICL范式的工作,我们相信UniLog可以促进更好的日志记录实践,并启发在一般日志分析研究中设计有效的框架。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大龄程序员的2024年3月总结:鸿蒙,发起GDE申请,金石计划获奖,月榜,技术文章

大家好&#xff0c;我是老A&#xff0c;一名工作十年的安卓开发&#xff1b; 又到了月末写总结的时候了&#xff0c;看过我文章的朋友应该会发现我没有写2月的总结&#xff0c;因为2月有春节假期&#xff0c;2月大部分时间都是在假期中度过的&#xff0c;所以就没有写2月总结&…

瓷砖通铺选择亮面还是哑光?了解这6点不难选。福州中宅装饰,福州装修

选择瓷砖通铺亮面还是哑光&#xff0c;可以从多个角度来考虑&#xff1a; ①空间感觉 亮面瓷砖通常会使空间看起来更加宽敞和明亮&#xff0c;而哑光瓷砖则给人大气、稳重的感觉。如果希望让空间显得更加宽敞&#xff0c;亮面瓷砖是一个不错的选择。 ②清洁与维护 亮面瓷砖更…

KNN算法 | K近邻:KD Tree、球树、KNN数据下采样策略

目录 一. KNN算法实现方式1. 蛮力实现(brute)2. KD树(kd_tree)3. 球树(ball_tree) 二. KD Tree算法1. 构建方式2. KD Tree 查找最近邻 三. 球树(Ball Tree)1. 构建方式 四. KNN评价1. 优点2. 缺点 五. 延申1. KNN数据下采样策略策略1策略2策略3策略4 Condensed Nearest Neighbo…

loadbalancer 引入与使用

在消费中pom中引入 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> 请求调用加 LoadBalanced 注解 进行服务调用 默认负载均衡是轮训模式 想要切换…

OpenStack部署

目录 一、安装环境 1.无网络使用该命令 2.修改主机名 3.配置hosts解析 4.配置本机免密 5.关闭防火墙和SElinux策略 6.关闭NewworkManager 7.修改yum源 7.1下载阿里源 7.2清空并加载缓存yum源 8.安装基本工具 9.系统升级 10.安装OPenStack的yum仓库 11.修改OPenSt…

Verilog语法之assign语句学习

assign语法主要是对组合逻辑的变量进行赋值的&#xff0c;就是把一个变量赋值给另一个变量&#xff0c;被复制的变量必须是wire类型的参数。 从仿真结果可以看出&#xff0c;data_in变量的值赋值给了data_out,assign语法就是赋值没有任何延迟&#xff0c;data_in是什么值&#…

数据结构--单链表(c语言实现)

一.单链表的设计 1.单链表的结构定义: typedef struct Node{int data;//数据域struct Node* next;//后继指针 }Node,*List; 2.单链表的设计示意图: 3.注意,单链表的最后一个节点的next域为NULL; 4.为什么要有一个头节点?(简单方便,不用传二级指针); 二.单链表的实现 //初始化 …

web练习仿小米页面

效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

车载电子电器架构 —— 通信信号数据库开发

车载电子电器架构 —— 信号数据库开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

rocketmq管理工具rocketmq-console安装

rocketmq-console是一个图形化管理控制台&#xff0c;提供Broker集群状态查看&#xff0c;Topic管理&#xff0c;Producer、Consumer状态展示&#xff0c;消息查询等常用功能&#xff0c;这个功能在安装好RocketMQ后需要额外单独安装、运行。 中文文档地址&#xff1a;https:/…

Java中的多线程和线程安全问题

线程 线程是操作系统进行调度的最小单位。一个进程至少包含一个主线程&#xff0c;而一个线程可以启动多个子线程。线程之间共享进程的资源&#xff0c;但也有自己的局部变量。多线程程序和普通程序的区别&#xff1a;每个线程都是一个独立的执行流&#xff1b;多个线程之间是…

C++模板进阶操作 —— 非类型模板参数、模板的特化以及模板的分离编译

非类型模板参数 模板参数可分为类型形参和非类型形参。类型形参&#xff1a; 出现在模板参数列表中&#xff0c;跟在class或typename关键字之后的参数类型名称。非类型形参&#xff1a; 用一个常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#xff…

【 书生·浦语大模型实战营】学习笔记(一):全链路开源体系介绍

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

汇编语言——用INT 21H 的A号功能,输入一个字符串存放在内存,倒序输出

用INT 21H 的A号功能&#xff0c;输入一个字符串“Hello, world!”&#xff0c;存放在内存&#xff0c;然 后倒序输出。 在DOS中断中&#xff0c;INT 21H是一个常用的系统功能调用中断&#xff0c;它提供了多种功能&#xff0c;其中A号功能用于字符串的输入。 在使用这个功能时…

OSCP靶场--Internal

OSCP靶场–Internal 考点(CVE-2009-3103) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.40 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-31 07:00 EDT Nmap scan report for 192.168.216.40 Host is up…

pymysql进行数据库各项基础操作

目录 1、mysql数据库简介2、基于mysql数据库的准备工作3、通过pymysql进行表的创建4、通过pymysql进行数据插入5、通过pymysql进行数据修改6、通过pymysql进行数据查询7、通过pymysql进行数据删除 本文内容是通过pymysql来进行时数据库的各项基础操作。 1、mysql数据库简介 …

西南交大swjtu算法实验4.2|分治

1. 实验目的 编写一个分治算法来搜索 m*n 矩阵 matrix 中的一个目标值 target&#xff0c;该矩阵 具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 通过该实例熟悉分治算法的分析求解过程&#xff0c;时间复杂度分析方法&#xff0c;以及如何设计 分治…

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…

ES6 学习(一)-- 基础知识

文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得」JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为…

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一&#xff1a;转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 &#xff1a; 如果出现\890,\921这些的不是属于\ddd类型的&#xff0c;&#xff0c;不是一个字符…