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

[Spring AI ๐Ÿค–] Spring AI ๋ณ€๊ฒฝ์  ์ด์Šˆ ์•Œ์•„๋ณด๊ธฐ (24.05.22 Issue)

by dev_writer 2024. 5. 26.

์ด์ „ Spring AI์— ๋Œ€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•œ ํ›„, ๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ๋ถ„์ด ๊ธ€์„ ์ฐพ์•„์ฃผ์…จ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋˜ ๋„์ค‘, ๊ฐ‘์ž๊ธฐ Spring AI ๋ฉ”์ธ README์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์˜ฌ๋ผ์™”์Šต๋‹ˆ๋‹ค.

 

Spring AI์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ณต์ง€

 

24.05.25 ๊ธฐ์ค€ Spring AI README

 

ํ•ต์‹ฌ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • 1๏ธโƒฃ ์ƒˆ๋กœ์šด ChatClient๋Š” ChatModel ์ธ์Šคํ„ด์Šค๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RestClient, WebClient, JdbcClient ๋“ฑ๊ณผ ๊ฐ™์€ ์Šคํ”„๋ง ์ƒํƒœ๊ณ„์˜ ํด๋ผ์ด์–ธํŠธ๋“ค๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก fluent API ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • 2๏ธโƒฃ ChatClient, ImageClient ๋“ฑ ...Client๋กœ ๋๋‚ฌ๋˜ ํŒŒ์ผ๋“ค์ด ์ด์ œ๋Š” ...Model๋กœ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ์ด์ „์—๋Š” ChatClient๊ฐ€ ModelClient๋ฅผ ์ƒ์†๋ฐ›์•˜์ง€๋งŒ, ์ด์ œ๋Š” ChatModel์ด Model์„ ์ƒ์†๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • Model ์ธํ„ฐํŽ˜์ด์Šค๋Š” Spring AI API์™€ AI ๋ชจ๋ธ API ๊ฐ„์˜ ๋ณ€ํ™˜์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋‚˜ ํ™•์ธํ•ด ๋ณด์ž

๊ทธ๋ ‡๋‹ค๋ฉด, ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ChatModel

(์ขŒ): ์—…๋ฐ์ดํŠธ ๋œ ChatModel, (์šฐ): ๊ธฐ์กด ChatClient

 

  • ์ด์ „์— ์žˆ๋˜ 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 ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์‚ฌ์ง„: DefaultChatClient (ChatClient์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด)์˜ prompt ๋ฉ”์„œ๋“œ (29๋ฒˆ์งธ ์ค„, ๊ฐ™์€ ChatClientRequest๋ฅผ ๋ฐ˜ํ™˜ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

 

CallResponseSpec ๋‚ด์šฉ๋ถ€ํ„ฐ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด๋กœ์จ ChatClient์™€ ChatModel๋กœ ๊ตฌ๋ถ„ํ•œ ์ด์œ ๋Š” README ๋‚ด์šฉ๋Œ€๋กœ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€์™€ ์œ ์ € ๋ฉ”์‹œ์ง€๋ฅผ ์‰ฝ๊ฒŒ, fluent API ๋ฐฉ์‹์œผ๋กœ ํ•œ ๋ฒˆ์— AI ๋ชจ๋ธ์—๊ฒŒ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ž„์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ๊ฐœ๋ฐœํ•œ Christian Tzolov์™€ Mark Pollack์— ๊ฒฝ์˜๋ฅผ ํ‘œํ•ฉ๋‹ˆ๋‹ค..)

 

์ถ”๊ฐ€: ๋ฐ”๋€ ํ๋ฆ„ํ‘œ

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

 

๋ณ€๊ฒฝ๋œ ์ด๋ฏธ์ง€: ChatClient์—์„œ ChatModel๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก : ๋Š๋‚€ ์ 

  • ChatClient์™€ ChatModel๋กœ ๊ตฌ์„ฑ๋œ ๊ฒƒ์„ ๋ณด๋“ฏ์ด, ์ด์ „ ๋ฒ„์ „๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ด๊ณ  ์œ ์šฉํ•˜๊ฒŒ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋งŒํผ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚œ ๊ฒƒ ๊ฐ™์•„ ์ด๋ฒˆ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ๊ธด ํด๋ž˜์Šค ๋“ฑ ๋งค๋„๋Ÿฝ๊ฒŒ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์„œ ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ดํ•ดํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋Š๋ผ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ •๋ฆฌ ๊ธ€์„ ์ž‘์„ฑํ•œ ์ง€ ์•ฝ 3์ฃผ ๋งŒ์— ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ์ด ์ƒ๊ธด ๊ฒƒ์„ ๋ณด๋ฉด์„œ, ๋น„๊ต์  ์‹ ์ƒ ๊ธฐ์ˆ ์ธ ๊ฒƒ์€ ๋„์ž…์„ ์‹ ์ค‘ํžˆ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ, ์กฐ๊ธˆ ์•ˆ์ •ํ™”๊ฐ€ ์ง„ํ–‰๋œ ๋’ค ๋„์ž…ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๊ฒŒ ๋œ ๊ณ„๊ธฐ์˜€์Šต๋‹ˆ๋‹ค.

 

Spring AI์— ๋Œ€ํ•œ ๋‹ค์Œ ๊ธ€๋กœ๋Š” ๋‹จ์ˆœํžˆ ์งˆ๋ฌธ ํ”„๋กฌํ”„ํŠธ๋งŒ ๋˜์ง€๋Š” ๊ฒƒ ๋ง๊ณ ๋„ ํ…œํ”Œ๋ฆฟ (template)์„ ์ ์šฉํ•˜๋Š” ๋“ฑ Spring AI์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์„ ์†Œ๊ฐœํ•ด๋ณด๋Š” ๊ธ€์„ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Reference