时间序列新范式:通过合成数据将时间序列与大语言模型对齐,以增强理解和推理

1. ChatTS概述

ChatTS: Aligning Time Series with LLMs via Synthetic Data for Enhanced Understanding and Reasoning 这篇文章是清华大学、字节跳动与必示科技三方共同创作而成。

在实际的工作中,时间序列在运维领域中占据着非常重要的地位,尤其是近些年大语言模型(LLM)的发展,极大地推动了时间序列这一领域的发展。这篇论文介绍了一个叫做ChatTS的模型,它是专为时间序列分析设计的新型多模态大语言模型(MLLMs)。为缓解训练数据稀缺问题,作者们提出基于属性的合成时间序列生成方法,可自动生成具有详细属性描述的时序数据。同时,作者们创新性地提出时间序列演化式指令生成方法(Time Series Evol-Instruct),通过生成多样化时序问答对来增强模型的推理能力。ChatTS是首个以多元时间序列作为输入,并进行理解和推理的时间序列多模态大语言模型,且完全基于合成的数据集微调。作者们在包含真实数据的基准数据集上开展评估,涵盖6项对齐任务和4项推理任务。

实验结果表明,ChatTS在对齐任务中提升46.0%,在推理任务中提升25.8%,其代码的官方链接是: https://github.com/NetManAIOps/ChatTS,HuggingFace的官方链接是:https://huggingface.co/bytedance-research/ChatTS-14B/tree/main ,模型的权重都可以在HuggingFace上面直接下载并使用。

用一个实际的例子来说明这个情况,那就是用户可以针对某个KPI曲线进行提问,并咨询是否有其他曲线存在了波动,然后并提问根因,大语言模型(LLM)进行了回答。

从图2的描述来看,如果要将多条时间序列进行输入,其实可以至少有四种方法可以执行:

  1. Text-Based:将多条时间序列整理成具体的数值,然后一次性输入给大模型进行分析和输出;
  2. Agent-Based:不同的时间序列输入给不同的大模型,然后一次性汇总之后进行汇总大模型LLM的处理和输出;
  3. Multimodal Vision-Based:将时间序列处理成图片信息,然后通过多模态大模型进行处理和分析,然后输出结果;
  4. Multimodal TS-Based:将多条时间序列的数值直接输入大模型,开发一个Time Series Multimodal LLM并做输出。

ChatTS的亮点是将多维时间序列直接作为输入,然后进行推理和分析。目前是一个14B的模型,它是在QWen2.5-14B-Instruct的基础上进行微调的,其开源代码使用也很简单,可以参考下面的代码:

from transformers import AutoModelForCausalLM, AutoTokenizer, AutoProcessor
import torch
import numpy as np

# Load the model, tokenizer and processor
model = AutoModelForCausalLM.from_pretrained("./ckpt", trust_remote_code=True, device_map=0, torch_dtype='float16')
tokenizer = AutoTokenizer.from_pretrained("./ckpt", trust_remote_code=True)
processor = AutoProcessor.from_pretrained("./ckpt", trust_remote_code=True, tokenizer=tokenizer)
# Create time series and prompts
timeseries = np.sin(np.arange(256) / 10) * 5.0
# 构造异常的时间序列取值
timeseries[100:] -= 10.0
prompt = f"I have a time series length of 256: <ts><ts/>. Please analyze the local changes in this time series."
# Apply Chat Template
prompt = f"<|im_start|>system\nYou are a helpful assistant.<|im_end|><|im_start|>user\n{prompt}<|im_end|><|im_start|>assistant\n"
# Convert to tensor
inputs = processor(text=[prompt], timeseries=[timeseries], padding=True, return_tensors="pt")
# Move to GPU
inputs = {k: v.to(0) for k, v in inputs.items()}
# Model Generate
outputs = model.generate(**inputs, max_new_tokens=300)
print(tokenizer.decode(outputs[0][len(inputs['input_ids'][0]):], skip_special_tokens=True))

如果是使用vLLM推理的话,可以参考这份代码:

import chatts.vllm.chatts_vllm
from vllm import LLM, SamplingParams
# Load the model
language_model = LLM(model="./ckpt", trust_remote_code=True, max_model_len=ctx_length, tensor_parallel_size=1, gpu_memory_utilization=0.95, limit_mm_per_prompt={"timeseries": 50})
# Create time series (np.ndarray) and prompts (chat_templated applied)
ts1, ts2 = ...
prompt = ...
# Model Inference
outputs = language_model.generate([{
      "prompt": prompt,
      "multi_modal_data": {"timeseries": [ts1, ts2]}
  }], sampling_params=SamplingParams(max_tokens=300))

2 ChatTS方法论

2.1 模块划分

从论文的介绍来看,ChatTS的数据模块大概可以分成以下几个情况:

  1. Attribute Selector:属性选择器,主要用于精准的属性选择,方便生成满足这些属性的时间序列;属性包括趋势类(稳定趋势、上升趋势、下降趋势等),周期类(三角函数、正方形、无周期等),局部波动类,是否存在噪声等类别。
  2. Attribute-Based Time Series Generator:基于属性的时间序列生成器,可以使用规则的方法进行生成;
  3. Time Series Evol-Instruct:时间序列演化式指令,用于生成大量的、多样的、精准的时间序列,并且有相应的文本回答,属于一个(time series,text question-answer)的信息;
  4. 模型设计(model design):使用了多维时间序列作为数据的输入;
  5. 模型训练(model training):使用了监督微调(SFT,Supervised Fine-Tuning)的方法,在已有模型的基础上进行了微调;

整体的流程可以参考下图的方法:通过选择不同的属性,生成不同的样本数据,以及相应的问题和答案。

同样的,时间序列的相应指令可以参考下图:

2.2 模型微调

而在模型微调的时候,需要将时间序列和文本进行分别输入,按照一定的格式进行编码,其中包括对时间序列的解释,以及相应的问题和答案。

而ChatTS的样本训练大约是万这个量级,在现有模型的基础上即可微调出不错的结果。

ChatTS的训练可以在QWen2.5-14B-Instruct的基础上进行两阶段的微调,包括大尺度的微调训练(large-scale alignment training)和监督微调(SFT)。具体的问答案例可以参考图8的内容。

模态对齐训练阶段

在第一阶段,我们使用基于属性的合成时间序列数据进行大规模对齐训练,以建立大语言模型中文本与时序模态的初步对齐。此阶段使ChatTS能够有效实现文本描述与时序属性的语义映射。在模态对齐阶段,通过手工设计模板和LLM精炼构建了三个训练数据集:

  • UTS(单变量时间序列)数据集 :包含单变量时序基础属性描述任务(涵盖全局与局部属性分析);
  • MTS-Shape(多元形态)数据集 :由具有全局趋势相关性的多元数据构成,旨在增强模型分析多元相关性的能力;
  • MTS-Local(多元局部)数据集 :包含局部波动相关的多元数据,重点提升模型对多元时序局部特征的分析能力;

鉴于多元时序(MTS)具有更复杂的特征组合,我们将MTS与UTS的训练数据规模设定为约2:1的比例(具体训练数据规模对模型性能的影响详见第4.5节的数据集扩展研究)。

监督微调阶段

在第二阶段,通过监督微调(SFT)开发模型执行复杂问答与推理任务的能力。该阶段主要使用两类训练数据:

  • TSEvol生成数据集 :通过时间序列演化式指令生成方法(Time Series Evol-Instruct)构建,用于增强模型对时序问题的问答推理能力;
  • 指令遵循(IF)数据集 :基于预定义模板构建,专门训练模型遵循特定响应格式;

对于TSEvol方法,我们使用对齐训练阶段的数据集配合LLM生成的问答对作为种子数据。通过联合训练,使多模态大语言模型能够精准响应时序领域查询,并强化其处理上下文驱动的复杂推理任务的能力。在模态对齐和监督微调阶段,我们通过系列数值任务系统提升ChatTS的数值分析能力,包括:极值识别、分段均值计算、局部特征提取(如尖峰位置/幅度)、季节性与趋势振幅分析、以及单点原始数值解析。实验结果中的数值评估指标验证了ChatTS在时序数值分析方面的卓越性能。

训练配置

  • 数据格式:两阶段均采用问答对格式。在模态对齐阶段混入少量IF数据以缓解指令遵循能力退化;
  • 防止过拟合策略:SFT阶段混30%对齐训练数据集;
  • 时序长度覆盖:训练数据包含64-1024长度的时序序列,确保模型处理变长时序的能力;
  • 训练框架:基于DeepSpeed和LLaMA-Factory [65]进行全参数监督微调,基础模型选用Qwen2.5-14B-Instruct;
  • 推理环境:Qwen与ChatTS均采用DeepSpeed框架部署。

3 ChatTS评估方法

3.1 数据的评估

本节通过回答以下研究问题(research questions)全面评估ChatTS的性能:

  • RQ1:ChatTS与时序数据的对齐效果如何?
  • RQ2:ChatTS在时序推理任务中的表现如何?
  • RQ3:基于属性的合成数据与TSEvol方法是否有效?
  • RQ4:训练集规模如何影响模型性能?
  • RQ5:ChatTS的时序模态设计是否真正发挥作用?
  • RQ6:ChatTS的原生时序多模态能力是否优于代理型方法?

参照多模态大语言模型通用评估范式,我们将评估任务分为两类:

  1. 对齐任务(验证文本-时序语义映射):(1)单变量任务:趋势识别、季节性检测、噪声分析、局部波动分析(含分类与数值子任务)(2)多元任务:相关性分析、聚类分析(均为分类任务)
  2. 推理任务(验证时序逻辑推演能力) (1)归纳推理:问答任务,对单/多元时序物理意义进行归纳总结(2)演绎推理:判断题(T/F),基于预设条件与单变量时序进行逻辑推演(3)因果推理:选择题,根据单变量时序选择最可能诱因(4)比较推理(MCQ2):选择题,对比两组时序选择正确答案

评估指标可以使用相对准确率:

验证数据集采用以下数据:

从模型的数据效果来看,相对其他开源模型和API的使用结果来看,ChatTS都获得了不错的数据表现:

3.2 实战的评估

除了理论上的应用之外,ChatTS还可以用于各种实际的场景,例如形状与统计值分析:

可以进行数据库的失效分析:

还支持时间序列数据的细节分析:

4 ChatTS论文总结

针对时间序列理解与推理领域长期存在的跨模态数据稀缺难题,本文提出首个支持多元时序输入的多模态大语言模型ChatTS,开辟了基于合成数据的时序语义对齐新模式,核心贡献体现在三个维度:

  1. 首创属性驱动的时序合成引擎,通过参数化建模生成兼具多样性和精确标注的时序-文本对,突破真实数据标注成本限制;
  2. 开发时序演化式指令生成框架(TSEvol),融合属性组合推理与Evol-Instruct机制,构建出覆盖复杂推理场景的20.8万高质量QA对;
  3. 建立多维度评估体系,在包含真实场景的跨领域数据集上验证模型性能,在时序对齐任务(F1=0.823)和因果推理任务(Acc=78.4%)上分别实现46.0%和25.8%的绝对性能提升,显著超越GPT-4o等基线模型。本研究不仅证实了合成数据在跨模态学习中的可行性,更为时序分析范式从传统特征工程向语义理解跃迁提供了技术基础设施,相关代码、模型及数据集已在GitHub开源。

这些成果验证了该方法在弥合时间序列数据与自然语言理解鸿沟方面的有效性。作者们已开源源代码、训练模型权重及评估数据集以供复现和后续研究:https://github.com/NetManAIOps/ChatTS。