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

[Spring AI ๐Ÿค–] Spring AI์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• (feat. PromptTemplate)

by dev_writer 2024. 6. 23.

์•ˆ๋…•ํ•˜์„ธ์š” dev_writer์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ €๋ฒˆ์— ๋ง์”€๋“œ๋ฆฐ ๋Œ€๋กœ Spring AI์—์„œ ์ง€์›ํ•˜๋Š” PromptTemplate๊ณผ ํ”„๋กฌํ”„ํŠธ์˜ ๊ทผ๋ณธ์ ์ธ ์ข…๋ฅ˜๋ฅผ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
 

ํ”„๋กฌํ”„ํŠธ๋ž€

์ด์ œ ํ”„๋กฌํ”„ํŠธ (Prompt)๋ผ๋Š” ๋‹จ์–ด๋Š” ์ผ์ƒ์ƒํ™œ์—์„œ ์‰ฝ๊ฒŒ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ง์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์œ„ํ‚ค๋ฐฑ๊ณผ์—์„œ๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ƒ์„ฑํ˜• AI ๋ชจ๋ธ๋กœ ํ•ด์„๋˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น, AI๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์„ค๋ช…ํ•˜๋Š” ์ž์—ฐ์–ด ํ…์ŠคํŠธ๋ผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
ํšจ๊ณผ์ ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€๋„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๋“ฏํ•ฉ๋‹ˆ๋‹ค.
 

Prompt ํด๋ž˜์Šค

๊ธฐ๋ณธ์ ์œผ๋กœ Spring AI์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Prompt ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ƒ์„ฑ์ž๋ฅผ ๋ณด๋ฉด UserMessage๋กœ ์ƒ์„ฑ๋จ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์™ธ์—๋„ Message ํƒ€์ž…๋“ค์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 

Prompt์˜ ์ƒ์„ฑ์ž ์ฝ”๋“œ

 

Message ์ธํ„ฐํŽ˜์ด์Šค

๋‹ค์Œ์œผ๋กœ Message ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
 

Message ์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ค๋ช…๊ณผ ๊ตฌํ˜„์ฒด

 
Message ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋”ฐ๋ฅด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Message ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ „์†กํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ๋‚ด์šฉ, ๋ฏธ๋””์–ด ์ฒจ๋ถ€ ํŒŒ์ผ, ์†์„ฑ ๋ฐ ๋ฉ”์‹œ์ง€ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
์ถ”์ƒ ํด๋ž˜์Šค์ธ AbstractMessage๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ 4๊ฐœ์˜ ๋ฉ”์‹œ์ง€์˜ ์—ญํ• ๊ณผ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Dan Vega (Spring AI ์†Œ๊ฐœ ๊ฐœ๋ฐœ์ž)์˜ ์˜์ƒ์„ ์ •๋ฆฌํ•œ ์ •์˜์ž…๋‹ˆ๋‹ค.

  • System: AI์˜ ํ–‰๋™๊ณผ ์‘๋‹ต ์Šคํƒ€์ผ์„ ์•ˆ๋‚ดํ•˜๋ฉฐ, AI๊ฐ€ ์ž…๋ ฅ์„ ํ•ด์„ํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ๊ทœ์น™์ด๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— AI์—๊ฒŒ ์ง€์‹œ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ญํ•  ๋ถ€์—ฌ, ํฌ๋งท ์ •์˜ ๋“ฑ์ด ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • User: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ, ๋ช…๋ น ๋˜๋Š” AI์— ๋Œ€ํ•œ ์ง„์ˆ ์ž…๋‹ˆ๋‹ค. ์ด ์—ญํ• ์€ AI์˜ ์‘๋‹ต์˜ ๊ธฐ์ดˆ๋ฅผ ํ˜•์„ฑํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Assistant: AI๊ฐ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•ด ์‘๋‹ตํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ๋‹ต๋ณ€์ด๋‚˜ ๋ฐ˜์‘ ์ด์ƒ์œผ๋กœ, ๋Œ€ํ™”์˜ ํ๋ฆ„์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ AI์˜ ์ด์ „ ์‘๋‹ต์„ ์ถ”์ ํ•˜์—ฌ, ์ผ๊ด€๋œ (coherent) ์ƒํ™ฉ์— ๋งž๋Š” ์ƒํ˜ธ์ž‘์šฉ (interactions)์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • Function: ๋Œ€ํ™” ์ค‘ ํŠน์ • ์ž‘์—…์ด๋‚˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์—ญํ• ์ด AI์˜ ์ „๋ฐ˜์ ์ธ ๋™์ž‘์„ ์„ค์ •ํ•˜๋Š” ๋ฐ˜๋ฉด, ๊ธฐ๋Šฅ ์—ญํ• ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ํŠน์ • ์ž‘์—…์ด๋‚˜ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋˜๋Š” ๊ธฐํƒ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ํŠน์ˆ˜ ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์—ญํ• ์„ ํ†ตํ•ด AI๋Š” ๋Œ€ํ™”์  ์‘๋‹ต ์™ธ์—๋„ ์‹ค์šฉ์ ์ธ ๋„์›€์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์„ค๋ช…์— ๋”ฐ๋ฅด๋ฉด, Prompt ํด๋ž˜์Šค๋ฅผ String๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž (User)์˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 

์—ฌ๋‹ด์œผ๋กœ ์ด ์ •์˜๋“ค์„ Spring AI์—์„œ๋„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ๋„๋ก ์ง์ ‘ Spring AI์— ๊ด€๋ จ ์ •์˜๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๊ณณ์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PromptTemplate ํด๋ž˜์Šค

PromptTemplate ํด๋ž˜์Šค๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ํ™œ์šฉํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

PromptTemplate์˜ ์ƒ์„ฑ์ž ๋ฐ ๊ทœ์น™

 
๋งŒ์•ฝ ๋‹ค์Œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”..

Tell me a {adjective} joke about {content}.

 
์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

String command = "Tell me a {adjective} joke about {content}.";
PromptTemplate template = new PromptTemplate(command);
template.add("adjective", "funny");
template.add("content", "life");
Prompt prompt = template.create();

// ๊ฒฐ๊ณผ: Tell me a funny joke about life.

// ๋˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.
Map<String, Object> map = new HashMap<>();
map.put("adjective", "funny");
map.put("content", "life");
template = new PromptTemplate(command, map);
prompt = template.create();

// ๋‹ค๋ฅธ ์˜ˆ๋กœ๋Š” ๋” ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
template = new PromptTemplate(message, Map.of("artist", artist));

 
๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์ž˜๋ชป๋œ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๊ฐ€๋ น, ์œ„์—์„œ๋Š” "adjective"์™€ "content"์— ๋Œ€ํ•œ ๊ฒƒ์„ ๋„ฃ๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์—†๋Š” ํ‚ค๋ฅผ ๋„ฃ๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์˜ˆ์™ธ (IllegalStateException)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
 

// ์˜ˆ์™ธ 1: ์—†๋Š” ํ‚ค๋ฅผ ๋„ฃ๊ณ ์ž ํ•  ๊ฒฝ์šฐ
String command = "Tell me a {adjective} joke about {content}.";
PromptTemplate template = new PromptTemplate(command);
template.add("adjective", "funny");
template.add("content", "life");
template.add("name", "david");
Prompt prompt = template.create();

// ์˜ˆ์™ธ 2: ๋„ฃ์–ด์•ผ ํ•  ํ‚ค์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์€ ๊ฒฝ์šฐ (์œ„์˜ ๊ฒฝ์šฐ์—์„œ content๋ฅผ ๋น„์šด ๊ฒฝ์šฐ ๋“ฑ)
String command = "Tell me a {adjective} joke about {content}.";
PromptTemplate template = new PromptTemplate(command);
template.add("adjective", "funny");
Prompt prompt = template.create();

 
์ด๋Š” PromptTemplate์—์„œ validate ๊ณผ์ •์„ ํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฃผ์ž…ํ•œ ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜๋“ค์„ ๋ชจ๋‘ ์ž‘์„ฑํ–ˆ๋Š”์ง€, ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜ ์ด์™ธ์— ๋‹ค๋ฅธ ํ‚ค๋“ค๋„ ํ•จ๊ป˜ ๋„ฃ์ง„ ์•Š์•˜๋Š”์ง€ ๋“ฑ์˜ ๊ฒ€์ฆ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 

PromptTemplate์€ UserMessage๋งŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ์ง€๋งŒ, PromptTemplate์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ UserMessage๋งŒ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
 
๊ทธ ์ด์œ ๋Š” PromptTemplate์ด ๋‚ด๋ถ€์ ์œผ๋กœ create ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Prompt๋ฅผ ๋งŒ๋“ค ๊ฒฝ์šฐ, String์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ (render ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ), Prompt๋ฅผ String์œผ๋กœ ๋งŒ๋“ค ๊ฒฝ์šฐ UserMessage๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ String์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Prompt๋ฅผ ๋ณด๋ฉด String ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฉด UserMessage๋กœ ์ €์žฅํ•จ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
๊ฐœ์ธ์ ์ธ ์ถ”์ธก์œผ๋กœ๋Š”, ์ด๋ ‡๊ฒŒ ํ…œํ”Œ๋ฆฟ์ด ํ•„์š”ํ•  ์ •๋„๋กœ ํ…์ŠคํŠธ๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์œ ์ € ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ๋ผ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋‹จ์ˆœํžˆ ์—ญํ•  ๋ถ€์—ฌ๋กœ๋„ ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์œ ์ € ๋ฉ”์‹œ์ง€์˜ ๊ฒฝ์šฐ์—๋Š” ์งˆ์˜ํ•  ๋ฉ”์‹œ์ง€๊ฐ€ ๋งค์šฐ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 

์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ์ž…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

ํ•˜๋‚˜์˜ ํ”„๋กฌํ”„ํŠธ ๋ฉ”์‹œ์ง€์—์„œ (PromptTemplate์„ ํ™œ์šฉํ•œ) ์œ ์ € ๋ฉ”์‹œ์ง€ ๋ง๊ณ ๋„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ๋“ฑ์„ ํ•จ๊ป˜ ๋„ฃ๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์œ„์˜ Prompt ํด๋ž˜์Šค์—์„œ ๋ณด์…จ๋“ฏ์ด List<Message>๋กœ Prompt๋ฅผ ์ƒ์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
๊ทธ๋ ‡๋‹ค๋ฉด PromptTemplate์„ ํ™œ์šฉํ•œ ์œ ์ € ๋ฉ”์‹œ์ง€์˜ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?
 
์ผ๋‹จ PromptTemplate์˜ create ๋ฉ”์„œ๋“œ๋Š” Prompt๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋‹ˆ, ์ด๊ฒƒ๋ณด๋‹ค๋Š” String ํ˜•ํƒœ๊ฐ€ ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. PromptTemplate์—์„œ๋Š” render ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ •๋ฆฌ๋œ String์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 

 
์ด๋ฅผ ์‘์šฉํ•˜๋ฉด ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 

์˜ˆ์ œ ์ฝ”๋“œ

@RequestMapping("/test")
@RestController
public class AiController {

    private final ChatModel chatModel;

    public AiController(final ChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @GetMapping
    public String test() {
        String command = "Tell me a {adjective} joke about {content}.";
        PromptTemplate template = new PromptTemplate(command);
        template.add("adjective", "funny");
        template.add("content", "life");
        // Prompt prompt = template.create();
        String message = template.render();
        Message userMessage = new UserMessage(message);
        Message systemMessage = new SystemMessage("translate to korean");
        // Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); 
        // ๋ฐ”๋กœ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋งŒ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด Prompt ๋ณด๋‹ค ๋ฐ”๋กœ ...Message๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
        String response = chatModel.call(userMessage, systemMessage);
        System.out.println("response = " + response);
        return "ok";
    }
}

 
์‘๋‹ต์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

ChatGPT๊ฐ€ ์ƒ์„ฑํ•œ ์‘๋‹ต

 
์ด๋ ‡๊ฒŒ PromptTemplate๊ณผ ๋ฉ”์‹œ์ง€๋“ค์„ ํ†ตํ•œ ํšจ๊ณผ์ ์ธ ํ”„๋กฌํ”„ํŠธ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
 

Reference