๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
1๏ธโƒฃ AI•DS/๐ŸŒ LLM

15. LLM ์—์ด์ „ํŠธ

by isdawell 2025. 11. 21.
728x90

 

 

1.   ์—์ด์ „ํŠธ๋ž€


 

1.1  ์—์ด์ „ํŠธ์˜ ๊ตฌ์„ฑ์š”์†Œ

 

โ  ์—์ด์ „ํŠธ

โ†ช๏ธŽ  ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ๊ฐ๊ฐ์„ ํ†ตํ•ด ์ธ์‹ํ•˜๊ณ , ์˜์‚ฌ๊ฒฐ์ •์„ ๋‚ด๋ ค, ํ–‰๋™ํ•˜๋Š” ์ธ๊ณต์ ์ธ ๊ฐœ์ฒด 

โ†ช๏ธŽ  ์ฃผ์–ด์ง„ ์ผ์„ ์Šค์Šค๋กœ ์„ธ๋ถ„ํ™”ํ•˜๊ณ  ๋‹จ๊ณ„๋ณ„๋กœ ํ•„์š”ํ•œ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์™„์ˆ˜ํ•œ๋‹ค. 

 

 

โ  ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ

 

 

 

โ†ช๏ธŽ  1) ๊ฐ๊ฐ : ์™ธ๋ถ€ํ™˜๊ฒฝ๊ณผ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ธ์‹

โ†ช๏ธŽ  2) ๋‘๋‡Œ : ์ง€์‹์ด๋‚˜ ๊ธฐ์–ต์„ ํ™•์ธํ•˜์—ฌ ๊ณ„ํš์„ ์„ธ์šฐ๊ฑฐ๋‚˜ ์ถ”๋ก ์„ ํ†ตํ•ด ๋‹ค์Œ ํ–‰๋™์˜ ์—ฌ๋ถ€ ๋“ฑ ์˜์‚ฌ๊ฒฐ์ •์„ ๋‚ด๋ฆผ 

โ†ช๏ธŽ  3) ํ–‰๋™ : ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด ํ–‰๋™ 

 

 

 

1.2  ์—์ด์ „ํŠธ์˜ ๋‘๋‡Œ

 

โ  ์—์ด์ „ํŠธ์˜ ๋‘๋‡Œ

โ†ช๏ธŽ  ๋‘๋‡Œ์—ญํ• ์„ ํ•˜๋Š” ๊ธฐ์ˆ  : Symbolic AI, ๊ฐ•ํ™”ํ•™์Šต, meta learning (์ „์ดํ•™์Šต์˜ ์ผ์ข…), LLM 

โ†ช๏ธŽ  LLM์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ์—์ด์ „ํŠธ๊ฐ€ ํ™œ๋ฐœํžˆ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋‹ค. 

 

 

โ†ช๏ธŽ ์ฃผ๋ณ€ ํ™˜๊ฒฝ๊ณผ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ธ์‹ํ•˜์—ฌ > ๊ทธ๋ฅผ ์ดํ•ดํ•˜๊ณ  > ๋ชฉํ‘œ๋‹ฌ์„ฑ์„ ์œ„ํ•ด ์–ด๋–ค ํ–‰๋™์„ ์ทจํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋‹ค. 

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

 

๐Ÿ‘‰ LLM์€ ์ด ๋ชจ๋“  ๊ณผ์ •์— ํ•„์š”ํ•œ ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค : RAG (ํ•„์š”ํ•œ ์ง€์‹์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ™œ์šฉ), ์ถ”๋ก  ๋Šฅ๋ ฅ, ์ผ๋ฐ˜ํ™” ๋Šฅ๋ ฅ, ์š”์•ฝ ๊ธฐ๋Šฅ 

 

 


1.3 ์—์ด์ „ํŠธ์˜ ๊ฐ๊ฐ

 

โ  ์—์ด์ „ํŠธ์˜ ๊ฐ๊ฐ

โ†ช๏ธŽ  ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ์Œ์„ฑ(e.g. OpenAI์˜ Whisper) ๋“ฑ LLM์ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ํ’๋ถ€ํ•œ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค. 

Video-LLaMA (๋น„๋””์˜ค ์ธ์ฝ”๋”์™€ ์˜ค๋””์˜ค ์ธ์ฝ”๋”๋กœ ์˜์ƒ์ •๋ณด์™€ ์˜ค๋””์˜ค ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•ด, ํ•ด๋‹น ๋น„๋””์˜ค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ…์ŠคํŠธ๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜)

 

โ†ช๏ธŽ  LLaVA (์ด๋ฏธ์ง€์™€ ํ…์ŠคํŠธ ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋ชจ๋ธ), Video-LLaMA (๋น„๋””์˜ค์™€ ํ…์ŠคํŠธ ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋ชจ๋ธ), GPT-4V, GPT-4o 

โ†ช๏ธŽ  ์ด๋ฏธ์ง€์™€ ์Œ์„ฑ ๋ฐ์ดํ„ฐ ์™ธ์—๋„, ์ด‰๊ฐ ์„ผ์„œ๋‚˜ ํ›„๊ฐ ์„ผ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ์ด‰๊ฐ ์ •๋ณด๋‚˜ ๋ƒ„์ƒˆ ์ •๋ณด๋ฅผ LLM์— ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, GPS์™€ ๊ฐ™์€ ์œ„์น˜์ •๋ณด, 3D ๊ณต๊ฐ„ ์ •๋ณด ๋“ฑ์„ ํ™œ์šฉํ•ด LLM์— ํ’๋ถ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

1.4  ์—์ด์ „ํŠธ์˜ ํ–‰๋™

 

โ  ์—์ด์ „ํŠธ์˜ ํ–‰๋™

โ†ช๏ธŽ  LLM์€ ํ…์ŠคํŠธ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ํ–‰๋™์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” LLM์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ (ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ) ์„ค๋ช…์„ ์ œ๊ณตํ•˜๋ฉด, LLM์€ ์ƒํ™ฉ์— ๋งž์ถฐ ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

โ†ช๏ธŽ  ๊ฐ€๋ น, ๋‚ด์ผ ๋‚ ์”จ๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ํ•  ๋•Œ, ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ ๊ณ„์‚ฐ๊ธฐ ๋„๊ตฌ ๋ชฉ๋ก์„ LLM์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ , ํ•„์š”ํ•œ ํ–‰๋™์„ ์„ ํƒํ•˜๋„๋ก ํ•˜๋ฉด ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๊ณ , '๋‚ด์ผ ๋‚ ์”จ'๋ฅผ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋กœ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ž˜ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋ฆ„๋งŒ์œผ๋กœ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ธฐ๋Šฅ์ด๋ผ๋ฉด, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ด๋„ ์ข‹๋‹ค. 

 

 

โ  ๋„๊ตฌ

โ†ช๏ธŽ  ๋Œ€ํ‘œ์ ์ธ ๋„๊ตฌ๋กœ๋Š” ๊ฒ€์ƒ‰ API (์ธํ„ฐ๋„ท ์ •๋ณด ํ™œ์šฉ), ์ฝ”๋“œ ์‹คํ–‰, ์ด๋ฏธ์ง€(Dall-E, Stable Diffusion)/์Œ์„ฑ(TTS) ์ƒ์„ฑ, ๋ฌผ๋ฆฌ์  ํ–‰๋™, ๋ฒˆ์—ญ/์š”์•ฝ ๋“ฑ์ด ์žˆ๋‹ค. 

 

 

 

 

 

2.   ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์˜ ํ˜•ํƒœ 


 

2.1  ๋‹จ์ผ ์—์ด์ „ํŠธ

 

โ  AutoGPT

์ถœ์ฒ˜ : https://fastcampus.co.kr/media_data_autogpt

 

 

โ†ช๏ธŽ  GPT-4 LLM์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ AI Agent ๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ํ”„๋กœ์ ํŠธ์™€ ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค AI ํ”Œ๋žซํผ (์˜คํ”ˆ์†Œ์Šค AI Agent) 

โ†ช๏ธŽ  AutoGPT๋Š” ์ž…๋ ฅ๋ฐ›๋Š” 'ํ”„๋กฌํ”„ํŠธ' ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ๋‹ค. 

 

 

โ  ํ”„๋กฌํ”„ํŠธ๊ตฌ์„ฑ

โ†ช๏ธŽ  1) ์—์ด์ „ํŠธ์˜ ์ด๋ฆ„๊ณผ ์—ญํ•  : ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ์—ญํ• ์„ ์ง€์ •ํ•˜์˜€์„ ๋•Œ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. 

โ†ช๏ธŽ  2) ๋ชฉํ‘œ : ex. ๊ฝƒ์— ๋Œ€ํ•œ ์งง์€ ์ด์•ผ๊ธฐ๋ฅผ ์“ฐ๊ธฐ 

โ†ช๏ธŽ  3) ์ œ์•ฝ์‚ฌํ•ญ (Constraints) : ์—์ด์ „ํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ ์ง€์ผœ์•ผ ํ•˜๋Š” ์ œ์•ฝ์‚ฌํ•ญ 

โ†ช๏ธŽ  4) ๋„๊ตฌ (Commands) : ๊ตฌ๊ธ€๊ฒ€์ƒ‰, ์›น์‚ฌ์ดํŠธ ์กฐํšŒ, ์ž‘์—… ์ข…๋ฃŒ ๋“ฑ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๋ น LLM์ด ํŒ๋‹จํ–ˆ์„ ๋•Œ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•˜๋ฉด 'google' ๋ผ๋Š” ๋„๊ตฌ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์ธ์ž๋กœ ํ•„์š”ํ•œ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

โ†ช๏ธŽ  5) ์„ฑ๋Šฅํ‰๊ฐ€ : ์—์ด์ „ํŠธ๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š”๋ฐ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋ช…๋ น 

โ†ช๏ธŽ  6) ์ˆ˜ํ–‰ํ•œ ํ–‰๋™๊ณผ ๊ฒฐ์ •์„ ํšŒ๊ณ ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ํ–‰๋™์œผ๋กœ ๋‚ญ๋น„๋œ ๋น„์šฉ์„ ๊ฒ€ํ† ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ต๋ณ€ ํ˜•ํƒœ๋ฅผ JSON ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜๋„๋ก ํ•˜์—ฌ ์ดํ›„์— ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 

 

 

โ  ๋‹จ์ผ ์—์ด์ „ํŠธ์˜ ์žฅ๋‹จ์ 

โ†ช๏ธŽ  ์žฅ์  : ๋ชจ๋“  ๊ณผ์ •์„ ์Šค์Šค๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ณ , ๋ฒ”์šฉ์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กฌํ”„ํŠธ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ํ™œ์šฉ์ด ๊ฐ€๋Šฅ 

โ†ช๏ธŽ  ๋‹จ์  : ๋ฒ”์šฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ธธ์„ ์žƒ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๊ณ , LLM์˜ ์„ฑ๋Šฅ์— ํฌ๊ฒŒ ์ขŒ์šฐ๋œ๋‹ค. 

โ†ช๏ธŽ  ๋ชฉํ‘œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ž‘์—…์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ์—๋งŒ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค. 

 

 


2.2  ์‚ฌ์šฉ์ž์™€ ์—์ด์ „ํŠธ์˜ ์ƒํ˜ธ์ž‘์šฉ

 

โ  ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ž…์ด ํ•„์š”ํ•œ ์ž‘์—… ๊ณผ์ •

 

(์™ผ์ชฝ) ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…๋ น๊ณผ ํ”ผ๋“œ๋ฐฑ์„ ์ „๋‹ฌํ•˜๊ณ  ์—์ด์ „ํŠธ๊ฐ€ ์ˆ˜ํ–‰, (b) ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ๋žŒ์˜ ๋ช…๋ น์„ ๋“ฃ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™๋“ฑํ•œ ์ง€์œ„์—์„œ ์ƒํ˜ธ์ž‘์šฉ

 

 

โ†ช๏ธŽ  ํŠน์ • ๋„๋ฉ”์ธ์—์„œ LLM์˜ ์ „๋ฌธ์„ฑ์ด ์‚ฌ๋žŒ์— ๋น„ํ•ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •์— ์ง์ ‘ ๊ฐœ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…ํ™•ํ•œ ๋ช…๋ น๊ณผ ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•˜๊ณ , ์—์ด์ „ํŠธ๋Š” ์ž‘์€ ์ž‘์—…์„ ์ž๋™ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋น ๋ฅด๊ณ  ํŽธํ•˜๊ฒŒ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋„๋ก ์ง€์›ํ•œ๋‹ค. 

โ†ช๏ธŽ  ๋ฐ”๋‘‘์ด๋‚˜ ์ฒด์Šค์ฒ˜๋Ÿผ AI ๋ชจ๋ธ์ด ์‚ฌ๋žŒ๊ณผ ์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋” ๋›ฐ์–ด๋‚œ ์ˆ˜์ค€์— ์ด๋ฅธ ์ž‘์—…์€ ์‚ฌ๋žŒ๊ณผ ๋™๋“ฑํ•œ ์ง€์œ„์—์„œ ํ”Œ๋ ˆ์ด ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 


2.3  ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ

 

โ  ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ

โ†ช๏ธŽ  ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ์˜ ํ˜‘๋ ฅ์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹

โ†ช๏ธŽ  ๊ฐ ์—์ด์ „ํŠธ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ•„์„ ์ฃผ๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ตฌ์ฒด์ ์ธ ํ”„๋กœํ•„์„ LLM์— ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ž‘์—…์˜ ์ „๋ฌธ์„ฑ์„ ๋†’์—ฌ ํ’ˆ์งˆ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. 

โ†ช๏ธŽ  AutoGen, MetaGPT, CrewAI ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ๊ตฌํ˜„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๋‹ค. 

 

 

โ  AutoGen

 

 

 

โ†ช๏ธŽ  ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์˜ ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

โ†ช๏ธŽ  ๋ชจ๋“  ์ž‘์—…์„ ํ•˜๋‚˜์˜ ์—์ด์ „ํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, ๋งž์ถคํ˜• ์—์ด์ „ํŠธ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ ํ•ด๊ฒฐ ํ™•๋ฅ ์„ ๋” ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. 

โ†ช๏ธŽ  ์—์ด์ „ํŠธ๋ผ๋ฆฌ๋Š” '๋Œ€ํ™”'๋ฅผ ํ†ตํ•ด ์ง„ํ–‰์ƒํ™ฉ๊ณผ ์ž‘์—…๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ๋ชจ๋‘ ํ•จ๊ป˜ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋Š” ์ˆ˜ํ‰ํ˜•(joint chat) ๋Œ€ํ™”์™€ ๋Œ€ํ™”๋ฅผ ์ฃผ๋„ํ•˜๋Š” ๋งค๋‹ˆ์ €๊ฐ€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ž‘์—…ํ•  ์—์ด์ „ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋Œ€ํ™”๊ฐ€ ์ง„ํ–‰๋˜๋Š” ์œ„๊ณ„ํ˜•(hierarchical chat) ๋Œ€ํ™”๊ฐ€ ์žˆ๋‹ค. 

 

 

โ  AutoGen Studio

 

 

 

 

โ†ช๏ธŽ  AutoGen ์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, UI์ƒ์—์„œ ์ƒ์„ฑํ•œ ์—์ด์ „ํŠธ์™€ ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์ง€ ์•Š๊ณ ๋„ ์—์ด์ „ํŠธ๋‚˜ ๋„๊ตฌ, ์—์ด์ „ํŠธ์˜ ์ž‘์—… ํ๋ฆ„์„ ์ •์˜ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

3.   ์—์ด์ „ํŠธ ํ‰๊ฐ€ํ•˜๊ธฐ


 

โ  ์„ฑ๋Šฅํ‰๊ฐ€

โ†ช๏ธŽ  LLM์„ ํ™œ์šฉํ•œ ์—์ด์ „ํŠธ๋Š” (2023๋…„๊ธฐ์ค€)  ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—์ด์ „ํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ •๋ฆฝ๋˜์ง€๋Š” ์•Š์•˜๋‹ค. 

 

 

โ  ์ฃผ๊ด€์ ์ธ ๋ฐฉ์‹

โ†ช๏ธŽ  ์—์ด์ „ํŠธ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๊ณ , ์‚ฌ๋žŒ์˜ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•ด์„œ ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฒƒ๊ณผ ์‚ฌ๋žŒ์ด ์ƒ์„ฑํ•œ ๊ฒƒ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” (ํŠœ๋งํ…Œ์ŠคํŠธ) ๋ฐฉ์‹์ด ์žˆ๋‹ค. LLM์„ ํ‰๊ฐ€ํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ‰๊ฐ€์ž LLM์„ ํ™œ์šฉํ•ด ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹๋„ ์—ฐ๊ตฌ๋˜๊ณ  ์žˆ๋‹ค. 

 

 

โ  ๊ฐ๊ด€์ ์ธ ๋ฐฉ์‹

โ†ช๏ธŽ  ๋ฒค์น˜๋งˆํฌ ๋ฐ์ดํ„ฐ์…‹์„ ์ด์šฉํ•ด ๊ฐ๊ด€์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค. Agent๋Š” LLM์— ํ–‰๋™์„ ์œ„ํ•œ ๋„๊ตฌ๋‚˜ ๊ธฐ์–ต๊ณผ ์ง€์‹๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ฒ€์ƒ‰์ฆ๊ฐ•์ƒ์„ฑ(RAG)๋ฅผ ์ถ”๊ฐ€๋กœ ํ™œ์šฉํ•˜๋ฏ€๋กœ ์—์ด์ „ํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ๋Š” ํ›จ์”ฌ ๋” ์–ด๋ ต๋‹ค. 

 

 

โ  ๊ฐ๊ด€์ ์ธ ๋ฐฉ์‹ : ์—์ด์ „ํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๊ธฐ์ค€ 4๊ฐ€์ง€ 

โ†ช๏ธŽ  1) ์œ ์šฉ์„ฑ : ์ž‘์—… ์„ฑ๊ณต๋ฅ  ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ์œ ์šฉ์„ฑ ํ‰๊ฐ€ 

โ†ช๏ธŽ  2) ์‚ฌํšŒ์„ฑ : ์–ธ์–ด์ ์ธ ์ƒํ˜ธ์ž‘์šฉ ์ธก๋ฉด์—์„œ, ์–ธ์–ด๋ฅผ ์–ผ๋งˆ๋‚˜ ์ˆ™๋ จ๋˜๊ฒŒ ์“ฐ๋Š”์ง€, ํ˜‘๋ ฅ์ด๋‚˜ ํ˜‘์ƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ผ๋งˆ๋‚˜ ๋›ฐ์–ด๋‚œ์ง€, ์—ญํ• ์„ ๋ถ€์—ฌํ•œ ๊ฒฝ์šฐ ๊ทธ์— ์–ผ๋งˆ๋‚˜ ๋ถ€ํ•ฉํ•˜๊ฒŒ ํ–‰๋™ํ•˜๋Š”์ง€ ๋“ฑ์„ ํ‰๊ฐ€ 

โ†ช๏ธŽ  3) ๊ฐ€์น˜๊ด€ : ๊ฑฐ์ง“์—†์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š”์ง€, ํŽธํ–ฅ๋˜๊ฑฐ๋‚˜ ์ฐจ๋ณ„์ ์ธ๊ฒŒ ์—†๋Š”์ง€, ์‚ฌํšŒ์— ํ•ด๊ฐ€๋˜๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š”์ง€ ํ‰๊ฐ€

โ†ช๏ธŽ  4) ์ง„ํ™”๋Šฅ๋ ฅ : ๋ณ€ํ™”ํ•˜๋Š” ํ™˜๊ฒฝ์— ๋งž์ถฐ ์Šค์Šค๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ํ‰๊ฐ€๋กœ, ์ง€์†์ ์ธ ํ•™์Šต, ์Šค์Šค๋กœ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‹ฌ์„ฑํ•˜๋Š” ํ•™์Šต๋Šฅ๋ ฅ, ํ™˜๊ฒฝ์— ์ ์‘ํ•˜๋Š” ๋Šฅ๋ ฅ ๋“ฑ์œผ๋กœ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

โ  ๊ฐ๊ด€์ ์ธ ๋ฐฉ์‹ : AgentBench

 

 

 

โ†ช๏ธŽ  ์นญํ™”๋Œ€์˜ Xiao Liu์™€ Hao Yu๋Š” 8๊ฐœ์˜ ์ž‘์—…์—์„œ LLM Agent๋ฅผ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ‰๊ฐ€์šฉ ๋ฐ์ดํ„ฐ์…‹์ธ AgentBench๋ฅผ ๊ตฌ์ถ•ํ–ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, 8๊ฐœ์˜ ์ž‘์—…์œผ๋กœ ํ‰๊ฐ€ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜ํ™”์„ฑ๋Šฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. 

โ†ช๏ธŽ  ์‹ค์ œ ์—์ด์ „ํŠธ๊ฐ€ ํ™œ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ 8๊ฐœ ํ™˜๊ฒฝ์„ ์„ ํƒํ–ˆ๋‹ค : ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ์šด์˜์ฒด์ œ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ž‘์—…, DB๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ SQL ์ž‘์„ฑ ์ž‘์—…, ์ง€์‹๊ทธ๋ž˜ํ”„๋ฅผ ๋‹ค๋ฃจ๋Š” ์ž‘์—…, ๊ฒŒ์ž„๊ด€๋ จ ์ž‘์—…, ์›นํ™œ๋™ ๊ด€๋ จ ์ž‘์—… ๋“ฑ 

 

 

 

 

โ†ช๏ธŽ  ๊ตฌ์ถ•ํ•œ 8๊ฐœ ๋ฐ์ดํ„ฐ์…‹์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์–‘ํ•œ API ๊ธฐ๋ฐ˜ ์ƒ์šฉ LLM๊ณผ ์˜คํ”ˆ์†Œ์Šค LLM์„ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ, ์˜คํ”ˆ์†Œ์Šค๋ณด๋‹ค ์ƒ์šฉ LLM์ด ๋” ์šฐ์ˆ˜ํ–ˆ๋‹ค. 

โ†ช๏ธŽ  ๋†’์€ ์ ์ˆ˜๋ฅผ ๋ฐ›์€ ๋ชจ๋ธ์€ ์ฃผ๋กœ ์ฝ”๋“œ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šตํ•˜๊ฑฐ๋‚˜, ๊ณ ํ’ˆ์งˆ์˜ ์ •๋ ฌ ๋ฐ์ดํ„ฐ์…‹(alignment dataset : ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋งž์ถฐ ์‘๋‹ตํ•˜๋„๋ก ๊ตฌ์ถ•ํ•œ ๋ฐ์ดํ„ฐ์…‹)์œผ๋กœ ์ง€๋„ ๋ฏธ์„ธ์กฐ์ •์„ ํ•œ ๊ฒฝ์šฐ์˜€๋‹ค. ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋ฐ›์€ ๊ฒฝ์šฐ๋Š” ์ฃผ๋กœ ๋Œ€ํ™”๊ฐ€ ์—ฌ๋Ÿฌ ํ„ด์— ๊ฑธ์ณ ์ง„ํ–‰๋˜๋ฉฐ ์ถ”๋ก  ๋ฐ ์˜์‚ฌ๊ฒฐ์ • ๋Šฅ๋ ฅ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ์™€ ์š”์ฒญํ•œ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค. 

 

 

 

 

4.   ์‹ค์Šต : ์—์ด์ „ํŠธ ๊ตฌํ˜„


 

4.1  AutoGen ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

 

โ  OpenAI API key ์„ค์ •

 

import json

openai_api_key = "์ž์‹ ์˜ API ํ‚ค ์ž…๋ ฅ"

with open('OAI_CONFIG_LIST.json', 'w') as f:
  config_list = [
    {
        "model": "gpt-4-turbo-preview",
        "api_key": openai_api_key
    },
    {
        "model": "gpt-4o",
        "api_key": openai_api_key,
    },
    {
        "model": "dall-e-3",
        "api_key": openai_api_key,
    }
]
  json.dump(config_list, f)

 

 

โ†ช๏ธŽ  gpt-4-turbo (์–ธ์–ด๋ชจ๋ธ), gpt-4o (๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ๋ชจ๋ธ), dall-e-3 (ํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ์ƒ์„ฑ) ์„ธ ๊ฐœ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ชจ๋‘ OpenAI ๋ชจ๋ธ์ด๋ฏ€๋กœ API ํ‚ค๋Š” ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์ž…๋ ฅํ•œ๋‹ค. 

 

 

 

โ  ์—์ด์ „ํŠธ์— ์‚ฌ์šฉํ•  ์„ค์ • ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

 

import autogen

config_list = autogen.config_list_from_json(
    "OAI_CONFIG_LIST.json",
    file_location=".",
    filter_dict={
        "model": ["gpt-4-turbo-preview"],
    },
)

llm_config = {
    "config_list": config_list,
    "temperature": 0,
}

 

 

โ†ช๏ธŽ  config_list_from_json ๋ฉ”์„œ๋“œ๋กœ ๋ชจ๋ธ๊ณผ API ํ‚ค ์„ค์ • ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด์„œ gpt-4-turbo preview ๋ชจ๋ธ์˜ ํ‚ค๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ•˜๊ณ , ๋ชจ๋ธ๊ณผ ํ‚ค๋ฅผ ์ €์žฅํ•œ config_list ๋ณ€์ˆ˜๋ฅผ OpenAI API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  llm_config ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค. 

 

 

 

โ  UserProxyAgent, Assistant Agent

โ†ช๏ธŽ  Autogen์—๋Š” ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜์˜ ์—์ด์ „ํŠธ๊ฐ€ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์„ ๋Œ€์‹ ํ•˜๋Š” UserProxyAgent๊ฐ€ ์žˆ๊ณ , ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” AssistantAgent๊ฐ€ ์žˆ๋‹ค. 

 

from autogen import AssistantAgent, UserProxyAgent

# ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  assistant
assistant = AssistantAgent("assistant", llm_config=llm_config)

# ์‚ฌ์šฉ์ž ์—ญํ• ์˜ agent 
user_proxy = UserProxyAgent("user_proxy",
  is_termination_msg=lambda x: x.get("content", "") and x.get("content", "").rstrip().endswith("TERMINATE"),
  human_input_mode="NEVER",
  code_execution_config={"work_dir": "coding", "use_docker": False})

## human_input_mode : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ถ”๊ฐ€๋กœ ๋ฐ›์„์ง€ ์„ค์ •ํ•˜๋Š” ์ธ์ž๋กœ, NEVER๋ฅผ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ์ถ”๊ฐ€์ ์ธ ์˜๊ฒฌ์„ ๋ฌป์ง€ ์•Š๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ์•Œ์•„์„œ ์‹คํ–‰
## is_termination_msg : ์—์ด์ „ํŠธ์‘๋‹ต์— ์ข…๋ฃŒ ์‹ ํ˜ธ (TERMINATE) ๊ฐ€ ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •

 

 

โ†ช๏ธŽ  AutoGen์€ ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ, ์ด๋•Œ ํŒŒ์ด์ฌ์„ Docker ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. AutoGen์€ ๋„์ปค์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์ด์ง€๋งŒ, ์‹ค์Šต ํŽธ์˜๋ฅผ ์œ„ํ•ด use_docker ๋ฅผ false๋กœ ์„ค์ •ํ•œ๋‹ค. 

 

 

โ„๏ธ  Docker 

 

 

์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ์ปดํ“จํ„ฐ ํ™˜๊ฒฝ์ด ์•„๋‹Œ, ๋„์ปค(Docker) ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ ์•ˆ์—์„œ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ. ๋„์ปค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ทธ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ(์ฝ”๋“œ, ๋Ÿฐํƒ€์ž„, ์‹œ์Šคํ…œ ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)์„ ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ํ‘œ์ค€ํ™”๋œ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์ฃผ๋Š” ํ”Œ๋žซํผ์œผ๋กœ ์–ด๋–ค ํ™˜๊ฒฝ์ด๋“  ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค. 

 

 

 

โ  ์‚ผ์„ฑ์ „์ž 3๊ฐœ์›” ์ฃผ์‹ ๊ฐ€๊ฒฉ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ž‘์—… ์‹คํ–‰

 

user_proxy.initiate_chat(assistant, message="""
์‚ผ์„ฑ์ „์ž์˜ ์ง€๋‚œ 3๊ฐœ์›” ์ฃผ์‹ ๊ฐ€๊ฒฉ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค์„œ samsung_stock_price.png ํŒŒ์ผ๋กœ ์ €์žฅํ•ด์ค˜.
plotly ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ž˜ํ”„ ์•„๋ž˜๋ฅผ ํˆฌ๋ช…ํ•œ ๋…น์ƒ‰์œผ๋กœ ์ฑ„์›Œ์ค˜.
๊ฐ’์„ ์ž˜ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก y์ถ•์€ ๊ตฌ๊ฐ„ ์ตœ์†Œ๊ฐ’์—์„œ ์‹œ์ž‘ํ•˜๋„๋ก ํ•ด์ค˜.
์ด๋ฏธ์ง€ ๋น„์œจ์€ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ ์ ˆํžˆ ์„ค์ •ํ•ด์ค˜.
""")

 

 

โ†ช๏ธŽ  ์‚ฌ์šฉ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” user_proxy์˜ initiate_chat ๋ฉ”์„œ๋“œ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์—์ด์ „ํŠธ์ธ assistant๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ˆ˜ํ–‰ํ•  ์ž‘์—…์€ message ์ธ์ž์— ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•œ๋‹ค. 

 

๋ช…๋ น์ด ์‹คํ–‰๋˜๋Š” ๊ณผ์ •

 

 

โ†ช๏ธŽ  ์‚ฌ์šฉ์ž ์—ญํ• ์˜ ์—์ด์ „ํŠธ๊ฐ€ ๋ช…๋ น์„ ์–ด์‹œ์Šคํ„ดํŠธ ์—์ด์ „ํŠธ์— ์ „๋‹ฌํ•˜๊ณ , ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  ์‘๋‹ตํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์—ญํ• ์˜ ์—์ด์ „ํŠธ๋Š” ์ „๋‹ฌ๋ฐ›์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์ „๋‹ฌํ•œ๋‹ค. ์–ด์‹œ์Šคํ„ดํŠธ ์—์ด์ „ํŠธ๋Š” ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•œ๋‹ค. 

โ†ช๏ธŽ  ์—์ด์ „ํŠธ ์‹คํ–‰์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚˜๋ฉด, coding ํด๋”๋ผ๋Š” ๊ณณ์— ์‹คํ–‰ํ•œ ํŒŒ์ด์ฌ ์ฝ”๋“œ์™€ ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋œ๋‹ค. 

 

 

 

 

4.2  RAG Agent 

 

โ  RAG Agent class๋ฅผ ์‚ฌ์šฉํ•œ ์ž‘์—… ์‹คํ–‰

โ†ช๏ธŽ  ์—์ด์ „ํŠธ๋„ LLM์„ ํ™œ์šฉํ•˜๋ฏ€๋กœ ๊ด€๋ จ๋œ ์ •๋ณด๊ฐ€ ํ”„๋กฌํ”„ํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค. 

 

import autogen
from autogen.agentchat.contrib.retrieve_assistant_agent import RetrieveAssistantAgent
from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent

assistant = RetrieveAssistantAgent(
    name="assistant",
    system_message="You are a helpful assistant.",
    llm_config=llm_config,
)

ragproxyagent = RetrieveUserProxyAgent(
    name="ragproxyagent",
    retrieve_config={
        "task": "qa",
        "docs_path": "https://raw.githubusercontent.com/microsoft/autogen/main/README.md",
        "collection_name": "default-sentence-transformers"
    },
)

assistant.reset()
ragproxyagent.initiate_chat(assistant, problem="AutoGen์ด ๋ญ์•ผ?")

# assistant (to ragproxyagent):
# AutoGen์€ ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ๊ฐ€ ์ƒํ˜ธ ๋Œ€ํ™”ํ•˜์—ฌ ์ž‘์—…์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” LLM(Large Language Model) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. 
# AutoGen ์—์ด์ „ํŠธ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋Œ€ํ™” ๊ฐ€๋Šฅํ•˜๊ณ , ์ธ๊ฐ„ ์ฐธ์—ฌ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. LLM, ์ธ๊ฐ„ ์ž…๋ ฅ, ๋„๊ตฌ์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

โ†ช๏ธŽ  RetrieveAssistantAgent, RetrieveUserProxyAgent : RAG ์—์ด์ „ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์—์ด์ „ํŠธ ํด๋ž˜์Šค 

โ†ช๏ธŽ  ragproxyagent : ์‚ฌ์šฉ์ž ์—ญํ•  ์—์ด์ „ํŠธ๋ฅผ ์ •์˜ํ•˜๋ฉด์„œ, AutoGen ๊นƒํ—ˆ๋ธŒ ๋ฉ”์ธ ํŽ˜์ด์ง€ ์ฃผ์†Œ๋ฅผ RAG์— ํ™œ์šฉํ•˜๋„๋ก docs_path ํ‚ค๋กœ ์ž…๋ ฅํ•ด์ค€๋‹ค. initiate_chat์— AutoGen ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด, ์•„๋ž˜ ์ฃผ์„๋‚ด์šฉ์ฒ˜๋Ÿผ AutoGen์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์ž˜ ๋‚˜์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

โ  OpenAI ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๊ธฐ

 

from chromadb.utils import embedding_functions

openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                api_key=openai_api_key,
                model_name="text-embedding-3-small"
            )

ragproxyagent = RetrieveUserProxyAgent(
    name="ragproxyagent",
    is_termination_msg=lambda x: x.get("content", "") and x.get("content", "").rstrip().endswith("TERMINATE"),
    human_input_mode="NEVER",
    retrieve_config={
        "task": "qa",
        "docs_path": "https://raw.githubusercontent.com/microsoft/autogen/main/README.md",
        "embedding_function": openai_ef,
        "collection_name": "openai-embedding-3",
    },
)

assistant.reset()
ragproxyagent.initiate_chat(assistant, problem="Autogen์ด ๋ญ์•ผ?")

# assistant (to ragproxyagent):
# AutoGen์€ ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ๊ฐ€ ์ƒํ˜ธ ๋Œ€ํ™”ํ•˜์—ฌ ์ž‘์—…์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” LLM(Large Language Model) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜

 

 

โ†ช๏ธŽ  AutoGen์—์„œ RAG๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ๋กœ๋Š” Sentence-Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฒกํ„ฐ DB๋กœ๋Š” Chroma๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

โ†ช๏ธŽ  ๊ฐ ์š”์†Œ๋Š” ์›ํ•˜๋Š”๋Œ€๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ„์˜ ์ฝ”๋“œ ์˜ˆ์ œ๋Š” embedding_functions ํ•จ์ˆ˜์— ์›ํ•˜๋Š” ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ๋กœ ๋ณ€๊ฒฝ(text-embedding-3-small) ํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค. 

 

 


โ  3๊ฐœ ์ด์ƒ์˜ ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ๊ทธ๋ฃน์ฑ— ๋งŒ๋“ค๊ธฐ 

 

def termination_msg(x):
    return isinstance(x, dict) and "TERMINATE" == str(x.get("content", ""))[-9:].upper()

# RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ์—ญํ•  ์—์ด์ „ํŠธ
user = autogen.UserProxyAgent(
    name="Admin",
    is_termination_msg=termination_msg,
    human_input_mode="NEVER",
    system_message="The boss who ask questions and give tasks.",
    code_execution_config=False,
    default_auto_reply="Reply `TERMINATE` if the task is done.",
)
# RAG๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์—ญํ•  ์—์ด์ „ํŠธ
user_rag = RetrieveUserProxyAgent(
    name="Admin_RAG",
    is_termination_msg=termination_msg,
    system_message="Assistant who has extra content retrieval power for solving difficult problems.",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=3,
    code_execution_config=False,
    retrieve_config={
        "task": "code",
        "docs_path": "https://raw.githubusercontent.com/microsoft/autogen/main/samples/apps/autogen-studio/README.md",
        "chunk_token_size": 1000,
        "collection_name": "groupchat-rag",
    }
)
# ํ”„๋กœ๊ทธ๋ž˜๋จธ ์—ญํ• ์˜ ์—์ด์ „ํŠธ
coder = AssistantAgent(
    name="Senior_Python_Engineer",
    is_termination_msg=termination_msg,
    system_message="You are a senior python engineer. Reply `TERMINATE` in the end when everything is done.",
    llm_config=llm_config,
)
# ํ”„๋กœ๋•ํŠธ ๋งค๋‹ˆ์ € ์—ญํ• ์˜ ์—์ด์ „ํŠธ
pm = autogen.AssistantAgent(
    name="Product_Manager",
    is_termination_msg=termination_msg,
    system_message="You are a product manager. Reply `TERMINATE` in the end when everything is done.",
    llm_config=llm_config,
)

PROBLEM = "AutoGen Studio๋Š” ๋ฌด์—‡์ด๊ณ  AutoGen Studio๋กœ ์–ด๋–ค ์ œํ’ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ?"

 

 

โ†ช๏ธŽ  ์ด 4๊ฐœ์˜ ์—์ด์ „ํŠธ ์ •์˜ (RAG๋ฏธ์‚ฌ์šฉ ์—์ด์ „ํŠธ, RAG์‚ฌ์šฉ ์—์ด์ „ํŠธ-autogen๊นƒํ—™๋งํฌ์ „๋‹ฌ, ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ ์—ญํ• ์˜ ์—์ด์ „ํŠธ coder, ํ”„๋กœ๋•ํŠธ ๋งค๋‹ˆ์ € ์—ญํ• ์˜ ์—์ด์ „ํŠธ pm) 

โ†ช๏ธŽ  PROBLEM ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๊ธฐ ์œ„ํ•ด ํ˜‘๋ ฅ์„ ์ง„ํ–‰ํ•จ 

 

 

def _reset_agents():
    user.reset()
    user_rag.reset()
    coder.reset()
    pm.reset()

def rag_chat():
    _reset_agents()
    groupchat = autogen.GroupChat(
        agents=[user_rag, coder, pm],
        messages=[], max_round=12, speaker_selection_method="round_robin"
    )
    manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

    user_rag.initiate_chat(
        manager,
        problem=PROBLEM,
    )

def norag_chat():
    _reset_agents()
    groupchat = autogen.GroupChat(
        agents=[user, coder, pm],
        messages=[],
        max_round=12,
        speaker_selection_method="auto",
        allow_repeat_speaker=False,
    )
    manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

    user.initiate_chat(
        manager,
        message=PROBLEM,
    )

 

โ†ช๏ธŽ  rag_chat : RAG๋ฅผ ์‚ฌ์šฉํ•˜๋Š” user_rag, coder, pm์ด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ” 

โ†ช๏ธŽ  norag_chat : RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” user, coder, pm์ด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ”

 

โ†ช๏ธŽ  autogen.GroupChat : ํ•ด๋‹น ํด๋ž˜์Šค๋กœ ๋ˆ„๊ฐ€ ๋Œ€ํ™”์— ์ฐธ์—ฌํ•˜๋Š”์ง€, ๋ฐœํ™”์ž๋Š” ์–ด๋–ป๊ฒŒ ์„ ์ •ํ• ์ง€ (speaker_selection_method), ์ตœ๋Œ€ ๋ช‡๋ฒˆ์˜ ๋Œ€ํ™”๋ฅผ ์ง„ํ–‰ํ• ์ง€ (max_round) ๋“ฑ ์ธ์ž๋ฅผ ์„ค์ •ํ•œ๋‹ค. 

 

โ†ช๏ธŽ  autogen.GroupChatManager : ๊ทธ๋ฃน์ฑ— ๋Œ€ํ™”๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋งค๋‹ˆ์ €๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ, ์•ž์„œ ์ •์˜ํ•œ ๊ทธ๋ฃน์ฑ—์„ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค. initate_chat ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค. 

 

 

 

 

โ†ช๏ธŽ  ์‹คํ–‰ ๊ฒฐ๊ณผ, norag_chat ์—์„œ๋Š” AutoGen ์ŠคํŠœ๋””์˜ค์— ๋Œ€ํ•ด ์ž˜ ์•Œ์ง€ ๋ชปํ•˜์—ฌ AutoGen์ด ์ž๋™ํ™”๋œ ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ๋ผ๊ณ  ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. RAG๋ฅผ ์‚ฌ์šฉํ•œ rag_chat ๊ฒฐ๊ณผ๋Š” ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

4.3  ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์—์ด์ „ํŠธ

 

 

โ  ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ Agent ๊ตฌํ˜„ 

 

import os
import re
import time
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union

import matplotlib.pyplot as plt
import PIL
import requests
from openai import OpenAI
from PIL import Image

from autogen import Agent, AssistantAgent, ConversableAgent, UserProxyAgent
from autogen.agentchat.contrib.img_utils import _to_pil, get_image_data
from autogen.agentchat.contrib.multimodal_conversable_agent import MultimodalConversableAgent

config_list_4o = autogen.config_list_from_json(
    "OAI_CONFIG_LIST.json",
    filter_dict={
        "model": ["gpt-4o"],
    },
)

config_list_dalle = autogen.config_list_from_json(
    "OAI_CONFIG_LIST.json",
    filter_dict={
        "model": ["dall-e-3"],
    },
)

 

 

โ†ช๏ธŽ  ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜๋ฉด ํ…์ŠคํŠธ์™€ ์ด๋ฏธ์ง€ ์ž…๋ ฅ์„ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•˜๋Š” ์—์ด์ „ํŠธ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅ : gpt-4o์™€ dall-e3๋ชจ๋ธ๋กœ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ํ…์ŠคํŠธ์— ๋งž๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ด๋ฏธ์ง€์™€ ์œ ์‚ฌํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ์—์ด์ „ํŠธ ๋งŒ๋“ค๊ธฐ ์‹ค์Šต ์ง„ํ–‰ 

 

 

 

def dalle_call(client, prompt, model="dall-e-3", size="1024x1024", quality="standard", n=1) -> str:
    response = client.images.generate(
        model=model,
        prompt=prompt,
        size=size,
        quality=quality,
        n=n,
    )
    image_url = response.data[0].url
    img_data = get_image_data(image_url)
    return img_data

class DALLEAgent(ConversableAgent):
    def __init__(self, name, llm_config: dict, **kwargs):
        super().__init__(name, llm_config=llm_config, **kwargs)

        try:
            config_list = llm_config["config_list"]
            api_key = config_list[0]["api_key"]
        except Exception as e:
            print("Unable to fetch API Key, because", e)
            api_key = os.getenv("OPENAI_API_KEY")
        self.client = OpenAI(api_key=api_key)
        self.register_reply([Agent, None], DALLEAgent.generate_dalle_reply)

    def generate_dalle_reply(self, messages, sender, config):
        client = self.client if config is None else config
        if client is None:
            return False, None
        if messages is None:
            messages = self._oai_messages[sender]

        prompt = messages[-1]["content"]
        img_data = dalle_call(client=self.client, prompt=prompt)
        plt.imshow(_to_pil(img_data))
        plt.axis("off")
        plt.show()
        return True, 'result.jpg'

 

 

โ†ช๏ธŽ  DALLEAgent์™€ ๋ชจ๋ธ API์š”์ฒญ์— ์‚ฌ์šฉํ•˜๋Š” dalle_call ํ•จ์ˆ˜ ์ •์˜ 

โ†ช๏ธŽ  dalle_call : ์ž…๋ ฅ ํ”„๋กฌํ”„ํŠธ๋ฅผ OpenAI์˜ DALL-E API์— ์ „๋‹ฌํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. get_image_data ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‚ด๋ ค๋ฐ›์•„ img_data ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  ๋ฐ˜ํ™˜ 

โ†ช๏ธŽ  DALLEAgent ๋Š” OpenAI ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  generate_dalle_reply ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋Œ€ํ™” ๋ฉ”์‹œ์ง€๋กœ ๋ฐ›์€ ํ”„๋กฌํ”„ํŠธ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ 

 

 

painter = DALLEAgent(name="Painter", llm_config={"config_list": config_list_dalle})

user_proxy = UserProxyAgent(
    name="User_proxy", system_message="A human admin.", human_input_mode="NEVER", max_consecutive_auto_reply=0
)

# ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ž‘์—… ์‹คํ–‰ํ•˜๊ธฐ
user_proxy.initiate_chat(
    painter,
    message="๊ฐˆ์ƒ‰์˜ ํ„ธ์„ ๊ฐ€์ง„ ๊ท€์—ฌ์šด ๊ฐ•์•„์ง€๋ฅผ ๊ทธ๋ ค์ค˜",
)

 

 

โ†ช๏ธŽ painter ๋ณ€์ˆ˜์— ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์—์ด์ „ํŠธ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์—ญํ•  ์—์ด์ „ํŠธ๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค. 

 

 

 

 

โ  ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” GPT-4o ์—์ด์ „ํŠธ ์ƒ์„ฑ 

โ†ช๏ธŽ  DALLEAgent๋Š” ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ์ง€๋„ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์„์ˆ˜ ์žˆ๋Š” GPT-4o ์—์ด์ „ํŠธ

 

image_agent = MultimodalConversableAgent(
    name="image-explainer",
    system_message="Explane input image for painter to create similar image.",
    max_consecutive_auto_reply=10,
    llm_config={"config_list": config_list_4o, "temperature": 0.5, "max_tokens": 1500},
)

user_proxy = autogen.UserProxyAgent(
    name="User_proxy",
    system_message="A human admin.",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=0,
    code_execution_config=False
)

groupchat = autogen.GroupChat(agents=[user_proxy, image_agent, painter], messages=[], max_round=12)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

user_proxy.initiate_chat(
    manager,
    message=f"""์•„๋ž˜ ์ด๋ฏธ์ง€๋ž‘ ๋น„์Šทํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค˜.
<img https://th.bing.com/th/id/R.422068ce8af4e15b0634fe2540adea7a?rik=y4OcXBE%2fqutDOw&pid=ImgRaw&r=0>.""",
)

user_proxy.initiate_chat(
    manager,
    message="๊ฐˆ์ƒ‰์˜ ํ„ธ์„ ๊ฐ€์ง„ ๊ท€์—ฌ์šด ๊ฐ•์•„์ง€๋ฅผ ๊ทธ๋ ค์ค˜",
)

 

 

โ†ช๏ธŽ  MultimodalConversableAgent ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์—์ด์ „ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

โ†ช๏ธŽ  image_agent (gpt4o)๋Š” ์ž…๋ ฅ๋œ ์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 

โ†ช๏ธŽ  system_message๋กœ painter (DALLEAgent)๊ฐ€ ์ž…๋ ฅ๋œ ์ด๋ฏธ์ง€์™€ ์œ ์‚ฌํ•œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ž…๋ ฅ ์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋ผ๊ณ  ์ง€์‹œํ•จ. ๊ทธ๋ฃน์ฑ— ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์—ญํ•  ์—์ด์ „ํŠธ์™€ image_agent, painter๊ฐ€ ํ•จ๊ป˜ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋„๋ก ํ•œ๋‹ค. 

 

โ†ช๏ธŽ  ์ „๋‹ฌํ•œ ์ด๋ฏธ์ง€์™€ ๋น„์Šทํ•œ ์ด๋ฏธ์ง€ ์‚ฌ์ง„์„ ๊ทธ๋ ค๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด ์œ ์‚ฌํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ ค์ค€๋‹ค. ์ด๋•Œ, image-explainer ๊ฐ€ ๊ทธ๋ฆผ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ๋Š” ๋‚ด์šฉ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

728x90

๋Œ“๊ธ€