可观测性
AI Service 可观测性
AI Service observability 是一项实验性功能。它的 API 和行为在未来版本中可能会发生变化。
AI Service 的 observability 机制允许用户追踪一次 AiService 调用期间到底发生了什么。
一次调用内部可能会包含多次 LLM 调用,而这些调用中的任意一次都可能成功,也可能失败。
AI Service observability 允许你跟踪完整的调用链路及其结果。
AI Service observability 能力仅在使用 AI Services 时可用。
它属于更高层的抽象,不能直接应用于 ChatModel 或 StreamingChatModel。
该实现最初来自 Quarkus LangChain4j extension, 后续被移植回了这里。
事件类型
每一种事件类型都有唯一标识符,
可以用来在多次调用之间做事件关联。
每种事件类型都包含封装在
InvocationContext
中的信息。
当前支持以下事件类型:
| Event Name | Description |
|---|---|
AiServiceStartedEvent | 当一次 LLM 调用开始时触发。 |
AiServiceRequestIssuedEvent | 在向 LLM 发送请求之前立即触发。它包含本次请求的详细信息。需要注意的是,当存在 tools 或 guardrails 时,在一次 AiService 调用期间它可能会被触发多次。 其中包含 system message、user message 等信息。 |
AiServiceResponseReceivedEvent | 当收到来自 LLM 的响应时触发。它包含 LLM 响应以及对应的请求。需要注意的是,当存在 tools 或 guardrails 时,在一次 AiService 调用期间它可能会被触发多次。 其中包含 system message、user message 等信息。 并不是每次调用都会收到这个事件。如果调用失败,则会收到 AiServiceErrorEvent 作为替代。 |
AiServiceErrorEvent | 当一次 LLM 调用失败时触发。失败原因可能是网络故障、AiService 不可用、输入 / 输出 guardrail 阻止了请求,或者其他很多情况。 它会包含本次失败的相关信息。 |
AiServiceCompletedEvent | 当一次 LLM 调用成功完成时触发。 并不是每次调用都会收到这个事件。如果调用失败,则会收到 AiServiceErrorEvent 作为替代。它会包含本次调用结果的相关信息。 |
ToolExecutedEvent | 当一次工具调用完成时触发。需要注意的是,在一次单独的 LLM 调用中,它可能被触发多次。 其中包含工具请求与执行结果的信息。 |
InputGuardrailExecutedEvent | 当input guardrail 校验完成后触发。每执行一次 guardrail,就会触发一个对应事件。 它包含某个输入 guardrail 的输入、输出(例如成功还是失败)以及执行耗时等信息。 |
OutputGuardrailExecutedEvent | 当output guardrail 校验完成后触发。每执行一次 guardrail,就会触发一个对应事件。 它包含某个输出 guardrail 的输入、输出(例如成功?失败?重试?reprompt?)以及执行耗时等信息。 |
监听事件
每一种事件类型 都有各自的 listener, 你可以实现对应的 listener 来接收该事件。 你可以按需选择想监听的事件种类。
要监听某类事件,只需创建一个实现了对应 listener 接口的类即可。 可用的 listener 接口如下:
定义好 listener 之后,需要在创建 AI Services 时注册它们。
AiServices 类
上提供了多种 registerListener 方法重载可供使用。
例如,下面这段代码展示了如何创建并注册一个监听 AiServiceCompletedEvent 的 listener:
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import dev.langchain4j.observability.api.AiServiceListenerRegistrar;
import dev.langchain4j.observability.api.event.AiServiceCompletedEvent;
import dev.langchain4j.observability.api.listener.AiServiceCompletedListener;
import dev.langchain4j.invocation.InvocationContext;
public class MyAiServiceCompletedListener implements AiServiceCompletedListener {
@Override
public void onEvent(AiServiceCompletedEvent event) {
InvocationContext invocationContext = event.invocationContext();
Optional<Object> result = event.result();
// 同一次 LLM 调用相关的所有事件,其 invocationId 都是相同的
UUID invocationId = invocationContext.invocationId();
String aiServiceInterfaceName = invocationContext.interfaceName();
String aiServiceMethodName = invocationContext.methodName();
List<Object> aiServiceMethodArgs = invocationContext.methodArguments();
Object chatMemoryId = invocationContext.chatMemoryId();
Instant eventTimestamp = invocationContext.timestamp();
// 在这里处理这些数据
}
}
// 创建 AI Service 时
MyAiServiceCompletedListener myListener = new MyAiServiceCompletedListener();
var myService = AiServices.builder(MyAiService.class)
.chatModel(chatModel) // 也可以是 .streamingChatModel(...)
.registerListener(myListener)
.build();
创建你自己的事件和监听器
AI Service observability 能力本身就是为可扩展性而设计的。
如果你想创建自己的事件,可以通过实现
AiServiceEvent
接口来定义自定义事件。
然后,再通过实现
AiServiceListener
接口,创建自定义的事件 listener。
定义好事件和 listener 之后,你还需要通过获取 / 管理 AiServiceListenerRegistrar 实例,
并调用 fireEvent(event) 方法,来真正触发该事件。
一旦事件会被触发,你就可以像使用内置事件一样,为它创建 listener 并完成注册。
扩展点
你也可以通过实现
AiServiceListenerRegistrarFactory
并通过 Java Service Provider Interface(Java SPI) 注册它,
来创建自定义的
AiServiceListenerRegistrar。
如果你希望自定义 listener 的注册 / 取消注册方式, 以及事件的触发方式,这会很有帮助。
Chat Model 可观测性
某些 ChatModel 和 StreamingChatModel 的实现
(见 “Observability” 一列)
支持配置 ChatModelListener 来监听以下事件:
- 发往 LLM 的请求
- 来自 LLM 的响应
- 错误
这些事件会包含多种属性,详见 OpenTelemetry Generative AI Semantic Conventions,例如:
- 请求:
- Messages
- Model
- Temperature
- Top P
- Max Tokens
- Tools
- Response Format
- 等等