LangChain4j —— 可观测性(Observability)

发布时间:2026/10/28 10:12:15
LangChain4j —— 可观测性(Observability) 1. 聊天模型可观测性Chat Model Observability部分ChatModel/StreamingChatModel实现见「Observability」列支持配置ChatModelListener监听三类事件事件回调方法时机请求onRequest(ChatModelRequestContext)调用 LLM 提供商 API之前响应onResponse(ChatModelResponseContext)成功收到响应后立即调用错误onError(ChatModelErrorContext)出错时仅一次事件属性遵循 OpenTelemetry Generative AI 语义约定。事件包含的属性请求Request消息messages模型model温度TemperatureTop P最大 tokens 数工具Tools响应格式responseFormat等等响应Response助手消息AiMessageID模型Token 使用情况TokenUsage结束原因finishReason等等2. ChatModelListener 完整示例ChatModelListenerlistenernewChatModelListener(){OverridepublicvoidonRequest(ChatModelRequestContextrequestContext){ChatRequestchatRequestrequestContext.chatRequest();ListChatMessagemessageschatRequest.messages();System.out.println(messages);ChatRequestParametersparameterschatRequest.parameters();System.out.println(parameters.modelName());System.out.println(parameters.temperature());System.out.println(parameters.topP());System.out.println(parameters.topK());System.out.println(parameters.frequencyPenalty());System.out.println(parameters.presencePenalty());System.out.println(parameters.maxOutputTokens());System.out.println(parameters.stopSequences());System.out.println(parameters.toolSpecifications());System.out.println(parameters.toolChoice());System.out.println(parameters.responseFormat());// 提供商特有参数以 OpenAI 为例需 instanceof 判断if(parametersinstanceofOpenAiChatRequestParametersopenAiParameters){System.out.println(openAiParameters.maxCompletionTokens());System.out.println(openAiParameters.logitBias());System.out.println(openAiParameters.parallelToolCalls());System.out.println(openAiParameters.seed());System.out.println(openAiParameters.user());System.out.println(openAiParameters.store());System.out.println(openAiParameters.metadata());System.out.println(openAiParameters.serviceTier());System.out.println(openAiParameters.reasoningEffort());}System.out.println(requestContext.modelProvider());// 在 onRequest / onResponse / onError 之间传递数据MapObject,ObjectattributesrequestContext.attributes();attributes.put(my-attribute,my-value);}OverridepublicvoidonResponse(ChatModelResponseContextresponseContext){ChatResponsechatResponseresponseContext.chatResponse();AiMessageaiMessagechatResponse.aiMessage();System.out.println(aiMessage);ChatResponseMetadatametadatachatResponse.metadata();System.out.println(metadata.id());System.out.println(metadata.modelName());System.out.println(metadata.finishReason());if(metadatainstanceofOpenAiChatResponseMetadataopenAiMetadata){System.out.println(openAiMetadata.created());System.out.println(openAiMetadata.serviceTier());System.out.println(openAiMetadata.systemFingerprint());}TokenUsagetokenUsagemetadata.tokenUsage();System.out.println(tokenUsage.inputTokenCount());System.out.println(tokenUsage.outputTokenCount());System.out.println(tokenUsage.totalTokenCount());if(tokenUsageinstanceofOpenAiTokenUsageopenAiTokenUsage){System.out.println(openAiTokenUsage.inputTokensDetails().cachedTokens());System.out.println(openAiTokenUsage.outputTokensDetails().reasoningTokens());}ChatRequestchatRequestresponseContext.chatRequest();System.out.println(chatRequest);System.out.println(responseContext.modelProvider());MapObject,ObjectattributesresponseContext.attributes();System.out.println(attributes.get(my-attribute));}OverridepublicvoidonError(ChatModelErrorContexterrorContext){ThrowableerrorerrorContext.error();error.printStackTrace();ChatRequestchatRequesterrorContext.chatRequest();System.out.println(chatRequest);System.out.println(errorContext.modelProvider());MapObject,ObjectattributeserrorContext.attributes();System.out.println(attributes.get(my-attribute));}};ChatModelmodelOpenAiChatModel.builder().apiKey(System.getenv(OPENAI_API_KEY)).modelName(GPT_4_O_MINI).listeners(List.of(listener)).build();model.chat(Tell me a joke about Java);attributes 映射的作用attributesMapObject, Object用于在同一个ChatModelListener的onRequest→onResponse/onError之间传递信息如请求开始时间、traceId。在多个ChatModelListener之间传递信息。3. 监听器的工作方式重要规则调用顺序与线程监听器以ListChatModelListener形式配置按迭代顺序依次调用。同步调用运行在同一个线程流式场景例外见下。第一个监听器返回之前第二个不会被调用。调用次数onRequest()每次请求只调用一次LLM API 出错重试时不会为每次重试重复调用。onResponse()只调用一次成功收到响应后立即调用。onError()只调用一次重试时不会为每次重试重复调用。异常处理监听器方法抛出的异常以WARN级别记录日志。后续监听器照常继续执行不会中断。请求内容是“最终请求”三个 Context 中拿到的ChatRequest是合并后的最终请求ChatModel上配置的默认ChatRequestParameters 请求特定的ChatRequestParameters。StreamingChatModel 的特殊点onResponse()/onError()与onRequest()在不同线程中执行。线程上下文如 MDC、ThreadLocal不会自动传播→ 需要用attributes把数据从onRequest()传到onResponse()/onError()。时序onResponse()早于StreamingChatResponseHandler.onCompleteResponse()。onError()早于StreamingChatResponseHandler.onError()。4. 在 Spring Boot 应用中的可观测性原文此处为小节标题展开内容待补充。实践要点结合上文规则的落地建议把ChatModelListener注册为 Spring Bean如Component或Bean在构建ChatModel时通过.listeners(...)注入便于统一收集指标/日志。在onRequest()中把traceId、开始时间等放入attributes在onResponse()/onError()中取出配合 Micrometer / OpenTelemetry 上报耗时onResponse/onError时间戳 −onRequest时间戳Token 消耗tokenUsage.inputTokenCount()/outputTokenCount()/totalTokenCount()错误率onError计数 errorContext.error()监听器内不要抛异常异常只会被 WARN 吞掉应自行 try-catch 并落日志避免影响监控链路完整性。速查小结三个回调onRequest请求前一次、onResponse成功响应一次、onError出错一次重试不会重复触发。一个桥梁attributes映射 —— 跨回调、跨监听器传值流式场景线程不同必须靠它传递上下文。两类参数通用ChatRequestParameters/ChatResponseMetadata 提供商特有如OpenAiChatRequestParameters、OpenAiChatResponseMetadata、OpenAiTokenUsage用instanceof取。线程非流式同线程同步流式onResponse/onError在另一线程且早于StreamingChatResponseHandler对应回调。容错监听器抛异常只记 WARN不影响后续监听器与主流程。语义约定属性命名对齐 OpenTelemetry Generative AI 语义约定便于接入现有 APM。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询