Skip to main content
PromptQuorumPromptQuorum
Home/Prompt Engineering/๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ์›Œํฌํ”Œ๋กœ์šฐ: IDE ์„ค์ •, ํ…Œ์ŠคํŠธ ๋ฐ CI/CD ํ†ตํ•ฉ
์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ์ž๋™ํ™”

๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ์›Œํฌํ”Œ๋กœ์šฐ: IDE ์„ค์ •, ํ…Œ์ŠคํŠธ ๋ฐ CI/CD ํ†ตํ•ฉ

ยท12๋ถ„ ์ฝ๊ธฐยทBy Hans Kuepper ยท Founder of PromptQuorum, multi-model AI dispatch tool ยท PromptQuorum

๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ๋ณ„๋„์˜ ํˆด ์ƒํƒœ๊ณ„๊ฐ€ ์•„๋‹Œ, ๋ฒ„์ „ ๊ด€๋ฆฌ, CI/CD, ๋กœ์ปฌ ํ…Œ์ŠคํŠธ ๋“ฑ ๊ธฐ์กด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์— ๋งž๋Š” ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ์šฐ๋Š” 5๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค: ์ž‘์„ฑ, ๋กœ์ปฌ ํ…Œ์ŠคํŠธ, ๋ฒ„์ „ ๊ด€๋ฆฌ, CI/CD ๊ฒŒ์ดํŠธ, ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง.

โšก Quick Facts

  • ยทPromptfoo๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ์ปฌ ํ”„๋กฌํ”„ํŠธ ํ…Œ์ŠคํŠธ ๋ฃจํ”„๋Š” 30์ดˆ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค: ์ž‘์„ฑ, 3๊ฐœ ์ž…๋ ฅ์œผ๋กœ ํ…Œ์ŠคํŠธ, ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต, ์ปค๋ฐ‹.
  • ยทํ”„๋กฌํ”„ํŠธ๋ฅผ /prompts ๋””๋ ‰ํ„ฐ๋ฆฌ์— .txt ๋˜๋Š” .ts ํŒŒ์ผ๋กœ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. task-version.txt ํ˜•์‹์œผ๋กœ ๋ช…๋ช…ํ•˜์‹ญ์‹œ์˜ค (์˜ˆ: customer-support-v3.txt).
  • ยทCI/CD ๊ฒŒ์ดํŠธ ์ž„๊ณ„๊ฐ’: 85% ํ†ต๊ณผ์œจ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ 3๊ฐœ์›” ํ›„ 95%๋กœ ์ƒํ–ฅํ•˜์‹ญ์‹œ์˜ค.
  • ยทCursor๋Š” TypeScript/Python ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ถŒ์žฅ๋˜๋Š” IDE์ž…๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค/๋กœ์ปฌ ๋ชจ๋ธ ์š”๊ตฌ์‚ฌํ•ญ์—๋Š” VS Code + Continue.dev๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ยทํ”„๋กœ๋•์…˜์—์„œ ์‘๋‹ต๋ณ„๋กœ ํ”„๋กฌํ”„ํŠธ ์‹๋ณ„์ž, ๋ชจ๋ธ, ์ง€์—ฐ ์‹œ๊ฐ„, ํ† ํฐ ์ˆ˜, ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜์‹ญ์‹œ์˜ค.
  • ยท24์‹œ๊ฐ„ ๋กค๋ง ์œˆ๋„์šฐ ๊ธฐ์ค€ ํ’ˆ์งˆ ์ ์ˆ˜๊ฐ€ 10% ์ด์ƒ ํ•˜๋ฝํ•˜๋ฉด ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜์‹ญ์‹œ์˜ค.

ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์„ ์œ„ํ•œ IDE ์„ค์ •

๐Ÿ“ In One Sentence

Cursor์™€ Continue.dev๊ฐ€ ํƒ‘์žฌ๋œ VS Code๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋‘ ๊ฐ€์ง€ IDE๋กœ, Cursor๋Š” ํด๋ผ์šฐ๋“œ API ์›Œํฌํ”Œ๋กœ์šฐ์—, Continue.dev๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฐ ๋กœ์ปฌ ๋ชจ๋ธ ์š”๊ตฌ์‚ฌํ•ญ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ฌ In Plain Terms

์ด๋ฏธ ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” IDE๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. TypeScript ๋˜๋Š” Python์„ ์‚ฌ์šฉํ•˜๊ณ  ํด๋ผ์šฐ๋“œ API(OpenAI, Anthropic, Google)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด Cursor๊ฐ€ ๊ฐ€์žฅ ์ ์€ ๋งˆ์ฐฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์˜คํ”ˆ์†Œ์Šค ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด Continue.dev๊ฐ€ ํƒ‘์žฌ๋œ VS Code๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋‘ ๊ฐ€์ง€ IDE๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: Cursor(๋„ค์ดํ‹ฐ๋ธŒ AI ํ†ตํ•ฉ, ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ผ๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ์ทจ๊ธ‰)์™€ Continue.dev๊ฐ€ ํƒ‘์žฌ๋œ VS Code(์˜คํ”ˆ์†Œ์Šค, ๋กœ์ปฌ ๋ชจ๋ธ ์ง€์›). ์„ ํƒ์€ ์ฃผ์š” ์–ธ์–ด์™€ ๋ชจ๋ธ ์•ก์„ธ์Šค ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Cursor๋Š” ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํŽธ์ง‘๊ธฐ์—์„œ ์ง์ ‘ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฐธ์กฐ, ํŽธ์ง‘, ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenAI ํ˜ธํ™˜ API์™€์˜ ๋„ค์ดํ‹ฐ๋ธŒ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜๋ฉฐ TypeScript์™€ Python์„ ์ž˜ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ด ์–ธ์–ด๋“ค์„ ์‚ฌ์šฉํ•˜๊ณ  ๋งˆ์ฐฐ์ด ๊ฐ€์žฅ ์ ์€ ํ”„๋กฌํ”„ํŠธ ํŽธ์ง‘ ๊ฒฝํ—˜์„ ์›ํ•œ๋‹ค๋ฉด Cursor๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Continue.dev๊ฐ€ ํƒ‘์žฌ๋œ VS Code๋Š” ์˜คํ”ˆ์†Œ์Šค์ด๋ฉฐ, Ollama๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ๋ชจ๋ธ์„ ์ง€์›ํ•˜๊ณ , ๋ชจ๋“  ์–ธ์–ด ์ƒํƒœ๊ณ„์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Continue.dev๋Š” ํŽธ์ง‘๊ธฐ ๋‚ด ํ”„๋กฌํ”„ํŠธ ์™„์„ฑ ๋ฐ ์ˆ˜์ • ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๊ฑฐ๋‚˜, ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ๋˜๋Š” ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋ชจ๋ธ์„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, Cursor์—์„œ ์ž˜ ์ง€์›๋˜์ง€ ์•Š๋Š” ์–ธ์–ด ์ƒํƒœ๊ณ„์—์„œ ์ž‘์—…ํ•œ๋‹ค๋ฉด VS Code + Continue.dev๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ฒฐ์ • ๊ธฐ์ค€: TypeScript ๋˜๋Š” Python์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํŒ€์ด ํด๋ผ์šฐ๋“œ API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Cursor๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋กœ์ปฌ ๋ชจ๋ธ ์ง€์›, ์˜คํ”ˆ์†Œ์Šค ์š”๊ตฌ์‚ฌํ•ญ, ๋˜๋Š” ์กฐ์ง์—์„œ ํด๋ผ์šฐ๋“œ API ์‚ฌ์šฉ์— ์ œํ•œ์ด ์žˆ๋‹ค๋ฉด VS Code + Continue.dev๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๐Ÿ’ก ํ”„๋กฌํ”„ํŠธ ๋ฐ˜๋ณต ์†๋„๋ฅผ ์œ„ํ•œ Cursor

Cursor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ์ง‘๊ธฐ ๋‚ด๋ถ€์—์„œ ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ์— Claude 4.6 Sonnet์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ฝ”๋“œ ์ž‘์—…์— Cursor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์˜ ๊ฒฝ์šฐ ์ž‘์„ฑ-ํ…Œ์ŠคํŠธ ์ฃผ๊ธฐ๊ฐ€ ์ˆ˜ ๋ถ„์—์„œ ์ˆ˜ ์ดˆ๋กœ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ํ”„๋กฌํ”„ํŠธ ํ…Œ์ŠคํŠธ ๋ฃจํ”„

๋กœ์ปฌ ํ”„๋กฌํ”„ํŠธ ํ…Œ์ŠคํŠธ ๋ฃจํ”„๋Š” 4๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค: ํ”„๋กฌํ”„ํŠธ ์ž‘์„ฑ, 3๊ฐœ์˜ ๋Œ€ํ‘œ ์ž…๋ ฅ์œผ๋กœ ํ…Œ์ŠคํŠธ, ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต, ํ†ต๊ณผ ์‹œ ์ปค๋ฐ‹. Promptfoo๋ฅผ ๋กœ์ปฌ์— ๊ตฌ์„ฑํ•˜๋ฉด ์ด ๋ฃจํ”„๊ฐ€ 30์ดˆ ๋ฏธ๋งŒ์œผ๋กœ ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1๋‹จ๊ณ„: IDE์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค. 2๋‹จ๊ณ„: 3๊ฐœ์˜ ๋Œ€ํ‘œ ์ž…๋ ฅ(์ผ๋ฐ˜์ ์ธ ์ž…๋ ฅ 1๊ฐœ, ์—ฃ์ง€ ์ผ€์ด์Šค 1๊ฐœ, ์ด์ „์— ์‹คํŒจ๋ฅผ ์œ ๋ฐœํ•œ ์ž…๋ ฅ 1๊ฐœ)์— ๋Œ€ํ•ด ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. 3๋‹จ๊ณ„: ๊ธฐ์ค€์„ (๋งˆ์ง€๋ง‰์œผ๋กœ ์ปค๋ฐ‹๋œ ๋ฒ„์ „)๊ณผ ์ถœ๋ ฅ์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. 4๋‹จ๊ณ„: ํ’ˆ์งˆ์ด ์œ ์ง€๋˜๊ฑฐ๋‚˜ ๊ฐœ์„ ๋œ๋‹ค๋ฉด ์ปจ๋ฒค์…”๋„ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๋ฃจํ”„๋ฅผ ์œ„ํ•œ Promptfoo ์„ค์ •: `npm install -g promptfoo`๋กœ ์„ค์น˜ํ•˜๊ณ , 3๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์™€ LLM-as-judge ํ‰๊ฐ€์ž๊ฐ€ ํฌํ•จ๋œ `promptfooconfig.yaml`์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. `promptfoo eval`์„ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํ”„๋กฌํ”„ํŠธ์˜ ์ „์ฒด ์„ค์ • ์‹œ๊ฐ„์€ 15๋ถ„ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์ค€์„  ๋น„๊ต๊ฐ€ ํ•ต์‹ฌ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„ ์—†์ด๋Š” ์ ˆ๋Œ€์  ํ’ˆ์งˆ๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ƒ๋Œ€์  ํ’ˆ์งˆ์€ ํ…Œ์ŠคํŠธํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค โ€” ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋”๋ผ๋„ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์›์—์„œ ์ด์ „ ๋ฒ„์ „๋ณด๋‹ค ๋” ๋‚˜์  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โš ๏ธ ๊ธฐ์ค€์„  ๋น„๊ต๋Š” ์„ ํƒ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค

๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜์ง€ ์•Š์œผ๋ฉด, ์ ˆ๋Œ€ ์ž„๊ณ„๊ฐ’์ด ๋‚ฎ์„ ๊ฒฝ์šฐ ์—ฃ์ง€ ์ผ€์ด์Šค์—์„œ ํ’ˆ์งˆ์ด ์ €ํ•˜๋œ ํ”„๋กฌํ”„ํŠธ๋„ ํ…Œ์ŠคํŠธ๋ฅผ "ํ†ต๊ณผ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฐํฌ๋œ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

๋ฒ„์ „ ๊ด€๋ฆฌ์— ํ”„๋กฌํ”„ํŠธ ์ €์žฅํ•˜๊ธฐ

ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ ๋ฃจํŠธ์˜ `/prompts` ๋””๋ ‰ํ„ฐ๋ฆฌ์— `.txt` ๋˜๋Š” `.ts` ํŒŒ์ผ๋กœ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. Git์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ ๋ฒ„์ „ ๊ด€๋ฆฌ์™€ ๋™์ผํ•œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์ „์ฒด ์ด๋ ฅ, blame, ๋กค๋ฐฑ, PR ๊ธฐ๋ฐ˜ ๊ฒ€ํ† .

๋ช…๋ช… ๊ทœ์น™: `task-version.txt` โ€” ์˜ˆ๋ฅผ ๋“ค์–ด `customer-support-v3.txt`, `email-draft-v1.txt`. ๋‚ ์งœ๊ฐ€ ์•„๋‹Œ ์ˆœ์ฐจ์  ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ๋Š” ์‚ญ์ œํ•˜์ง€ ๋ง๊ณ  `/prompts/archive/`๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

ํ”„๋กฌํ”„ํŠธ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹: ์ปจ๋ฒค์…”๋„ ์ปค๋ฐ‹์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค โ€” `feat: add few-shot examples to customer-support prompt`, `fix: reduce hallucination in email-draft prompt`, `refactor: simplify chain-of-thought in summarizer prompt`. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กฌํ”„ํŠธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ํ‘œ์ค€ `git log` ์ถœ๋ ฅ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Git ํƒœ๊ทธ๋ฅผ ํ”„๋กœ๋•์…˜ ๋ฒ„์ „์— ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: ๋ชจ๋“  ์„ฑ๊ณต์ ์ธ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„, `prompts/task/version` ํ˜•์‹์œผ๋กœ ์ปค๋ฐ‹์— ํƒœ๊ทธ๋ฅผ ๋ถ™์ด์‹ญ์‹œ์˜ค (์˜ˆ: `prompts/customer-support/v3`). ์ด ํƒœ๊ทธ๋“ค์€ ํ”„๋กœ๋•์…˜์—์„œ ํ”„๋กฌํ”„ํŠธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋˜๋Œ๋ ค์•ผ ํ•  ๋•Œ ๋กค๋ฐฑ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ํ”„๋กฌํ”„ํŠธ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค

ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ์„ ์ฝ”๋“œ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ๊ทœ์œจ๋กœ ์ทจ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค: PR ๊ฒ€ํ† , ์ž‘์„ฑ์ž ๋ช…์‹œ, ์‹œ๋งจํ‹ฑ ๋ฒ„์ „ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์ ˆ๋Œ€ ์‚ญ์ œํ•˜์ง€ ๋ง๊ณ  /prompts/archive/๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

ํ”„๋กฌํ”„ํŠธ์šฉ CI/CD ๊ฒŒ์ดํŠธ

๋ชจ๋“  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์—์„œ Promptfoo ๋˜๋Š” Braintrust๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ†ต๊ณผ์œจ์ด ์ž„๊ณ„๊ฐ’ ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋ฉด ๋นŒ๋“œ๋ฅผ ์‹คํŒจ์‹œํ‚ค๋Š” GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ž„๊ณ„๊ฐ’์„ 85%๋กœ ์‹œ์ž‘ํ•˜๊ณ  3๊ฐœ์›”๊ฐ„ ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ ํ›„ 95%๋กœ ์ƒํ–ฅํ•˜์‹ญ์‹œ์˜ค.

GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌ์กฐ: `pull_request`์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋˜๊ณ , Promptfoo๋ฅผ ์„ค์น˜ํ•˜๊ณ , `promptfoo eval --config promptfooconfig.yaml`์„ ์‹คํ–‰ํ•˜๊ณ , ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ์‹คํŒจํ•˜๋Š” ์ž‘์—…์„ ํฌํ•จํ•˜๋Š” `.github/workflows/prompt-test.yml`์„ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค (Promptfoo๋Š” ์ž„๊ณ„๊ฐ’ ์ดํ•˜๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ฝ”๋“œ 1๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค).

์ž„๊ณ„๊ฐ’ ์ „๋žต: 85%๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ฃผ์š” ํšŒ๊ท€๋ฅผ ์žก์œผ๋ฉด์„œ๋„ ์ผ๋ถ€ ๋ถ„์‚ฐ์„ ํ—ˆ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฑฐ์ง“ ์‹คํŒจ ์—†์ด 3๊ฐœ์›”๊ฐ„ ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ ํ›„ 95%๋กœ ์ƒํ–ฅํ•˜์‹ญ์‹œ์˜ค. ์ค‘์š”ํ•œ ํ”„๋กฌํ”„ํŠธ(๊ณ ๊ฐ ๋Œ€๋ฉด, ๊ธˆ์œต, ์˜๋ฃŒ)์˜ ๊ฒฝ์šฐ 90%๋กœ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.

๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์„ค์ •์—์„œ prompt-test ์ž‘์—…์„ ํ•„์ˆ˜ ์ƒํƒœ ๊ฒ€์‚ฌ๋กœ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š” PR์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š์œผ๋ฉด์„œ, ํ”„๋กฌํ”„ํŠธ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” PR์˜ ๋ณ‘ํ•ฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กฌํ”„ํŠธ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง

ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๊ธฐ๋กํ•˜๊ณ , ๋ชจ๋“  ์‘๋‹ต์— ํ’ˆ์งˆ ์ ์ˆ˜ ์ธก์ •์„ ์‹คํ–‰ํ•˜๊ณ , 24์‹œ๊ฐ„ ๋กค๋ง ์œˆ๋„์šฐ ๊ธฐ์ค€ ํ’ˆ์งˆ ์ ์ˆ˜๊ฐ€ 10% ์ด์ƒ ํ•˜๋ฝํ•˜๋ฉด ์•Œ๋ฆผ์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋‚ด๋ถ€ ํ”„๋กฌํ”„ํŠธ์— ๋Œ€ํ•ด์„œ๋Š” ๋กœ๊ทธ ๊ธฐ๋ก๋งŒ์œผ๋กœ๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋กํ•  ํ•ญ๋ชฉ: ํ”„๋กฌํ”„ํŠธ ์‹๋ณ„์ž์™€ ๋ฒ„์ „, ๋ชจ๋ธ๋ช…, ์ž…๋ ฅ ํ† ํฐ ์ˆ˜, ์ถœ๋ ฅ ํ† ํฐ ์ˆ˜, ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„ ์ง€์—ฐ ์‹œ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ํ‰๊ฐ€์ž์˜ ํ’ˆ์งˆ ์ ์ˆ˜. ๊ฐœ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ์˜ ๊ฒฝ์šฐ, ๋กœ๊ทธ์— PII๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์›์‹œ ์ž…๋ ฅ ๋Œ€์‹  ํ•ด์‹œ๋ฅผ ๊ธฐ๋กํ•˜์‹ญ์‹œ์˜ค.

ํ’ˆ์งˆ ์ ์ˆ˜ ์ธก์ • ์˜ต์…˜: Braintrust๋Š” ์‘๋‹ต๋ณ„ ์ ์ˆ˜์™€ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ํฌํ•จ๋œ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํ‰๊ฐ€์ž๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด ํ˜ธ์ŠคํŒ… ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ, ์‘๋‹ต์˜ 10% ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด ๊ฒฝ๋Ÿ‰ LLM-as-judge ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์‘๋‹ต๊ณผ ํ•จ๊ป˜ ์ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜์‹ญ์‹œ์˜ค.

์•Œ๋ฆผ ์ž„๊ณ„๊ฐ’: 7์ผ ๋กค๋ง ํ‰๊ท  ๋Œ€๋น„ ํ‰๊ท  ํ’ˆ์งˆ ์ ์ˆ˜๊ฐ€ 10% ์ด์ƒ ํ•˜๋ฝํ•˜๊ฑฐ๋‚˜, ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ธฐ์ค€ P95์˜ 2๋ฐฐ๋ฅผ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜, ์˜ค๋ฅ˜์œจ์ด 1%๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์•Œ๋ฆผ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. ํ”„๋กฌํ”„ํŠธ๋ณ„ ์•Œ๋ฆผ์„ ์ผ๋ฐ˜ DevOps ๋Œ€๊ธฐ์—ด์ด ์•„๋‹Œ ํ•ด๋‹น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์†Œ์œ ํ•œ ํŒ€์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜์‹ญ์‹œ์˜ค.

๊ฐœ๋ฐœ์ž ํ”„๋กฌํ”„ํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜

โŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ์ง์ ‘ ํ”„๋กฌํ”„ํŠธ ์ž‘์„ฑ

Why it hurts: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ”„๋กฌํ”„ํŠธ๋Š” ์ „์ฒด ๋ฐฐํฌ ์—†์ด๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ, ํ…Œ์ŠคํŠธ, ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

Fix: ํ”„๋กฌํ”„ํŠธ๋ฅผ /prompts ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณ„๋„ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. ๋Ÿฐํƒ€์ž„์— ๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค.

โŒ ๋กœ์ปฌ์—์„œ๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  CI/CD์—์„œ๋Š” ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ

Why it hurts: ๋กœ์ปฌ ํ…Œ์ŠคํŠธ๋Š” ์‹œ๊ฐ„ ์••๋ฐ• ํ•˜์— ๊ฑด๋„ˆ๋›ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค; CI/CD ๊ฒŒ์ดํŠธ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค

Fix: GitHub Actions์— Promptfoo ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ํ†ต๊ณผ์œจ์ด 85% ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋ฉด ๋ณ‘ํ•ฉ์„ ์ฐจ๋‹จํ•˜์‹ญ์‹œ์˜ค.

โŒ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์—†์Œ

Why it hurts: ํ”„๋กฌํ”„ํŠธ ํ’ˆ์งˆ์ด ๋ฐฐํฌ ํ›„ ๊ฐ€์‹œ์„ฑ ์—†์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค

Fix: ํ”„๋กฌํ”„ํŠธ๋ณ„ ์ผ๋ณ„ ํ†ต๊ณผ์œจ์„ ๊ธฐ๋กํ•˜์‹ญ์‹œ์˜ค. ํ†ต๊ณผ์œจ์ด ์ฃผ๊ฐ„ 5% ์ด์ƒ ํ•˜๋ฝํ•˜๋ฉด ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜์‹ญ์‹œ์˜ค.

โŒ ํ•˜๋‚˜์˜ ๋ชจ๋ธ๋กœ๋งŒ ํ…Œ์ŠคํŠธ

Why it hurts: GPT-5.5์—์„œ ์ž‘๋™ํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ๊ฐ€ Claude 4.6 Sonnet์—์„œ๋Š” ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

Fix: CI/CD์—์„œ ์ตœ์†Œ 2๊ฐœ์˜ ๋ชจ๋ธ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

ํ•ต์‹ฌ ์š”์ 

  • ํด๋ผ์šฐ๋“œ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” TypeScript/Python ๊ฐœ๋ฐœ์ž๋Š” Cursor๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋กœ์ปฌ ๋ชจ๋ธ์ด๋‚˜ ์˜คํ”ˆ์†Œ์Šค ์š”๊ตฌ์‚ฌํ•ญ์—๋Š” VS Code + Continue.dev๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ๋กœ์ปฌ ํ…Œ์ŠคํŠธ ๋ฃจํ”„๋Š” 4๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค: ์ž‘์„ฑ, 3๊ฐœ์˜ ๋Œ€ํ‘œ ์ž…๋ ฅ์œผ๋กœ ํ…Œ์ŠคํŠธ, ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต, ํ†ต๊ณผ ์‹œ ์ปค๋ฐ‹. Promptfoo๋กœ 30์ดˆ ๋ฏธ๋งŒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์‹ญ์‹œ์˜ค.
  • ํ”„๋กฌํ”„ํŠธ๋ฅผ /prompts์— .txt ๋˜๋Š” .ts ํŒŒ์ผ๋กœ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. task-version.txt ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. Git์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ๋ฒ„์ „์— ํƒœ๊ทธ๋ฅผ ๋ถ™์ด์‹ญ์‹œ์˜ค.
  • ํ†ต๊ณผ์œจ์ด 85% ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋ฉด ๋นŒ๋“œ๋ฅผ ์‹คํŒจ์‹œํ‚ค๋Š” GitHub Actions CI/CD ๊ฒŒ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. 3๊ฐœ์›”๊ฐ„ ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ ํ›„ 95%๋กœ ์ƒํ–ฅํ•˜์‹ญ์‹œ์˜ค.
  • ํ”„๋กœ๋•์…˜์—์„œ ํ”„๋กฌํ”„ํŠธ ์‹๋ณ„์ž, ๋ชจ๋ธ, ํ† ํฐ ์ˆ˜, ์ง€์—ฐ ์‹œ๊ฐ„, ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜์‹ญ์‹œ์˜ค. 24์‹œ๊ฐ„ ๋‚ด ํ’ˆ์งˆ ์ ์ˆ˜ 10% ์ด์ƒ ํ•˜๋ฝ ์‹œ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜์‹ญ์‹œ์˜ค.
  • ํ’ˆ์งˆ ์ ์ˆ˜ ์ธก์ •์œผ๋กœ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๋ถ€ ์ „์šฉ ํ”„๋กฌํ”„ํŠธ์— ๋Œ€ํ•ด์„œ๋Š” ๋กœ๊ทธ ๊ธฐ๋ก๋งŒ์œผ๋กœ๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ IDE๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Cursor๋Š” ์ฃผ๋กœ TypeScript ๋˜๋Š” Python์œผ๋กœ ์ž‘์—…ํ•˜๋ฉฐ ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ์„ ์ผ๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ AI ํ†ตํ•ฉ์„ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ถŒ์žฅ๋˜๋Š” IDE์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ชจ๋ธ ์ง€์›, ์˜คํ”ˆ์†Œ์Šค ์š”๊ตฌ์‚ฌํ•ญ, ๋˜๋Š” Cursor์—์„œ ์ž˜ ์ง€์›๋˜์ง€ ์•Š๋Š” ์–ธ์–ด ์ƒํƒœ๊ณ„์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ Continue.dev๊ฐ€ ํƒ‘์žฌ๋œ VS Code๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ ๊ด€๋ฆฌ์— ํ”„๋กฌํ”„ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ ๋ฃจํŠธ์˜ /prompts ๋””๋ ‰ํ„ฐ๋ฆฌ์— .txt ๋˜๋Š” .ts ํŒŒ์ผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. task-version.txt ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค (์˜ˆ: customer-support-v3.txt). ํ”„๋กฌํ”„ํŠธ ๋ณ€๊ฒฝ์—๋Š” ์ปจ๋ฒค์…”๋„ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค (feat:, fix:, refactor:). ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋œ ๋ชจ๋“  ๋ฒ„์ „์— Git ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

ํ”„๋กฌํ”„ํŠธ์šฉ CI/CD ๊ฒŒ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๊นŒ?

๋ชจ๋“  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์—์„œ Promptfoo ๋˜๋Š” Braintrust๋ฅผ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์— ์‹คํ–‰ํ•˜๋Š” GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ํ†ต๊ณผ์œจ์ด ์ž„๊ณ„๊ฐ’ ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋ฉด ๋นŒ๋“œ๋ฅผ ์‹คํŒจ์‹œํ‚ค๋„๋ก ๋‹จ๊ณ„๋ฅผ ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค โ€” 85%๋กœ ์‹œ์ž‘ํ•˜๊ณ  3๊ฐœ์›”๊ฐ„ ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ ํ›„ 95%๋กœ ์ƒํ–ฅํ•˜์‹ญ์‹œ์˜ค. ํ†ต๊ณผ์œจ ์ž„๊ณ„๊ฐ’์„ ๋ฒ„์ „ ๊ด€๋ฆฌ๋˜๋„๋ก ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ €์žฅํ•˜์‹ญ์‹œ์˜ค.

ํ”„๋กœ๋•์…˜ ํ”„๋กฌํ”„ํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ๋ฌด์—‡์„ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ(PII๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ•ด์‹œ), ๋ชจ๋ธ ์‘๋‹ต, ์ง€์—ฐ ์‹œ๊ฐ„, ํ† ํฐ ์ˆ˜, ํ‰๊ฐ€์ž์˜ ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜์‹ญ์‹œ์˜ค. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ์˜ ๊ฒฝ์šฐ, ๋กœ๊ทธ๋ฅผ ์ตœ์†Œ 30์ผ๊ฐ„ ๋ณด๊ด€ํ•˜๊ณ  24์‹œ๊ฐ„ ๋กค๋ง ์œˆ๋„์šฐ ๊ธฐ์ค€ ํ’ˆ์งˆ ์ ์ˆ˜ 10% ์ด์ƒ ํ•˜๋ฝ ์‹œ ์•Œ๋ฆผ์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

Git ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์— ํ”„๋กฌํ”„ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•ฉ๋‹ˆ๊นŒ?

๊ฐ ํ”„๋กฌํ”„ํŠธ๋ฅผ `/prompts/theme/` ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. ์Šฌ๋Ÿฌ๊ทธ์™€ ๋ฒ„์ „์œผ๋กœ ํŒŒ์ผ๋ช…์„ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค: `classify-intent-v2.txt`. ๋ฒ„์ „, ์ž‘์„ฑ์ž, ์ˆ˜์ •์ผ, ๋ชจ๋ธ, ํ•œ ์ค„ ์„ค๋ช…์ด ํฌํ•จ๋œ YAML ํ”„๋ก ํŠธ๋งคํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ‘œ์ค€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋„๊ตฌ์—์„œ ๊ฒ€์ƒ‰, ๋น„๊ต, ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กฌํ”„ํŠธ์šฉ CI/CD ๊ฒŒ์ดํŠธ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

CI/CD ๊ฒŒ์ดํŠธ๋Š” ๋ชจ๋“  PR์—์„œ ํ”„๋กฌํ”„ํŠธ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ†ต๊ณผ์œจ์ด ์ž„๊ณ„๊ฐ’(์ผ๋ฐ˜์ ์œผ๋กœ 85%) ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋ฉด ๋ณ‘ํ•ฉ์„ ์ฐจ๋‹จํ•˜๋Š” ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. Promptfoo์˜ CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub Actions์—์„œ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค: `npx promptfoo eval --threshold 0.85`. ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด PR์ด ์ž๋™์œผ๋กœ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์— ๊ฐ€์žฅ ์ข‹์€ IDE๋Š” ์–ด๋А ๊ฒƒ์ž…๋‹ˆ๊นŒ?

Cursor๋Š” ํ”„๋กฌํ”„ํŠธ ๋ฐ˜๋ณต์„ ์œ„ํ•œ ๋‚ด์žฅ AI ์ง€์›๊ณผ ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ์—์„œ Claude 4.6 Sonnet์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์— ๊ฐ€์žฅ ์ข‹์€ IDE์ž…๋‹ˆ๋‹ค. Continue.dev๊ฐ€ ํƒ‘์žฌ๋œ VS Code๋Š” ์˜คํ”ˆ์†Œ์Šค ํˆด๋ง์ด ํ•„์š”ํ•œ ํŒ€์—๊ฒŒ ๊ฐ•๋ ฅํ•œ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ๋‘ IDE ๋ชจ๋‘ ํ”„๋กฌํ”„ํŠธ ํ˜•์‹์˜ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ์ง€์›ํ•˜๊ณ  Git๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

Apply these techniques with a local LLM or your own API keys โ€” PromptQuorum works with any backend.

Try PromptQuorum free โ†’

โ† Back to Prompt Engineering

๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง: IDE ๋ฐ CI/CD ์„ค์ • | PromptQuorum