- 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: fooAvailable: 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 |
์ค๊ณ ์์น
- ํ์ฌ ๋ฌด์์ด ์๋ชป๋๋์ง ์ ํํ ๋ช ์
- ์ฆ์ ์คํ ๊ฐ๋ฅํ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํจ๊ป ์ ๊ณต
- ์ ๋ณด ํ์์ด ํ์ํ ๊ฒฝ์ฐ ๊ทธ ํ์ ๋ช ๋ น์ด๋ฅผ ์๋ด
์ด ์์น์ด 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 โ ์คํธ๋ฆฌ๋ฐ ๋ฉํ๋ฐ์ดํฐ ์ผ๋ฐ ๊ฐ๋