AI 可观测
提供AI可观测基础能力,包括metric、log和trace,其后需接ai-proxy插件,如果不接ai-proxy插件,则需要用户进行相应配置才可生效。
运行属性
插件执行阶段:默认阶段
,插件执行优先级:200
。
配置说明
插件默认请求符合openai协议格式,并提供了以下基础可观测值,用户无需特殊配置:
metric:提供了输入token、输出token、首个token的RT(流式请求)、请求总RT等指标,支持在网关、路由、服务、模型四个维度上进行观测。
log:提供了input_token, output_token, model, llm_service_duration, llm_first_token_duration 等字段。
您还可以通过配置的方式对可观测的值进行扩展:
名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
| []Attribute | 非必填 | - | 希望记录在log/span中的信息。 |
Attribute 配置说明:
名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
| string | 必填 | - | attribute 名称。 |
| string | 必填 | - | attribute 取值来源,可选值为 |
| string | 必填 | - | attribute 取值 key value/path。 |
| string | 非必填 | - | 从流式响应中提取 attribute 的规则,可选值为 |
| bool | 非必填 | false | 是否将提取的信息记录在日志中。 |
| bool | 非必填 | false | 是否将提取的信息记录在链路追踪span中。 |
value_source
的各种取值含义如下:
fixed_value
:固定值。request_header
: attribute值通过http请求头获取,value配置为header key。request_body
:attribute值通过请求body获取,value配置格式为gjson的jsonpath。response_header
:attribute值通过http响应头获取,value配置为header key。response_body
:attribute值通过响应body获取,value配置格式为 gjson的jsonpath。response_streaming_body
:attribute 值通过流式响应body获取,value配置格式为gjson的 jsonpath。
当value_source
为response_streaming_body
时,应当配置rule
,用于指定如何从流式body中获取指定值,取值含义如下:
first
:多个chunk中取第一个有效chunk的值。replace
:多个chunk中取最后一个有效chunk的值。append
:拼接多个有效chunk中的值,可用于获取回答内容。
配置示例
如果希望在网关访问日志中记录ai-statistic相关的统计值,需要修改log_format,在原log_format基础上添加一个新字段,示例如下:
'{"ai_log":"%FILTER_STATE(wasm.ai_log:PLAIN)%"}'
空配置
监控
route_upstream_model_metric_input_token{ai_route="llm",ai_cluster="outbound|443||qwen.dns",ai_model="qwen-turbo"} 10
route_upstream_model_metric_llm_duration_count{ai_route="llm",ai_cluster="outbound|443||qwen.dns",ai_model="qwen-turbo"} 1
route_upstream_model_metric_llm_first_token_duration{ai_route="llm",ai_cluster="outbound|443||qwen.dns",ai_model="qwen-turbo"} 309
route_upstream_model_metric_llm_service_duration{ai_route="llm",ai_cluster="outbound|443||qwen.dns",ai_model="qwen-turbo"} 1955
route_upstream_model_metric_output_token{ai_route="llm",ai_cluster="outbound|443||qwen.dns",ai_model="qwen-turbo"} 69
日志
{
"ai_log":"{\"model\":\"qwen-turbo\",\"input_token\":\"10\",\"output_token\":\"69\",\"llm_first_token_duration\":\"309\",\"llm_service_duration\":\"1955\"}"
}
链路追踪
配置为空时,不会在span中添加额外的attribute。
从非openai协议提取token使用信息
在ai-proxy中设置协议为original时,以百炼为例,可作如下配置指定如何提取model、input_token、output_token。
attributes:
- key: model
value_source: response_body
value: usage.models.0.model_id
apply_to_log: true
apply_to_span: false
- key: input_token
value_source: response_body
value: usage.models.0.input_tokens
apply_to_log: true
apply_to_span: false
- key: output_token
value_source: response_body
value: usage.models.0.output_tokens
apply_to_log: true
apply_to_span: false
监控
route_upstream_model_metric_input_token{ai_route="bailian",ai_cluster="qwen",ai_model="qwen-max"} 343
route_upstream_model_metric_output_token{ai_route="bailian",ai_cluster="qwen",ai_model="qwen-max"} 153
route_upstream_model_metric_llm_service_duration{ai_route="bailian",ai_cluster="qwen",ai_model="qwen-max"} 3725
route_upstream_model_metric_llm_duration_count{ai_route="bailian",ai_cluster="qwen",ai_model="qwen-max"} 1
日志
此配置下日志效果如下:
{
"ai_log": "{\"model\":\"qwen-max\",\"input_token\":\"343\",\"output_token\":\"153\",\"llm_service_duration\":\"19110\"}"
}
链路追踪
链路追踪的span中可以看到model、input_token、output_token三个额外的attribute。
配合认证鉴权记录consumer
举例如下:
attributes:
- key: consumer # 配合认证鉴权记录consumer
value_source: request_header
value: x-mse-consumer
apply_to_log: true
记录问题与回答
attributes:
- key: question # 记录问题
value_source: request_body
value: messages.@reverse.0.content
apply_to_log: true
- key: answer # 在流式响应中提取大模型的回答
value_source: response_streaming_body
value: choices.0.delta.content
rule: append
apply_to_log: true
- key: answer # 在非流式响应中提取大模型的回答
value_source: response_body
value: choices.0.message.content
apply_to_log: true
进阶
配合阿里云SLS数据加工,可以将AI相关的字段进行提取加工,例如原始日志为:
ai_log:{"question":"用python计算2的3次方","answer":"你可以使用 Python 的乘方运算符 `**` 来计算一个数的次方。计算2的3次方,即2乘以自己2次,可以用以下代码表示:\n\n```python\nresult = 2 ** 3\nprint(result)\n```\n\n运行这段代码,你会得到输出结果为8,因为2乘以自己两次等于8。","model":"qwen-max","input_token":"16","output_token":"76","llm_service_duration":"5913"}
使用如下数据加工脚本,可以提取出question和answer:
e_regex("ai_log", grok("%{EXTRACTJSON}"))
e_set("question", json_select(v("json"), "question", default="-"))
e_set("answer", json_select(v("json"), "answer", default="-"))
提取后,SLS中会添加question和answer两个字段,示例如下:
ai_log:{"question":"用python计算2的3次方","answer":"你可以使用 Python 的乘方运算符 `**` 来计算一个数的次方。计算2的3次方,即2乘以自己2次,可以用以下代码表示:\n\n```python\nresult = 2 ** 3\nprint(result)\n```\n\n运行这段代码,你会得到输出结果为8,因为2乘以自己两次等于8。","model":"qwen-max","input_token":"16","output_token":"76","llm_service_duration":"5913"}
question:用python计算2的3次方
answer:你可以使用 Python 的乘方运算符 `**` 来计算一个数的次方。计算2的3次方,即2乘以自己2次,可以用以下代码表示:
result = 2 ** 3
print(result)
运行这段代码,你会得到输出结果为8,因为2乘以自己两次等于8。