advisors

Advisor

Spring의 Filter와 비슷한 기능으로 Filter는 Spring application을 Advisor는 ChatModel을 감싸는 형태로 구현되어있다. ChatClientRequest, ChatClientResponse를 관찰, 조작할 수 있다.

advisors-flow.jpg

Order

  • Advisor는 Ordered의 구현체이다.
  • Advisor chain의 실행 순서를 지정하는 역할을 한다.
  • 상수
    • Ordered.HIGHEST_PRECEDENCE: 가장 먼저 실행되는 Order
    • Ordered.LOWEST_PRECEDENCE: 가장 늦게 실행되는 Order

구현

  • Call, Stream

    • Advisor는 Stream(Flux), Call 두 가지 방식으로 구현된다.
  • 아래는 spring ai에서 구현되어있는 간단한 예제이다.

public class SimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor {

	private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class);

	@Override
	public String getName() {
		return this.getClass().getSimpleName();
	}

	@Override
	public int getOrder() {
		return 0;
	}


	@Override
	public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {
		logRequest(chatClientRequest);

		ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest);

		logResponse(chatClientResponse);

		return chatClientResponse;
	}

	@Override
	public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest,
			StreamAdvisorChain streamAdvisorChain) {
		logRequest(chatClientRequest);

		Flux<ChatClientResponse> chatClientResponses = streamAdvisorChain.nextStream(chatClientRequest);

		return new ChatClientMessageAggregator().aggregateChatClientResponse(chatClientResponses, this::logResponse);
	}

	private void logRequest(ChatClientRequest request) {
		logger.debug("request: {}", request);
	}

	private void logResponse(ChatClientResponse chatClientResponse) {
		logger.debug("response: {}", chatClientResponse);
	}

}