이전 Spring AI에 대한 글을 작성한 후, 감사하게도 생각보다 많은 분이 글을 찾아주셨습니다.
그러던 도중, 갑자기 Spring AI 메인 README에 다음과 같은 내용이 올라왔습니다.
Spring AI의 변경 사항 공지
핵심 먼저 말씀드리면, 아래와 같이 바뀌게 되었습니다.
- 1️⃣ 새로운 ChatClient는 ChatModel 인스턴스를 취합니다. 이것은 RestClient, WebClient, JdbcClient 등과 같은 스프링 생태계의 클라이언트들과 유사한 방식으로 프롬프트를 실행할 수 있도록 fluent API 방식을 지원합니다.
- 2️⃣ ChatClient, ImageClient 등 ...Client로 끝났던 파일들이 이제는 ...Model로 이름이 변경되었습니다.
- 따라서 이전에는 ChatClient가 ModelClient를 상속받았지만, 이제는 ChatModel이 Model을 상속받게 됩니다.
- Model 인터페이스는 Spring AI API와 AI 모델 API 간의 변환을 표현합니다.
실제로 어떻게 바뀌었나 확인해 보자
그렇다면, 실제로 어떻게 바뀌었는지 확인해 보겠습니다.
ChatModel
- 이전에 있던 String call(String message), String call(Message... messages)는 동일한 방식으로 이루어집니다.
- 따라서 기존 사용자 분들은 ChatModel를 생성한다는 점만 제외하면 그대로 사용하실 수 있습니다.
- ChatResponse를 담은 call(Prompt prompt) 메서드도 동일하게 있습니다.
- ChatOptions를 가져올 수 있는 getDefaultOptions() 메서드가 추가되었습니다.
ChatClient (이후)
새로 생긴 ChatClient에서는 빌더 패턴을 사용할 수 있음이 보입니다.
실습 비교 - 업데이트 이전 버전 vs 업데이트 이후 버전
한식 전문가라고 정의한 뒤, 한식에 대해 알려달라고 질문해 보겠습니다.
업데이트 이전 버전
업데이트 이전 버전에서는 SystemMessage와 UserMessage 등 여러 개의 메시지를 이용하기 위해서는 List<Message> 타입의 messages를 만들고, 이것을 이용하여 Prompt를 만든 뒤 ChatClient에게 호출하도록 해야 했습니다.
업데이트 이후 버전
반면, 업데이트 이후에서는 한 번에 빌더 패턴으로 정의할 수 있게 됩니다. 개인적인 추측으로는 이렇게 더 자세하게 프롬프트를 만들고 호출해야 하는 상황에서, 번거로웠던 방식을 빌더 패턴으로 쉽게 (fluent API) 만들기 위해 이런 리팩터링 작업을 하지 않았을까 생각이 듭니다.
위의 코드를 더 자세히 알아보겠습니다.
- ChatClient의 Builder에서는 내부적으로 ChatClientRequest와 ChatModel을 가집니다.
- ChatModel은 앞서 말씀드린 ChatGPT 등의 AI 모델을 뜻합니다.
- ChatClientRequest는 시스템 텍스트 (시스템에게 정의할 역할 등), 유저 텍스트 (유저가 보낼 프롬프트 문구) 등을 가집니다.
다음은 ChatClientRequest의 내부입니다. 빌더 생성자 메서드에서 보셨듯, 빌더 클래스에서 가지고 있던 ChatModel을 그대로 가지고 있습니다. (이는 안에 있는 mutate 메서드에서 사용되기 위함입니다. mutate 메서드는 해당 ChatClientRequest 클래스로부터 세팅 값을 복제하여 새로운 ChatClient를 만들기 위한 ChatClient.Builder를 반환합니다.)
이후 build가 완료되고 ChatClient가 만들어지면, prompt 메서드를 통해 ChatClientRequest를 가져온 다음 ChatClientRequest의 call 메서드를 호출하여 CallResponseSpec 클래스를 가져옵니다.
CallResponseSpec 내용부터는 아래 그림으로 설명드리겠습니다.
이로써 ChatClient와 ChatModel로 구분한 이유는 README 내용대로 시스템 메시지와 유저 메시지를 쉽게, fluent API 방식으로 한 번에 AI 모델에게 호출하게 하기 위함임을 알게 되었습니다. (그리고 이러한 구현 방식을 개발한 Christian Tzolov와 Mark Pollack에 경의를 표합니다..)
추가: 바뀐 흐름표
업데이트에 의해, 이전 글에서 소개드렸던 흐름표 또한 바뀌게 되었습니다. 큰 흐름은 바뀌지 않았으나, 원리를 익히고 싶으신 분들은 다시 아셔야 할 것 같아 공유드립니다.
결론: 느낀 점
- ChatClient와 ChatModel로 구성된 것을 보듯이, 이전 버전보다 더 구체적이고 유용하게 바뀌었습니다. 그러나 그만큼 이해해야 하는 코드가 늘어난 것 같아 이번 글을 작성하면서는 내부적으로 생긴 클래스 등 매끄럽게 이해되지 않는 부분도 있었습니다. 예상보다 더 많은 시간을 투자해서 본 프로젝트를 이해해야겠다고 느끼게 되었습니다.
- 정리 글을 작성한 지 약 3주 만에 이렇게 변경이 생긴 것을 보면서, 비교적 신생 기술인 것은 도입을 신중히 해야겠다는 생각, 조금 안정화가 진행된 뒤 도입해야겠다는 생각이 들게 된 계기였습니다.
Spring AI에 대한 다음 글로는 단순히 질문 프롬프트만 던지는 것 말고도 템플릿 (template)을 적용하는 등 Spring AI의 다른 클래스들을 소개해보는 글을 작성하도록 하겠습니다.
Reference
'🚀 팁 (기술 적용 방법 등) > 🤖 Spring AI 파헤치기' 카테고리의 다른 글
[Spring AI 🤖] Spring AI에서 프롬프트를 더욱 효과적으로 작성하는 방법 (feat. PromptTemplate) (0) | 2024.06.23 |
---|---|
[Spring AI 🤖] Spring AI를 적용해보자! (3) | 2024.05.02 |