本文最后更新于 2025-07-21,文章内容可能已经过时。请谨慎检查,如果谬误,请评论联系

ChatModel是直接与模型调用交互的对象。但是可以通过ChatClient封装Advisor,增强调用过程。具体实现逻辑如下:

实现和执行逻辑

DefaultChatClientcall 方法执行流程如下:

  1. 调用入口

    • call 方法的调用始于 DefaultChatClientRequestSpeccall() 方法,返回一个 DefaultCallResponseSpec 实例。
    • 代码片段:
      public CallResponseSpec call() {
          return new DefaultCallResponseSpec(this);
      }
      
  2. 获取响应内容

    • DefaultCallResponseSpec 中,调用 content() 方法获取最终的响应内容。
    • 代码片段:
      @Override
      @Nullable
      public String content() {
          ChatResponse chatResponse = doGetChatResponse();
          return getContentFromChatResponse(chatResponse);
      }
      
  3. 执行核心逻辑

    • doGetChatResponse() 是核心方法,负责实际执行请求并返回 ChatResponse
    • 它通过 Observation(监控工具)包装执行过程,确保可观测性。
    • 代码片段:
      @Nullable
      private ChatResponse doGetObservableChatResponse(DefaultChatClientRequestSpec inputRequest,
              @Nullable String formatParam) {
      
          ChatClientObservationContext observationContext = ChatClientObservationContext.builder()
              .withRequest(inputRequest)
              .withFormat(formatParam)
              .withStream(false)
              .build();
      
          var observation = ChatClientObservationDocumentation.AI_CHAT_CLIENT.observation(
                  inputRequest.getCustomObservationConvention(), DEFAULT_CHAT_CLIENT_OBSERVATION_CONVENTION,
                  () -> observationContext, inputRequest.getObservationRegistry());
          return observation.observe(() -> doGetChatResponse(inputRequest, formatParam, observation));
      }
      
  4. 构建请求并调用模型

    • doGetChatResponse() 方法中,首先将请求封装为 AdvisedRequest,然后通过 aroundAdvisorChainBuilder 执行一系列的顾问链(Advisor Chain)。
    • 最终调用底层的 ChatModelcall 方法完成实际的模型调用。
    • 代码片段:
      private ChatResponse doGetChatResponse(DefaultChatClientRequestSpec inputRequestSpec,
              @Nullable String formatParam, Observation parentObservation) {
      
          AdvisedRequest advisedRequest = toAdvisedRequest(inputRequestSpec, formatParam);
      
          // Apply the around advisor chain that terminates with the last model call advisor.
          AdvisedResponse advisedResponse = inputRequestSpec.aroundAdvisorChainBuilder.build()
              .nextAroundCall(advisedRequest);
      
          return advisedResponse.response();
      }
      
  5. 顾问链的作用

    • aroundAdvisorChainBuilder 是一个责任链模式的实现,允许在实际调用模型之前或之后插入自定义逻辑。
    • 默认情况下,DefaultChatClientRequestSpec 构造函数中添加了两个顾问:
      • CallAroundAdvisor:用于非流式调用。
      • StreamAroundAdvisor:用于流式调用。
    • 这些顾问最终会调用底层的 ChatModel
  6. 返回结果

    • 模型调用完成后,返回的 ChatResponse 被提取出主要内容(如文本),并通过 getContentFromChatResponse 方法返回给调用者。

总结

call 方法的核心流程可以概括为以下几个步骤:

  1. 构建请求参数(AdvisedRequest)。
  2. 使用顾问链(Advisor Chain)处理请求。
  3. 调用底层的 ChatModel 执行实际的模型推理。
  4. 提取并返回结果内容。

这种设计使得 DefaultChatClient 具有高度的灵活性和扩展性,支持通过顾问链插入自定义逻辑,同时保持核心逻辑的清晰和模块化。