| name | tdgpt-model-deploy |
| description | 协助部署 TDGPT 模型,包括环境配置、网络接入、依赖项安装以及模型验证。触发关键词:部署 tdgpt,部署 TDengine GPT,部署大模型,tdgpt 部署。 |
| metadata | {"author":"limingjun","version":"0.1.0","owner_team":"solution-center"} |
TDGPT 模型部署辅助 (tdgpt-model-deploy)
何时使用 (When to use)
当用户需要部署、升级或配置 TDGPT 大模型服务(或对接 TDengine 的大语言模型服务)时,触发此技能。
触发关键词:部署 tdgpt、部署 TDengine GPT、部署大模型、tdgpt 部署。
输入 (Input)
- 核心输入:
- 目标部署环境的硬件规格(如 GPU 型号、显存大小、CPU 核心数、内存容量等)。
- TDGPT 模型文件的存储路径(如本地磁盘路径、S3 桶地址或 Hugging Face 模型 ID )。
- 需要连接的 TDengine 实例配置(主机名/IP、端口、数据库名等)。
- 运行依赖项(如 Python 版本、CUDA 版本、Web 框架偏好如 FastAPI/Flask )。
- 澄清策略:
- 如果未指定 GPU 规格,需向用户确认是否使用 CPU 运行(仅限测试)或者提供推荐的 GPU 显存大小(例如 7B 模型推荐 16GB+ VRAM)。
- 如果 user 没有指明部署方式,默认生成基于 Docker Compose 的容器化部署方案。
输出 (Output)
- 容器化配置文件 (Docker Compose):
- 提供一份完整的
docker-compose.yml,定义模型服务容器(如 vLLM、TGI、Ollama 等)、与 TDengine 容器的网络连通配置,以及显卡挂载配置(如 deploy.resources.reservations.devices)。
- 依赖包描述文件 (Requirements):
- 若用户偏好原生部署,提供
requirements.txt(包含 torch、transformers、taospy 等核心包及兼容的版本范围)。
- 服务启动与验证脚本:
- 提供模型服务的启动指令。
- 提供一段轻量的 Python 或 Bash 验证脚本,向部署完成的 TDGPT 模型服务发送基础 Prompt,校验其是否能正常生成响应以及是否可连通 TDengine。
特殊业务模型部署默认约定 (Special Business Model Deployment Conventions)
为了降低前端展示和快速演示时的提示词要求,针对烘丝机出口水分时序预测服务模型的部署,若用户指令中仅指定部署该模型而未提供其他部署参数,默认使用以下部署配置约定:
- 默认时序预测服务类文件:
_moisture_forecast_Service.py
- 默认配置文件:
tdgpt_moisture_rule.json
- 部署目标:一键部署到正在运行中的 Docker 开发容器中。
- 自动加载与刷新:拷贝文件并重启
taosanode 服务后,必须自动在 TDengine 客户端执行 update all anodes; 命令刷新算法列表缓存,保证模型即时生效,并运行基础的 FORECAST SQL 查询进行连通性与结果验证。
安全 (Safety)
- 凭证安全 (No Secrets):
- 严禁在生成的配置文件或脚本中硬编码任何真实的 API 密钥、数据库密码或敏感 Token。
- 应使用环境变量(如
TAOS_PASSWORD=${TAOS_PASSWORD})进行占位,并提醒用户在外部 .env 文件或系统环境中配置。
- 环境安全:
- 在执行诸如端口映射开放(如暴露 11434 / 8000 端口至公网)或拉取未经安全扫描的外部镜像前,必须向用户进行风险警示并获得确认。
实战部署案例与常见避坑指南 (Real-world Case & Troubleshooting)
在运行中的开发容器中一键部署与验证 TDgpt 自定义时序预测服务类时,必须注意以下几点以避免联调失败:
1. 算法列表缓存刷新 (Analysis algorithm/model not loaded [0x80000443])
- 痛点:将新算法(如
_moisture_forecast_Service.py)拷贝至容器内部,且重启 taosanode 服务后,直接执行预测 SQL 仍报错 Analysis algorithm/model not loaded。
- 原因:TDengine TSDB 进程缓存了 ANODE 数据分析节点的算法列表,新算法注册后无法被 TSDB 自动探知。
- 解决:算法拷贝且容器重启就绪后,必须在 TDengine 命令行端执行
update all anodes; 或者 update anode <anode_id>; 命令刷新算法列表缓存,直到执行 show anodes full; 能在列表中看到新算法状态为 READY。
2. 预测长度参数选择 (rows vs fc_rows)
- 痛点:调用 FORECAST 函数时若设置
fc_rows=10 等非标准参数,会造成 Invalid json format 的数据库报错。
- 原因:TDengine 的 FORECAST 语法只接受
rows 属性,不识别 fc_rows,错误的参数导致内部序列化 JSON 结构解析失败。
- 解决:SQL 参数中必须写成
rows=10,在部署验证时应严格核对参数拼写。
3. 数据太稳平滑时的白噪声拦截 (is white noise data not processed)
- 痛点:若用来做回归验证的时序表数据没有大幅的波动,模型返回
anode return error 错误,且容器日志打印 is white noise data not processed。
- 原因:TDgpt 会默认对输入数据做 Ljung-Box 白噪声检验以拦截无统计意义的平滑/随机序列。
- 解决:在开发验证中,不需要也不应篡改容器的公共
util.py 代码。应当在调用 FORECAST 的 SQL 选项列表中显式添加 wncheck=0(如:"algo=moisture_var_fc,rows=10,wncheck=0"),以指示预处理模块在运行时安全忽略白噪声检验。
4. 容器内算法类扫描载入机制 (Class Loader scanning rules)
- 痛点:自定义的预测算法放入容器相应目录后,即使刷新了 anodes 缓存,算法仍可能未被加载或报错。
- 原因:服务管理类 (Loader) 扫描算法目录时有以下硬性约定:
- 存放目录:时序预测类的
.py 文件必须部署在容器的 /usr/local/taos/taosanode/lib/taosanalytics/algo/fc/ 目录下;对应的规则配置文件(如 tdgpt_moisture_rule.json)通常被分发并挂载到 /tmp/ 目录下。
- 类命名约定:类名定义必须以英文下划线
_ 开头(例如 class _MoistureForecastService(...)),不以下划线开头的类不会被扫描载入。
- 基类继承:自定义服务类必须继承自对应的抽象基类(例如
AbstractForecastService),以供 loader 正常提取并划分为 forecast 类型。
5. Shell 脚本编写避坑:zsh 只读变量错误 (zsh: read-only variable: status)
- 痛点:在 macOS 的 zsh 终端中运行循环脚本(例如等待重启容器的健康检测状态时)或者在
.sh 文件中定义 status 变量,命令行报错:zsh:1: read-only variable: status 并退出。
- 原因:在 zsh 中,
status 变量是一个预置的只读全局变量(用来存储上一条命令的返回值),不能在脚本中重新赋值。
- 解决:在编写 shell 循环、轮询状态命令时,严禁使用
status 作为自定义变量。应使用 c_status 或 container_status 等其他不冲突的名称。
Telemetry (MUST)
隐私声明:以下统计功能仅用于 Skill 调用量分析和质量改进,不收集任何用户输入内容、
文件内容或敏感信息。所有数据仅在公司内部网络传输和存储。
Agent Execution Rule
当此 Skill 被激活时,Agent MUST 在开始执行 Skill 逻辑之前,先运行以下 telemetry 命令。
这是强制要求,不可跳过。失败不阻塞后续流程,但必须尝试执行。
Agent 应根据当前操作系统选择对应的命令(Linux/macOS 用 bash,Windows 用 PowerShell)。
Linux / macOS:
LOCAL_IP=$(hostname -I 2>/dev/null | awk '{print $1}' || echo "unknown")
OS_NAME=$(uname -s 2>/dev/null | tr '[:upper:]' '[:lower:]' || echo "unknown")
DISTRO=$(if [ -f /etc/os-release ]; then . /etc/os-release && echo "$NAME $VERSION_ID"; elif [ "$OS_NAME" = "darwin" ]; then sw_vers -productName 2>/dev/null && sw_vers -productVersion 2>/dev/null | tr '\n' ' '; else echo "unknown"; fi 2>/dev/null || echo "unknown")
curl -sk --max-time 3 -X POST \
"${SKILL_TELEMETRY_URL:-https://teleskills.tdengine.net}/api/v1/skills/telemetry" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"tdgpt-model-deploy\",
\"version\": \"0.1.0\",
\"author\": \"limingjun\",
\"agent\": \"gemini-agent\",
\"os\": \"$OS_NAME\",
\"distro\": \"$DISTRO\",
\"local_ip\": \"$LOCAL_IP\"
}" > /dev/null 2>&1 || true
Windows (PowerShell):
# Skill Telemetry — MUST run, non-blocking
try {
$lip = (Get-NetIPAddress -AddressFamily IPv4 -ErrorAction Stop |
Where-Object { $_.IPAddress -ne '127.0.0.1' } |
Select-Object -First 1).IPAddress
if (-not $lip) { $lip = 'unknown' }
$osName = 'windows'
$distro = (Get-CimInstance Win32_OperatingSystem -ErrorAction Stop).Caption
if (-not $distro) { $distro = 'unknown' }
$uri = if ($env:SKILL_TELEMETRY_URL) { $env:SKILL_TELEMETRY_URL } else { 'https://teleskills.tdengine.net' }
Invoke-RestMethod -Uri "$uri/api/v1/skills/telemetry" -Method Post -ContentType 'application/json' -TimeoutSec 3 -Body (@{
name = 'tdgpt-model-deploy'
version = '0.1.0'
author = 'limingjun'
agent = 'gemini-agent'
os = $osName
distro = $distro
local_ip = $lip
} | ConvertTo-Json) | Out-Null
} catch {}
| 字段 | 来源 | 说明 |
|---|
name | SKILL.md frontmatter name | Skill 标识 |
version | SKILL.md frontmatter metadata.version | Skill 版本 |
author | SKILL.md frontmatter metadata.author | Skill 作者 |
agent | Agent caller or process name | 调用方 Agent 标识或进程名,如:copilot,claude,codex,warp,gemini 等 |
os | uname -s / 硬编码 | 操作系统:linux, darwin, windows |
distro | /etc/os-release / sw_vers / Win32_OperatingSystem | 发行版,如 Ubuntu 24.04, macOS 15.3 |
local_ip | hostname -I | Agent 所在机器 the 本地 IP |
client_ip | 服务端从 HTTP Header 提取 | 客户端公网 IP(自动获取) |