TDgpt 使用 — 部署、SQL、算法

分类 :18.TDgpt | 篇章:02 TDgpt 使用

免费详情

本文讲解 TDgpt 的部署、SQL 函数(FORECAST、ANOMALY_WINDOW)的用法、算法配置和实战案例。

速查表

函数 作用
FORECAST 时序预测
ANOMALY_WINDOW 异常窗口
INTERP 插值填充
SHOW ANODES 列出算法节点
CREATE ANODE 注册节点

详细解析

1. 部署 Anode

bash 复制代码
# Anode 是 TDgpt 的算法服务进程
# 通常作为单独包安装

# 1. 安装(Linux)
wget https://www.taosdata.com/assets-download/3.0/TDengine-tdgpt-3.x.x-Linux-x64.tar.gz
tar xzf TDengine-tdgpt-3.x.x-Linux-x64.tar.gz
cd TDengine-tdgpt-3.x.x/
sudo ./install.sh


# 2. 配置(/etc/taos/taosanode.cfg)
# 端口、算法路径、日志等


# 3. 启动
systemctl start taosanoded
systemctl enable taosanoded


# 4. 注册到 TDengine
taos -s "CREATE ANODE '<anode_host>:6090'"


# 5. 验证
taos -s "SHOW ANODES"
taos -s "SHOW ANODES FULL"
sql 复制代码
-- 查看注册的算法节点
SHOW ANODES;
SHOW ANODES FULL;


-- 查看节点提供的算法
SELECT * FROM information_schema.ins_anodes;


-- 删除节点
DROP ANODE 1;


-- 更新(重新加载算法)
UPDATE ANODE 1;

2. FORECAST 函数

sql 复制代码
-- 基本语法
SELECT _wstart, FORECAST(column, count, options) 
FROM table 
WHERE ts > start AND ts <= end 
INTERVAL(window);


-- 示例 1: 默认算法预测未来 12 个点
SELECT _wstart, 
       FORECAST(temp, 12) AS pred 
FROM sensors 
WHERE device = 'd1' AND ts > NOW - 7d 
INTERVAL(1h);


-- 示例 2: 指定算法
SELECT _wstart, 
       FORECAST(temp, 24, "algo=holtwinters") AS pred 
FROM sensors 
WHERE ts > NOW - 30d 
INTERVAL(1d);


-- 示例 3: 带参数
SELECT _wstart,
       FORECAST(load_kw, 24, "algo=arima,p=2,d=1,q=2") AS pred 
FROM substations 
WHERE id = 'S001' AND ts > NOW - 7d 
INTERVAL(1h);


-- 支持算法(可能因版本变化):
--   algo=holtwinters   季节性
--   algo=arima         自回归
--   algo=prophet       通用
--   algo=lstm          深度学习(需 GPU/CPU)
--   algo=auto          自动选择

3. ANOMALY_WINDOW 函数

sql 复制代码
-- 基本语法(窗口子句)
SELECT _wstart, _wend, aggregations 
FROM table 
WHERE ts > start 
ANOMALY_WINDOW(column, options);


-- 示例 1: 默认 IQR 异常检测
SELECT _wstart, _wend, 
       AVG(temp) AS avg_temp,
       MAX(temp) AS max_temp 
FROM sensors 
WHERE device = 'd1' AND ts > NOW - 1d 
ANOMALY_WINDOW(temp);


-- 示例 2: 指定算法和阈值
SELECT _wstart, _wend, COUNT(*) AS anomaly_points 
FROM sensors 
WHERE ts > NOW - 7d 
ANOMALY_WINDOW(temp, "algo=zscore,threshold=3");


-- 示例 3: 多设备
SELECT _wstart, _wend, device, AVG(temp) 
FROM sensors 
WHERE ts > NOW - 1d 
PARTITION BY device 
ANOMALY_WINDOW(temp, "algo=iqr");


-- 支持算法:
--   algo=iqr          四分位距
--   algo=zscore       标准差倍数
--   algo=lof          局部离群因子
--   algo=isolation    孤立森林

4. INTERP 智能填充

sql 复制代码
-- 在范围内每秒生成插值
SELECT _wstart, 
       INTERP(temp) AS smooth_temp 
FROM sensors 
WHERE device = 'd1' 
  AND ts >= '2026-06-04 00:00:00' 
  AND ts < '2026-06-04 01:00:00' 
RANGE('2026-06-04 00:00:00', '2026-06-04 01:00:00', 1s) 
FILL(LINEAR);


-- 插值方法(FILL):
--   NONE      不填
--   VALUE x   固定值
--   PREV      前值
--   NEXT      后值
--   LINEAR    线性
--   NULL      空值


-- 与 FORECAST 结合
WITH historical AS (
  SELECT _wstart AS t, AVG(temp) AS temp 
  FROM sensors WHERE ts > NOW - 7d 
  INTERVAL(1h)
),
predicted AS (
  SELECT _wstart AS t, FORECAST(temp, 24) AS temp 
  FROM historical
)
SELECT * FROM historical 
UNION ALL 
SELECT * FROM predicted;

5. 流计算中使用

sql 复制代码
-- 实时异常告警流
CREATE STREAM anomaly_stream 
INTO anomaly_log AS 
SELECT _wstart, _wend, device, COUNT(*) AS pts 
FROM sensors 
PARTITION BY device 
ANOMALY_WINDOW(temp, "algo=iqr");


-- 实时滚动预测
CREATE STREAM forecast_stream 
TRIGGER WINDOW_CLOSE 
INTO forecast_log AS 
SELECT _wstart, device, 
       FORECAST(temp, 6, "algo=holtwinters") AS pred 
FROM sensors 
WHERE ts > NOW - 24h 
PARTITION BY device 
INTERVAL(1h);


-- 注意:流计算中 AI 函数有性能开销
-- 控制 partition 数量
-- 控制窗口大小

6. 实战案例

sql 复制代码
-- 案例 1: 电力负荷预测

-- 历史 30 天,预测未来 24 小时
SELECT 
  _wstart, 
  substation_id, 
  AVG(load_kw) AS hist_load,
  FORECAST(load_kw, 24, "algo=holtwinters,period=24") AS pred_24h 
FROM grid 
WHERE ts > NOW - 30d 
PARTITION BY substation_id 
INTERVAL(1h);


-- 案例 2: 设备异常检测告警

CREATE STREAM motor_anomaly 
INTO alerts AS 
SELECT 
  _wstart, _wend, motor_id, 
  AVG(vibration) AS vib_avg,
  MAX(vibration) AS vib_max,
  'anomaly_detected' AS alert_type 
FROM motors 
WHERE ts > NOW - 1m 
PARTITION BY motor_id 
ANOMALY_WINDOW(vibration, "algo=zscore,threshold=3");


-- 案例 3: 风电场出力预测

SELECT 
  _wstart, turbine_id,
  AVG(wind_speed) AS avg_ws,
  FORECAST(power_kw, 4, "algo=prophet") AS pred_power 
FROM wind_farm 
WHERE ts > NOW - 7d 
PARTITION BY turbine_id 
INTERVAL(15m);


-- 案例 4: 服务器性能异常

SELECT _wstart, _wend, host, AVG(cpu) AS avg_cpu 
FROM servers 
WHERE ts > NOW - 1h 
PARTITION BY host 
ANOMALY_WINDOW(cpu, "algo=iqr");

7. 算法调优

复制代码
算法选择:

  ① 数据有强季节性 → Holt-Winters / Prophet
     例:日/周/月模式
     
  ② 数据平稳 + 自相关 → ARIMA
     例:传感器小幅波动
     
  ③ 复杂非线性 → LSTM
     例:长期依赖
     
  ④ 不确定 → auto


参数调优:

  Holt-Winters:
    period: 季节周期(关键)
    - 小时数据日周期:24
    - 小时数据周周期:168
    - 天数据周周期:7
    
  ARIMA:
    p, d, q: 模型阶数
    - 默认 auto 可
    - 大量历史数据时手动可优化
    
  Prophet:
    - 自动检测季节性
    - 支持节假日
    
  LSTM:
    - 训练时间长
    - 推理较慢
    - 适合复杂时序


异常检测调参:

  IQR:
    factor: 四分位间距倍数(默认 1.5)
    - 严格:1.0
    - 宽松:2.0
    
  Z-Score:
    threshold: 标准差倍数(默认 3)
    - 严格:2
    - 宽松:4

8. 性能与最佳实践

复制代码
性能优化:

  ① 控制输入数据量
     - 充足历史(够拟合)但不过多
     - 通常几百到几千点
     
  ② 选轻量算法
     - 实时场景:IQR / Z-Score / Holt-Winters
     - 离线分析:可用 LSTM
     
  ③ 缓存预训练模型(视实现)
     - 减少重复训练
     
  ④ 流计算并发控制
     - PARTITION BY 数量适中
     - 避免每秒大量调用


最佳实践:

  ✓ 先用简单算法(IQR/Holt-Winters)
  ✓ 评估精度后再升级到 ML
  ✓ 大规模并发用 Anode 集群
  ✓ 关键业务做 A/B 验证
  ✓ 监控算法执行时长


注意事项:

  ✗ 不要把 AI 当万能
     - 数据质量影响结果
     - 业务规则更可靠的优先用规则
  
  ✗ 不要每个 SQL 都用 FORECAST
     - 预测开销不小
     - 用流计算定期算一次
  
  ✗ 不要忽略数据预处理
     - 缺失值
     - 异常值(用 INTERP 处理后再预测)

代码示例

综合应用

python 复制代码
import taosws
import json

conn = taosws.connect("...")

# 1. 预测 + 告警
def predict_and_alert(substation_id):
  result = conn.query(f"""
    SELECT FORECAST(load_kw, 24, "algo=holtwinters,period=24") AS pred 
    FROM substations 
    WHERE id = '{substation_id}' AND ts > NOW - 7d 
    INTERVAL(1h)
  """)
  
  for ts, pred in result:
    if pred > 1000:
      send_alert({
        "substation": substation_id,
        "timestamp": ts,
        "predicted_load": pred,
        "threshold": 1000
      })


# 2. 异常分析报告
def daily_anomaly_report():
  result = conn.query("""
    SELECT _wstart, _wend, device, COUNT(*) AS pts 
    FROM sensors 
    WHERE ts > NOW - 1d 
    PARTITION BY device 
    ANOMALY_WINDOW(temp, "algo=iqr")
  """)
  
  return [
    {"start": s, "end": e, "device": d, "anomaly_count": c}
    for s, e, d, c in result
  ]


# 3. 数据补全
def fill_gaps(device_id, start, end):
  conn.execute(f"""
    INSERT INTO sensors_filled 
    SELECT _wstart, '{device_id}', INTERP(temp) 
    FROM sensors 
    WHERE device = '{device_id}' AND ts >= '{start}' AND ts < '{end}' 
    RANGE('{start}', '{end}', 1m) 
    FILL(LINEAR)
  """)

性能考量

调用开销

操作 延迟
FORECAST 简单 100ms~1s
FORECAST LSTM 1s~10s
ANOMALY_WINDOW IQR < 100ms
ANOMALY_WINDOW ML 500ms+

资源规划

并发预测/秒 Anode 数
< 10 1
10~100 2~3
100~1000 多个 + GPU

FAQ

Q1: 不部署 Anode 能用吗?

部分简单功能(INTERP)原生支持,FORECAST/ANOMALY_WINDOW 需 Anode。

Q2: 算法不准怎么办?

  • 检查数据质量
  • 尝试其他算法
  • 调整算法参数
  • 增加历史数据
  • 考虑业务规则补充

Q3: 能定时执行预测吗?

  • 用流计算(CREATE STREAM)
  • 或外部调度(cron)调 SQL

Q4: GPU 必需吗?

不必需。统计算法 CPU 即可。LSTM 等深度模型用 GPU 更快。

Q5: 自定义算法?

支持。开发算法插件,部署到 Anode。详见官方算法插件文档。

参考

系统构架篇

数据模型

存储引擎

查询引擎

数据写入

数据订阅

预聚合

索引

SQL 语句

客户端与连接器

运维

安全

生态

应用案例

产品对比

内部机制

TDgpt

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
DBA_G2 小时前
GBase 8a数据库表空间多路径功能特点综述
数据库·oracle
starzy19902 小时前
Flink基础之Transformation API详解及代码实现:从map到connect
大数据·flink
不会就选b2 小时前
数据结构之树&&二叉树(四)
数据结构·算法
hansang_IR2 小时前
【题解】P4456 [CQOI2018] 交错序列(矩阵乘法)
c++·线性代数·算法
字节跳动数据平台2 小时前
PDF 文档解析算子全新升级!不仅“读得懂”,更让解析结果直接可用
大数据
爱吃火鸡面呀2 小时前
HDFS 文件读取流程深度解析:从客户端请求到数据落地的完整链路
大数据·hadoop·hdfs
数模加油站2 小时前
26数模国赛C题|思路第3弹【顶流思路+深度攻略】
算法·数学建模·数学建模竞赛·国赛·26国赛
晴天¥2 小时前
Oracle 19c数据库内存管理优化(内存管理方式调整及内存扩容)
数据库·oracle·oracle数据库集群调优
回忆2012初秋2 小时前
DBX:一个现代化的轻量级、跨平台的开源数据库管理工具
大数据·服务器·网络