๋ณธ ๋ด์ฉ์ 24.05.22 Spring AI์ ๋ํด ๋ณ๊ฒฝ์ ์ด ์๊ธด ์ด์ ๋ก ์ต์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ๋๋ต์ ์ธ ์๋ฆฌ๋ ๊ฐ์ผ๋, ๋ณ๊ฒฝ์ ์ ๋ํด ์์๊ณ ์ถ์ผ์ ๋ถ๋ค์ ํด๋น ๊ธ๋ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์
์์ ChatGPT ๋ฑ ์์ฑํ AI๋ฅผ ์๋น์ค์ ์ ๋ชฉ์ํค๋ ๊ธฐ์
๋ค์ด ๋์ด๋๊ณ ์๊ณ , ์ด๋ฌํ ์ฐจ์์์ ์์ฑํ AI๋ฅผ ํ๋ก์ ํธ์ ๋ฃ์ด๋ณด๊ณ ์ ํ๋ ๋ถ๋ค์ด ๋ง์ ๊ธฐ๋ฅ๋ฅผ ๋๋ผ๊ณ ์์ต๋๋ค.
์คํ๋ง์์๋ ์๋์ ์์์ ํตํด ์์ฒด ๊ธฐ์ ์ธ Spring AI๋ฅผ ์๊ฐํ๋ ์์์ ๋ง๋ค๊ธฐ๋ ํ์์ฃ .
๋์จ ์ง ์ผ๋ง ๋์ง ์์ ๊ธฐ์ ์ด๋ค ๋ณด๋, ์์ง ์ด ๊ธฐ์ ์ ๋ธ๋ก๊ทธ์ ๊ธฐ๋กํ์ ๋ถ์ด ๋ง์ด ์๋ ๊ฒ ๊ฐ์ ํ๋ก์ ํธ ์ํฉ์์ ์ ์ฉํ ๊ณผ์ ์ ๊ณต์ ํ๊ณ ์ ํฉ๋๋ค.
๋ณธ ๊ธ์์ ์งํํ ์์๋ OpenAI์ ChatGPT๋ฅผ ๊ฒฐํฉํ์ฌ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ChatGPT์๊ฒ ํ๋กฌํํธ๋ฅผ ์ ๋ฌํ๊ณ ์๋ต๋ฐ๋ ์์์ ๋๋ค.
Spring AI๋?
์คํ๋ง ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, Spring AI๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ ํฌ๊ฐ API๋ฅผ ์ด์ฉํ์ฌ ์ธ๊ณต์ง๋ฅ ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ RestTemplate, WebClient ๋ฑ HTTP ์ฐ๊ฒฐ์ ์ง์ ์ง์ ํด์ผ ํ์ต๋๋ค. ํ์ง๋ง Spring AI๋ฅผ ์ด์ฉํ๋ฉด, ์คํ๋ง์ ์ถ์ํ๋ฅผ ์ด์ฉํ์ฌ ์ฝ๊ฒ ์์ฒญ์ ๋ณด๋ผ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ ์์ ๋์
ํด๋ณด๊ณ ์ถ์ ์๊ฐ์ด ๋ค์์ต๋๋ค.
Spring AI ์ ์ฉํ๊ธฐ
์์ฑํ๋ ๋ค๋ฅธ ๊ธ๋ค์ฒ๋ผ, ์ด๋ฒ์๋ ์คํ๋ง์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
build.gradle ์์
๋จผ์ , build.gradle ์์ ์๋ repositories๋ฅผ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์์ฑํด์ผ ํฉ๋๋ค. Spring AI๋ ์์ง ๊ณ์ ๊ฐ๋ฐ ์ค์ด๋ผ ๋ง์ผ์คํค๊ณผ ์ค๋ ์ท์ ๊ด๋ฆฌ๋์ด ์์ด ๊ทธ๋ฐ ๊ฒ ๊ฐ์ต๋๋ค. (์คํ๋ง ๋ถํธ ์ฌ์ดํธ์์ OpenAI ๋ํ๋์๋ฅผ ํ์ธํ์ค ์๋ ์์ต๋๋ค.)
๊ทธ๋ค์์ผ๋ก๋ dependencies์ (OpenAI๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ) org.springframework.ai:spring-ai-openai ๋ฑ์ ์์กด์ฑ์ ๋ฑ๋ก์์ผ์ผ ํฉ๋๋ค. ์ ๋ ๋ฒ์ ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ช
์ํ ๋ฐฉ๋ฒ (์ฒซ ๋ฒ์งธ ์ค)์ ์ฌ์ฉํ์์ต๋๋ค.
์์ : Spring AI 1.0.0 M1 ๋ฒ์ ์ด ๋์ค๊ฒ ๋๋ฉด์ ๊ณต์์ ์ผ๋ก start.spring.io์์ AI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ค ์ ์๊ฒ ๋์์ต๋๋ค.
์ฑํ AI์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์?
๊ทธ๋ผ ์ด์ ChatGPT์ ๊ฐ์ ์ฑํ AI๋ฅผ ํธ์ถํ ์ ์๋ ๊ด๋ จ ์ฝ๋๊ฐ ์ด๋ค ๊ฒ ์๋์ง ์์๋ด์ผ๊ฒ ์ฃ . ๊ณต์ ๋ฌธ์์ ํ๋ณด ์์์ ์ฐธ๊ณ ํ๋ฉด, ChatClient๋ผ๋ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด๋์ด๋ผ ์ ์์์ ๋ณด์ค ์ ์์ต๋๋ค.
- String call(String message)
- ChatResponse ๋ฑ์ ๋ํ ๋ณต์กํจ์ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์์๋ก "๋ฌธ์์ด์ ํ๋กฌํํธ๋ก ๋ณด๋ด๊ณ , ๋ฌธ์์ด๋ก ์๋ตํ ๊ฐ๋ง ๋ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ" ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค.
- ์ค์ ๋ด๋ถ ์ฝ๋๋ฅผ ๋ณด๋ฉด, ์๋์ ChatResponse call(Prompt prompt) ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ChatResponse call(Prompt prompt)
- Prompt ํ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ , ChatResponse ํ์ ์ผ๋ก ์๋ต์ ๋ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ์ ํ์ ํ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ด์ฉํ ์ ์์ด, ๊ณต์ ๋ฌธ์์์๋ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ํฉ์์ ๋ ์์ฃผ ์ฐ์ธ๋ค๊ณ ํฉ๋๋ค.
StreamingChatClient๋ Reactive Flux ๋ฐฉ์์ผ๋ก ์์ฒญ๊ณผ ์๋ต์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ๊ฒ ๊ฐ์๋ฐ, ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ ์๊ณ ์์ง ์์ ๊ฐ๋
์ด๋ผ ๋ณธ ๊ธ์์๋ ChatClient๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
ํ๋ฆํ
์ฑํ
ํ๋ฆ์ ์ดํดํ๊ธฐ ์ํด์๋ ChatClient ์ด์ธ์๋ Prompt์ ChatResponse์ ๋ํด ์ดํดํ์
์ผ ํฉ๋๋ค.
Prompt
Prompt๋ ๋ฉ์์ง (Message)์ ๋ฆฌ์คํธ์ ChatOptions (์ฑํ ๋ชจ๋ธ ์ต์ )์ ์บก์ํ ํ ํด๋์ค์ ๋๋ค.
- 1๏ธโฃ: ๋ชจ๋ ์์ฒญ๊ณผ ํจ๊ป ์ ๋ฌ๋๋ ์ฑํ ์ต์ ์ผ๋ก, ์์ฒญ ์ ์์คํ ์ ์ ๋ฌ๋๋ฉฐ ์์ ์ต์ ์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. (์๋ ๊ฒฝ์ฐ)
- 2๏ธโฃ: instructions (๋ช ๋ น๋ค)์ ์ฑํ ์์ฑ ๋ฐ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ํ ์คํธ ๋ชฉ๋ก, CV ๋ชจ๋ธ์ ์ค๋์ค ๋๋ ์ด๋ฏธ์ง/๋น๋์ค ๋ฑ์ด ๋ ์ ์์ต๋๋ค.
๋ฉ์์ง (Message)๋ ๊ฐ๋จํ ๋งํด์, ์ ํฌ๊ฐ ์ผ์์ ์ผ๋ก ์ฌ์ฉํ๋ ํ๋กฌํํธ ๋ฉ์์ง๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ํ์ ํ๊ฒ ์ง๋ง, ์๋ต ๋ฉ์์ง๋ฅผ ๋ฐ์ ๋์๋ ์ด ๋ฉ์์ง๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Message์ ๊ตฌํ์ฒด๋ก AbstractMessage๊ฐ ์๊ณ , ์ด AbstractMessage๋ฅผ ์์๋ฐ์ UserMessage๋ฅผ ChatClient์์ ์ฌ์ฉํฉ๋๋ค.
ChatClient
ChatClient์์๋ Prompt๋ฅผ GPT AI์ API์ ๋ง๊ฒ ์ ๋ ฅ ๋ช ๋ น๋ค์ ๋ณํํ๊ณ , ์ฑํ ์ต์ ๋ค์ ๋ณํฉํ ๋ค GPT์ API ์์ฒญ์ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์๋ต์ ChatResponse๋ก ๋ฐ์ ์ ์๊ฒ ํฉ๋๋ค.
- 3๏ธโฃ: ChatClient์์๋ ์ ๋ ฅ ๋ช ๋ น๋ค์ ๋ชจ๋ธ ์ ๋ ฅ ํ์์ ๋ง๊ฒ ๋ณํํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- 4๏ธโฃ: ์คํ ์์ ๋น์ด ์์ง ์์ ์ต์ ๋ค์ ์์ ์ ์ต์ ๋ค์ ๋ฎ์ด์๋๋ค.
- 5๏ธโฃ: ์ฑํ ์ต์ ์ ChatClient ์ด๊ธฐํ ์ค์ ์์ ์ ์ค์ ๋ฉ๋๋ค. (๋ชจ๋ธ๋ง๋ค ์ ํ์ ์ผ๋ก ๊ตฌํ)
- 6๏ธโฃ: AI ๋ชจ๋ธ์ด ๋ฐํํ ์๋ต์ ModelRequest, ModelResponse๋ก ๋ณํํฉ๋๋ค.
ChatResponse
ChatResponse๋ ์ฑํ ์๋ต์ ๋ํ ๋ฉํ๋ฐ์ดํฐ (ChatResponseMetadata), Generation์ ๊ฐ์ง๋ ์๋ต ๊ฐ์ฒด์ ๋๋ค.
ChatResponseMetadata๋ AI ๋ชจ๋ธ์ ๋ํ RateLimit (API ํธ์ถ ์ ํ๋), Usage (์ฌ์ฉ๋) ๋ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ OpenAiChatResponseMetadata๋ฅผ ๋ณด๋ฉด ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์๋ฆฌ๋ฅผ ์ดํดํ์ค ์ ์์ต๋๋ค.
์ด๋ฒ์๋ Generation์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Generation ํด๋์ค๋ ๋ชจ๋ธ ๊ฒฐ๊ณผ๋ฅผ ํ์ฅํ์ฌ ๋ณด์กฐ ๋ฉ์์ง (AssistantMessage) ์๋ต๊ณผ ๊ด๋ จ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ํ๋
๋๋ค.
์์ ์ค๋ช
์ ๊ธฐ์ตํ๊ณ ๊ณ์ ๋ถ๋ค์ด๋ผ๋ฉด, ์์ ๋ฉ์์ง (Message)์ ํ์ ํ์
์ผ๋ก UserMessage, AssistantMessage๊ฐ ํจ๊ป ์๋ ๊ฒ์ ๊ธฐ์ตํ๊ณ ๊ณ์ค ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ๊ป ๋์๋ MessageType์ ํตํด, ๋ฉ์์ง์ ํ์
์ค์๋ USER์ ASSISTANT๊ฐ ์์์๋ ์์ค ๊ฒ๋๋ค.
GPT์ ์์ฒญ์ ๋ณด๋ผ ๋๋ ChatClient์์ UserMessage๋ฅผ ์ฌ์ฉํ์๊ณ , ์๋ต์ ๋ฐ์ ๋๋ AssistantMessage๊ฐ Generation ์์ ์์์ ๋ณด์์ต๋๋ค. ์ฆ, ์ด๋ฅผ ํตํด ๋ค์ ์ฌ์ค์ ์ถ๋ก ํ ์ ์์ต๋๋ค.
- ์์ฒญ์ ๋ณด๋ผ ๋๋ Message์ ํ์ ์ด USER์ด๋ค. (์ฌ๋์ด ๋ณด๋ธ ๊ฒ์ด๋ฏ๋ก)
- ์๋ต์ ๋ฐ์ ๋ AI ๋ชจ๋ธ์์ ์ ๋ฌํ Message์ ํ์ ์ ASSISTANT์ด๋ค.
๊ทธ๋ ๋ค๋ฉด String call(String message)์์ ๋ฐํ ์ค์ด ์ ์ ๋ ๊ฒ ๋๋์ง (getResult().getOutput()...)๋ง ๋ณด๊ณ , ์ค์ ๊ตฌ๋์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ChatResponse ์ค์ ์ฝ๋
๊ณต์ ๋ฌธ์์์ ๋ณด์ฌ์ค ChatResponse์ ์ค์ ์ฝ๋๋ ์๋์ฒ๋ผ ๋์ด ์์ต๋๋ค.
- String call(String message) ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ํ๋กฌํํธ๊ฐ ๋ง๋ค์ด์ง๋๋ค.
- ChatResponse๋ฅผ ๋ฐ์ต๋๋ค.
- getResult() ๋ฉ์๋๋ฅผ ํตํด, ์์ฑ๋ Generation์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐ์ต๋๋ค.
- Generation์ getOutput ๋ฉ์๋๋ฅผ ํตํด, Generation์ด ๊ฐ์ง๊ณ ์๋ AssistantMessage๋ฅผ ๋ฐ์ต๋๋ค.
- AssistantMessage๋ AbstractMessage๋ฅผ ์์๋ฐ์ผ๋ฏ๋ก, AbstractMessage์ ์ปจํ ์ธ (์๋ต ๋ฌธ์์ด)๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ด๋ก์จ Spring AI๋ฅผ ์ด์ฉํ์ฌ GPT์ ๋ํํ ๋์ ์์ฒญ๊ณผ ์๋ต์ ๋ํ ํ๋ฆ์ ์๊ฒ ๋์์ต๋๋ค.
GPT๋ฅผ ๊ฒฐํฉํ์!
์ด์ ํ๋ฆ์ ์์์ผ๋, GPT๋ฅผ ๊ฒฐํฉํ์ฌ ์ค์ ํธ์ถ์ ํด ๋ด
์๋ค.
์ด ๊ณผ์ ์์ ๊ณผ๊ธ์ด ๋ฐ์ํ ์ ์์ผ๋, ์ ๋ ์ง์ API ํ ํฐ์ ๊ตฌ์
ํ์๊ธฐ์ ์ ๊ฒฝํ์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค.
API key ๋ฐ๊ธ
GPT์ API key ๋ฐ๊ธ์ ์ํค๋
์ค์์ ์ ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋งํฌ๋ฅผ ๊ณต์ ๋๋ฆฝ๋๋ค.
yml (or properties)์ ํค ์์ฑํ๊ธฐ
์์์ ๋ณด๋ฉด, spring.ai.openai.api-key์ API ํค๋ฅผ ์์ฑํด ๋๋ฉด ๋จ์ ์ ์ ์์ต๋๋ค.
ChatClient ํธ์ถ
์ด์ , ๋ด๋ถ์ ์ผ๋ก ChatClient๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
Postman ํ ์คํธ
Postman์ผ๋ก ํ ์คํธํด ๋ณด๋ฉด ์ ์์ ์ผ๋ก ์๋ํจ์ ๋ณผ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
Spring AI๋ฅผ ๋์
ํ๊ธฐ ์ด์ ์๋ ์ง์ RestTemplate, WebClient ๋ฑ์ผ๋ก GPT์ url์ ์์ฑํ๊ณ , HTTP ์ฐ๊ฒฐ์ ๋ฐ๋ฅธ IOException์ ์บ์น ์ฒ๋ฆฌํด์ค์ผ ํ๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ์์์ง๋ง, Spring AI๊ฐ ๊ฐ์ง ์ถ์ํ์ ์บก์ํ๋ฅผ ํตํด ํจ์ฌ ๊ฐ๋จํ๊ฒ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ต๋๋ค.
๋ค์ ๊ธ์์๋ Spring AI๋ฅผ ๋ณด๋ฉฐ ๋๋ ์ฅ๋จ์ ์ ๋ํด ๊ธ์ ์์ฑํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ถ๊ฐ ์ ๋ณด: OpenAiChatClient
์ฌ๋ด์ผ๋ก, ChatClient์ ๊ตฌํ์ฒด์ธ OpenAiChatClient์ ์ฝ๋๋ฅผ ๋ณด๋ฉด call์ ์ด๋ป๊ฒ ์ค๋ฒ๋ผ์ด๋ฉํ๋์ง ๋ณด์ค ์ ์์ต๋๋ค.
์ด์์ผ๋ก Spring AI ์ ์ฉ๊ธฐ์ ๋ํ ๊ธ์ ๋ง์น๊ฒ ์ต๋๋ค. ๊ธด ๊ธ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!