基于LLM的日志解析

开源LLM模型框架

LLMParser: An Exploratory Study on Using Large Language Models for Log Parsing

代码链接:https://github.com/zeyang919/llmparser

提出了LLMParser模型框架: 利用四种文本到文本或文本生成 LLM:Flan-T5-small、Flan-T5-base、LLaMA-7B 和 ChatGLM-6B。

模型框架与算法流程:

LLMParser 侧重于利用少量数据进行学习,提出了LLMParser框架, 其过程:

1. 原始数据的提取: 将Log日志提取出来

2. LLM的Prompt: 设计合适的Prompt来构建适合LLM处理的文本

3. 模型调优: 对模型进行训练,提升模型的泛化性和准确性。

4. 生成Template: 根据训练的结果生成log的模板。

2.LibreLog: Accurate and Efficient Unsupervised Log Parsing Using Open-Source Large Language Models(可以)

代码链接:https://github.com/zeyang919/LibreLog

提出的LibreLog框架:其核心思想是利用开源的 LLM(例如 Llama3-8B)的强大文本理解和生成能力,结合有效的日志分组和模板记忆机制,实现准确且高效的日志解析,而无需人工标注数据。

LibreLog 的算法流程可以分为以下几个主要步骤:

1. 日志分组(Log Grouping):

- 目的: 将具有相似静态文本的日志分组在一起,为后续的 LLM 解析做准备。

- 方法: 采用基于固定深度的分组树的策略。

- 第一步: 根据日志的 token 长度进行分组,将 token 长度相似的日志划分到同一个子集中。

- 第二步: 在固定的深度存储 K 个前缀 token,这样做可以避免分组爆炸,从而提升分组效率。

- 第三步: 抽象数值字面量,使用通配符符号()。 这样做可以防止第三步中分组的爆炸,从而使分组效率低下。

- 第四步: 计算新日志与现有日志组之间的相似度,判断新日志应该插入到哪个组中。相似度计算采用 Jaccard 相似度,如果相似度高于阈值(例如 0.5),则将日志插入到现有组中,否则创建一个新的日志组。

2. 基于 LLM 的无监督日志解析(LLM-based Unsupervised Log Parsing):

- 目的: 利用 LLM 将分组后的日志解析为日志模板,区分静态文本和动态变量。

- 方法: 采用检索增强生成(Retrieval-Augmented Generation,RAG)的方法,结合自反思机制。

- Prompt 设计: 设计包含以下几个部分的 Prompt:

- 指令(Instruction): 明确告诉 LLM 需要完成的任务,即识别和提取日志中的动态变量,并生成日志模板。

- 输入/输出示例(Input/Output Example): 提供一个输入输出的例子,帮助 LLM 理解任务的目标和格式。

- 检索增强(Retrieval-Augmented Log Parsing): 从每个日志组中选择具有代表性的日志,以帮助 LLM 更好地理解日志的结构和动态变量。代表性日志的选择基于 Jaccard 相似度,选择与其他日志相似度最低的日志。

- 模板提取: 从 LLM 的响应中提取生成的日志模板。

- 模板标准化(Post-processing Template Standardization): 对提取的日志模板进行标准化处理,例如移除不必要的字符和标记,将动态变量替换为正则表达式。

- 自反思验证(Self-Reflection for Verifying Log Template): 验证生成的日志模板是否能够匹配组内的所有日志。如果存在未匹配的日志,则使用自反思机制,重新生成日志模板,直到所有日志都能被匹配。

3. 模板记忆(Template Memory for Efficient Log Parsing):

- 目的: 存储解析后的日志模板,避免重复的 LLM 查询,提高解析效率。

- 方法: 将解析后的日志模板存储在内存中,并根据 token 长度进行排序。当需要解析新的日志时,首先在内存中查找匹配的日志模板。如果找到匹配的模板,则直接使用该模板进行解析,否则调用 LLM 进行解析。

上下文学习(需依靠LLMAPI辅助)

LILAC using LLMs with Adaptive Parsing Cache、

代码链接:https://github.com/logpai/LILAC

模型框架:

LILAC(Log parsIng framework using LLMs with Adaptive parsing Cache)是一个使用大型语言模型 (LLM) 结合自适应解析缓存的日志解析框架。该框架主要由两个核心组件构成:

1. ICL-enhanced Parser (ICL增强解析器): 该组件利用 LLM 的上下文学习 (In-Context Learning, ICL) 能力,通过提供少量示例来引导 LLM 理解日志解析任务,而无需进行耗时的模型微调。

2. Adaptive Parsing Cache (自适应解析缓存): 该组件用于存储和管理已解析的日志模板,并根据新的解析结果进行自适应更新。目的是解决 LLM 在日志解析中存在的效率问题和结果不一致性问题。

模型算法流程:

1. 输入: 一条待解析的日志消息。

2. 缓存匹配 (Cache Matching):

首先,LILAC 会在自适应解析缓存中查找是否已存在与该日志消息对应的模板。

如果找到匹配的模板,则直接使用该模板作为解析结果,跳过 LLM 查询,提高效率。

3. ICL增强解析器:如果缓存中找不到匹配的模板,则执行以下步骤:

候选集采样 (Candidate Sampling):

该算法旨在从大量的历史日志数据中选取一小部分具有代表性的日志消息作为候选集,用于后续的演示示例选择。

LILAC 采用了分层抽样算法,首先根据日志消息的常见词语进行粗粒度聚类,再根据特殊字符进行细粒度聚类,最后从每个聚类中抽取一定数量的候选日志消息。

演示示例选择:根据待解析的日志消息,从候选集中选择 k 个最相似的日志消息作为演示示例。

相似度计算基于词语和特殊格式,采用 K 近邻(k-Nearest Neighbors, kNN)算法。

提示构建:将指令、演示示例和待解析的日志消息按照特定的格式组合成一个完整的提示。

LLM 查询:将构建好的提示输入 LLM,要求 LLM 生成待解析日志消息的模板。

4. 缓存更新:

将 LLM 生成的模板与缓存中相关的模板进行比较。

如果 LLM 生成的模板与缓存中的某个模板非常相似,则认为它们可能来自相同的基本模板,然后更新缓存中的模板以确保结果的一致性。

如果 LLM 生成的模板与缓存中的任何模板都不相似,则将其作为一个新的模板添加到缓存中。

  1. 输出: 解析后的日志模板。

Free: Towards More Practical Log Parsing with Large Language Models

代码链接:https://github.com/LogIntelligence/LogBatcher

与上个论文LILAC相似,LogBatcher的核心思想是利用日志数据中潜在的共性和变异性,通过聚类将日志数据划分为多个分区,并在每个分区中抽取具有高多样性的日志消息来构建提示上下文,从而引导LLM更好地执行日志解析任务,而无需任何人工标注的演示示例。

LogBatcher的算法流程可以分为以下几个主要步骤:

1. 日志分区(Partitioning):

- 目的: 将原始日志数据划分为多个分区,使得每个分区内的日志具有较高的相似性。

- 方法: 采用基于DBSCAN聚类算法的通用聚类方法。

- Tokenization: 对日志进行tokenization和清洗,去除噪声和不相关的字符。

- Vectorization: 将日志转化为数值向量,采用TF-IDF算法来衡量每个token的重要性。

- Clustering & Sorting: 使用DBSCAN算法对日志进行聚类,并将聚类结果按照大小进行排序,将噪声数据点视为单独的聚类进行处理。

2. 缓存(Caching):

- 目的: 存储之前解析过的日志模板,避免重复的LLM调用。

- 方法: 使用简单的缓存机制来存储日志模板、参考日志和匹配频率。当新的日志到达时,首先在缓存中查找匹配的日志模板,如果找到,则直接使用该模板进行解析;否则,将日志发送给LLM进行解析。

3. 批处理-查询(Batching – Querying):

- 目的: 构建LLM的查询上下文,包括指令和查询日志批处理,从而引导LLM更好地执行日志解析任务。

- 方法:

- 批处理(Batching): 从每个分区中抽取具有高多样性的日志消息,构建批处理。

- 提示设计(Prompting Design): 设计包含指令和查询日志批处理的提示,指令描述了日志解析的目标和输入/输出格式,查询日志批处理包含了从分区中抽取的日志消息。

- 后处理(Post-Processing): 对LLM的输出进行后处理,提取识别的模板,并进行优化。

4. 匹配和修剪(Matching & Pruning):

- 目的: 处理聚类过程中可能出现的错误,例如,同一模板的日志被分到不同的聚类中,或者不同模板的日志被错误地分到同一个聚类中。

- 方法: 使用识别的模板对日志进行重新分组,将与模板匹配的日志保留在原始聚类中,将不匹配的日志移动到新的聚类中,并重新进行解析。

ULog: Unsupervised Log Parsing with Large Language Modelsthrough Log Contrastive Units

ULog 提出了一种无监督的日志解析方法,通过日志对比单元(Log Contrastive Units, LCUs),引导 LLMs 进行对比分析,从而提高解析准确率。

ULog 的算法流程主要分为三个步骤:

1. 分层分片(Hierarchical Sharder):

由于日志数量庞大,直接搜索 LCU 不可行。因此,ULog 提出了一种分层分片方案,将日志划分为不同的桶(buckets):

按日志长度分片: 首先按照日志长度(token数量)进行分片,将长度相同的日志放入同一个桶中。

按 Top-K Token 聚类分片: 在每个长度桶内,进一步按照 Top-K 高频 token 进行层次聚类,将具有相似 Top-K token 的日志聚类到一起,形成更细粒度的桶。

2. 生成式 LCU 排序(Generative LCU Ranker):

在每个分片后的桶内,ULog 通过以下步骤生成和选择高质量的 LCU:

LCU 生成: 从桶中随机选择一个日志作为锚点日志(anchor log),并计算该锚点日志与桶中其他日志的相似度,然后根据相似度对日志进行分层抽样,再进行组合枚举,生成候选 LCU。

混合 LCU 排序: 对候选 LCU 进行排序,选择最优的 LCU。排序标准是综合考虑 LCU 的共性(Commonality) 和 变异性(Variability)。

共性: LCU 中日志的相似程度,如果日志差异过大,则可能来自不同的模板。

变异性: LCU 中日志参数的变化程度,如果日志参数变化太小,则 LLMs 可能无法有效识别参数。

混合评分: 通过线性加权组合共性和变异性,得到 LCU 的综合评分,并选择评分最高的 LCU。

3. 无标签 LLM 解析器(Label-free LLM Parser):

提示语设计(Prompt Design): 对于选定的 LCU,ULog 构建一个特定的提示语,引导 LLM 进行解析。提示语包括:

任务指令(Task Instruction): 明确任务目标,例如提取动态变量并输出静态日志模板。

参数示例(Parameter Examples): 提供参数类型和值的示例,帮助 LLM 理解参数的特征。

输出约束(Output Constraints): 规定输出格式,例如每个日志模板以“LogTemplate\[idx]:”开头。

查询 LCU(Queried LCUs): 将 LCU 中的日志添加到提示语中,供 LLM 进行对比分析。

模板获取(Template Acquisition): 利用 LLM 生成对 LCU 中日志对应的日志模板。

通过精心设计的提示词对 LLM 进行询问,获取 LLM 的反馈。然后,对 LLM 的反馈进行后处理,提取有效的模板信息,这要归功于清晰的输出约束设定。

在获得有效的模板后,ULog 会选择最常见的模板作为该 LCU 的最终模板,并将参数部分替换为占位符。

4. 分桶更新(Bucket Updating):

对于成功匹配到模板的日志,ULog 会将它们从桶中移除,减少后续迭代的搜索空间。

剩余的日志桶用于下一个解析迭代。

当所有日志桶为空时,解析过程终止。

Log Parsing using LLMs with Self-Generated In-Context Learning and Self-Correction

AdaParser算法流程:

1. 输入: 待解析的日志消息。

2. 树状解析器匹配: 首先尝试在树状解析器中匹配现有的模板。

如果匹配成功: 直接使用匹配的模板作为解析结果。

如果匹配失败: 继续进行步骤3。

3. SG-ICL解析:

从动态候选集中选择与待解析日志消息相似的示范示例。

构建包含示范示例的提示,并将提示发送给LLM。

接收LLM生成的模板。

4. 模板纠正: 使用模板纠正器,通过模板匹配纠正和变量抽象纠正两种策略,对LLM生成的模板进行修正。

5. 更新: 将修正后的模板添加到树状解析器和候选集中,以供后续使用。

6. 输出: 最终解析的日志模板和变量。

DivLog: Log Parsing with Prompt Enhanced In-Context Learning

论文提出了DivLog,一个基于大型语言模型(LLMs)的上下文学习(ICL)能力的高效日志解析框架。DivLog的主要思想是:

1. 离线样本选择阶段: 通过最大化日志的多样性,选择少量的离线日志作为候选集。

2. 在线解析阶段: 对于每个目标日志,从候选集中检索top-5个最相关的日志示例及其标签,构建提示(prompt)。通过挖掘提示中示例的语义,DivLog能够以无训练的方式生成目标日志模板。

DivLog的关键组成部分:

1. 确定性点过程采样器 (DPP Sampler):

用于在离线阶段从日志数据中选择具有最大多样性的样本。

目标是选择一组能够代表不同日志模板的日志,以构建一个高质量的候选集,用于后续的上下文学习。

2. k近邻选择器 (kNN Selector):

在解析阶段,kNN选择器从候选集中选择与目标日志最相似的日志示例。

通过计算目标日志与候选集中日志的相似度,选择最相关的示例作为上下文信息提供给LLM。

3. 提示格式器 (Prompt Formatter):

设计了一种通用的提示格式,用于指导LLM提取输出,并确保生成的日志模板的质量。

提示格式包括指令、示例和查询。指令描述任务,示例提供任务相关的知识,查询是实际需要解析的日志。

DivLog算法流程:

1. 离线阶段:

使用DPP采样器从离线日志数据中选择具有最大多样性的日志样本。

人工标注这些日志样本,生成日志模板,构建候选集。

2. 在线阶段:

对于每个目标日志消息,使用kNN选择器从候选集中选择最相似的5个日志示例及其模板。

使用提示格式器将选择的示例组合成一个提示。

将提示输入到LLM(例如GPT-3),生成日志模板。

使用正则表达式等方法,从LLM的原始输出中提取最终的日志模板。

基于开源模型微调的

1.The Effectiveness of Compact Fine-Tuned LLMs in Log Parsing

1. 选择小型 LLM: 选择 Mistral-7B Instruct,一个拥有 70 亿参数的 LLM。

2. 准备数据集: 从 LogPai 基准测试集中选取多个日志文件,并进行数据清理和标注,创建用于微调的数据集。

3. 微调 LLM: 使用低秩适应 (LoRA) 技术,对 Mistral-7B 进行微调。

High-precision Online Log Parsing with Large Language Models

基于非LLM的无监督日志解析方法(可用)

日志解析github代码总结:https://github.com/logpai/logparser/tree/main

Brain: Log Parsing With Bidirectional Parallel Tree

提出了一种新的稳定日志解析方法,称为Brain,它根据最长的公共模式创建初始组。然后,使用双向树将常量词分层补充到最长的公共模式中,以有效地形成完整的日志模板。在16个基准数据集上的实验结果表明,我们的方法在两种广泛使用的解析精度指标上优于最先进的解析器,并且处理一百万行日志只需要46秒左右

An Effective Approach for Parsing Large Log Files

提出了一种高度准确和高效的统一日志解析工具ULP。ULP结合了字符串匹配和局部频率分析,以有效的方式解析大型日志文件。首先,使用文本处理方法将日志事件组织成组。然后,对同一组的实例进行频率分析,以识别日志事件的静态和动态内容。当应用于LogPai基准测试的10个日志数据集时,ULP的平均准确率为89.2%,优于四种领先的日志解析工具Drain、Logram、SPELL和AEL的准确率。此外,ULP可以在不到3分钟的时间内解析多达400万条日志事件。ULP可作为开源在线提供,实践者和研究人员可以方便地使用它来有效和高效地解析大型日志文件,以支持日志分析任务。

依赖闭源LLM的日志解析(不可用)

1.Log Parsing: How Far Can ChatGPT Go?

2.Leveraging Large Language Models and BERT for Log Parsing and Anomaly Detection

posted @   云岛夜川川  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示