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

news/2024/5/14 11:38:20


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

文章目录

  • 摘要
  • 一、介绍
  • 二、背景和动机
    • 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可以促进更好的日志记录实践,并启发在一般日志分析研究中设计有效的框架。



http://www.mrgr.cn/p/06051167

相关文章

【快速解决】解决谷歌自动更新的问题,禁止谷歌自动更新,如何防止chrome自动升级 chrome浏览器禁止自动升级设置方法

目录 问题描述 解决方法 1、搜索栏搜索控制面板 2、搜索&#xff1a;服务 ​编辑 3、点击Windows工具 4、点击服务 ​5、禁止谷歌更新 问题描述 由于我现在需要装一个谷歌的驱动系统&#xff0c;但是目前的谷歌驱动系统的版本都太旧了&#xff0c;谷歌自身的版本又太新了…

[转帖]FIO测试存储性能iodepth队列深度对iops的影响

FIO是用来测试磁盘IO性能比较常用的工具,它的强大之处在于提供了一套测试框架,能够支持多线程多进程的IO测试,用户只需进行参数的配置,便能够方便地定制不同的IO行为(顺序读写,随机读写等),并对其性能进行监测。此次我们来测试金山私有云KingStack某套环境下SSD磁盘的4KB…

Unity | 工具类-UV滚动

一、内置渲染管线Shader Shader"Custom/ImageRoll" {Properties {_MainTex ("Main Tex", 2D) "white" {}_Width ("Width", float) 0.5_Distance ("Distance", float) 0}SubShader {Tags {"Queue""Trans…

docker 部署 gitlab-ce 16.9.1

文章目录 [toc]拉取 gitlab-ce 镜像创建 gitlab-ce 持久化目录启停脚本配置配置 gitlab-ce编辑 gitlab-ce 配置文件重启 gitlab-ce配置 root 密码 设置中文 gitlab/gitlab-ce(需要科学上网) 拉取 gitlab-ce 镜像 docker pull gitlab/gitlab-ce:16.9.1-ce.0查看镜像是不是有 Vo…

uniapp 微信小程序 canvas 手写板获取书写内容区域并输出

uni.canvasGetImageData 返回一个数组&#xff0c;用来描述 canvas 区域隐含的像素数据&#xff0c;在自定义组件下&#xff0c;第二个参数传入自定义组件实例 this&#xff0c;以操作组件内 组件。 // 获取目标 canvas 的像素信息 pixelData let canvas uni.createSelector…

RabbitMQ 实验消费原始队列消息, 拒绝(reject)投递死信交换机过程

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为&#xff0c;你可以按照以下步骤操作&#xff1a; 创建原始队列&#xff0c;并将其绑定到一个交换机上&#xff1a; export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…

ubuntu使用-ubuntu23.10中创建arm架构的银河麒麟操作系统v10

ubuntu使用-ubuntu23.10中创建arm架构的银河麒麟操作系统v10ubuntuqemu银河麒麟arm安装qemu之后,从应用中或者使用virt-manager命令打开虚拟系统管理器。 创建虚拟机,架构选择aarch64,机器类型不知道选什么,暂选的是virt,后面有问题的话再说。参考国产银河麒麟操作系统下…

Radio Silence for mac 好用的防火墙软件

Radio Silence for Mac是一款功能强大的网络防火墙软件&#xff0c;专为Mac用户设计&#xff0c;旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能&#xff0c;可以精确显示每个网络连接的状态&#xff0c;让用户轻松掌握网络活动情况。 软件下载&#xff1a;Radio…

VSCode 如何同步显示网页在手机或者平板上

首先要确保 ①电脑上安装了VsCode ②VsCode安装插件LiveServer 安装成功之后 连续按住 Alt L 、Alt O 会跳转到对应的html页面上 http://127.0.0.1:5500/....... 是这个开头的 然后打开网络 如果桌面有网上邻居的可以直接点桌面的网上邻居 进来找到WLAN这个…

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

2-19. 拾取物品基本逻辑

创建 ItemPickup 脚本项目相关代码 代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git 标签:20240329_0638

Win10 搭建FTP存储服务器站点【超详细教程】

目录 第一步&#xff1a;打开控制面板>程序 第二步&#xff1a;win10左下角搜索IIS并打开 第三步&#xff1a;右键网站&#xff0c;选择添加FTP站点 第四步&#xff1a;添加FTP站点名称 第五步&#xff1a;添加IP地址和端口 第六步&#xff1a;身份验证与授权信息 第…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记20_读后总结与感想兼导读

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记20_读后总结与感想兼导读1. 基本信息 1.1. 读薄率 书籍总字数350千字,笔记总字数32629字。 读薄率32629350000≈9.32% 1.2. 读厚方向千脑智能脑机穿越未来呼啸而来虚拟人AI3.0新机器人人工不智能:计算机如何误解世界天才与算法…

UE小:基于UE5的两种Billboard material(始终朝向相机材质)

本文档展示了两种不同的效果&#xff0c;分别是物体完全朝向相机和物体仅Z轴朝向相机。通过下面的演示和相关代码&#xff0c;您可以更加直观地理解这两种效果的差异和应用场景。 1. 完全朝向相机效果 此效果下&#xff0c;物体将完全面向相机&#xff0c;不论相机在哪个角度…

蓝桥杯_day6

文章目录 不同路径不同路径II拿金币珠宝的最高价值 不同路径 【题目描述】 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

2024/3/26 C++作业

定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员&#xff1a;长(length)、宽&#xff08;width&#xff09;, 定义成员函数&#xff1a; 设置长度&#xff1a;void set_l(int l) 设置宽度&#xff1a;void set_w(int w) 获取长度&#xff1a;int…

RISC-V特权架构 - 中断定义

RISC-V特权架构 - 中断定义 1 中断类型1.1 外部中断1.2 计时器中断1.3 软件中断1.4 调试中断 2 中断屏蔽3 中断等待4 中断优先级与仲裁5 中断嵌套6 异常相关寄存器 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断类型 RISC-V 架构定义的中…

数字孪生关键技术及体系架构

摘要&#xff1a; 数字孪生以各领域日益庞大的数据为基本要素&#xff0c;借助发展迅速的建模仿真、人工智能、虚拟现实等先进技术&#xff0c;构建物理实体在虚拟空间中的数字孪生体&#xff0c;实现对物理实体的数字化管控与优化&#xff0c;开拓了企业数字化转型的可行思路…

Codeforces Round 937 (Div. 4) A - F 题解

A. Stair, Peak, or Neither? 题解&#xff1a;直接比较输出即可。 代码&#xff1a; #include<bits/stdc.h> using namespace std ; typedef long long ll ; const int maxn 2e5 7 ; const int mod 1e9 7 ; inline ll read() {ll x 0, f 1 ;char c getchar()…

论文《Exploring to Prompt for Vision-Language Models》阅读

论文《Exploring to Prompt for Vision-Language Models》阅读 论文概况论文动机&#xff08;Intro&#xff09;MethodologyPreliminaryCoOp[CLASS]位置Context 是否跨 class 共享表示和训练 ExperimentsOverall ComparisonDomain GeneralizationContext Length (M) 和 backbon…