
SpringAI技术记录-ChatClient
本文最后更新于 2025-07-21,文章内容可能已经过时。请谨慎检查,如果谬误,请评论联系
ChatModel是直接与模型调用交互的对象。但是可以通过ChatClient封装Advisor,增强调用过程。具体实现逻辑如下:
实现和执行逻辑
DefaultChatClient
的 call
方法执行流程如下:
-
调用入口:
call
方法的调用始于DefaultChatClientRequestSpec
的call()
方法,返回一个DefaultCallResponseSpec
实例。- 代码片段:
public CallResponseSpec call() { return new DefaultCallResponseSpec(this); }
-
获取响应内容:
- 在
DefaultCallResponseSpec
中,调用content()
方法获取最终的响应内容。 - 代码片段:
@Override @Nullable public String content() { ChatResponse chatResponse = doGetChatResponse(); return getContentFromChatResponse(chatResponse); }
- 在
-
执行核心逻辑:
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)); }
-
构建请求并调用模型:
doGetChatResponse()
方法中,首先将请求封装为AdvisedRequest
,然后通过aroundAdvisorChainBuilder
执行一系列的顾问链(Advisor Chain)。- 最终调用底层的
ChatModel
的call
方法完成实际的模型调用。 - 代码片段:
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(); }
-
顾问链的作用:
aroundAdvisorChainBuilder
是一个责任链模式的实现,允许在实际调用模型之前或之后插入自定义逻辑。- 默认情况下,
DefaultChatClientRequestSpec
构造函数中添加了两个顾问:CallAroundAdvisor
:用于非流式调用。StreamAroundAdvisor
:用于流式调用。
- 这些顾问最终会调用底层的
ChatModel
。
-
返回结果:
- 模型调用完成后,返回的
ChatResponse
被提取出主要内容(如文本),并通过getContentFromChatResponse
方法返回给调用者。
- 模型调用完成后,返回的
总结
call
方法的核心流程可以概括为以下几个步骤:
- 构建请求参数(
AdvisedRequest
)。 - 使用顾问链(Advisor Chain)处理请求。
- 调用底层的
ChatModel
执行实际的模型推理。 - 提取并返回结果内容。
这种设计使得 DefaultChatClient
具有高度的灵活性和扩展性,支持通过顾问链插入自定义逻辑,同时保持核心逻辑的清晰和模块化。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 萧轩miss
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果