๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ ํŒ (๊ธฐ์ˆ  ์ ์šฉ ๋ฐฉ๋ฒ• ๋“ฑ)/๐Ÿค– Spring AI

[Spring AI ๐Ÿค–] Spring AI๋ฅผ ์ ์šฉํ•ด๋ณด์ž!

by dev_writer 2024. 5. 2.
๋ณธ ๋‚ด์šฉ์€ 24.05.22 Spring AI์— ๋Œ€ํ•ด ๋ณ€๊ฒฝ์ ์ด ์ƒ๊ธด ์ด์œ ๋กœ ์ตœ์‹  ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋žต์ ์ธ ์›๋ฆฌ๋Š” ๊ฐ™์œผ๋‚˜, ๋ณ€๊ฒฝ์ ์— ๋Œ€ํ•ด ์•„์‹œ๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค์€ ํ•ด๋‹น ๊ธ€๋„ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

๊ฐœ์š”

์š”์ƒˆ ChatGPT ๋“ฑ ์ƒ์„ฑํ˜• AI๋ฅผ ์„œ๋น„์Šค์— ์ ‘๋ชฉ์‹œํ‚ค๋Š” ๊ธฐ์—…๋“ค์ด ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๊ณ , ์ด๋Ÿฌํ•œ ์ฐจ์›์—์„œ ์ƒ์„ฑํ˜• AI๋ฅผ ํ”„๋กœ์ ํŠธ์— ๋„ฃ์–ด๋ณด๊ณ ์ž ํ•˜๋Š” ๋ถ„๋“ค์ด ๋งŽ์€ ๊ธฐ๋ฅ˜๋ฅผ ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
์Šคํ”„๋ง์—์„œ๋Š” ์•„๋ž˜์˜ ์˜์ƒ์„ ํ†ตํ•ด ์ž์ฒด ๊ธฐ์ˆ ์ธ Spring AI๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ์˜์ƒ์„ ๋งŒ๋“ค๊ธฐ๋„ ํ•˜์˜€์ฃ .

Building Intelligent Applications With Spring AI - IntelliJ IDEA ์˜์ƒ (24.03.29)

 
๋‚˜์˜จ ์ง€ ์–ผ๋งˆ ๋˜์ง€ ์•Š์€ ๊ธฐ์ˆ ์ด๋‹ค ๋ณด๋‹ˆ, ์•„์ง ์ด ๊ธฐ์ˆ ์„ ๋ธ”๋กœ๊ทธ์— ๊ธฐ๋กํ•˜์‹  ๋ถ„์ด ๋งŽ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์—์„œ ์ ์šฉํ•œ ๊ณผ์ •์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
 

๋ณธ ๊ธ€์—์„œ ์ง„ํ–‰ํ•  ์˜ˆ์‹œ๋Š” OpenAI์˜ ChatGPT๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ChatGPT์—๊ฒŒ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์‘๋‹ต๋ฐ›๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

Spring AI๋ž€?

์Šคํ”„๋ง ๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด, 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 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์‹ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

start.spring.io์—์„œ ์ง€์›ํ•˜๋Š” OpenAI

 

์ฑ„ํŒ… AI์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์€?

๊ทธ๋Ÿผ ์ด์ œ ChatGPT์™€ ๊ฐ™์€ ์ฑ„ํŒ… AI๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๊ฒŒ ์žˆ๋Š”์ง€ ์•Œ์•„๋ด์•ผ๊ฒ ์ฃ . ๊ณต์‹ ๋ฌธ์„œ์™€ ํ™๋ณด ์˜์ƒ์„ ์ฐธ๊ณ ํ•˜๋ฉด, ChatClient๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด๋Œ์–ด๋‚ผ ์ˆ˜ ์žˆ์Œ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์‹ ๋ฌธ์„œ์— ์žˆ๋Š” ChatClient์™€ StreamingChatClient ์ธํ„ฐํŽ˜์ด์Šค ์ฝ”๋“œ - ๋ฒˆ์—ญ์ด ์ข€ ์ด์ƒํ•œ๋ฐ, ์•„๋ž˜ ์„ค๋ช…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

  • String call(String message)
    • ChatResponse ๋“ฑ์— ๋Œ€ํ•œ ๋ณต์žกํ•จ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ๋กœ "๋ฌธ์ž์—ด์„ ํ”„๋กฌํ”„ํŠธ๋กœ ๋ณด๋‚ด๊ณ , ๋ฌธ์ž์—ด๋กœ ์‘๋‹ตํ•œ ๊ฐ’๋งŒ ๋ฐ›๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ" ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.
    • ์‹ค์ œ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ์•„๋ž˜์˜ ChatResponse call(Prompt prompt) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ChatResponse call(Prompt prompt)
    • Prompt ํƒ€์ž…์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ChatResponse ํƒ€์ž…์œผ๋กœ ์‘๋‹ต์„ ๋ฐ›๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐ‘์— ํ›„์ˆ  ํ•  ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด, ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํ™ฉ์—์„œ ๋” ์ž์ฃผ ์“ฐ์ธ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

StreamingChatClient๋Š” Reactive Flux ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ์•Œ๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฐœ๋…์ด๋ผ ๋ณธ ๊ธ€์—์„œ๋Š” ChatClient๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
 

ํ๋ฆ„ํ‘œ

์ถœ์ฒ˜ - Spring AI ๊ณต์‹ ๋ฌธ์„œ

 
์ฑ„ํŒ… ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ChatClient ์ด์™ธ์—๋„ Prompt์™€ ChatResponse์— ๋Œ€ํ•ด ์ดํ•ดํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 

Prompt

Prompt๋Š” ๋ฉ”์‹œ์ง€ (Message)์˜ ๋ฆฌ์ŠคํŠธ์™€ ChatOptions (์ฑ„ํŒ… ๋ชจ๋ธ ์˜ต์…˜)์„ ์บก์Šํ™” ํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

  • 1๏ธโƒฃ: ๋ชจ๋“  ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „๋‹ฌ๋˜๋Š” ์ฑ„ํŒ… ์˜ต์…˜์œผ๋กœ, ์š”์ฒญ ์‹œ ์‹œ์Šคํ…œ์— ์ „๋‹ฌ๋˜๋ฉฐ ์‹œ์ž‘ ์˜ต์…˜์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์žˆ๋Š” ๊ฒฝ์šฐ)
  • 2๏ธโƒฃ: instructions (๋ช…๋ น๋“ค)์€ ์ฑ„ํŒ… ์™„์„ฑ ๋ฐ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์˜ ํ…์ŠคํŠธ ๋ชฉ๋ก, CV ๋ชจ๋ธ์˜ ์˜ค๋””์˜ค ๋˜๋Š” ์ด๋ฏธ์ง€/๋น„๋””์˜ค ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ - Spring AI ๊ณต์‹ ๋ฌธ์„œ

 
๋ฉ”์‹œ์ง€ (Message)๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์ €ํฌ๊ฐ€ ์ผ์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ ๋ฉ”์‹œ์ง€๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ›„์ˆ  ํ•˜๊ฒ ์ง€๋งŒ, ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ์—๋„ ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Spring AI์˜ ์‹ค์ œ Message ์ธํ„ฐํŽ˜์ด์Šค

 
Message์˜ ๊ตฌํ˜„์ฒด๋กœ AbstractMessage๊ฐ€ ์žˆ๊ณ , ์ด AbstractMessage๋ฅผ ์ƒ์†๋ฐ›์€ UserMessage๋ฅผ ChatClient์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

AbstractMessage, UserMessage, MessageType ๋‚ด๋ถ€ ์ฝ”๋“œ

 

ChatClient

ChatClient์—์„œ๋Š” Prompt๋ฅผ GPT AI์˜ API์— ๋งž๊ฒŒ ์ž…๋ ฅ ๋ช…๋ น๋“ค์„ ๋ณ€ํ™˜ํ•˜๊ณ , ์ฑ„ํŒ… ์˜ต์…˜๋“ค์„ ๋ณ‘ํ•ฉํ•œ ๋’ค GPT์— API ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์‘๋‹ต์„ ChatResponse๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  • 3๏ธโƒฃ: ChatClient์—์„œ๋Š” ์ž…๋ ฅ ๋ช…๋ น๋“ค์„ ๋ชจ๋ธ ์ž…๋ ฅ ํ˜•์‹์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
  • 4๏ธโƒฃ: ์‹คํ–‰ ์‹œ์— ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์˜ต์…˜๋“ค์€ ์‹œ์ž‘ ์‹œ ์˜ต์…˜๋“ค์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  • 5๏ธโƒฃ: ์ฑ„ํŒ… ์˜ต์…˜์€ ChatClient ์ดˆ๊ธฐํ™” ์ค‘์— ์‹œ์ž‘ ์‹œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. (๋ชจ๋ธ๋งˆ๋‹ค ์„ ํƒ์ ์œผ๋กœ ๊ตฌํ˜„)
  • 6๏ธโƒฃ: AI ๋ชจ๋ธ์ด ๋ฐ˜ํ™˜ํ•œ ์‘๋‹ต์„ ModelRequest, ModelResponse๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

ChatResponse

ChatResponse๋Š” ์ฑ„ํŒ… ์‘๋‹ต์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (ChatResponseMetadata), Generation์„ ๊ฐ€์ง€๋Š” ์‘๋‹ต ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ - Spring AI ๊ณต์‹ ๋ฌธ์„œ

 
ChatResponseMetadata๋Š” AI ๋ชจ๋ธ์— ๋Œ€ํ•œ RateLimit (API ํ˜ธ์ถœ ์ œํ•œ๋Ÿ‰), Usage (์‚ฌ์šฉ๋Ÿ‰) ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ OpenAiChatResponseMetadata๋ฅผ ๋ณด๋ฉด ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenAI์™€ ๊ด€๋ จ๋œ ChatResponseMetadata

 
์ด๋ฒˆ์—๋Š” Generation์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Generation ํด๋ž˜์Šค๋Š” ๋ชจ๋ธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋ณด์กฐ ๋ฉ”์‹œ์ง€ (AssistantMessage) ์‘๋‹ต๊ณผ ๊ด€๋ จ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 
์œ„์˜ ์„ค๋ช…์„ ๊ธฐ์–ตํ•˜๊ณ  ๊ณ„์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด, ์œ„์˜ ๋ฉ”์‹œ์ง€ (Message)์˜ ํ•˜์œ„ ํƒ€์ž…์œผ๋กœ UserMessage, AssistantMessage๊ฐ€ ํ•จ๊ป˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ  ๊ณ„์‹ค ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ๊ป˜ ๋„์›Œ๋‘” MessageType์„ ํ†ตํ•ด, ๋ฉ”์‹œ์ง€์˜ ํƒ€์ž… ์ค‘์—๋Š” USER์™€ ASSISTANT๊ฐ€ ์žˆ์—ˆ์Œ๋„ ์•„์‹ค ๊ฒ๋‹ˆ๋‹ค.
 
GPT์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” ChatClient์—์„œ UserMessage๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๋Š” AssistantMessage๊ฐ€ Generation ์•ˆ์— ์žˆ์Œ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์‚ฌ์‹ค์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” Message์˜ ํƒ€์ž…์ด USER์ด๋‹ค. (์‚ฌ๋žŒ์ด ๋ณด๋‚ธ ๊ฒƒ์ด๋ฏ€๋กœ)
  • ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ AI ๋ชจ๋ธ์—์„œ ์ „๋‹ฌํ•œ Message์˜ ํƒ€์ž…์€ ASSISTANT์ด๋‹ค.

๋‹ค์‹œ ๋ณต๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ChatClient์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

 
๊ทธ๋ ‡๋‹ค๋ฉด String call(String message)์—์„œ ๋ฐ˜ํ™˜ ์ค„์ด ์™œ ์ €๋ ‡๊ฒŒ ๋˜๋Š”์ง€ (getResult().getOutput()...)๋งŒ ๋ณด๊ณ , ์‹ค์ œ ๊ตฌ๋™์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
 

ChatResponse ์‹ค์ œ ์ฝ”๋“œ

๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ณด์—ฌ์ค€ ChatResponse์˜ ์‹ค์ œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ChatResponse, Generation, AbstractMessage

  1. String call(String message) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
  3. ChatResponse๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  4. getResult() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด, ์ƒ์„ฑ๋œ Generation์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  5. Generation์˜ getOutput ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด, Generation์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” AssistantMessage๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  6. AssistantMessage๋Š” AbstractMessage๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฏ€๋กœ, AbstractMessage์˜ ์ปจํ…์ธ  (์‘๋‹ต ๋ฌธ์ž์—ด)๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋กœ์จ Spring AI๋ฅผ ์ด์šฉํ•˜์—ฌ GPT์™€ ๋Œ€ํ™”ํ•  ๋•Œ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ํ๋ฆ„์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
 

GPT๋ฅผ ๊ฒฐํ•ฉํ•˜์ž!

์ด์ œ ํ๋ฆ„์„ ์•Œ์•˜์œผ๋‹ˆ, GPT๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹ค์ œ ํ˜ธ์ถœ์„ ํ•ด ๋ด…์‹œ๋‹ค.
 
์ด ๊ณผ์ •์—์„œ ๊ณผ๊ธˆ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ €๋Š” ์ง์ ‘ API ํ† ํฐ์„ ๊ตฌ์ž…ํ•˜์˜€๊ธฐ์— ์ œ ๊ฒฝํ—˜์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
 

API key ๋ฐœ๊ธ‰

GPT์˜ API key ๋ฐœ๊ธ‰์€ ์œ„ํ‚ค๋…์Šค์—์„œ ์ž˜ ์ •๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งํฌ๋ฅผ ๊ณต์œ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
 

yml (or properties)์— ํ‚ค ์ž‘์„ฑํ•˜๊ธฐ

์˜์ƒ์„ ๋ณด๋ฉด, spring.ai.openai.api-key์— API ํ‚ค๋ฅผ ์ž‘์„ฑํ•ด ๋‘๋ฉด ๋จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Building Intelligent Applications With Spring AI - IntelliJ IDEA ์˜์ƒ (24.03.29)

 

ChatClient ํ˜ธ์ถœ

์ด์ œ, ๋‚ด๋ถ€์ ์œผ๋กœ ChatClient๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 

๋ฐ๋ชจ์šฉ ์ฝ”๋“œ

 

Postman ํ…Œ์ŠคํŠธ

Postman์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด ๋ณด๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•จ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Postman ์‹คํ–‰ ๊ฒฐ๊ณผ

 

๊ฒฐ๋ก 

Spring AI๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์ด์ „์—๋Š” ์ง์ ‘ RestTemplate, WebClient ๋“ฑ์œผ๋กœ GPT์˜ url์„ ์ž‘์„ฑํ•˜๊ณ , HTTP ์—ฐ๊ฒฐ์— ๋”ฐ๋ฅธ IOException์„ ์บ์น˜ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, Spring AI๊ฐ€ ๊ฐ€์ง„ ์ถ”์ƒํ™”์™€ ์บก์Šํ™”๋ฅผ ํ†ตํ•ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
 
๋‹ค์Œ ๊ธ€์—์„œ๋Š” Spring AI๋ฅผ ๋ณด๋ฉฐ ๋Š๋‚€ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ๊ธ€์„ ์ž‘์„ฑํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
 

์ถ”๊ฐ€ ์ •๋ณด: OpenAiChatClient

์—ฌ๋‹ด์œผ๋กœ, ChatClient์˜ ๊ตฌํ˜„์ฒด์ธ OpenAiChatClient์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด call์„ ์–ด๋–ป๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ–ˆ๋Š”์ง€ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ OpenAiChatClient์˜ call ๋ฉ”์„œ๋“œ

 
์ด์ƒ์œผ๋กœ Spring AI ์ ์šฉ๊ธฐ์— ๋Œ€ํ•œ ๊ธ€์„ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
 

Reference