语义富化

本文介绍基于SLS提供的语义富化能力,从日志中提取关键信息和知识。

语义富化概述

日志分为结构化日志和非结构化日志。针对不同类型的日志,通常有不同的分析处理手段。

  • 结构化日志:通常具有定义清晰的schema和类型,基于SQL计算引擎,可以对结构化日志进行统计操作。

  • 非结构化日志:通常是长文本,例如LLM聊天历史、Agent交互日志。通常需要人工介入提取有价值的信息。

SLS推出的语义富化能力,借助于LLM处理自然语言的能力,从非结构化日志中提取关键和有效的信息。

支持地域

语义富化仅限于中国内地使用,不适用于海外区域。

大语言模型(LLM)函数

ai_gen()函数

语法

ai_gen(prompt varchar)

或者

ai_gen(prompt varchar, model varchar)

参数说明

参数

说明

prompt

提供给大模型的数据

model

模型选择,目前可选的模型:

  • qwen-turbo

返回值

row(
 result varchar
 error_msg varchar
)

字段名

说明

result

大模型生成的内容

error_msg

错误信息。为 null 表示成功

最佳实践

由于大模型的上下文有限,我们不可能给大模型输入太多数据。为了尽可能的利用大模型的上下文能力,我们需要尽可能的提供给大模型高质量的上下文,上下文不能有重复内容。因此最佳实践遵循以下流程:

  1. 先对海量数据进行聚类,聚类函数请参考向量索引中的说明。

  2. 对于聚类结果:

    1. 如果要对每个类别分别调用大模型,则分别从每一个类别中随机选择10-20个样本,每个类别组装成一个prompt。

    2. 如果要对所有的类别整体调用大模型,那么把所有的类别的样本分别随机选择1-2个样本合并在一起,形成一份完整的样本。形成一个大的prompt。

  3. 把指令和数据进行拼装。

  4. 调用大模型ai_gen函数。

  5. 对大模型的输出进行后处理。

示例

* | set session enable_remote_functions=true;set session spl_sql_force_run_velox = true;
 with t1 as (select  array[input,'' ]   as x, "input__embedding__"  as embd from log where input <> 'null' and input__embedding__ is not null limit 5000),
t2 as (select cluster(array_agg(embd),'kmeans','{
  "n_clusters": "10",
  "max_iter": "100",
  "tol": "0.0001",
  "metric":"cosine",
  "init_mode": "kmeans++"
}') as cluster_res, array_agg(x) as xs from t1),
t3 as (select label,x from t2,unnest(cluster_res.assignments,xs) as t(label,x) ),
t4 as (select cast(label as bigint) as "聚类id",array_join(slice(array_distinct(array_agg((x[1]))),1,5),concat(chr(10),'----',chr(10))) as "content" ,count(1) as pv from t3 group by label),
t5 as (select array_join(array_agg(content),concat(chr(10),'----',chr(10))) as content from t4),

xt1 as (
 select
    
    "content" as trans,  -- 此处是待处理数据
    '{{query}}' as targets,  --此处是评估模板中的占位符
    '{"model":"<QWEN_MODEL>","input":{"messages":[{"role":"system","content":"<SYSTEM_PROMPT>"},{"role":"user","content":"<USER_PROMPT>"}]}}' as body_template, --此处为访问百炼的body模板
    cast('```{{query}}```。 请你对以上文本中的任务场景进行归类,例如NL2SQL场景等' as varchar) as eval_prompt --此处为评估模板,包含了指令信息和占位符
   FROM    t4
  ),
  xt1_1 as (
   select
        body_template,
    eval_prompt,
    replace(eval_prompt, targets, trans) as eval_content,
    trans
   FROM    xt1
  ),
  xt2 as (
   select
        body_template,
    eval_content,
    trans
   FROM    xt1_1
  ),
  xt3 as (
   select
        trans as oldeval,
    body_template,
    replace(
     replace(
      replace(
       replace(
        replace(
         replace(replace(eval_content, chr(92), '\\'), '"', '\"'),
         chr(8),
         '\b'
        ),
        chr(12),
        '\f'
       ),
       chr(10),
       '\n'
      ),
      chr(13),
      '\r'
     ),
     chr(9),
     '\t'
    ) as eval,
    trans
   FROM    xt2
  ),
  xt4 as (
   select
        replace(
     replace(
      replace(body_template, '<QWEN_MODEL>', 'qwen-max'),
      '<SYSTEM_PROMPT>',
      'You are a helpful assistant.'
     ),
     '<USER_PROMPT>',
     eval
    ) as body,
    oldeval,
    trans
   FROM    xt3
  ),
  xt5 as (
   select
        ai_gen(
     body
    ) as response,
    body,
    oldeval,
    trans
   FROM    xt4
  ),
  xt6 as (
   select
        oldeval,
    body,
    response.result as res,
    trans
   FROM    xt5
  ),
xt7 as (select
  trans as "原文", 
  res as "总结信息"
FROM  xt6)
select * from xt7

示例解读:

  1. 读取embedding列。

    select  array[input,'' ]   as x, "input__embedding__"  as embd
  2. embedding聚类。

    select cluster(array_agg(embd),'kmeans','{
      "n_clusters": "10",
      "max_iter": "100",
      "tol": "0.0001",
      "metric":"cosine",
      "init_mode": "kmeans++"
    }') as cluster_res, array_agg(x) as xs from t1
  3. 拼装prompt。

     select
        
        "content" as trans,  -- 此处是待处理数据
        '{{query}}' as targets,  --此处是评估模板中的占位符
        '{"model":"<QWEN_MODEL>","input":{"messages":[{"role":"system","content":"<SYSTEM_PROMPT>"},{"role":"user","content":"<USER_PROMPT>"}]}}' as body_template, --此处为访问百炼的body模板
        cast('```{{query}}```。 请你对以上文本中的任务场景进行归类,例如NL2SQL场景等' as varchar) as eval_prompt --此处为评估模板,包含了指令信息和占位符
       FROM    t4
  4. prompt内容转义(这一步至关重要,需要把不可见字符进行转义)。

    select
            trans as oldeval,
        body_template,
        replace(
         replace(
          replace(
           replace(
            replace(
             replace(replace(eval_content, chr(92), '\\'), '"', '\"'),
             chr(8),
             '\b'
            ),
            chr(12),
            '\f'
           ),
           chr(10),
           '\n'
          ),
          chr(13),
          '\r'
         ),
         chr(9),
         '\t'
        ) as eval,
        trans
       FROM    xt2
  5. 调用大模型。

    select
            ai_gen(
         body
        ) as response,
        body,
        oldeval,
        trans
       FROM    xt4
  6. 获取大模型处理结果。

    select
            oldeval,
        body,
        response.result as res,
        trans
       FROM    xt5
  7. 提取大模型处理结果。

    select
      trans as "原文", 
      res as "总结信息"
    FROM  xt6