• Agent Heuristic Design์€ CLI tool์ด agent์—๊ฒŒ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฅด์น˜๋„๋ก ๋งŒ๋“œ๋Š” ์ถœ๋ ฅยท์—๋Ÿฌยท๋„์›€๋ง ์„ค๊ณ„ ์›์น™
  • Progressive --help, Error as navigation, Consistent output format 3๊ธฐ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑ๋œ agent ์ž๊ธฐํ•™์Šต ์ธํ„ฐํŽ˜์ด์Šค
  • ๋„๊ตฌ ์‚ฌ์šฉ๋ฒ•์„ ๋ณ„๋„ ํ•™์Šต ์—†์ด ๋ฐ˜๋ณต ๋…ธ์ถœ๊ณผ ์ ์ง„์  ๋ฐœ๊ฒฌ์œผ๋กœ ์Šต๋“์‹œํ‚ค๋Š” agent UX ํŒจํ„ด
  • ์ปจํ…์ŠคํŠธ ์ ˆ๊ฐ๊ณผ ์ž์œจ ๋ณต๊ตฌ ๋Šฅ๋ ฅ์„ ๋™์‹œ์— ํ™•๋ณดํ•˜๋Š” tool ์ถœ๋ ฅ ์„ค๊ณ„ ์›์น™

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ๋„๊ตฌ ์‚ฌ์šฉ๋ฒ•์„ ๋งค๋‰ด์–ผ๋กœ ์‚ฌ์ „ ์ฃผ์ž…ํ•˜๋ฉด ์ปจํ…์ŠคํŠธ์˜ ํฐ ๋น„์ค‘์„ ๋งค๋‰ด์–ผ์ด ์ฐจ์ง€ โ†’ ์‹ค์ œ ์ž‘์—… ํ† ํฐ ๋ถ€์กฑ
  • ์‚ฌ๋žŒ์šฉ์œผ๋กœ ์„ค๊ณ„๋œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” agent๊ฐ€ ํ•ด์„ ํ›„ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰ยท์‹œ๋„ ํ•„์š” โ†’ ํ˜ธ์ถœ ํšŸ์ˆ˜์™€ ์‹œ๊ฐ„ ๋‚ญ๋น„
  • ๋„๊ตฌ๋งˆ๋‹ค ์ถœ๋ ฅ ํ˜•์‹์ด ์ œ๊ฐ๊ฐ์ด๋ฉด agent๊ฐ€ ๋งค๋ฒˆ ํŒŒ์‹ฑ ํŒจํ„ด์„ ์ƒˆ๋กœ ์ถ”๋ก  โ†’ ์ถ”๋ก  ํ’ˆ์งˆ ์ €ํ•˜
  • ํ˜ธ์ถœ ๋น„์šฉยท์‹คํŒจ ์‹ ํ˜ธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด agent๊ฐ€ ๋น„ํšจ์œจ์  ํ˜ธ์ถœ ํŒจํ„ด์„ ๋ฌดํ•œ ๋ฐ˜๋ณต

AS-IS โ€” ์ •์  ๋งค๋‰ด์–ผ + ์ธ๊ฐ„์šฉ ์—๋Ÿฌ + ์ œ๊ฐ๊ฐ ์ถœ๋ ฅ

sequenceDiagram
    autonumber
    participant A as Agent
    participant T as Tool
    Note over A: ์‹œ์ž‘ ์‹œ 3000๋‹จ์–ด ๋งค๋‰ด์–ผ ์ฃผ์ž…<br/>(์ปจํ…์ŠคํŠธ์˜ 30% ์ฐจ์ง€)
    A->>T: command ํ˜ธ์ถœ
    T-->>A: "Operation failed: code -127"
    Note over A: ์—๋Ÿฌ ์˜๋ฏธ ์ถ”์ธก<br/>๋งค๋‰ด์–ผ ์žฌ์ฐธ์กฐ
    A->>T: ๋‹ค๋ฅธ ๋ณ€ํ˜• ์‹œ๋„
    T-->>A: ๋˜ ๋‹ค๋ฅธ ํ˜•์‹์˜ ์—๋Ÿฌ
    Note over A: ํ•™์Šต ์ง„์ „ ์—†์ด ์‹œํ–‰์ฐฉ์˜ค ๋ฐ˜๋ณต

TO-BE โ€” ์ ์ง„์  ๋ฐœ๊ฒฌ + ํ–‰๋™ ์ง€์‹œ ์—๋Ÿฌ + ์ผ๊ด€ ์ถœ๋ ฅ

sequenceDiagram
    autonumber
    participant A as Agent
    participant T as Tool
    Note over A: ์‹œ์ž‘ ์‹œ ๋ช…๋ น์–ด ๋ชฉ๋ก๋งŒ<br/>(200๋‹จ์–ด, ํ•œ ์ค„ ์„ค๋ช…)
    A->>T: memory (์ธ์ž ์—†์ด)
    T-->>A: "[error] usage: memory search|recent|store|..."
    Note over A: ์‚ฌ์šฉ๋ฒ• ์ž๋™ ๋ฐœ๊ฒฌ
    A->>T: memory search "foo"
    T-->>A: "๊ฒฐ๊ณผ...\n[exit:0 | 12ms]"
    Note over A: ๋น„์šฉยท์„ฑ๊ณต ํŒจํ„ด ํ•™์Šต<br/>๋‹ค์Œ ํ˜ธ์ถœ์— ํ™œ์šฉ

ํœด๋ฆฌ์Šคํ‹ฑ โ‘ : Progressive --help Discovery

๋„๊ตฌ ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ค ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ , agent์˜ ์‹œ๋„์— ๋”ฐ๋ผ 3๋‹จ๊ณ„๋กœ ์ ์ง„ ๊ณต๊ฐœํ•œ๋‹ค. ์ปจํ…์ŠคํŠธ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ํ•™์Šต์ด ์ผ์–ด๋‚œ๋‹ค.

3๋‹จ๊ณ„ ๋…ธ์ถœ ๊ตฌ์กฐ

Level 0 โ€” ๋Œ€ํ™” ์‹œ์ž‘ ์‹œ ๋™์  ์ฃผ์ž… (ํ•œ ์ค„ ์š”์•ฝ ๋ชฉ๋ก)

Available commands:
- cat โ€” ํ…์ŠคํŠธ ํŒŒ์ผ ์ฝ๊ธฐ. ์ด๋ฏธ์ง€๋Š” 'see', ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” 'cat -b' ์‚ฌ์šฉ
- see โ€” ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
- grep โ€” ํŒจํ„ด ํ•„ํ„ฐ๋ง (-i, -v, -c ์ง€์›)
- memory โ€” ๋ฉ”๋ชจ๋ฆฌ ๊ฒ€์ƒ‰/๊ด€๋ฆฌ
- clip โ€” ์™ธ๋ถ€ ํ™˜๊ฒฝ ์šด์˜ (์ƒŒ๋“œ๋ฐ•์Šค, ์„œ๋น„์Šค)

Level 1 โ€” ์ธ์ž ์—†์ด ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉ๋ฒ• ๋ฐ˜ํ™˜

$ run("memory")
[error] memory: usage: memory search|recent|store|facts|forget
[exit:1 | 2ms]

Level 2 โ€” ์„œ๋ธŒ๋ช…๋ น๋งŒ ํ˜ธ์ถœ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ธ๋ถ€

$ run("memory search")
[error] memory: usage: memory search <query> [-t topic_id] [-k keyword]
[exit:1 | 2ms]

์™œ ํšจ๊ณผ์ ์ธ๊ฐ€

๋น„๊ต ํ•ญ๋ชฉ์ •์  ๋งค๋‰ด์–ผ ์ฃผ์ž…Progressive Discovery
์‹œ์ž‘ ์ปจํ…์ŠคํŠธ ๋น„์šฉ๋†’์Œ (3000+ ๋‹จ์–ด)๋‚ฎ์Œ (200 ๋‹จ์–ด)
ํ•™์Šต ์‹œ์ ์‚ฌ์ „ (์‚ฌ์šฉ ์ „)์‚ฌํ›„ (์‹œ๋„ ํ›„)
์ •๋ณด ์ •ํ™•๋„๋งค๋‰ด์–ผ vs ์‹ค์ œ ๊ดด๋ฆฌ ๊ฐ€๋Šฅ์‹ค์ œ ๋™์ž‘๊ณผ ์ผ์น˜
Agent ํ–‰๋™๋งค๋‰ด์–ผ ์žฌ์ฐธ์กฐ์ž์—ฐ์Šค๋Ÿฌ์šด ์‹œํ–‰

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

ํœด๋ฆฌ์Šคํ‹ฑ โ‘ก: Error as Navigation

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

์ธ๊ฐ„์šฉ vs Agent์šฉ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

์ธ๊ฐ„์šฉ (์ „ํ†ต์  CLI):

$ cat photo.png
cat: binary file (standard output)
โ†’ ์‚ฌ๋žŒ์ด Google ๊ฒ€์ƒ‰, "PNG ์–ด๋–ป๊ฒŒ ๋ณด์ง€?"

Agent์šฉ (Heuristic Design):

$ cat photo.png
[error] cat: binary image file (182KB). Use: see photo.png
โ†’ agent๊ฐ€ ์ฆ‰์‹œ 'see photo.png' ํ˜ธ์ถœ

์ถ”๊ฐ€ ์˜ˆ์‹œ

์ƒํ™ฉ์ข‹์€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€
์•Œ ์ˆ˜ ์—†๋Š” ๋ช…๋ น์–ด[error] unknown command: foo
Available: cat, ls, see, write, grep, memory, clip
์ž˜๋ชป๋œ ํŒŒ์ผ ํƒ€์ž…[error] not an image file: data.csv (use cat to read text files)
์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ž์›[error] clip "sandbox" not found. Use 'clip list' to see available clips

์„ค๊ณ„ ์›์น™

  1. ํ˜„์žฌ ๋ฌด์—‡์ด ์ž˜๋ชป๋๋Š”์ง€ ์ •ํ™•ํžˆ ๋ช…์‹œ
  2. ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ•จ๊ป˜ ์ œ๊ณต
  3. ์ •๋ณด ํƒ์ƒ‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ทธ ํƒ์ƒ‰ ๋ช…๋ น์–ด๋ฅผ ์•ˆ๋‚ด

์ด ์›์น™์ด Two-Layer Architecture์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฐ€๋“œ์™€ ๊ฒฐํ•ฉํ•˜๋ฉด, ์ž˜๋ชป๋œ ํ˜ธ์ถœ์ด ์ฆ‰์‹œ ์˜ฌ๋ฐ”๋ฅธ ํ˜ธ์ถœ๋กœ ์ด์–ด์ง„๋‹ค.

ํœด๋ฆฌ์Šคํ‹ฑ โ‘ข: Consistent Output Format

๋งค ํ˜ธ์ถœ์˜ ์ถœ๋ ฅ ๋์— ๋™์ผํ•œ ํ˜•์‹์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€์ฐฉํ•œ๋‹ค. ๋ฐ˜๋ณต ๋…ธ์ถœ์„ ํ†ตํ•ด agent๊ฐ€ ํŒจํ„ด์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚ด์žฌํ™”ํ•œ๋‹ค.

ํ‘œ์ค€ ํ‘ธํ„ฐ ํ˜•์‹

์‹ค์ œ ๋ช…๋ น์–ด ์ถœ๋ ฅ ๋‚ด์šฉ
[exit:0 | 12ms]

๋‘ ํ•„๋“œ์˜ ํ•™์Šต ํšจ๊ณผ

Exit Code โ€” Unix ํ‘œ์ค€, LLM ์‚ฌ์ „์ง€์‹ ํ™œ์šฉ

์ฝ”๋“œ์˜๋ฏธAgent์˜ ํ•™์Šต
exit:0์„ฑ๊ณต๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ
exit:1์ผ๋ฐ˜ ์‹คํŒจ์ธ์ž/์กฐ๊ฑด ์žฌ๊ฒ€ํ† 
exit:127๋ช…๋ น์–ด ์—†์Œ๋‹ค๋ฅธ ๋ช…๋ น์–ด ์‹œ๋„

Duration โ€” ๋น„์šฉ ์ธ์‹ ํ•™์Šต

์‹œ๊ฐ„Agent ํ–‰๋™ ๋ณ€ํ™”
12ms์ž์œ ๋กญ๊ฒŒ ํ˜ธ์ถœ, ํƒ์ƒ‰์šฉ์œผ๋กœ๋„ ์‚ฌ์šฉ
3.2s์‹ ์ค‘ํžˆ ์‚ฌ์šฉ, ํ˜ธ์ถœ ์ „ ๋ช…ํ™•ํ•œ ์˜๋„ ์ •๋ฆฝ
45sํ˜ธ์ถœ ํšŸ์ˆ˜ ์ตœ์†Œํ™”, ๊ฒฐ๊ณผ ์บ์‹ฑ ๊ณ ๋ ค

๋ˆ„์  ํšจ๊ณผ

์„ธ์…˜์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก agent๋Š”:

  • ๋น ๋ฅธ ๋ช…๋ น์–ด๋กœ ํƒ์ƒ‰ โ†’ ๋น„์‹ผ ๋ช…๋ น์–ด๋กœ ๊ฒฐ์ •์  ํ˜ธ์ถœ
  • ์‹คํŒจ ํŒจํ„ด์„ ๋น ๋ฅด๊ฒŒ ์ธ์ง€ โ†’ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ ๊ฐ์†Œ
  • exit code๋ณ„ ๋ถ„๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉ โ†’ && / || ํ™œ์šฉ ๋Šฅ์ˆ™

์ด๋Š” ๋ณ„๋„ ํ•™์Šต์ด๋‚˜ ํ”„๋กฌํ”„ํŠธ ์ถ”๊ฐ€ ์—†์ด ๋ฐ˜๋ณต ๋…ธ์ถœ๋งŒ์œผ๋กœ ํ•™์Šต๋˜๋Š” ํ–‰๋™ ํŒจํ„ด์ด๋‹ค.

์„ธ ๊ธฐ๋ฒ•์˜ ์‹œ๋„ˆ์ง€ โ€” ํ•™์Šต ๋น„์šฉ vs ์šด์˜ ๋น„์šฉ

์„ธ ๊ธฐ๋ฒ•์ด ๊ฒฐํ•ฉ๋˜๋ฉด ํ•™์Šต ๋น„์šฉ์„ ์šด์˜ ์ค‘์— ์ ์ง„์ ์œผ๋กœ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

flowchart LR
    Start[๋Œ€ํ™” ์‹œ์ž‘] --> L0[Level 0: ๋ช…๋ น์–ด ๋ชฉ๋ก 200๋‹จ์–ด]
    L0 --> Try[Agent ์‹œ๋„]
    Try --> Err{์—๋Ÿฌ ๋ฐœ์ƒ?}
    Err -->|Yes| Nav[Error as navigation:<br/>๋‹ค์Œ ํ–‰๋™ ์ง€์‹œ]
    Err -->|No| Foot[Consistent output:<br/>๋น„์šฉยท์„ฑ๊ณต ํ•™์Šต]
    Nav --> Try
    Foot --> Try
    Try --> Better[๋” ํšจ์œจ์ ์ธ ํ˜ธ์ถœ ํŒจํ„ด]
๊ธฐ๋ฒ•ํ•™์Šต ์‹œ์ ํ•™์Šต ๋น„์šฉ ์ถœ์ฒ˜
Progressive --help๋„๊ตฌ ์‚ฌ์šฉ ์‹œ๋„ ์‹œ์‹ค์ œ ์‹œ๋„๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งŒ
Error as Navigation์‹ค์ˆ˜ํ–ˆ์„ ๋•Œ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ณต๊ตฌ ๋น„์šฉ์— ๋™์Šน
Consistent Output๋งค ํ˜ธ์ถœ๊ฑฐ์˜ ๋ฌด๋ฃŒ (๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•œ ์ค„)

์•ˆํ‹ฐํŒจํ„ด โ€” ์ž์ฃผ ๋ณด์ด๋Š” ์ž˜๋ชป๋œ ์‚ฌ๋ก€

  • ์‚ฌ์ „ ๋งค๋‰ด์–ผ ํญ๊ฒฉ: โ€œ๋„๊ตฌ ์‚ฌ์šฉ๋ฒ•โ€ 5000์ž๋ฅผ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ฃผ์ž… โ†’ ํ† ํฐ ๋‚ญ๋น„
  • ์นœ๊ทผํ•œ ์—๋Ÿฌ: โ€œOops! Something went wrong :(โ€ โ†’ agent๊ฐ€ ๋ฌด์—‡์„ ํ• ์ง€ ๋ชจ๋ฆ„
  • ํฌ๋งท ์ผ๊ด€์„ฑ ๋ถ€์žฌ: ๋„๊ตฌ๋งˆ๋‹ค ์„ฑ๊ณต/์‹คํŒจ ์‹ ํ˜ธ๊ฐ€ ๋‹ค๋ฆ„ โ†’ ๋งค๋ฒˆ ํŒŒ์‹ฑ ์ถ”๋ก 
  • Stderr ์นจ๋ฌต: ์—๋Ÿฌ ๋ณธ๋ฌธ์„ stdout ํ•œ ์ค„๋กœ ์š”์•ฝ โ†’ ์›์ธ ํŒŒ์•… ๋ถˆ๊ฐ€
  • ์ˆซ์ž ์ฝ”๋“œ๋งŒ: Error: -127 โ†’ ์˜๋ฏธ ์—†์Œ, โ€œUse:โ€ ๊ฐ™์€ ํ–‰๋™ ์ง€์‹œ ๋ˆ„๋ฝ

์ ์šฉ ์‹œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์‹œ์ž‘ ์‹œ ์ฃผ์ž…๋˜๋Š” ๋„๊ตฌ ์ •๋ณด๊ฐ€ ํ•œ ์ค„ ์„ค๋ช… ์œ„์ฃผ๋กœ ์งง์€๊ฐ€
  • ์ธ์ž ์—†์ด ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉ๋ฒ• ์ž๋™ ๋ฐ˜ํ™˜๋˜๋Š”๊ฐ€
  • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹ค์Œ ๋ช…๋ น์–ด๊ฐ€ ํฌํ•จ๋˜๋Š”๊ฐ€
  • ์•Œ ์ˆ˜ ์—†๋Š” ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด ๋ชฉ๋ก์„ ํ•จ๊ป˜ ๋…ธ์ถœํ•˜๋Š”๊ฐ€
  • ๋ชจ๋“  ํ˜ธ์ถœ ์‘๋‹ต์— [exit:N | duration] ํ‘ธํ„ฐ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ๋ถ€์ฐฉ๋˜๋Š”๊ฐ€
  • duration ๋‹จ์œ„๊ฐ€ ms/s๋กœ ์ผ๊ด€๋˜๋ฉฐ ๋น„์šฉ ์ฐจ์ด๊ฐ€ ์ธ์ง€๋  ์ˆ˜ ์žˆ๊ฒŒ ํ‘œ์‹œ๋˜๋Š”๊ฐ€

๊ด€๋ จ ๊ฐœ๋…

  • CLI-based Tool Calling โ€” ์ด ํœด๋ฆฌ์Šคํ‹ฑ์ด ์ ์šฉ๋˜๋Š” ์ƒ์œ„ ๋„๊ตฌ ๋ชจ๋ธ(๋ฉ”์ธ ๊ฐœ๋…)
  • Two-Layer Architecture โ€” Error as Navigation์ด ์‹ค์ œ๋กœ ๊ตฌํ˜„๋˜๋Š” Layer 2์˜ 4๊ฐ€์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • delta โ€” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ผ๋ฐ˜ ๊ฐœ๋…

์ฐธ๊ณ  ๋ฌธ์„œ