AI_FILTER

更新时间:
复制 MD 格式

AI_FILTER 是 Hologres 提供的 AI Function,用于在 SQL 中直接对文本或文件进行「真/假」的语义判断,返回 BOOLEAN 结果。本文为您介绍 AI_FILTER 的使用限制、语法和使用示例。

功能介绍

AI_FILTER 将大语言模型的语义理解能力封装成一个标准的布尔函数,可以用在 SELECT 列表、WHERE 过滤条件、JOIN ON 关联条件等任意需要布尔值的位置,无需额外的 UDF 或外部服务集成。

典型使用场景如下:

  • 评论、反馈的情感或意图筛选,例如判断「客户是否满意」。

  • 内容合规、垃圾信息、敏感内容判断。

  • 在没有外键关系时,基于语义做关联 JOIN。

  • 图片内容识别,例如判断「图片中是否包含猫」。

使用限制

  • 版本要求:仅 Hologres V4.2.12 及以上版本支持。

  • 需先部署托管模型:使用前需在 Hologres 控制台部署托管模型。具体操作,请参见托管模型

  • return_error_details 参数:只接受省略或 TRUE。省略时,出错的行返回 NULL;取值为 TRUE 时,返回 OBJECT 类型的 {"value": ..., "error": ...};取值为 FALSE 时不被接受,会直接报错并提示改用不带该参数的重载。

  • 行级容错:批量处理多行时,出错的行返回 NULL,不会中断整个查询。

  • 结果非确定性:布尔结果由模型的语义判断决定,同一输入在不同模型或不同模型版本下可能存在差异,不保证结果完全一致。

语法

-- 语法一:对输入文本做布尔判断
AI_FILTER( <model_name>, <input> [, <return_error_details> ] )

-- 语法二:对单个文件(如图片)做布尔判断
AI_FILTER( <model_name>, <predicate>, <file> [, <return_error_details> ] )

-- 语法三:使用 PROMPT 模板拼装多列、混合文本与文件的输入
AI_FILTER( <model_name>, PROMPT('<template_string>', <col_1>, ... ) [, <return_error_details> ] )

参数说明

参数名

参数含义

是否必填

model_name

模型名,TEXT 类型。

input

待判断的文本陈述,TEXT 类型。函数会在陈述前自动拼接一段「判断以下陈述为 TRUE 还是 FALSE」的提示词,由模型返回布尔结果。

predicate

判断指令,TEXT 类型,描述如何对 file 做布尔分类,例如 '图片中是否包含猫?'

file

待判断的文件列,FILE 类型。可以使用 IMAGE FILE 作为输入,通过 to_file() 或 Object Table 提供。

PROMPT('<template_string>', <col_1>, ...)

对于复杂提示词,尤其是多列或混合文本与文件的场景,使用 PROMPT() 拼装输入,支持文本与 FILE 类型的格式化。

return_error_details

布尔标志,BOOLEAN 类型,指示出错时是否返回错误详情。省略时,出错返回 NULL;取值为 TRUE 时,返回 OBJECT 类型的 {"value": ..., "error": ...};取值为 FALSE 时不被接受并报错。

错误行为

默认情况下,如果 AI_FILTER 无法处理某一行输入,该行返回 NULL,查询继续执行,不会中断。返回值取决于 return_error_details 参数。

return_error_details 取值

返回值

说明

省略或 TRUE(执行成功)

BOOLEAN 类型的 truefalse,或 OBJECT 类型的 {"value": bool, "error": null}

正常结果。

省略(执行失败)

NULL

行级错误,查询继续执行。

TRUE(执行失败)

{"value": null, "error": "<msg>"}

错误详情作为 OBJECT 返回。

FALSE

报错

不支持该取值,报错并引导改用不带该参数的重载。

传入 FALSE 时的报错信息如下:

ERROR: ai_filter: return_error_details must be TRUE when specified;
       use ai_filter(model_name, input) for BOOLEAN output
HINT:  Call ai_filter(model_name, input) to get a BOOLEAN result on error (NULL).

使用示例

以下示例均使用 Hologres 托管模型 qwen3.8-max 执行。

示例一:对输入文本应用 AI_FILTER

SELECT ai_filter('qwen3.8-max', '天空是蓝色的');

返回结果:

+------+
| ?    |
+------+
| t    |
+------+

示例二:在 WHERE 子句中做语义过滤

筛选出表达正面评价的订单评论。

SELECT order_id, order_comments
FROM (VALUES
  (1, '质量很好,物流也快,非常满意'),
  (2, '包装破损,客服态度差'),
  (3, '一般般,凑合用')
) AS orders(order_id, order_comments)
WHERE ai_filter('qwen3.8-max', '客户是否喜欢这个商品:' || order_comments);

返回结果:

+----------+----------------------------------------+
| order_id | order_comments                         |
+----------+----------------------------------------+
|        1 | 质量很好,物流也快,非常满意            |
+----------+----------------------------------------+

示例三:使用 PROMPT 函数拼装输入

SELECT ai_filter(
  'qwen3.8-max',
  prompt('{0} 是否被描述为 {1}?', '无线鼠标', '一款黑色的人体工学鼠标')
) AS consistent;

返回结果:

consistent
---------
f

示例四:在 JOIN 条件中做语义关联

投诉表中没有部门 ID,无法使用传统外键 JOIN。此时可以用 AI_FILTER 判断某条投诉是否应由某个部门处理,并将其作为 JOIN 条件。

SELECT t.ticket_id, t.issue_text, d.department_name
FROM (VALUES
  (201, '手机屏幕碎了,想申请保修维修'),
  (202, '扣款成功了但订单状态一直没更新'),
  (203, '登录时收不到短信验证码')
) AS t(ticket_id, issue_text)
JOIN (VALUES
  ('售后服务'),
  ('订单运营'),
  ('账号支持')
) AS d(department_name)
ON ai_filter(
  'qwen3.8-max',
  prompt('下面这条用户问题是否应该由"{0}"负责处理?只根据语义判断。用户问题:{1}',
         d.department_name, t.issue_text)
);

返回结果:

ticket_id | issue_text                     | department_name
----------|--------------------------------|----------------
      201 | 手机屏幕碎了,想申请保修维修     | 售后服务
      202 | 扣款成功了但订单状态一直没更新   | 售后服务
      202 | 扣款成功了但订单状态一直没更新   | 订单运营
      203 | 登录时收不到短信验证码           | 账号支持

示例五:对图片文件应用 AI_FILTER

SELECT id,
       ai_filter(
         'qwen3.8-max',
         '图片中是否包含猫?',
         to_file(img_path, 'oss-cn-hangzhou-internal.aliyuncs.com', 'acs:ram::<ACCOUNT_ID>:role/<ROLE_NAME>')
       ) AS has_cat
FROM (VALUES
  (1, 'oss://my-bucket/cat.png'),
  (2, 'oss://my-bucket/dog.png')
) AS images(id, img_path);

返回结果:

+----+---------+
| id | has_cat |
+----+---------+
|  1 | t       |
|  2 | f       |
+----+---------+

示例六:返回错误详情

return_error_details 设置为 TRUE,返回 OBJECT 类型的结果。

SELECT ai_filter('qwen3.8-max', '水在100摄氏度沸腾', TRUE) AS result;

返回结果:

+----------------------------------+
| result                           |
+----------------------------------+
| {"value": true, "error": null}   |
+----------------------------------+
说明

如需 BOOLEAN 类型的输出,请省略 return_error_details 参数。传入 FALSE 会直接报错。