• CLI-based Tool Calling์€ ๋‹จ์ผ run(command="...") ๋„๊ตฌ๋กœ Unix ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด agent์˜ ์™ธ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŒจํ„ด
  • ํ•จ์ˆ˜ ์นดํƒˆ๋กœ๊ทธ(function calling) ๋Œ€์‹  LLM์ด ์ด๋ฏธ ํ•™์Šตํ•œ Bash ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š” ๋„๊ตฌ ์ธํ„ฐํŽ˜์ด์Šค
  • LLM์˜ ๋ณธ์งˆ์ด โ€œํ…์ŠคํŠธ ํ™˜๊ฒฝ์˜ ์šด์˜์ž(ํ„ฐ๋ฏธ๋„ ์˜คํผ๋ ˆ์ดํ„ฐ)โ€œ๋ผ๋Š” ๊ด€์ฐฐ์—์„œ ์ถœ๋ฐœํ•œ agent ์•„ํ‚คํ…์ฒ˜ ์ฒ ํ•™
  • ์ปจํ…์ŠคํŠธ ์ ˆ๊ฐยท์กฐํ•ฉ์„ฑยท์ž๊ธฐ ๊ธฐ์ˆ  ๋Šฅ๋ ฅ์„ ๋™์‹œ์— ๋‹ฌ์„ฑํ•˜๋Š” ๋‹จ์ˆœํ™”๋œ ๋„๊ตฌ ๋ชจ๋ธ

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

  • ํ•จ์ˆ˜ ์นดํƒˆ๋กœ๊ทธ ๋ฐฉ์‹์€ ๋งค ํ˜ธ์ถœ๋งˆ๋‹ค N๊ฐœ ๋„๊ตฌ ์ค‘ ์„ ํƒ์„ ์š”๊ตฌํ•˜์—ฌ ํ† ํฐยท์ฃผ์˜๋ ฅ ๋‚ญ๋น„ ๋ฐœ์ƒ
  • ๋‹จ์ˆœ ์ž‘์—…(โ€œ๋กœ๊ทธ์—์„œ ERROR ๊ฐœ์ˆ˜โ€)๋„ 3ํ˜ธ์ถœ(read_file โ†’ search โ†’ count)์ด ํ•„์š”ํ•œ ๋น„ํšจ์œจ ๊ตฌ์กฐ
  • LLM ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ(GitHub/StackOverflow)์— BashยทCLI ํŒจํ„ด์ด ์••๋„์ ์œผ๋กœ ๋งŽ์•„ ๋ณ„๋„ ํ•™์Šต ์—†์ด๋„ ๋Šฅ์ˆ™
  • ์ƒˆ ๋ช…๋ น์–ด ์ถ”๊ฐ€ ์‹œ ์Šคํ‚ค๋งˆ ๋“ฑ๋ก ์—†์ด --help๋กœ ์ž๊ธฐ ๊ธฐ์ˆ  ๊ฐ€๋Šฅ โ†’ ํ™•์žฅ ๋น„์šฉ ์ตœ์†Œํ™”

AS-IS โ€” Function Calling ์นดํƒˆ๋กœ๊ทธ

sequenceDiagram
    autonumber
    participant A as Agent(LLM)
    participant T as Tool Catalog
    A->>T: read_file("/var/log/app.log")
    T-->>A: ๋กœ๊ทธ ์ „์ฒด ํ…์ŠคํŠธ
    A->>T: search_text("ERROR")
    T-->>A: ๋งค์นญ ๋ผ์ธ๋“ค
    A->>T: count_lines()
    T-->>A: 247
    Note over A,T: 3ํ˜ธ์ถœ, ๋งค๋ฒˆ ๋„๊ตฌ ์„ ํƒ ์ถ”๋ก 

TO-BE โ€” CLI ๊ธฐ๋ฐ˜ ๋‹จ์ผ ๋„๊ตฌ

sequenceDiagram
    autonumber
    participant A as Agent(LLM)
    participant R as run() Tool
    A->>R: run("cat /var/log/app.log | grep ERROR | wc -l")
    R-->>A: "247\n[exit:0 | 12ms]"
    Note over A,R: 1ํ˜ธ์ถœ, Unix ํŒŒ์ดํ”„๋กœ ์กฐํ•ฉ

LLM์˜ ๋ณธ์งˆ โ€” โ€œํ„ฐ๋ฏธ๋„ ์˜คํผ๋ ˆ์ดํ„ฐโ€

LLM๊ณผ Unix๊ฐ€ 50๋…„์˜ ์‹œ์ฐจ๋ฅผ ๋‘๊ณ  ๊ฐ™์€ ์„ค๊ณ„ ๊ฒฐ์ •์— ์ˆ˜๋ ดํ–ˆ๋‹ค.

์˜์—ญUnix (1970s)LLM (ํ˜„์žฌ)
๋ฐ์ดํ„ฐ ํ˜•์‹๋ชจ๋“  ๊ฒƒ์€ ํ…์ŠคํŠธ ์ŠคํŠธ๋ฆผ๋ชจ๋“  ๊ฒƒ์€ ํ† ํฐ(ํ…์ŠคํŠธ)
์กฐํ•ฉ ๋ฐฉ์‹| ํŒŒ์ดํ”„ํ…์ŠคํŠธ ์ž…์ถœ๋ ฅ chaining
์ž๊ธฐ ๊ธฐ์ˆ --help, exit code๋„๊ตฌ ์„ค๋ช… + ์ถœ๋ ฅ ๋ฉ”ํƒ€
LLM์˜ ํ•™์Šต ํ™˜๊ฒฝโ€”GitHub/StackOverflow ๋ฐ์ดํ„ฐ

LLM ํ›ˆ๋ จ ์ฝ”ํผ์Šค์˜ ๋ง‰๋Œ€ํ•œ Bash ๋ช…๋ น์–ดยท์—๋Ÿฌ ๋ฉ”์‹œ์ง€ยทexit code ๋…ธ์ถœ ๋•๋ถ„์—, CLI ์‚ฌ์šฉ์€ ์‚ฌ์‹ค์ƒ โ€œ๊ธฐ๋ณธ๊ธฐโ€์— ํ•ด๋‹นํ•œ๋‹ค. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ•™์Šต์‹œํ‚ค๋Š” ๋น„์šฉ ์—†์ด ๊ทธ ๋Šฅ๋ ฅ์„ ๊ทธ๋Œ€๋กœ ๋Œ์–ด ์“ฐ๋Š” ๊ฒƒ์ด CLI tool calling์˜ ์ถœ๋ฐœ์ .

Function Calling vs CLI โ€” ํ˜ธ์ถœ ๋น„์šฉ ๋น„๊ต

ํ•ญ๋ชฉFunction CallingCLI
๋„๊ตฌ ๋…ธ์ถœ ๋ฐฉ์‹์นดํƒˆ๋กœ๊ทธ (15+ ํ•จ์ˆ˜ ์‚ฌ์ „ ๋…ธ์ถœ)๋‹จ์ผ run() + ๋ช…๋ น์–ด ๋ชฉ๋ก
์กฐํ•ฉ ๊ฐ€๋Šฅ์„ฑํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ LLM์ด ๋‹ค์‹œ ๋ฐ›์•„ ๋‹ค์Œ ํ•จ์ˆ˜ ๊ฒฐ์ •| ํŒŒ์ดํ”„๋กœ ๋‹จ์ผ ํ˜ธ์ถœ ๋‚ด ์กฐํ•ฉ
์ปจํ…์ŠคํŠธ ๋น„์šฉ๋งค ํ˜ธ์ถœ๋งˆ๋‹ค ๋„๊ตฌ ์„ ํƒ ํ† ํฐ ์†Œ๋ชจ๋ช…๋ น์–ด ์ž์ฒด๊ฐ€ ์˜๋„ ํ‘œํ˜„
์ƒˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€JSON Schema ์ •์˜ + ํ”„๋กฌํ”„ํŠธ ๋“ฑ๋ก๋ช…๋ น์–ด ์ถ”๊ฐ€, --help๋กœ ์ž๋™ ๋ฐœ๊ฒฌ
LLM ์‚ฌ์ „์ง€์‹ํ•™์Šต ๋ฐ์ดํ„ฐ ๋ถ€์กฑํ’๋ถ€ (Bash, Unix ๋ฌธ์„œ)
์‹คํŒจ ๋ณต๊ตฌํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์—๋Ÿฌexit code + stderr ํ‘œ์ค€

4๊ฐ€์ง€ Unix ์—ฐ์‚ฐ์ž (Chain Parser)

CLI tool์€ ๋‹จ์ผ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฐ์‚ฐ์ž๋กœ ์กฐํ•ฉ๋œ ํ‘œํ˜„์‹์„ ๋ฐ›์•„๋“ค์—ฌ์•ผ LLM์˜ ์ž‘์—… ์••์ถ•์ด ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

์—ฐ์‚ฐ์ž์˜๋ฏธ์˜ˆ์‹œ
|์ด์ „ stdout โ†’ ๋‹ค์Œ stdincat log | grep ERROR | wc -l
&&์ด์ „ ์„ฑ๊ณต ์‹œ๋งŒ ์‹คํ–‰curl $URL -o data.csv && head data.csv
||์ด์ „ ์‹คํŒจ ์‹œ๋งŒ ์‹คํ–‰cat config.yaml || echo "default"
;๊ฒฐ๊ณผ ๋ฌด๊ด€ ์ˆœ์ฐจ ์‹คํ–‰cd /tmp ; ls ; date

2๊ณ„์ธต ์•„ํ‚คํ…์ฒ˜ (๊ฐœ์š”)

LLM์˜ ์ธ์ง€ ์ œ์•ฝ(์ปจํ…์ŠคํŠธ ์œ ํ•œ, ํ…์ŠคํŠธ ์ „์šฉ)๊ณผ Unix์˜ ์ˆœ์ˆ˜ ์˜๋ฏธ๋ก ์ด ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ๋‘ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

  • Layer 1 (Execution): ์ˆœ์ˆ˜ Unix ์˜๋ฏธ๋ก . ๋ฉ”ํƒ€๋ฐ์ดํ„ฐยท๊ฐ€๊ณต ์—†์ด ๋ช…๋ น์–ด ์‹คํ–‰๊ณผ ํŒŒ์ดํ”„ ์ฒ˜๋ฆฌ๋งŒ ์ˆ˜ํ–‰.
  • Layer 2 (Presentation): LLM์— ์ „๋‹ฌํ•˜๊ธฐ ์ง์ „, ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฐ€๋“œยท์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ฒ˜๋ฆฌยท๋ฉ”ํƒ€ ํ‘ธํ„ฐยทstderr ์ฒจ๋ถ€ ์ ์šฉ.

๋ถ„๋ฆฌ ์ด์œ : Layer 1์—์„œ [exit:0] ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ ํŒŒ์ดํ”„(grep)์˜ ๊ฒ€์ƒ‰ ๋Œ€์ƒ์— ์„ž์—ฌ ์˜๋ฏธ๋ก ์ด ๊นจ์ง„๋‹ค.

์ƒ์„ธ ๋‚ด์šฉ์€ Two-Layer Architecture์—์„œ ๋‹ค๋ฃฌ๋‹ค.

ํœด๋ฆฌ์Šคํ‹ฑ 3๊ธฐ๋ฒ• (๊ฐœ์š”)

Agent๊ฐ€ ๋„๊ตฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ฐœ๊ฒฌยท์‚ฌ์šฉยท๋ณต๊ตฌํ•˜๋„๋ก ๋งŒ๋“œ๋Š” 3๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™.

  1. Progressive --help discovery โ€” ํ•„์š”ํ•  ๋•Œ๋งŒ ์ •๋ณด๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋…ธ์ถœ
  2. Error as navigation โ€” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ž์ฒด๊ฐ€ ๋‹ค์Œ ํ–‰๋™์„ ์•ˆ๋‚ด
  3. Consistent output format โ€” [exit:0 | 12ms] ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ LLM์— ๋น„์šฉยท์„ฑํŒจ๋ฅผ ํ•™์Šต์‹œํ‚ด

์ƒ์„ธ ๋‚ด์šฉ์€ Agent Heuristic Design์—์„œ ๋‹ค๋ฃฌ๋‹ค.

ํ•œ๊ณ„์™€ ์ œ์•ฝ

  • ๊ฐ•ํƒ€์ž… ์ƒํ˜ธ์ž‘์šฉ: DB ์ฟผ๋ฆฌยทGraphQL์€ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ๋œ typed ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•ˆ์ •์ 
  • ๋ณด์•ˆ: CLI ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์€ ์ฃผ์ž… ์œ„ํ—˜ โ†’ ์ƒŒ๋“œ๋ฐ•์Šค ๊ฒฉ๋ฆฌ ํ•„์ˆ˜
  • ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋„ค์ดํ‹ฐ๋ธŒ: ์ˆœ์ˆ˜ ์˜ค๋””์˜คยท๋น„๋””์˜ค ์ฒ˜๋ฆฌ์—๋Š” ํ…์ŠคํŠธ ํŒŒ์ดํ”„๊ฐ€ ๋ณ‘๋ชฉ

CLI ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์€ โ€œagent๋ฅผ ์œ„ํ•œ ์ผ๋ฐ˜ ์ž‘์—… ํ™˜๊ฒฝโ€์œผ๋กœ๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋ชจ๋“  ๋„๊ตฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์€ํƒ„ํ™˜์€ ์•„๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ฐœ๋…

  • Two-Layer Architecture โ€” Layer 1(Execution)๊ณผ Layer 2(Presentation) ๋ถ„๋ฆฌ, ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฐ€๋“œยท์˜ค๋ฒ„ํ”Œ๋กœ์šฐยท๋ฉ”ํƒ€ ํ‘ธํ„ฐยทstderr ์ฒจ๋ถ€ 4๊ฐ€์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • Agent Heuristic Design โ€” Progressive --help, Error as Navigation, Consistent Output Format 3๊ฐ€์ง€ ํœด๋ฆฌ์Šคํ‹ฑ
  • AG-UI Tools โ€” Frontend-defined tool ํŒจํ„ด (CLI tool๊ณผ ๋Œ€๋น„๋˜๋Š” ๋‹ค๋ฅธ ๊ฐ๋„์˜ ๋„๊ตฌ ์ธํ„ฐํŽ˜์ด์Šค)
  • AbstractAgent โ€” agent loop ์ง„์ž…์ ๊ณผ RunAgentInput ์ž๋™ ์กฐ๋ฆฝ
  • delta โ€” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ผ๋ฐ˜ ๊ฐœ๋…

์ฐธ๊ณ  ๋ฌธ์„œ