-- V12: AI 自然语言控制地基表 -- 设计说明: -- 1) ai_alias 统一别名库:把用户的口语说法映射到真实目标(设备/场景/房间) -- 这是 AI 控制准确率的"地基",因为涂鸦设备 device_type 多为空, -- 仅靠 device_name 无法稳定匹配(如用户说"客厅开关"而设备名叫"dvevo1")。 -- 2) ai_device_profile 设备控制档案:记录开/关等真实指令码(如 switch_1/switch_led), -- 由 iot-device 侧通过涂鸦状态接口自动探测写入,iot-rule 侧读取使用。 -- 3) ai_command_log 指令日志与纠错反馈:记录每次自然语言解析与执行结果, -- 用户纠正后的目标会回写为别名,形成"越用越准"的正循环。 -- ============ 1. 别名库 ============ CREATE TABLE IF NOT EXISTS ai_alias ( id BIGINT NOT NULL COMMENT '主键', target_type VARCHAR(16) NOT NULL COMMENT '目标类型: device/scene/room', target_id VARCHAR(64) NOT NULL COMMENT '目标ID: device.device_id / scene.id / room.id', alias VARCHAR(64) NOT NULL COMMENT '用户说法(原始)', normalized VARCHAR(64) NOT NULL COMMENT '归一化别名(去空格标点+小写, 匹配用)', owner_id BIGINT NOT NULL COMMENT '归属用户ID(member.id)', home_id BIGINT NULL COMMENT '归属家庭ID(home.id)', source VARCHAR(16) NOT NULL DEFAULT 'manual' COMMENT '来源: manual手动/learned纠正学习/import导入', hit_count INT NOT NULL DEFAULT 0 COMMENT '命中次数(用于优先级排序)', enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用: 1启用 0停用', deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除: 0正常 1删除', create_time DATETIME NULL COMMENT '创建时间', update_time DATETIME NULL COMMENT '更新时间', tenant_id BIGINT NULL COMMENT '租户ID', create_by BIGINT NULL COMMENT '创建人', update_by BIGINT NULL COMMENT '更新人', PRIMARY KEY (id), KEY idx_ai_alias_match (owner_id, target_type, normalized, deleted), KEY idx_ai_alias_target (target_type, target_id, deleted) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI 自然语言别名库'; -- ============ 2. 设备控制档案 ============ CREATE TABLE IF NOT EXISTS ai_device_profile ( id BIGINT NOT NULL, device_id VARCHAR(64) NOT NULL COMMENT '设备业务ID(device.device_id)', owner_id BIGINT NOT NULL COMMENT '设备归属用户ID', power_code VARCHAR(64) NULL COMMENT '开/关指令码, 如 switch_1 / switch_led / switch', power_on_value VARCHAR(64) NOT NULL DEFAULT 'true' COMMENT '开启时下发的值', power_off_value VARCHAR(64) NOT NULL DEFAULT 'false' COMMENT '关闭时下发的值', brightness_code VARCHAR(64) NULL COMMENT '亮度指令码, 如 bright_value', color_temp_code VARCHAR(64) NULL COMMENT '色温指令码, 如 temp_value', temperature_code VARCHAR(64) NULL COMMENT '温度设定指令码, 如 temp_set', mode_code VARCHAR(64) NULL COMMENT '模式指令码, 如 mode', source VARCHAR(16) NOT NULL DEFAULT 'auto' COMMENT '来源: auto状态探测/manual手动/type-default类型默认', raw_status TEXT NULL COMMENT '探测到的原始状态JSON(排查用)', enabled TINYINT NOT NULL DEFAULT 1, deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME NULL, update_time DATETIME NULL, tenant_id BIGINT NULL, create_by BIGINT NULL, update_by BIGINT NULL, PRIMARY KEY (id), KEY idx_ai_profile_device (device_id, deleted), KEY idx_ai_profile_owner (owner_id, deleted) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI 设备控制指令码档案'; -- ============ 3. 指令日志与反馈 ============ CREATE TABLE IF NOT EXISTS ai_command_log ( id BIGINT NOT NULL, owner_id BIGINT NOT NULL COMMENT '发起用户ID', input_text VARCHAR(500) NOT NULL COMMENT '用户原始输入', normalized_text VARCHAR(500) NULL COMMENT '归一化后的文本', parse_source VARCHAR(16) NULL COMMENT '解析来源: rule规则模板/llm大模型', intent_type VARCHAR(32) NULL COMMENT '意图类型: device_control/scene_execute/query/unknown', action VARCHAR(32) NULL COMMENT '动作: turn_on/turn_off/set_brightness等', matched_type VARCHAR(16) NULL COMMENT '命中目标类型: device/scene', matched_id VARCHAR(64) NULL COMMENT '命中目标ID', matched_name VARCHAR(64) NULL COMMENT '命中目标名称', confidence DECIMAL(4,3) NULL COMMENT '置信度 0-1', success TINYINT NOT NULL DEFAULT 0 COMMENT '是否执行成功', reply VARCHAR(500) NULL COMMENT '返回给用户的回复文案', candidates VARCHAR(2000) NULL COMMENT '歧义候选JSON(用于前端二次确认)', corrected_target_id VARCHAR(64) NULL COMMENT '用户纠正后的目标ID(学习数据)', cost_ms INT NULL COMMENT '解析+执行耗时(毫秒)', deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME NULL, update_time DATETIME NULL, tenant_id BIGINT NULL, create_by BIGINT NULL, update_by BIGINT NULL, PRIMARY KEY (id), KEY idx_ai_log_owner_time (owner_id, create_time), KEY idx_ai_log_text (owner_id, normalized_text) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI 指令日志与纠错反馈';