本文介绍基于SLS提供的语义富化能力,从日志中提取关键信息和知识。
语义富化概述
日志分为结构化日志和非结构化日志。针对不同类型的日志,通常有不同的分析处理手段。
结构化日志:通常具有定义清晰的schema和类型,基于SQL计算引擎,可以对结构化日志进行统计操作。
非结构化日志:通常是长文本,例如LLM聊天历史、Agent交互日志。通常需要人工介入提取有价值的信息。
SLS推出的语义富化能力,借助于LLM处理自然语言的能力,从非结构化日志中提取关键和有效的信息。
支持地域
语义富化仅限于中国内地使用,不适用于海外区域。
大语言模型(LLM)函数
ai_gen()函数
语法
ai_gen(prompt varchar)
或者
ai_gen(prompt varchar, model varchar)
参数说明
参数 | 说明 |
prompt | 提供给大模型的数据 |
model | 模型选择,目前可选的模型:
|
返回值
row(
result varchar
error_msg varchar
)
字段名 | 说明 |
result | 大模型生成的内容 |
error_msg | 错误信息。为 null 表示成功 |
最佳实践
由于大模型的上下文有限,我们不可能给大模型输入太多数据。为了尽可能的利用大模型的上下文能力,我们需要尽可能的提供给大模型高质量的上下文,上下文不能有重复内容。因此最佳实践遵循以下流程:
先对海量数据进行聚类,聚类函数请参考向量索引中的说明。
对于聚类结果:
如果要对每个类别分别调用大模型,则分别从每一个类别中随机选择10-20个样本,每个类别组装成一个prompt。
如果要对所有的类别整体调用大模型,那么把所有的类别的样本分别随机选择1-2个样本合并在一起,形成一份完整的样本。形成一个大的prompt。
把指令和数据进行拼装。
调用大模型ai_gen函数。
对大模型的输出进行后处理。
示例
* | 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
示例解读:
读取embedding列。
select array[input,'' ] as x, "input__embedding__" as embd
对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
拼装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
对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
调用大模型。
select ai_gen( body ) as response, body, oldeval, trans FROM xt4
获取大模型处理结果。
select oldeval, body, response.result as res, trans FROM xt5
提取大模型处理结果。
select trans as "原文", res as "总结信息" FROM xt6
该文章对您有帮助吗?