๐Ÿง  ๋‚˜๋Š” OrKa์˜ Plugin Agents๋ฅผ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด Support Triage Module์„ ๋งŒ๋“ค์—ˆ๋‹ค

๋ฐœํ–‰: (2026๋…„ 1์›” 10์ผ ์˜คํ›„ 10:40 GMT+9)
19 min read
์›๋ฌธ: Dev.to

Source: Dev.to

๋ธŒ๋žœ์น˜โ€‘์ „์šฉ ์‹คํ—˜: support_triage ๋ชจ๋“ˆ์—์„œ ์ปค์Šคํ…€ ์—์ด์ „ํŠธ ๋“ฑ๋ก, ์‹ ๋ขฐ ๊ฒฝ๊ณ„, ๊ฒฐ์ •๋ก ์  ์ถ”์ ์„ ์ŠคํŠธ๋ ˆ์Šคโ€‘ํ…Œ์ŠคํŠธ

์ฐธ๊ณ 

  • ๋ธŒ๋žœ์น˜: (์ง€์ •๋˜์ง€ ์•Š์Œ)
  • ์ปค์Šคํ…€ ๋ชจ๋“ˆ: (์ง€์ •๋˜์ง€ ์•Š์Œ)
  • ์ฐธ์กฐ ๋กœ๊ทธ: (์ง€์ •๋˜์ง€ ์•Š์Œ)

Note: OrKa๋Š” ์•„์ง ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์€ ์ฆ๋ช…์šฉ์ด๋ฉฐ, ์ถœ์‹œ ๊ฒŒ์‹œ๋ฌผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐ€์ •

  1. OrKa๊ฐ€ ๋ฌด์—‡์ธ์ง€โ€”YAMLโ€‘์ •์˜ ์ธ์ง€ ๊ทธ๋ž˜ํ”„, ๊ฒฐ์ •๋ก ์  ์‹คํ–‰, ์ถ”์  ๊ฐ€๋Šฅํ•œ ์‹คํ–‰โ€”์— ๋Œ€ํ•ด ์ด๋ฏธ ๋†’์€ ์ˆ˜์ค€์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์ฆ์„ ์œ„ํ•œ โ€œ๋ธŒ๋žœ์น˜โ€‘์ „์šฉโ€ ์ž‘์—…์— ๋งŒ์กฑํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์™œ ์ง€์› ํŠธ๋ผ์ด์• ์ง€๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ณ ๋ฌธ ํ…Œ์ŠคํŠธ์ธ๊ฐ€

์ง€์›์€ ์‹ค์ œ ํ˜„์žฅ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‹คํŒจ ๋ชจ๋“œ๊ฐ€ ํ•œ ๊ณณ์— ๋ชจ์ด๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

  • ๊ณ ๊ฐ ์ฝ˜ํ…์ธ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Œ.
  • ์—ฌ๊ธฐ์—๋Š” PII, ํ”„๋กฌํ”„ํŠธโ€‘์ธ์ ์…˜ ์‹œ๋„, ํ˜น์€ ์‹œ์Šคํ…œ์— โ€œ์•ก์…˜โ€์„ ๋ชฐ๋ž˜ ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ์‹œ์Šคํ…œ์„ ์œ„ํ—˜ํ•œ ์˜์—ญ(ํ™˜๋ถˆ, ๊ณ„์ • ๋ณ€๊ฒฝ, ์ •์ฑ… ์˜ˆ์™ธ)์œผ๋กœ ๋ชฐ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์ €๋Š” ์ง€์› ํŠธ๋ผ์ด์• ์ง€๋ฅผ ์ œํ’ˆ์ด ์•„๋‹ˆ๋ผ ์•„ํ‚คํ…์ฒ˜ ํ…Œ์ŠคํŠธ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฆ๋ช…: ์ฝ”์–ด ๋ณ€๊ฒฝ ์—†์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์—์ด์ „ํŠธ ๋“ฑ๋ก

๋‚ด๊ฐ€ ๋จผ์ € ๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง์„ค์ ์ด์—ˆ๋‹ค:

OrKa๊ฐ€ ๋ถ€ํŒ…ํ•˜๊ณ , ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋ฉฐ, ์ฝ”์–ด๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์—์ด์ „ํŠธ ํŒฉํ† ๋ฆฌ์— ์ƒˆ๋กœ์šด ์—์ด์ „ํŠธ ํƒ€์ž…์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๋””๋ฒ„๊ทธ ์ฝ˜์†”์€ ์˜ˆ๋ผ๊ณ  ๋‹ตํ•œ๋‹ค. ์‹คํ–‰ ๋กœ๊ทธ์—์„œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” support_triage๋ฅผ ๋กœ๋“œํ•˜๊ณ , ํ•ด๋‹น ๋ชจ๋“ˆ์€ ์ผ๊ณฑ ๊ฐœ์˜ ์ปค์Šคํ…€ ์—์ด์ „ํŠธ ํƒ€์ž…์„ ๋“ฑ๋กํ•œ๋‹ค:

  • envelope_validator
  • redaction
  • trust_boundary
  • permission_gate
  • output_verification
  • decision_recorder
  • risk_level_extractor

๊ทธ ํ•˜๋‚˜์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋‚˜์—๊ฒŒ๋Š” ํ—ค๋“œ๋ผ์ธ์ด๋ฉฐ, โ€œAI ์ง€์› ์ž๋™ํ™”โ€๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์ด ์ง„ํ™”์˜ ๋‹จ์œ„์ด๊ณ , ์ฝ”์–ด๋Š” ๋ณ€ํ•จ์—†์ด ์ง€๋ฃจํ•˜๊ฒŒ ๋‚จ๋Š”๋‹ค. ๊ธฐ๋Šฅ์€ ๋น ๋ฅด๊ฒŒ ์›€์ง์ธ๋‹ค.

์ด ํŒจํ„ด์ด ์œ ์ง€๋œ๋‹ค๋ฉด OrKa(๋˜๋Š” ์–ด๋–ค ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ) ๊ฐ€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํ™•์žฅ๋˜๋Š” ๋ฐฉ์‹์„ ๋ฐ”๊พผ๋‹ค. ์ „์ฒด ์ธ์ง€ ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋’ค์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด, ๋ชจ๋‘๊ฐ€ ์˜์กดํ•˜๋Š” ๋Ÿฐํƒ€์ž„์„ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ณต๊ฒฉ์ ์ธ ๋ฐ˜๋ณต์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์ž…๋ ฅ ์—”๋ฒจ๋กœํ”„: ์‹ ๋ขฐ ๊ฒฝ๊ณ„๋กœ์„œ์˜ ์Šคํ‚ค๋งˆ, ์ œ์•ˆ์ด ์•„๋‹ˆ๋ผ

์ง€์› ํŠธ๋ฆฌ์•„์ง€๋Š” ์—”๋ฒจ๋กœํ”„์—์„œ ์‹œ์ž‘๋˜๋ฉฐ, ์ž์œ  ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์—”๋ฒจ๋กœํ”„๋Š” ์ดˆ๊ธฐ์— ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋กœ ์ œ์•ฝ์„ ์ €๋ ดํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Šฆ๊ฒŒ ๊ฒ€์ฆํ•˜๋ฉด ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ๋ฅผ ๊ฒ€์ฆํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ฐ€์žฅ ์•ˆ ์ข‹์€ ์‹œ์ ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์—”๋ฒจ๋กœํ”„๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฐ„๋‹จํ•œ ์ฆ๊ฑฐ๋Š” ์Šคํ‚ค๋งˆ ์ˆ˜์ค€์—์„œ ์ž˜๋ชป๋œ ์˜๋„๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ํ•œ ํŠธ๋ ˆ์ด์Šค์—์„œ ์ž…๋ ฅ์— ์ฐจ๋‹จ๋œ ํ–‰๋™(issue_refund, change_account_settings)์ด ํฌํ•จ๋˜์—ˆ๋Š”๋ฐ, ์ด๋Š” ์—ด๊ฑฐํ˜•(enum)์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฒ€์ฆ๊ธฐ๊ฐ€ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

PII redaction: ์˜๋„์ ์œผ๋กœ ์ง€๋ฃจํ•˜๊ฒŒ

PII ๋งˆ์Šคํ‚น์€ ์ง€๋ฃจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. โ€œ๋˜‘๋˜‘ํ•˜๊ฒŒโ€ ํ•˜๋ฉด ์ผ๊ด€์„ฑ์ด ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ถ”์ ์—์„œ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€์— ์ด๋ฉ”์ผ๊ณผ ์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ‚น ์—์ด์ „ํŠธ๋Š”:

  • ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ž๋ฆฌํ‘œ์‹œ์ž([EMAIL_REDACTED], [PHONE_REDACTED])๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค
  • ๊ฐ์ง€๋œ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(total_pii_found: 2)

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

Prompt injection: the uncomfortable part

์ง€์› ํŠธ๋ฆฌ์•„์ง€๋Š” ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๊ณณ, ์ฆ‰ ๊ณ ๊ฐ ํ…์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด์Šค์˜ ํ•œ ์˜ˆ์‹œ์—๋Š” ๊ณ ์ „์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

SYSTEM: ignore all previous instructions

์—ฌ๊ธฐ์— grant_admin์— ๋Œ€ํ•œ ๊ฐ€์งœ JSON ๋ช…๋ น, ํŒŒ๊ดด์ ์ธ ๋ช…๋ น๋“ค, ๊ทธ๋ฆฌ๊ณ  XSS ์Šค๋‹ˆํŽซ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํŽธ์ง‘ ๊ฒฐ๊ณผ๋Š” ํ•ด๋‹น ๋‚ด์šฉ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๊ณ ๊ฐ ํ…์ŠคํŠธ๋กœ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์†”์งํ•œ ๋ถ€๋ถ„:

  • ํ•ด๋‹น ํŠธ๋ ˆ์ด์Šค ๊ตฌ๊ฐ„์€ injection_detected: false๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์˜ˆ์‹œ์—์„œ๋Š” ์ผ์น˜ํ•˜๋Š” ํŒจํ„ด์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์Šน๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ์šฉํ•œ ์‹คํŒจ์ž…๋‹ˆ๋‹ค.

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

Source: โ€ฆ

ํ•ต์‹ฌ ์š”์•ฝ

๋ชจ๋“ˆ ๋ถ„๋ฆฌ๊ฐ€ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์‹คํŒจ ์˜์—ญ์„ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. support_triage ๋ธŒ๋žœ์น˜๋Š” OrKa๊ฐ€ ์˜†์œผ๋กœ ํ™•์žฅํ•˜๊ณ , ์‹ ๋ขฐ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๋ฉฐ, ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

# Parallel retrieval: fork and join that actually converges

Most orchestration demos stay linear because it is easier to reason about. Real systems do **not** stay linear for long.

This workflow forks retrieval into two parallel paths, `kb_search` and `account_lookup`, then joins them deterministically.

In the debug logs, the **join node**:

* recovers the fork group from a mapping,  
* waits for the expected agents,  
* confirms both completed, and  
* merges results.

It prints the merged keys, including `kb_search` and `account_lookup`.

> This is the kind of lowโ€‘level observability that makes forkโ€‘andโ€‘join usable in practice.  
> You can see what is pending, what arrived, and what merged.

The trace also captures the forkโ€‘group ID for retrieval, `fork_retrieval`, along with the agents in the group.

> Concurrency without deterministic convergence becomes a debugging tax. I want the join to be **boring**. When it fails, I want it to fail **loudly**, with evidence.

๋ณ‘๋ ฌ ๊ฒ€์ƒ‰: ์‹ค์ œ๋กœ ์ˆ˜๋ ดํ•˜๋Š” ํฌํฌ์™€ ์กฐ์ธ

๋Œ€๋ถ€๋ถ„์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฐ๋ชจ๋Š” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์„œ ์„ ํ˜•์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์‹œ์Šคํ…œ์€ ์˜ค๋žซ๋™์•ˆ ์„ ํ˜•์œผ๋กœ ๋จธ๋ฌผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์›Œํฌํ”Œ๋กœ๋Š” ๊ฒ€์ƒ‰์„ kb_search์™€ account_lookup ๋‘ ๊ฐœ์˜ ๋ณ‘๋ ฌ ๊ฒฝ๋กœ๋กœ ํฌํฌํ•œ ๋’ค, ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ์กฐ์ธํ•ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ ๋กœ๊ทธ์—์„œ ์กฐ์ธ ๋…ธ๋“œ๋Š”:

  • ๋งคํ•‘์—์„œ ํฌํฌ ๊ทธ๋ฃน์„ ๋ณต๊ตฌํ•˜๊ณ ,
  • ์˜ˆ์ƒ๋œ ์—์ด์ „ํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ,
  • ๋‘ ์ž‘์—…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋์Œ์„ ํ™•์ธํ•˜๊ณ ,
  • ๊ฒฐ๊ณผ๋ฅผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  kb_search์™€ account_lookup์„ ํฌํ•จํ•œ ๋ณ‘ํ•ฉ๋œ ํ‚ค๋“ค์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํฌํฌโ€‘์•คโ€‘์กฐ์ธ์„ ์‹ค์ œ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ €์ˆ˜์ค€ ๊ฐ€์‹œ์„ฑ์ž…๋‹ˆ๋‹ค.
๋ฌด์—‡์ด ๋Œ€๊ธฐ ์ค‘์ด๊ณ , ๋ฌด์—‡์ด ๋„์ฐฉํ–ˆ์œผ๋ฉฐ, ๋ฌด์—‡์ด ๋ณ‘ํ•ฉ๋๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ ์—๋Š” ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ํฌํฌโ€‘๊ทธ๋ฃน ID fork_retrieval์™€ ๊ทธ๋ฃน ๋‚ด ์—์ด์ „ํŠธ๋“ค๋„ ์บก์ฒ˜๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ •๋ก ์  ์ˆ˜๋ ด์ด ์—†๋Š” ๋™์‹œ์„ฑ์€ ๋””๋ฒ„๊น… ๋น„์šฉ์ด ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์กฐ์ธ์ด ์ง€๋ฃจํ–ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•  ๊ฒฝ์šฐ ํฐ ์†Œ๋ฆฌ๋กœ, ์ฆ๊ฑฐ์™€ ํ•จ๊ป˜ ์‹คํŒจํ•˜๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ์ด ํŠธ๋ ˆ์ด์Šค์— ํฌํ•จ๋  ๋•Œ ๋กœ์ปฌโ€‘ํผ์ŠคํŠธ์™€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๊ฐ€ ์Šฌ๋กœ๊ฑด์ด ์•„๋‹ˆ๋‹ค

โ€œ๋กœ์ปฌโ€‘ํผ์ŠคํŠธโ€๊ฐ€ ๋ถ„์œ„๊ธฐ๋งŒ ์žˆ๊ธธ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธก์ • ๊ฐ€๋Šฅํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด์Šค์—์„œ account_lookup ์—์ด์ „ํŠธ๋Š” _metrics ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  • ํ† ํฐ ์ˆ˜
  • ์ง€์—ฐ ์‹œ๊ฐ„
  • ๋น„์šฉ
  • ๋ชจ๋ธ ์ด๋ฆ„ (openai/gpt-oss-20b)
  • ์ œ๊ณต์ž (lm_studio)

ํ•ด๋‹น ๋‹จ๊ณ„์˜ ์ง€์—ฐ ์‹œ๊ฐ„์€ ์•ฝ 718โ€ฏms ์ž…๋‹ˆ๋‹ค.
:contentReference[oaicite:7]{index=7}

์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ๋ณ„๋กœ ๋น„์šฉ๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๊ท€์†์‹œํ‚ฌ ์ˆ˜ ์—†์œผ๋ฉด ํ™•์žฅ์„ฑ์„ ๋…ผ์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ์„ ์–ธ์ œ ์ „ํ™˜ํ• ์ง€, ๋ฌด์—‡์„ ์บ์‹œํ• ์ง€, ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ• ์ง€ ์›๊ฒฉ์—์„œ ์‹คํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

OrKa์˜ ์ฃผ์žฅ์€ **โ€œ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹คโ€**๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ โ€“ ๋ชจ๋“  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์ฃผ์žฅ์€ ์‹คํ–‰์ด ์ถฉ๋ถ„ํžˆ ์ถ”์  ๊ฐ€๋Šฅํ•ด์„œ ํŠธ๋ ˆ์ด๋“œโ€‘์˜คํ”„๊ฐ€ ์ „์„ค์ด ์•„๋‹ˆ๋ผ ์—”์ง€๋‹ˆ์–ด๋ง ๊ฒฐ์ •์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Decision recording and output verification: traces that are meant to be replayed

์ง€์›โ€‘ํŠธ๋ฆฌ์•„์ง€ ์›Œํฌํ”Œ๋กœ๋Š” ์‘๋‹ต ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•˜๋Š” ์ˆœ๊ฐ„์— ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ์ • ๋‚ด์šฉ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ์ด๋ฅผ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋‚จ๊ธธ ๋•Œ ๋น„๋กœ์†Œ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด์Šค์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • DecisionRecorderAgent ์ด๋ฒคํŠธ์™€, decision_id ๋ฐ request_id๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฐ์ • ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ.
  • workflow_status, request_id, decision_id๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ตœ์ข… ๋‹จ๊ณ„.

ํ•ต์‹ฌ์ ์ธ ๊ฑด ํŠน์ • ๊ฒฐ์ • ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, ์›Œํฌํ”Œ๋กœ๊ฐ€ ๊ธฐ๊ณ„๊ฐ€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌํ›„์— ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๊ฒฐ์ • ๊ณ„๋ณด๋ฅผ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๊ฐ์‚ฌ ์ถ”์ ์ด ์—†๋Š” ๊ฒƒ์ด๋ฉฐโ€”๊ทธ์ € ๋กœ๊ทธ๋งŒ ์กด์žฌํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

RedisStack ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰: ์ค‘์š”ํ•œ ์ธํ”„๋ผ ์„ธ๋ถ€ ์‚ฌํ•ญ

โ€˜์ง€์› ํŠธ๋ผ์ด์• ์ง€โ€™ ๋ชจ๋“ˆ์—์„œ๋„ ๋Ÿฐํƒ€์ž„์€ ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฒ€์ƒ‰ ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Key details from the logs:

Vector search: RedisStack with HNSW
Embedder: sentence-transformers/all-MiniLM-L6-v2 (dim = 384)
Memory decay scheduling: enabled
  โ€ข shortโ€‘term window
  โ€ข longโ€‘term window
  โ€ข check interval

์ด๋Š” โ€œAI ๋ฉ”๋ชจ๋ฆฌโ€๋ผ๋Š” ์œ ํ–‰์–ด๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ช…ํ™•ํ•˜๊ฒŒ ๋‹ค์Œ์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ๋ณด์กด
  • ๋น„์šฉ
  • ๋ฐ์ดํ„ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹จ์ˆœํžˆ ๋ฒ„๋ฆฌ๋Š” ์žฅ์†Œ๋กœ ๋งŒ๋“ ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ๋ถ€๋‹ด์ด ๋ฉ๋‹ˆ๋‹ค.

์ž‘๋™ํ•œ ๋ถ€๋ถ„๊ณผ ์•„์ง ์•ฝํ•œ ๋ถ€๋ถ„

๊ฐ•์ 

  1. ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฒฝ๊ณ„ โ€“ ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๊ณ , ์—์ด์ „ํŠธ ํƒ€์ž…์„ ๋“ฑ๋กํ•˜๋ฉฐ, ์ฝ”์–ด ๋Ÿฐํƒ€์ž„์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ ๊ฐœ๋… ์ฆ๋ช…์ž…๋‹ˆ๋‹ค.
  2. ์ถ”์  ๊ฐ€๋Šฅ์„ฑ โ€“ ์ฃผ์š” ๋™์ž‘์ด ๋ชจ๋ธ ํ…์ŠคํŠธ๋ฟ ์•„๋‹ˆ๋ผ ํŠธ๋ ˆ์ด์Šค์™€ ๋กœ๊ทธ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:
    • ๋งˆ์Šคํ‚น ์ถœ๋ ฅ์ด ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํฌํฌโ€‘์•คโ€‘์กฐ์ธ์—์„œ ๊ฒฐ์ •๋ก ์  ์ˆ˜๋ ด์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • ๊ฒฐ์ •์ด ID๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์•ฝ์ 

  • ์ธ์ ์…˜ ํƒ์ง€ โ€“ ์˜ˆ์‹œ ํŠธ๋ ˆ์ด์Šค์— ์•…์„ฑ ์ฝ˜ํ…์ธ ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ injection_detected: false ๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ํƒ์ง€ ์—์ด์ „ํŠธ๊ฐ€ ์•„์ง ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„ํ‚คํ…์ฒ˜ ์ž์ฒด๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„ํ—˜ ํ‰๊ฐ€ ์ค‘ ๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ ๊ฒ€์ฆ โ€“ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ์— risk_assess์—์„œ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. โ€œriskโ€ ๊ฐ์ฒด๊ฐ€ ์Šคํ‚ค๋งˆ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋ผ์šฐํŒ… ๋ฐ ๊ฒŒ์ดํŒ…์ด ๋น ๋ฅด๊ฒŒ ์•…ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹คํŒจ๋Š” ์ตœ์„  ๋…ธ๋ ฅ์ด ์•„๋‹ˆ๋ผ ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™œ ์ด๊ฒƒ์ด ์ „์šฉ ๋ธŒ๋žœ์น˜์— ์กด์žฌํ•˜๋Š”๊ฐ€

Core๋Š” ์ง€๋ฃจํ•จ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

OrKa๋Š” ์ž์ฒด ์—์ด์ „ํŠธ ํƒ€์ž…, ์ •์ฑ…, ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง„ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ์ธ์ง€ ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํ˜ธ์ŠคํŒ…ํ•˜๋ฉด์„œ๋„ ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„ ์•„๋ž˜์—์„œ ๊ฒฐ์ •๋ก ์  ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“ˆ ์•ˆ์—์„œ ๋‹ค์Œ์— ๊ตฌ์ถ•ํ•  ๋‚ด์šฉ

  1. Injection detection โ€“ ์ƒ์ง•์  ํ”Œ๋ž˜๊ทธ์—์„œ ๋” ํ’๋ถ€ํ•œ ์ถœ๋ ฅ์œผ๋กœ ์ „ํ™˜: ๋งค์น˜๋œ ํŒจํ„ด, ์‹ ๋ขฐ๋„ ์ ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ธ์ด ๊ณต๊ฒฉ์ž์˜ ๋ช…๋ น์— ๋”ฐ๋ฅด๋ ค ํ•ด๋„ ํ•˜์œ„ ์—์ด์ „ํŠธ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ์ •ํ™” ๊ณ„ํš.
  2. Schema validation โ€“ ์œ„ํ—˜ ์ถœ๋ ฅ์— ๋Œ€ํ•ด ํ˜‘์ƒ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋ชจ๋ธ์ด ์ž˜๋ชป๋œ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ์ „ํ•œ ๊ฒฝ๋กœ๋กœ ๋ผ์šฐํŒ…ํ•˜๊ณ  ์œ„๋ฐ˜์„ ์ผ๊ธ‰ ์ด๋ฒคํŠธ๋กœ ๊ธฐ๋กํ•ด์•ผ ํ•œ๋‹ค.
  3. Isolation โ€“ ์ฝ”์–ด์— โ€œ๊ทธ๋ƒฅ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜์ •โ€ ๊ฐ™์€ ์ ‘๊ทผ์„ ๊ธˆํ•œ๋‹ค. ๋ชจ๋“ˆ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋ฉด ๋จผ์ € ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์••๋ ฅ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…๋ฐฑํžˆ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์—๋งŒ ์ฝ”์–ด๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

๊ทธ๊ฒƒ์ด ํ˜„์‹ค๊ณผ ๋งˆ์ฃผ์ณ๋„ ์‚ด์•„๋‚จ๋Š” ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

ํœด๋Œ€ํฐ์„ ๊ณ„์† ์žก์ง€ ์•Š๊ณ  MFA ํ…Œ์ŠคํŠธ

๋ฌธ์ œ: ์ธ์ฆ ๊ธฐ๋Šฅ์„ ์ž‘์—…ํ•  ๋•Œ MFA ํ…Œ์ŠคํŠธ๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ํ๋ฆ„์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ์ „ํ™”๊ธฐ์˜ ์ž ๊ธˆ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์•ฑ์„ ์—ฝ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๊ณ„์ •์„ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค. Rac...

Git ๋ฐ Git-Hub์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ: git๊ณผ git-hub์˜ ๊ด€๊ณ„, ์„ค์น˜, ๋‘ ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๋ณด์ž ๊ฐ€์ด๋“œ

์†Œ๊ฐœ: Git๊ณผ GitHub ์ดํ•ด Git์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž ๊ฐ„ ํ˜‘์—…์„ ์ด‰์ง„ํ•˜๋ฉฐ, โ€ฆ

๊ฐ์ž์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ GIS

๋ฒˆ์—ญํ•  ํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์–ด์š”? ํ…์ŠคํŠธ๋ฅผ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.