Home / ์—์ด์ „ํŠธ ๊ธฐ์ดˆ / ๐ŸŽฏ AI ์—์ด์ „ํŠธ ๊ธฐ์ดˆ
Module

๐ŸŽฏ AI ์—์ด์ „ํŠธ ๊ธฐ์ดˆ

์—์ด์ „ํŠธ ์ •์˜, ReAct, Tool Use, ๋„๊ตฌ ์„ค๊ณ„, Human-in-the-Loop

โฑ 60๋ถ„ 68 / 189

AI ์—์ด์ „ํŠธ ๊ธฐ์ดˆ

์ •์˜ ยท ReAct ยท Tool Use ยท ๋„๊ตฌ ์„ค๊ณ„ ยท Human-in-the-Loop

๋„๊ตฌ๋ฅผ ์“ฐ๋Š” AI๊ฐ€ ์—์ด์ „ํŠธ๋‹ค

LLM์ด ์ž์œจ์ ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ํ–‰๋™ํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์›๋ฆฌ

์—์ด์ „ํŠธ์˜ ์ •์˜์™€ ๊ตฌ์กฐ

์ •์˜ ยท ์ฑ—๋ด‡๊ณผ์˜ ์ฐจ์ด ยท ์—์ด์ „ํ‹ฑ ๋ฃจํ”„ ยท ์ž์œจ์„ฑ ๋ ˆ๋ฒจ

PART 1 ยท ์—์ด์ „ํŠธ์˜ ์ •์˜์™€ ๊ตฌ์กฐ

์ •์˜์™€ ๊ตฌ์กฐ

์ฑ—๋ด‡๊ณผ์˜ ์ฐจ์ด์—์„œ ์ž์œจ์„ฑ ์ˆ˜์ค€๊นŒ์ง€ โ€” ์—์ด์ „ํŠธ๋ฅผ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ์œผ๋กœ ๋ณด๋Š” ๊ด€์ 

๋‹ต๋ณ€์„ ๋„˜์–ด ํ–‰๋™ํ•˜๋Š” AI

LLM์ด ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜์—ฌ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

  • ์ฑ—๋ด‡ vs ์—์ด์ „ํŠธ โ€” ๋‹ต๋ณ€๋งŒ vs ํŒ๋‹จํ•˜๊ณ  ํ–‰๋™
  • ์—์ด์ „ํ‹ฑ ๋ฃจํ”„ โ€” Perception โ†’ Reasoning โ†’ Action โ†’ Memory
  • ๊ตฌ์„ฑ์š”์†Œ 5๊ฐ€์ง€ โ€” Tools ยท Memory ยท Guardrails ยท Context ยท Orchestration
  • ์ž์œจ์„ฑ 4๋‹จ๊ณ„ โ€” Manual โ†’ Assisted โ†’ Supervised โ†’ Autonomous
takeaway

์ฑ—๋ด‡๊ณผ์˜ ์ฐจ์ด์—์„œ ์ถœ๋ฐœํ•ด ๋ฃจํ”„ ยท ๊ตฌ์„ฑ์š”์†Œ ยท ์ž์œจ์„ฑ ๋‹จ๊ณ„๊นŒ์ง€ โ€” ์—์ด์ „ํŠธ๋ฅผ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ์œผ๋กœ ๋ณด๋Š” ๊ด€์ ์„ ์„ธ์›๋‹ˆ๋‹ค.

PART 1 ยท ์—์ด์ „ํŠธ์˜ ์ •์˜์™€ ๊ตฌ์กฐ

์ฑ—๋ด‡ vs ์—์ด์ „ํŠธ

๋‹ต๋ณ€ํ•˜๋Š” AI์—์„œ ํ–‰๋™ํ•˜๋Š” AI๋กœ

์ฑ—๋ด‡

๋‹ต๋ณ€๋งŒ ์ƒ์„ฑ

  • LLM๋งŒ ์‚ฌ์šฉ โ€” ํ…์ŠคํŠธ ์ž…๋ ฅ โ†’ ํ…์ŠคํŠธ ์ถœ๋ ฅ
  • ์‹คํ–‰ ํ๋ฆ„ ๊ณ ์ • (์งˆ๋ฌธโ†’๋‹ต๋ณ€)
  • "๊ฐ•๋‚จ์—ญ ์ดํƒˆ๋ฆฌ์•ˆ ์ถ”์ฒœํ•ด์ค˜" โ†’ ์ผ๋ฐ˜์  ์ •๋ณด ๋‚˜์—ด
  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๋ถˆ๊ฐ€

์ฑ—๋ด‡์€ ํ•™์Šต๋œ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ •๋ณด, ์˜ˆ์•ฝ ์‹คํ–‰, ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ฐ™์€ "ํ–‰๋™"์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ

ํŒ๋‹จํ•˜๊ณ  ํ–‰๋™

  • LLM + ๋„๊ตฌ + ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
  • ๋ชจ๋ธ์ด ๋‹ค์Œ ํ–‰๋™์„ ๋™์  ๊ฒฐ์ •
  • "๊ฐ•๋‚จ์—ญ ์ดํƒˆ๋ฆฌ์•ˆ ์ถ”์ฒœํ•ด์ค˜" โ†’ ๊ฒ€์ƒ‰ ๋„๊ตฌ ํ˜ธ์ถœ โ†’ ์‹ค์‹œ๊ฐ„ ๊ฒฐ๊ณผ
  • API, DB, ํŒŒ์ผ, ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ

์—์ด์ „ํŠธ๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ๋•Œ๊นŒ์ง€ ์ถ”๋ก ๊ณผ ํ–‰๋™์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

PART 1 ยท ์—์ด์ „ํŠธ์˜ ์ •์˜์™€ ๊ตฌ์กฐ

์—์ด์ „ํ‹ฑ ๋ฃจํ”„

์ปจํ…์ŠคํŠธ โ†’ LLM โ†’ ๋„๊ตฌ๋ฅผ ๋ชฉํ‘œ ๋‹ฌ์„ฑ๊นŒ์ง€ ๋ฐ˜๋ณต

PART 1 ยท ์—์ด์ „ํŠธ์˜ ์ •์˜์™€ ๊ตฌ์กฐ

์—์ด์ „ํŠธ ๊ตฌ์„ฑ์š”์†Œ

ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ๋ฅผ ์ด๋ฃจ๋Š” 5๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ

PART 1 ยท ์—์ด์ „ํŠธ์˜ ์ •์˜์™€ ๊ตฌ์กฐ

์ž์œจ์„ฑ 4๋‹จ๊ณ„

์—์ด์ „ํŠธ์—๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๊ถŒํ•œ์˜ ํญ โ€” ์ˆ˜๋™ ๋ณด์กฐ๋ถ€ํ„ฐ ์™„์ „ ์ž์œจ๊นŒ์ง€

takeaway

๋‹จ๊ณ„๋Š” ์ž‘์—… ์œ„ํ—˜๋„์™€ ์‹ ๋ขฐ๊ฐ€ ์ •ํ•ฉ๋‹ˆ๋‹ค โ€” ํ”„๋กœ๋•์…˜์€ Supervised(์Šน์ธ ๊ฒŒ์ดํŠธ)์—์„œ ์‹œ์ž‘ํ•ด ์‹ ๋ขฐ๊ฐ€ ์Œ“์ธ ์ž‘์—…๋ถ€ํ„ฐ ์ž์œจ๋กœ ๋„“ํž™๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

ReAct ยท ReWoo ยท Tool Use ํ”„๋กœํ† ์ฝœ

PART 2 ยท ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

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

ReAct ยท ReWoo ยท Tool Use

ReAct๋Š” ๋งค ์Šคํ… ํŒ๋‹จํ•˜๊ณ  ReWoo๋Š” ๊ณ„ํš ํ›„ ๋ณ‘๋ ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค โ€” ๋„๊ตฌ ํ˜ธ์ถœ์€ 6๋‹จ๊ณ„ ๋ฉ”์‹œ์ง€ ํ”„๋กœํ† ์ฝœ๋กœ ์˜ค๊ฐ‘๋‹ˆ๋‹ค.

  • ReAct โ€” ๋งค ์Šคํ… ์ถ”๋ก  ํ›„ ํ–‰๋™, ๋†’์€ ์ ์‘๋ ฅ
  • ReWoo โ€” ๊ณ„ํš ๋จผ์ € + ๋ณ‘๋ ฌ ์‹คํ–‰, LLM 2ํšŒ ํ˜ธ์ถœ
  • Tool Use 6๋‹จ๊ณ„ โ€” toolSpec โ†’ tool_use โ†’ toolResult
  • ํŒจํ„ด ์„ ํƒ โ€” ๋Œ€ํ™”ํ˜•์€ ReAct, ๋ณ‘๋ ฌยท๋น„์šฉ ๋ฏผ๊ฐ์€ ReWoo
takeaway

ReAct๋Š” ์ ์‘๋ ฅ์„, ReWoo๋Š” ํ† ํฐ ํšจ์œจ์„ ์–ป์Šต๋‹ˆ๋‹ค โ€” ์ž‘์—… ์„ฑ๊ฒฉ์ด ํŒจํ„ด์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

PART 2 ยท ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

ReAct ํŒจํ„ด

Reasoning + Acting์„ ๋งค ์Šคํ… ๋ฐ˜๋ณต โ€” ์—์ด์ „ํŠธ์˜ ๊ธฐ๋ณธ ํŒจํ„ด

ํ•œ ์Šคํ…์˜ ๊ตฌ์กฐ

  1. 1
    Thought

    ์ง€๊ธˆ๊นŒ์ง€์˜ ๋Œ€ํ™”ยท๋„๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ๋‹ค์Œ ํ–‰๋™์„ ์ถ”๋ก  โ€” "๋ฌด์—‡์ด ๋” ํ•„์š”ํ•œ๊ฐ€"

  2. 2
    Action

    ์ถ”๋ก ์ด ๊ณ ๋ฅธ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœ โ€” ๋„๊ตฌ ์ด๋ฆ„๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ชจ๋ธ์ด ๊ฒฐ์ •

  3. 3
    Observation

    ๋„๊ตฌ ๊ฒฐ๊ณผ๊ฐ€ messages[]์— ์Œ“์—ฌ ๋‹ค์Œ Thought์˜ ์ž…๋ ฅ์ด ๋จ

  4. 4
    ๋ฐ˜๋ณต ๋˜๋Š” ์ข…๋ฃŒ

    ์ •๋ณด๊ฐ€ ์ถฉ๋ถ„ํ•ด์ง€๋ฉด ๋„๊ตฌ ํ˜ธ์ถœ ๋Œ€์‹  ์ตœ์ข… ๋‹ต๋ณ€ ์ƒ์„ฑ

์‹ค์ œ ํŠธ๋ ˆ์ด์Šค โ€” ํ•œ ์š”์ฒญ์ด ๋‘ ์Šคํ…์„ ๋„๋Š” ๊ณผ์ •

takeaway

๋งค ์Šคํ… ์ค‘๊ฐ„ ๊ฒฐ๊ณผ์— ๋ฐ˜์‘ํ•ด ๋‹ค์Œ ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ReAct์˜ ๊ฐ•์ ์ž…๋‹ˆ๋‹ค.

PART 2 ยท ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

ReWoo ํŒจํ„ด

๊ณ„ํš์„ ๋จผ์ € ์„ธ์šฐ๊ณ  ๋„๊ตฌ๋ฅผ ๋ณ‘๋ ฌ ์‹คํ–‰ โ€” HotpotQA ๋ฒค์น˜๋งˆํฌ ๊ธฐ์ค€ ํ† ํฐ ์ตœ๋Œ€ 5๋ฐฐ ํšจ์œจ

3์—ญํ•  ๋ถ„์—… โ€” Reasoning WithOut Observation

  1. 1
    Planner โ€” ์„ค๊ณ„๋„ ์ž‘์„ฑ (LLM 1ํšŒ)

    ์ „์ฒด ๋„๊ตฌ ํ˜ธ์ถœ ๊ณ„ํš์„ ํ•œ ๋ฒˆ์— ์ˆ˜๋ฆฝ โ€” ์•„์ง ์—†๋Š” ๊ฒฐ๊ณผ๋Š” #E1ยท#E2 ํ”Œ๋ ˆ์ด์Šคํ™€๋”๋กœ ์ฐธ์กฐ

  2. 2
    Worker โ€” ์ผ๊ด„ ์‹คํ–‰ (LLM 0ํšŒ)

    ๊ณ„ํš์˜ ๋„๊ตฌ๋ฅผ ๋ชจ๋ธ ๊ฐœ์ž… ์—†์ด ์‹คํ–‰ โ€” ์˜์กด์„ฑ ์—†๋Š” ํ˜ธ์ถœ์€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

  3. 3
    Solver โ€” ์ฆ๊ฑฐ ์ข…ํ•ฉ (LLM 1ํšŒ)

    ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์ž๋ฆฌ์— ์‹ค์ œ ๊ฒฐ๊ณผ๋ฅผ ์ฑ„์›Œ ์ตœ์ข… ๋‹ต๋ณ€ ์ƒ์„ฑ

๊ฐ™์€ ์š”์ฒญ์˜ ์‹คํ–‰ ๊ณ„ํš์„œ โ€” Planner ์ถœ๋ ฅ

python
Plan: ๊ฐ•๋‚จ์—ญ ์ดํƒˆ๋ฆฌ์•ˆ ๋ง›์ง‘์„ ์ฐพ๋Š”๋‹ค
#E1 = search_restaurants(location="๊ฐ•๋‚จ์—ญ",
                         cuisine="์ดํƒˆ๋ฆฌ์•ˆ")

Plan: ํ‰์  1์œ„ ์‹๋‹น์„ ์ €๋…์œผ๋กœ ์˜ˆ์•ฝํ•œ๋‹ค
#E2 = book_table(restaurant=#E1[0],
                 time="19:00")
takeaway

๊ด€์ฐฐ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ณ„ํš์„ ๋จผ์ € ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค โ€” LLM ํ˜ธ์ถœ์ด ๊ณ„ํšยท์ข…ํ•ฉ 2ํšŒ๋กœ ๊ณ ์ •๋˜๋Š” ๊ฒƒ์ด ์Šคํ…๋งˆ๋‹ค ๋ชจ๋ธ์„ ๋ถ€๋ฅด๋Š” ReAct์™€์˜ ๊ฒฐ์ •์  ์ฐจ์ด์ž…๋‹ˆ๋‹ค.

PART 2 ยท ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

ReAct vs ReWoo

์ž‘์—… ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ํŒจํ„ด์„ ์„ ํƒ

๊ตฌ๋ถ„ReActReWoo
์ „๋žต๋งค ์Šคํ… ํŒ๋‹จ๊ณ„ํš ๋จผ์ €, ์ผ๊ด„ ์‹คํ–‰
LLM ํ˜ธ์ถœNํšŒ (์Šคํ…๋งˆ๋‹ค)2ํšŒ (๊ณ„ํš + ์ข…ํ•ฉ)
ํ† ํฐ ํšจ์œจ๋‚ฎ์Œ๋†’์Œ (HotpotQA ๊ธฐ์ค€ ์ตœ๋Œ€ 5๋ฐฐ)
์‹คํ–‰ ์‹œ๊ฐ„์ง๋ ฌ โ€” ๋А๋ฆผ๋ณ‘๋ ฌ โ€” ๋น ๋ฆ„
์ ์‘๋ ฅโœ“ ๋†’์Œ (์ค‘๊ฐ„ ๊ฒฐ๊ณผ์— ๋ฐ˜์‘)๋‚ฎ์Œ (๊ณ„ํš ์‹คํŒจ ์‹œ ์žฌ๊ณ„ํš)
์ ํ•ฉํ•œ ๊ฒฝ์šฐ๋Œ€ํ™”ํ˜•, HITL, ๊ฒฐ๊ณผ ์˜์กด์„ฑ ๋†’์„ ๋•Œ๋ฉ€ํ‹ฐ๋„๊ตฌ, ๋ณ‘๋ ฌ ๊ฐ€๋Šฅ, ๋น„์šฉ ๋ฏผ๊ฐ
takeaway

๋Œ€ํ™”ํ˜•์ด๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ ์˜์กด์„ฑ์ด ๋†’์œผ๋ฉด ReAct, ๋ณ‘๋ ฌ ๊ฐ€๋Šฅํ•˜๊ณ  ๋น„์šฉ์— ๋ฏผ๊ฐํ•˜๋ฉด ReWoo โ€” ์ ์‘๋ ฅ๊ณผ ํšจ์œจ์˜ ๋งž๊ตํ™˜์ž…๋‹ˆ๋‹ค.

PART 2 ยท ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

Tool Use 6๋‹จ๊ณ„

LLM๊ณผ ๋„๊ตฌ ์‚ฌ์ด์˜ ๋ฉ”์‹œ์ง€ ํ”„๋กœํ† ์ฝœ

๋„๊ตฌ ์„ค๊ณ„

ํ•จ์ˆ˜ vs ๋„๊ตฌ ยท @tool ๋ณ€ํ™˜ ยท ์Šคํ‚ค๋งˆ ยท ์„ค๊ณ„ ์›์น™

PART 3 ยท ๋„๊ตฌ ์„ค๊ณ„

๋„๊ตฌ ์„ค๊ณ„

์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ LLM์ด ์“ธ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ๋˜๊ธฐ๊นŒ์ง€์˜ ์„ค๊ณ„ ์š”์†Œ ์กฐ๊ฐ

๋„๊ตฌ = ํ•จ์ˆ˜ + JSON Schema

LLM์€ ์ฝ”๋“œ๋ฅผ ์ฝ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค โ€” nameยทdescriptionยทinputSchema ์„ค๋ช…์„œ๊ฐ€ ๋„๊ตฌ ์„ ํƒ์˜ ์œ ์ผํ•œ ๊ทผ๊ฑฐ์ž…๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ vs ๋„๊ตฌ โ€” ํ˜ธ์ถœ ์ฃผ์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž์—์„œ LLM์œผ๋กœ
  • @tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ โ€” Python ํ•จ์ˆ˜๋ฅผ ๋„๊ตฌ๋กœ ์ž๋™ ๋ณ€ํ™˜
  • ์Šคํ‚ค๋งˆ 3์š”์†Œ โ€” name ยท description ยท inputSchema
  • ์„ค๊ณ„ ์›์น™ โ€” ๋‹จ์ผ ์ฑ…์ž„ ยท ๊ตฌ์กฐํ™” ๋ฐ˜ํ™˜ ยท ๋ช…ํ™•ํ•œ ์—๋Ÿฌ
takeaway

์ข‹์€ description์€ "์–ธ์ œ + ๋ญ˜ ๋„ฃ๊ณ  + ๋ญ˜ ๋ฐ›๋‚˜ + ์ฃผ์˜์‚ฌํ•ญ"์„ ๋‹ด์Šต๋‹ˆ๋‹ค โ€” ์„ค๋ช…์„œ ํ’ˆ์งˆ์ด ๋„๊ตฌ ์„ ํƒ ์ •ํ™•๋„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

PART 3 ยท ๋„๊ตฌ ์„ค๊ณ„

ํ•จ์ˆ˜ vs ๋„๊ตฌ

ํ•จ์ˆ˜๋ฅผ ๋„๊ตฌ๋กœ ๋งŒ๋“œ๋Š” ์กฐ๊ฑด โ€” JSON Schema(์„ค๋ช…์„œ)

์ผ๋ฐ˜ ํ•จ์ˆ˜

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœ

  • ํ˜ธ์ถœ ์ฃผ์ฒด: ๊ฐœ๋ฐœ์ž (์ฝ”๋“œ์—์„œ ์ง์ ‘)
  • ์„ค๋ช… ๋ถˆํ•„์š” โ€” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋จ
  • ํŒŒ๋ผ๋ฏธํ„ฐ: ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜
  • ์„ ํƒ ๊ธฐ์ค€: ๊ฐœ๋ฐœ์ž ํŒ๋‹จ

๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ์ˆ˜๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ถ”๊ฐ€ ์„ค๋ช… ์—†์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ ๋„๊ตฌ

LLM์ด ์ž์œจ ๊ฒฐ์ •

  • ํ˜ธ์ถœ ์ฃผ์ฒด: LLM (์ถ”๋ก  ํ›„ ์ž์œจ)
  • ์„ค๋ช… ํ•„์ˆ˜ โ€” LLM์€ ์ฝ”๋“œ๋ฅผ ๋ชป ์ฝ์Œ
  • ํŒŒ๋ผ๋ฏธํ„ฐ: JSON Schema
  • ์„ ํƒ ๊ธฐ์ค€: description ํ…์ŠคํŠธ

LLM์€ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, nameยทdescriptionยทinputSchema๋งŒ์œผ๋กœ "์ด ๋„๊ตฌ๋ฅผ ์ง€๊ธˆ ์จ์•ผ ํ•˜๋‚˜" ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

PART 3 ยท ๋„๊ตฌ ์„ค๊ณ„

@tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

Python ํ•จ์ˆ˜๋ฅผ ์—์ด์ „ํŠธ ๋„๊ตฌ๋กœ ์ž๋™ ๋ณ€ํ™˜

python
from strands import Agent, tool

# โ‘  ๋„๊ตฌ ์ •์˜ โ€” docstring์ด LLM์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๋„๊ตฌ ์„ค๋ช…
@tool
def search_restaurants(location: str, cuisine: str = None) -> str:
    """์ง€์—ญ๊ณผ ์š”๋ฆฌ ์ข…๋ฅ˜๋กœ ์‹๋‹น์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ์ž๊ฐ€ ์‹๋‹น ์ถ”์ฒœ์„ ์š”์ฒญํ•  ๋•Œ ํ˜ธ์ถœํ•˜์„ธ์š”.
    location: ๊ฒ€์ƒ‰ํ•  ์ง€์—ญ๋ช… (์˜ˆ: "๊ฐ•๋‚จ์—ญ")
    cuisine: ์š”๋ฆฌ ์ข…๋ฅ˜ (์˜ˆ: "์ดํƒˆ๋ฆฌ์•ˆ"). ์ƒ๋žตํ•˜๋ฉด ์ „์ฒด ๊ฒ€์ƒ‰
    """
    return f"{location} ๊ทผ์ฒ˜ ์‹๋‹น 3๊ณณ ๋ฐœ๊ฒฌ"

# โ‘ก Agent์— ๋„๊ตฌ ์ „๋‹ฌ โ†’ ReAct ๋ฃจํ”„์—์„œ ์ž์œจ ํ˜ธ์ถœ
agent = Agent(
    model="us.anthropic.claude-sonnet-4-6",
    tools=[search_restaurants],
)

# โ‘ข ์‹คํ–‰ โ€” ๋ชจ๋ธ์ด ์Šค์Šค๋กœ ๋„๊ตฌ ํ˜ธ์ถœ์„ ๊ฒฐ์ •ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ข…ํ•ฉ
result = agent("๊ฐ•๋‚จ์—ญ ์ดํƒˆ๋ฆฌ์•ˆ ์ถ”์ฒœํ•ด์ค˜")
  • @tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ โ€” ํ‰๋ฒ”ํ•œ Python ํ•จ์ˆ˜๊ฐ€ ๊ทธ๋Œ€๋กœ ๋„๊ตฌ๊ฐ€ ๋จ. docstringยทํƒ€์ž… ํžŒํŠธ๊ฐ€ nameยทdescriptionยทinputSchema๋กœ ์ž๋™ ๋ณ€ํ™˜
  • tools=[...] ๋“ฑ๋ก โ€” ๋ชจ๋ธ์ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™ ๋ชฉ๋ก. ๋ฆฌ์ŠคํŠธ์— ๋‹ด๋Š” ์ˆœ๊ฐ„ ReAct ๋ฃจํ”„์˜ ์„ ํƒ์ง€
  • ์‹คํ–‰ โ€” ํ˜ธ์ถœ ์—ฌ๋ถ€ยท์ธ์ž๋ฅผ ๋ชจ๋ธ์ด ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•˜๊ณ , Observation์„ ์ข…ํ•ฉํ•ด ์ตœ์ข… ๋‹ต๋ณ€
PART 3 ยท ๋„๊ตฌ ์„ค๊ณ„

๋„๊ตฌ ์Šคํ‚ค๋งˆ 3์š”์†Œ

LLM์ด ๋„๊ตฌ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ •๋ณด

name

๋™์‚ฌ+๋ช…์‚ฌ ํŒจํ„ด โ€” search_restaurants, get_weather, create_ticket

description

์–ธ์ œ ์“ฐ๋Š”์ง€ + ์ž…๋ ฅ ํ˜•์‹ + ๋ฐ˜ํ™˜๊ฐ’ โ€” ๋„๊ตฌ ์„ ํƒ์˜ ์œ ์ผํ•œ ๊ทผ๊ฑฐ

inputSchema

required/optional ๊ตฌ๋ถ„, ํƒ€์ž… ์ œ์•ฝ, enum์œผ๋กœ ์ž…๋ ฅ ๊ฒ€์ฆ

takeaway

name์œผ๋กœ 1์ฐจ ํ•„ํ„ฐ๋ง, description์œผ๋กœ ์ตœ์ข… ์„ ํƒ, inputSchema๋กœ ์ž…๋ ฅ ๊ฒ€์ฆ โ€” ์„ธ ์š”์†Œ๊ฐ€ ํ•จ๊ป˜ ๋„๊ตฌ ์„ ํƒ ์ •ํ™•๋„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

PART 3 ยท ๋„๊ตฌ ์„ค๊ณ„

๋„๊ตฌ ์„ค๊ณ„ ์›์น™

์ข‹์€ ๋„๊ตฌ = LLM์ด ์ •ํ™•ํžˆ ์„ ํƒํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰

์›์น™์ข‹์€ ์˜ˆ๋‚˜์œ ์˜ˆ
๋‹จ์ผ ์ฑ…์ž„search_restaurants (๊ฒ€์ƒ‰๋งŒ)manage_restaurant (๊ฒ€์ƒ‰+์˜ˆ์•ฝ+์ทจ์†Œ)
๋ช…ํ™•ํ•œ ์ด๋ฆ„get_weather (๋™์‚ฌ+๋ช…์‚ฌ)do_stuff, helper, process
๊ตฌ์ฒด์  ์„ค๋ช…"๋น„์šฉ ์งˆ๋ฌธ ์‹œ ํ˜ธ์ถœ. service, period ํ•„์ˆ˜""๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค"
๊ตฌ์กฐํ™” ๋ฐ˜ํ™˜JSON: {name, rating, price}์ž์œ  ํ˜•์‹ ํ…์ŠคํŠธ
์—๋Ÿฌ ๋ฉ”์‹œ์ง€{"error": "์„œ๋น„์Šค๋ช…์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"}๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ์˜ˆ์™ธ
takeaway

ํ•œ ๋„๊ตฌ๋Š” ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•˜๊ณ , ๋ฐ˜ํ™˜์€ ๊ตฌ์กฐํ™”ํ•˜๋ฉฐ, ์—๋Ÿฌ์—๋Š” ์ด์œ ๋ฅผ ๋‹ด์Šต๋‹ˆ๋‹ค โ€” LLM์ด ๋‹ค์Œ ํŒ๋‹จ์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

Human-in-the-Loop

์—์ด์ „ํŠธ ์˜ค๋ฅ˜ ยท ๋„๊ตฌ ๋ถ„๋ฅ˜ ยท HITL 3ํŒจํ„ด ยท ๊ตฌํ˜„

PART 4 ยท Human-in-the-Loop

Human-in-the-Loop

์—์ด์ „ํŠธ์˜ ์‹คํŒจ ๋ฐฉ์‹์„ ์•Œ๊ณ  ์œ„ํ—˜ํ•œ ํ˜ธ์ถœ ์•ž์—๋งŒ ์‚ฌ๋žŒ์˜ ํ™•์ธ์„ ์‹ฌ๋Š” ์„ค๊ณ„

์ฝ๊ธฐ = ์ž๋™ ยท ์“ฐ๊ธฐ = ์Šน์ธ ยท ๊ณ ์œ„ํ—˜ = ์ด์ค‘ ํ™•์ธ

์ž์œจ์„ฑ์ด ๋†’์„์ˆ˜๋ก ์œ„ํ—˜๋„ ์ปค์ง‘๋‹ˆ๋‹ค โ€” ๋„๊ตฌ๋ฅผ ์œ„ํ—˜๋„๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์œ„ํ—˜ํ•œ ํ˜ธ์ถœ ์•ž์—์„œ๋งŒ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

  • ์‹คํŒจ ๋ฐฉ์‹ โ€” ํ™˜๊ฐ ยท ์ž˜๋ชป๋œ ๋„๊ตฌ ์„ ํƒ ยท ๋ฒ”์œ„ ์ดˆ๊ณผ
  • HITL 3ํŒจํ„ด โ€” ์Šน์ธ ๊ฒŒ์ดํŠธ ยท ์—์Šค์ปฌ๋ ˆ์ด์…˜ ยท ๊ฐ์‚ฌ ๋กœ๊ทธ
  • Hook ๊ตฌํ˜„ โ€” BeforeToolCallEvent + event.interrupt()
  • ์„ค๊ณ„ ์›์น™ โ€” ์ตœ์†Œ ๊ถŒํ•œ ยท ์ ์ง„์  ์ž์œจ ยท ์‹คํŒจ ์•ˆ์ „
takeaway

๋„๊ตฌ๋ฅผ ์ฝ๊ธฐยท์“ฐ๊ธฐยท๊ณ ์œ„ํ—˜์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์œ„ํ—˜ํ•œ ํ˜ธ์ถœ๋งŒ ์‚ฌ๋žŒ์ด ํ™•์ธํ•ฉ๋‹ˆ๋‹ค โ€” ์•ˆ์ „๊ณผ ํšจ์œจ์˜ ๊ท ํ˜•์ด HITL ์„ค๊ณ„์˜ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

PART 4 ยท Human-in-the-Loop

์—์ด์ „ํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋ฐฉ์‹

์ž์œจ์„ฑ์— ๋น„๋ก€ํ•ด ์ปค์ง€๋Š” ์œ„ํ—˜

ํ™˜๊ฐ (Hallucination)

์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ƒ์„ฑ

์ž˜๋ชป๋œ ๋„๊ตฌ ์„ ํƒ

delete๋ฅผ ์จ์•ผ ํ•˜๋Š”๋ฐ create๋ฅผ ํ˜ธ์ถœ โ€” description ๋ชจํ˜ธ ์‹œ ๋นˆ๋ฒˆ

๋ฒ”์œ„ ์ดˆ๊ณผ (Excessive Agency)

ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์‹œ์Šคํ…œ์— ์ ‘๊ทผ ์‹œ๋„ โ€” OWASP LLM Top 10์˜ Excessive Agency ํ•ญ๋ชฉ

takeaway

์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ์ž์œจ์„ฑ์ด ๋งŒ๋“œ๋Š” ์‹คํŒจ์ž…๋‹ˆ๋‹ค โ€” ๋„๊ตฌ ํ˜ผ๋™์€ description ์ฐจ๋ณ„ํ™”๋กœ, ๋ฒ”์œ„ ์ดˆ๊ณผ๋Š” ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์œผ๋กœ ์ค„์ž…๋‹ˆ๋‹ค.

PART 4 ยท Human-in-the-Loop

๋„๊ตฌ ์œ„ํ—˜ ๋ถ„๋ฅ˜

์ฝ๊ธฐ = ์ž๋™, ์“ฐ๊ธฐ = ์Šน์ธ, ๊ณ ์œ„ํ—˜ = ์ด์ค‘ ํ™•์ธ

์ฝ๊ธฐ ์ „์šฉ (์กฐํšŒ)

์ž๋™ ์‹คํ–‰ ํ—ˆ์šฉ

  • search_restaurants
  • get_weather
  • query_status

์–ธ์ œ โ€” ๋ถ€์ž‘์šฉ ์—†์Œ โ€” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์—†์ด ์ •๋ณด๋งŒ ๋ฐ˜ํ™˜

์“ฐ๊ธฐ (๋ณ€๊ฒฝ)

์‚ฌ์šฉ์ž ์Šน์ธ ํ›„ ์‹คํ–‰

  • create_reservation
  • update_profile
  • send_email

์–ธ์ œ โ€” ๋˜๋Œ๋ฆฌ๊ธฐ ์–ด๋ ค์šด ๋ณ€๊ฒฝ โ€” ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ

๊ณ ์œ„ํ—˜ (๋น„๊ฐ€์—ญ)

์ด์ค‘ ํ™•์ธ + ๊ฐ์‚ฌ ๋กœ๊ทธ

  • cancel_order
  • process_refund
  • delete_account

์–ธ์ œ โ€” ๊ธˆ์ „์  ์˜ํ–ฅ, ๋ฐ์ดํ„ฐ ์†์‹ค, ๋ฒ•์  ์ฑ…์ž„

takeaway

๋ถ€์ž‘์šฉ์ด ์—†์œผ๋ฉด ์ž๋™, ๋˜๋Œ๋ฆฌ๊ธฐ ์–ด๋ ค์šฐ๋ฉด ์Šน์ธ, ๊ธˆ์ „ยท๋ฒ•์  ์˜ํ–ฅ์ด๋ฉด ์ด์ค‘ ํ™•์ธ โ€” ๋ถ€์ž‘์šฉ์˜ ํฌ๊ธฐ๊ฐ€ ๊ฒŒ์ดํŠธ์˜ ๊ฐ•๋„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

PART 4 ยท Human-in-the-Loop

HITL 3ํŒจํ„ด

์‚ฌ๋žŒ์ด ์—์ด์ „ํŠธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

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

์Šน์ธ ๊ฒŒ์ดํŠธ๋Š” ์‹คํ–‰ ์ „์—, ์—์Šค์ปฌ๋ ˆ์ด์…˜์€ ํŒ๋‹จ์ด ๋ง‰ํž ๋•Œ, ๊ฐ์‚ฌ ๋กœ๊ทธ๋Š” ์‹คํ–‰ ํ›„์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค โ€” ์‹œ์ ์ด ๋‹ค๋ฅธ ์„ธ ๊ฒน์˜ ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค.

PART 4 ยท Human-in-the-Loop

Hook ๊ธฐ๋ฐ˜ ์Šน์ธ ๊ฒŒ์ดํŠธ

Strands SDK๋กœ HITL ๊ตฌํ˜„

python
from strands.hooks import BeforeToolCallEvent, HookProvider, HookRegistry

# โ‘  Hook ์ •์˜ โ€” ๋„๊ตฌ ์‹คํ–‰ ์ง์ „(BeforeToolCallEvent)์— ๊ฐœ์ž…
class ApprovalGate(HookProvider):
    """๊ณ ์œ„ํ—˜ ๋„๊ตฌ ํ˜ธ์ถœ ์ „ ์‚ฌ์šฉ์ž ์Šน์ธ์„ ์š”์ฒญํ•˜๋Š” Hook"""

    def register_hooks(self, registry: HookRegistry):
        registry.add_callback(BeforeToolCallEvent, self.check)

    def check(self, event: BeforeToolCallEvent):
        # โ‘ก ์“ฐ๊ธฐ/์‚ญ์ œ ๋„๊ตฌ๋งŒ ์Šน์ธ ์š”์ฒญ โ€” ์ฝ๊ธฐ ๋„๊ตฌ๋Š” ํ†ต๊ณผ
        dangerous = ["cancel_reservation", "delete_account"]
        if event.tool_use["name"] in dangerous:
            event.interrupt(
                "approval_needed",
                reason=f"'{event.tool_use['name']}' ์‹คํ–‰์„ ์Šน์ธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"
            )

# โ‘ข ์—์ด์ „ํŠธ์— Hook ์ ์šฉ
agent = Agent(
    model="us.anthropic.claude-sonnet-4-6",
    tools=[cancel_reservation, search_restaurants],
    hooks=[ApprovalGate()]
)
  • BeforeToolCallEvent โ€” ๋„๊ตฌ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๊ธฐ ์ง์ „์˜ ๊ฐœ์ž… ์ง€์ . ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ”๋ฉด ๋„๊ตฌ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Œ
  • ์„ ๋ณ„ ์Šน์ธ โ€” ๊ณ ์œ„ํ—˜ ๋„๊ตฌ๋งŒ event.interrupt()๋กœ ์ผ์‹œ ์ค‘์ง€. ์Šน์ธ โ†’ ์žฌ๊ฐœ, ๊ฑฐ๋ถ€ โ†’ ์ค‘๋‹จ
  • hooks=[...] โ€” Agent์— ๋ถ™์ด๋Š” ์ˆœ๊ฐ„ ๋ชจ๋“  ๋„๊ตฌ ํ˜ธ์ถœ์ด ์ด ๊ฒŒ์ดํŠธ๋ฅผ ๊ฑฐ์นจ. ๋„๊ตฌ ์ฝ”๋“œ๋Š” ๋ฌด๋ณ€๊ฒฝ
PART 4 ยท Human-in-the-Loop

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

์•ˆ์ „๊ณผ ํšจ์œจ์˜ ๊ท ํ˜•

์ตœ์†Œ ๊ถŒํ•œ ยท ์ ์ง„์  ์ž์œจ ยท ์‹คํŒจ ์•ˆ์ „

ํ•„์š”ํ•œ ๋„๊ตฌ๋งŒ ์ œ๊ณตํ•˜๊ณ , ์‹ ๋ขฐ๊ฐ€ ์Œ“์ด๋ฉด ์ž๋™ ์Šน์ธ์„ ํ™•๋Œ€ํ•˜๋ฉฐ, ์˜ค๋ฅ˜ ์‹œ ๋ฐ˜๋“œ์‹œ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค

  • Least Privilege
  • Graduated Autonomy
  • Fail-Safe
์—์ด์ „ํŠธ๋Š” ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ํ•˜๋„ค์Šค๊ฐ€ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋„๊ตฌ ยท ๋ฃจํ”„ ยท ์•ˆ์ „์žฅ์น˜๋ฅผ ๊ฐ–์ถ˜ ์‹œ์Šคํ…œ ์„ค๊ณ„