Home / Strands ์ƒํƒœ์™€ ์ปจํ…์ŠคํŠธ / ๐ŸŽฏ Strands ์ƒํƒœ ๊ด€๋ฆฌ
Module

๐ŸŽฏ Strands ์ƒํƒœ ๊ด€๋ฆฌ

Session, Conversation, Memory, Context, Snapshot

โฑ 60๋ถ„ 86 / 189

Strands ์ƒํƒœ ๊ด€๋ฆฌ

Session ยท Conversation ยท Memory ยท Context

์—์ด์ „ํŠธ์˜ ๊ธฐ์–ต์„ ์„ค๊ณ„ํ•œ๋‹ค

์„ธ์…˜ ์˜์†ํ™”๋ถ€ํ„ฐ ์ปจํ…์ŠคํŠธ ์ž๋™ ๊ด€๋ฆฌ๊นŒ์ง€ โ€” ์ƒํƒœ์˜ 4๊ณ„์ธต

์ƒํƒœ์˜ ๊ธฐ์ดˆ

ํ„ด๊ณผ ์„ธ์…˜ ยท messages[] ยท ์™œ ์ƒํƒœ ๊ด€๋ฆฌ์ธ๊ฐ€

PART 1 ยท ์ƒํƒœ์˜ ๊ธฐ์ดˆ

์—์ด์ „ํŠธ ๋Œ€ํ™”์˜ ๊ตฌ์กฐ โ€” ํ„ด ยท ์„ธ์…˜ ยท ๊ธฐ์–ต

๋ฉ”์‹œ์ง€๊ฐ€ ๋ชจ์—ฌ ํ„ด, ํ„ด์ด ๋ชจ์—ฌ ์„ธ์…˜ โ€” ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ „๋ถ€๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ณณ











Session โ€” ๋Œ€ํ™” ์ „์ฒด (ํ„ด๋“ค์˜ ๋ฌถ์Œ)


๐Ÿ‘ค ์‚ฌ์šฉ์ž
๐Ÿค– ์—์ด์ „ํŠธ






ํ„ด 1
๋ฉ”์‹œ์ง€ 2๊ฐœ

"์˜ค๋Š˜ ์ €๋… 2๋ช… ์˜ˆ์•ฝํ•˜๊ณ  ์‹ถ์–ด์š”"
user ๋ฉ”์‹œ์ง€

์ดํƒˆ๋ฆฌ์•ˆ 2๊ณณ์„ ์ถ”์ฒœ๋“œ๋ ค์š”
assistant ๋ฉ”์‹œ์ง€




ํ„ด 2
๋ฉ”์‹œ์ง€ 4๊ฐœ โ€” ๋„๊ตฌ ํ˜ธ์ถœ ํฌํ•จ

"์ฝ”์Šค ์š”๋ฆฌ ํฌํ•จ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜"

๐Ÿ”ง ๋„๊ตฌ ํ˜ธ์ถœ โ€” ์˜ˆ์•ฝ ๋ณ€๊ฒฝ
toolUse ยท toolResult ๋ฉ”์‹œ์ง€ 2๊ฐœ ์ถ”๊ฐ€

์ฝ”์Šค ๊ตฌ์„ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์˜ˆ์•ฝํ–ˆ์–ด์š”




messages[]
์ด ๋Œ€ํ™”์˜ ๋ฉ”์‹œ์ง€ 6๊ฐœ๋ฅผ
์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋ก
์ €์žฅ ์œ„์น˜: ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ
โšก ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ = ์ „๋ถ€ ์†Œ๋ฉธ


๊ธฐ์–ต์ด ์—ฌ๊ธฐ๋ฟ์ด๋ผ๋ฉด ๋Œ€ํ™”๋Š” ์žฌ์‹œ์ž‘๊ณผ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค โ€” ๊ทธ๋ž˜์„œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
PART 1 ยท ์ƒํƒœ์˜ ๊ธฐ์ดˆ

๊ธฐ์–ต์˜ ์‹ค์ฒด โ€” messages[]

๋ชจ๋ธ์€ ์•„๋ฌด๊ฒƒ๋„ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Œ โ€” ๋งค ํ„ด, ์ง€๊ธˆ๊นŒ์ง€์˜ ๋Œ€ํ™” ์ „์ฒด๋ฅผ ์žฌ์ „์†ก










์ด๋ฏธ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€ โ€” ๋งค๋ฒˆ ๋‹ค์‹œ ์ „์†ก

์ด๋ฒˆ ํ„ด์˜ ์ƒˆ ์งˆ๋ฌธ

๋„๊ตฌ ๋ฉ”์‹œ์ง€ โ€” ์ด๋ ฅ์— ๋‚จ์•„ ์žฌ์ „์†ก




ํ„ด 1


messages[]

์งˆ๋ฌธ 1

๋ฐฐ์—ด ํ†ต์งธ๋กœ ์ „์†ก โ€” 1๊ฐœ




ํ„ด 2


messages[]

์งˆ๋ฌธ 1

๋‹ต๋ณ€ 1

์งˆ๋ฌธ 2

๋ฐฐ์—ด ํ†ต์งธ๋กœ ์ „์†ก โ€” 3๊ฐœ


ํ„ด 2์—์„œ ๋„๊ตฌ ์‚ฌ์šฉ โ†’ ๋„๊ตฌ ์š”์ฒญยท๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€ 2๊ฐœ๊ฐ€ messages[]์— ์ถ”๊ฐ€




ํ„ด 3


messages[]

์งˆ๋ฌธ 1

๋‹ต๋ณ€ 1

์งˆ๋ฌธ 2

๋„๊ตฌ ์š”์ฒญ

๋„๊ตฌ ๊ฒฐ๊ณผ

๋‹ต๋ณ€ 2

์งˆ๋ฌธ 3

โ€” 7๊ฐœ



๋ชจ๋ธ
stateless
ํ˜ธ์ถœ ์‚ฌ์ด์— ์•„๋ฌด๊ฒƒ๋„
์ €์žฅํ•˜์ง€ ์•Š์Œ
๊ธฐ์–ต์€ ๋ชจ๋ธ ๋ฐ– โ€”
messages[]์— ์žˆ์Œ


๋ชจ๋ธ์ด ๊ธฐ์–ตํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ํฐ ๋„๊ตฌ ๊ฒฐ๊ณผ๊นŒ์ง€ ๋งค ํ„ด ๋‹ค์‹œ ๋“ค๋ ค์ฃผ๋Š” ๊ฒƒ โ€” messages[] ์ „์ฒด๊ฐ€ ๊ธฐ์–ต์˜ ์‹ค์ฒด์ž…๋‹ˆ๋‹ค
PART 1 ยท ์ƒํƒœ์˜ ๊ธฐ์ดˆ

์ƒํƒœ๊ฐ€ ์—†์œผ๋ฉด ์ƒ๊ธฐ๋Š” ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ

์ธ๋ฉ”๋ชจ๋ฆฌ messages[]๋ฅผ ๊ทธ๋Œ€๋กœ ํ”„๋กœ๋•์…˜์— ๋‘๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

๋งฅ๋ฝ ์œ ์‹ค

์žฌ์‹œ์ž‘ยท์ฝœ๋“œ ์Šคํƒ€ํŠธยท๋ฐฐํฌ = ๊ธฐ์–ต ์ƒ์‹ค

  • ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ํ›„ "์•„๊นŒ ๊ทธ๊ฑฐ"๋ฅผ ๋ชจ๋ฆ„
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์„ค๋ช…ํ•ด์•ผ ํ•จ

ํ† ํฐ ํญ๋ฐœ

๋งค ํ˜ธ์ถœ์— ์ „์ฒด ํžˆ์Šคํ† ๋ฆฌ ์ „์†ก

  • 50ํ„ด์ด๋ฉด ๋งค๋ฒˆ ์ˆ˜๋งŒ ํ† ํฐ ๊ณผ๊ธˆ
  • ๋น„์šฉ๊ณผ ์ง€์—ฐ์ด ๋Œ€ํ™” ๊ธธ์ด์— ๋น„๋ก€ ์ฆ๊ฐ€

์œˆ๋„์šฐ ์ดˆ๊ณผ

์ปจํ…์ŠคํŠธ ํ•œ๋„๋ฅผ ๋„˜์œผ๋ฉด ํ˜ธ์ถœ ์‹คํŒจ

  • ๊ธด ๋Œ€ํ™”ยทํฐ ๋„๊ตฌ ๊ฒฐ๊ณผ๊ฐ€ ํ•œ๋„๋ฅผ ๋„˜๊น€
  • ์ •๋ฆฌ ์ „๋žต ์—†์ด๋Š” ๋Œ€ํ™”๊ฐ€ ์ค‘๋‹จ
takeaway

์ด ์„ธ ๋ฌธ์ œ์˜ ํ•ด๋ฒ•์ด ๊ณง ์ƒํƒœ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค.
Strands๋Š” ์ด๋ฅผ ๋„ค ๊ณ„์ธต์œผ๋กœ ํ’€์–ด๋ƒ…๋‹ˆ๋‹ค โ€” ์ €์žฅ์€ Session, ๊ธธ์ด๋Š” Conversation, ๊ธฐ์–ต์€ Memory, ์กฐ๋ฆฝ์€ Context

PART 1 ยท ์ƒํƒœ์˜ ๊ธฐ์ดˆ

๋„ค ๊ฐ€์ง€ ์ด๋ฆ„์˜ ์‹ค์ฒด

์ €์žฅยท๊ธธ์ดยท๊ธฐ์–ตยท์กฐ๋ฆฝ โ€” ๊ฐ ์ด๋ฆ„์ด Strands์—์„œ ์‹ค์ œ๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ

Session

์ €์žฅ โ€” ๋Œ€ํ™” ์ „์ฒด๋ฅผ ์˜์†ํ™”ยท๋ณต์›

Conversation

๊ธธ์ด โ€” ์Œ“์ด๋Š” ๋Œ€ํ™” ์ด๋ ฅ๊ณผ ๊ทธ ๊ด€๋ฆฌ

Memory

๊ธฐ์–ต โ€” ์„ธ์…˜์„ ๋„˜์–ด ๋‚จ๋Š” ์‚ฌ์‹ค๊ณผ ์„ ํ˜ธ

Context

์กฐ๋ฆฝ โ€” ์ด๋ฒˆ ํ˜ธ์ถœ์— ์‹ค์ œ๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ž…๋ ฅ

takeaway

Strands์— "์ƒํƒœ ๊ด€๋ฆฌ"๋ผ๋Š” ๋‹จ์ผ API๋Š” ์—†์Šต๋‹ˆ๋‹ค โ€” ์œ„ ๋„ค ๊ณ„์ธต์˜ ์กฐํ•ฉ์ด๋ฉฐ, ๋ณ„๋„๋กœ agent.state(๋ชจ๋ธ์— ์ „์†ก๋˜์ง€ ์•Š๋Š” key-value ์ €์žฅ์†Œ)๊ฐ€ ์„ธ์…˜๊ณผ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ๊ด€๋ฆฌ ๊ณ„์ธต

Session โ†’ Conversation โ†’ Memory โ†’ Context

PART 2 ยท ์ƒํƒœ ๊ด€๋ฆฌ ๊ณ„์ธต

4๊ณ„์ธต ์ง€๋„ โ€” ์Œ“์•„๊ฐ€๋Š” ์„ ํƒ

์›Œํฌ๋กœ๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์•„๋ž˜๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์Œ“์ด๋Š” ๊ณ„์ธต

Sessionโ€” ์ €์žฅยท๋ณต์›Conversationโ€” ๊ธธ์ด ์ •๋ฆฌMemoryโ€” ์žฅ๊ธฐ ๊ธฐ์–ตContextโ€” ๋ชจ๋ธ ์ž…๋ ฅ ์กฐ๋ฆฝ
Context
๋‹จ๋ฐœ์„ฑ ์งˆ์˜
Lambda โ€” ๋Œ€ํ™” ์—†์Œ
Conversation
SlidingWindow
Session
Context
์ฑ—๋ด‡
์„ธ์…˜ ์œ ์ง€
Memory
Conversation
Summarizing
Session
Context
๊ฐœ์ธ ๋น„์„œ
์žฅ๊ธฐ ๊ธฐ์–ต
Memory
Conversation
Summarizing
Session
Context
context_manager='auto'
๋ฉ€ํ‹ฐํ„ด ๋ถ„์„
๋Œ€์šฉ๋Ÿ‰ โ€” ํ•œ๋„ ๋ฐฉ์–ด๊นŒ์ง€
์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ โ€” ๋Œ€ํ™”๊ฐ€ ๊ธธ๊ณ  ๊นŠ์–ด์งˆ์ˆ˜๋ก ๊ณ„์ธต์ด ํ•˜๋‚˜์”ฉ ์Œ“์ž…๋‹ˆ๋‹ค
PART 2 ยท ์ƒํƒœ ๊ด€๋ฆฌ ๊ณ„์ธต

๋ชจ๋ธ ์ž…๋ ฅ์ด ๋˜๊ธฐ๊นŒ์ง€ โ€” Context ์กฐ๋ฆฝ ๋ผ์ธ

๋„ค ๊ณ„์ธต์ด ๊ฐ์ž์˜ ๊ธฐ์—ฌ๋ฌผ์„ ๊ฝ‚์•„ ๋„ฃ๋Š”, ๋งค ํ˜ธ์ถœ ์ƒˆ๋กœ ์กฐ๋ฆฝ๋˜๋Š” Context










1

Session
์ €์žฅ์†Œ์—์„œ messages[] ๋ณต์›
(Agent ์ƒ์„ฑ ์‹œ 1ํšŒ)


2

Conversation
์ •์ฑ…๋Œ€๋กœ ์ด๋ ฅ ์ •๋ฆฌ
์ตœ๊ทผ N๊ฐœ ์œ ์ง€ ๋˜๋Š” ์š”์•ฝ



3

Memory
์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ์žฅ๊ธฐ ๊ธฐ์–ต ๊ฒ€์ƒ‰
๊ด€๋ จ๋  ๋•Œ๋งŒ ์ฃผ์ž…



4

์ƒˆ ์งˆ๋ฌธ
์ด๋ฒˆ ํ„ด์˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ




Context โ€” ๋ชจ๋ธ ์ž…๋ ฅ

System Prompt
๋งค ํ˜ธ์ถœ ๋™์ผ (๊ณ ์ •)

์ •๋ฆฌ๋œ ๋Œ€ํ™” ์ด๋ ฅ
Session ๋ณต์› + Conversation ์ •๋ฆฌ

์ฃผ์ž…๋œ ์žฅ๊ธฐ ๊ธฐ์–ต
Memory recall ๊ฒฐ๊ณผ

์ƒˆ ์งˆ๋ฌธ
์ด๋ฒˆ ํ„ด์˜ ์ž…๋ ฅ
+ ํ„ด ์ค‘ ์ƒ๊ธฐ๋Š” ๋„๊ตฌ ๊ฒฐ๊ณผ









๋ชจ๋ธ
์กฐ๋ฆฝ๋œ Context๋งŒ ๋ด„
๋งค ํ˜ธ์ถœ ์ƒˆ๋กœ ์กฐ๋ฆฝ


๋ณต์›ยท์ •๋ฆฌยท์ฃผ์ž…์€ ๊ณ„์ธต์ด ์•Œ์•„์„œ โ€” ๊ฐœ๋ฐœ์ž๋Š” ์งˆ๋ฌธ๋งŒ ๋„ฃ์œผ๋ฉด Context๊ฐ€ ์กฐ๋ฆฝ๋ฉ๋‹ˆ๋‹ค

SessionManager

๋ผ์ดํ”„์‚ฌ์ดํด ยท File ยท S3 ยท Repository

PART 3 ยท SessionManager

SessionManager

์„ธ์…˜ ์˜์†ํ™” ๊ณ„์ธต โ€” Agent์— ์žฅ์ฐฉํ•˜๋ฉด ์ €์žฅ๊ณผ ๋ณต์›์ด ์ž๋™

SessionManager

๋Œ€ํ™” ์ƒํƒœ๋ฅผ ์ €์žฅ์†Œ์— ์ž๋™์œผ๋กœ ์˜์†ํ™”ํ•˜๊ณ , session_id ํ•˜๋‚˜๋กœ ๋˜์‚ด๋ฆฝ๋‹ˆ๋‹ค

  • ์ €์žฅ ๋Œ€์ƒ: messages[] + agent.state
  • ์ €์žฅ ์‹œ์ : ๋งค ํ„ด ์ž๋™
  • ๋ณต์› ํ‚ค: session_id
  • ๋ฐฑ์—”๋“œ: File ยท S3 ยท ์ปค์Šคํ…€ Repository
takeaway

๊ฐœ๋ฐœ์ž๊ฐ€ save()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์žฅ์ฐฉ๋งŒ ํ•˜๋ฉด ์„ธ์…˜์ด Agent๋ฅผ ๋”ฐ๋ผ๋‹ค๋‹™๋‹ˆ๋‹ค.

PART 3 ยท SessionManager

์„ธ์…˜ ๋ผ์ดํ”„์‚ฌ์ดํด

๋ช…์‹œ์ ์œผ๋กœ ์—ด๊ณ  ๋‹ซ์ง€ ์•Š๋Š” ์„ธ์…˜ โ€” ์ƒํƒœ ์‚ฌ์ด๋ฅผ ์˜ค๊ฐ€๋Š” ์ €์žฅยท๋ณต์›ยท์†Œ๋ฉธ์˜ ํ๋ฆ„

















์ƒ์„ฑ
agent() ์ฒซ ํ˜ธ์ถœ
์ €์žฅ์†Œ์— ์ƒˆ ์„ธ์…˜ ๊ธฐ๋ก



ํ™œ์„ฑ
ํ„ด ์ง„ํ–‰ ์ค‘
messages[] ๋ˆ„์ 



๋ณด๊ด€
ํ”„๋กœ์„ธ์Šค๋Š” ์—†์–ด๋„
์ €์žฅ์†Œ์—๋Š” ๊ทธ๋Œ€๋กœ



์†Œ๋ฉธ
์„ธ์…˜ ๊ธฐ๋ก ์‚ญ์ œ



์ฒซ ํ„ด ์‹คํ–‰



ํ„ด ๋ฐ˜๋ณต โ€” ๋งค ํ„ด ์ž๋™ ์ €์žฅ
๊ฐœ๋ฐœ์ž๊ฐ€ save๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ



ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
์ธ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์†Œ๋ฉธ



๋ณต์› โ€” ๊ฐ™์€ session_id๋กœ Agent ์žฌ์ƒ์„ฑ
์ด์ „ messages[]ยทstate ์ž๋™ ๋กœ๋“œ โ€” ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจยท์„œ๋ฒ„ ์žฌ์‹œ์ž‘์—๋„ ์ด์–ด์ง



TTL ยท ์ˆ˜๋™ ์‚ญ์ œ
์ข…๋ฃŒ ์ด๋ฒคํŠธ ์—†์Œ


์„ธ์…˜์—๋Š” open()๋„ close()๋„ ์—†์Šต๋‹ˆ๋‹ค โ€” ์ €์žฅ์€ ์ž๋™, ๋ณต์›์€ session_id, ์†Œ๋ฉธ์€ ์Šคํ† ๋ฆฌ์ง€ ์ •์ฑ…
PART 3 ยท SessionManager

SessionManager ๋ฐฑ์—”๋“œ

์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์— ์ €์žฅํ• ์ง€ ์„ ํƒ โ€” ํ™˜๊ฒฝ์— ๋งž๋Š” ๋ฐฑ์—”๋“œ

FileSessionManager

  • ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์— JSON ์ €์žฅ
  • ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์— ์ ํ•ฉ
  • ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ์ ‘๊ทผ ์‹œ ์ถฉ๋Œ ๊ฐ€๋Šฅ

์–ธ์ œ โ€” ๋กœ์ปฌ ๊ฐœ๋ฐœ, ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค, ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž…

S3SessionManager

  • S3 ๋ฒ„ํ‚ท์— ์„ธ์…˜ ์ €์žฅ
  • ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ(Lambda)์— ์ ํ•ฉ
  • ๋ฒ„์ „ ๊ด€๋ฆฌ์™€ ์ˆ˜๋ช…์ฃผ๊ธฐ ์ •์ฑ… ํ™œ์šฉ ๊ฐ€๋Šฅ

์–ธ์ œ โ€” Lambda ๋ฐฐํฌ, ๋Œ€์šฉ๋Ÿ‰ ์„ธ์…˜, ์žฅ๊ธฐ ๋ณด๊ด€ ํ•„์š”

AgentCore Memory

  • AgentCore Memory ๊ธฐ๋ฐ˜ ์„ธ์…˜ ์ €์žฅ
  • TTL ์ž๋™ ๋งŒ๋ฃŒ, ์ €์ง€์—ฐ ์กฐํšŒ
  • ์žฅ๊ธฐ ๊ธฐ์–ต(LTM)๊ณผ ๋‹จ๊ธฐ ๊ธฐ์–ต(STM) ํ†ตํ•ฉ

์–ธ์ œ โ€” ํ”„๋กœ๋•์…˜, ๊ณ ๊ฐ€์šฉ์„ฑ, ์žฅ๊ธฐ ๊ธฐ์–ต ํ†ตํ•ฉ, ์ž๋™ ๋งŒ๋ฃŒ

takeaway

๊ฐœ๋ฐœ์€ File, ์„œ๋ฒ„๋ฆฌ์Šค๋Š” S3, ํ”„๋กœ๋•์…˜ ํ†ตํ•ฉ์€ AgentCore Memory โ€” ์–ด๋А ์ชฝ์ด๋“  ์ฝ”๋“œ๋Š” ํ•œ ์ค„๋งŒ ๋ฐ”๋€๋‹ˆ๋‹ค.

PART 3 ยท SessionManager

์„ธ์…˜ ์ €์žฅ๊ณผ ๋ณต์›

session_id ํ•˜๋‚˜๋กœ ์ „์ฒด ๋Œ€ํ™” ์ƒํƒœ๋ฅผ ์˜์†ํ™”ยท๋ณต์›

ํ•ต์‹ฌ ํฌ์ธํŠธ

session_manager=
์žฅ์ฐฉ ํ•œ ์ค„๋กœ ์ €์žฅยท๋ณต์› ์ž๋™ โ€” save()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ
session_id
๋ณต์› ํ‚ค โ€” ๊ฐ™์€ ID๋กœ Agent๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ฉด ์ด์ „ ๋Œ€ํ™”๊ฐ€ ๊ทธ๋Œ€๋กœ
์ €์žฅ ์‹œ์ 
๋งค ํ„ด ์ž๋™ โ€” messages[]์™€ agent.state๊ฐ€ ํ•จ๊ป˜ ์˜์†ํ™”
S3 ๋ฐฑ์—”๋“œ
ํŒŒ์ผ์‹œ์Šคํ…œ ์—†๋Š” LambdaยทFargate์—์„œ๋„ ์„ธ์…˜ ์œ ์ง€

์ฝ”๋“œ

python
from strands import Agent
from strands.session import S3SessionManager

# ์„ธ์…˜ ๋งค๋‹ˆ์ € โ€” session_id + S3 ๋ฒ„ํ‚ท์œผ๋กœ ์ €์žฅ ์œ„์น˜ ์ง€์ •
session_mgr = S3SessionManager(
    session_id="user-123-chat-1",
    bucket="agent-sessions-bucket",
)
agent = Agent(session_manager=session_mgr)
agent("๋‚ด AWS ๋น„์šฉ์„ ๋ถ„์„ํ•ด์ค˜")

# ๋‚˜์ค‘์— โ€” ๊ฐ™์€ session_id๋กœ ์žฌ์ƒ์„ฑํ•˜๋ฉด ์ด์ „ ๋Œ€ํ™” ์ž๋™ ๋กœ๋“œ
agent2 = Agent(session_manager=S3SessionManager(
    session_id="user-123-chat-1",
    bucket="agent-sessions-bucket",
))
agent2("์•„๊นŒ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ์—์„œ ๊ฐ€์žฅ ๋น„์‹ผ ์„œ๋น„์Šค๋Š”?")
PART 3 ยท SessionManager

messages[] ๋ฐ–์˜ ์ƒํƒœ โ€” agent.state

๋ชจ๋ธ์—๊ฒŒ๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ, ์„ธ์…˜๊ณผ ํ•จ๊ป˜ ์ €์žฅ๋˜๋Š” key-value ์ƒํƒœ

ํ•ต์‹ฌ ํฌ์ธํŠธ

agent.state
๋Œ€ํ™” ๋ฐ– key-value ์ €์žฅ์†Œ โ€” ๋ชจ๋ธ ์ปจํ…์ŠคํŠธ์— ์ „์†ก๋˜์ง€ ์•Š์Œ
set / get
์นด์šดํ„ฐยทํ”Œ๋ž˜๊ทธยท์‚ฌ์šฉ์ž ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ฝ๊ณ  ์”€
์˜์†ํ™”
SessionManager๊ฐ€ messages[]์™€ ํ•จ๊ป˜ ์ €์žฅยท๋ณต์›
์šฉ๋„
์š”๊ธˆ์ œยทํ˜ธ์ถœ ํšŸ์ˆ˜ยท์ค‘๊ฐ„ ๊ฒฐ๊ณผ์ฒ˜๋Ÿผ ๋ชจ๋ธ์ด ๋ชฐ๋ผ๋„ ๋˜๋Š” ๊ฐ’

์ฝ”๋“œ

python
from strands import Agent
from strands.session import FileSessionManager

agent = Agent(
    session_manager=FileSessionManager(session_id="user-123"),
)

# ๋ชจ๋ธ ์ปจํ…์ŠคํŠธ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” key-value ์ƒํƒœ
agent.state.set("user_tier", "premium")
agent.state.set("api_calls", 3)
print(agent.state.get("user_tier"))  # "premium"

# ์„ธ์…˜ ์ €์žฅ์†Œ์— messages[]์™€ ํ•จ๊ป˜ ์˜์†ํ™” โ€” ์žฌ์ƒ์„ฑํ•ด๋„ ์œ ์ง€
agent2 = Agent(
    session_manager=FileSessionManager(session_id="user-123"),
)
print(agent2.state.get("api_calls"))  # 3
PART 3 ยท SessionManager

์„ธ์…˜ ๊ฒฉ๋ฆฌ์™€ ๋ณด์•ˆ

๋ฉ€ํ‹ฐํ…Œ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ ์„ธ์…˜ ๊ฐ„ ๋ฐ์ดํ„ฐ ์œ ์ถœ ๋ฐฉ์ง€

session_id ๋„ค์ด๋ฐ

user-{userId}-{chatId} ํŒจํ„ด์œผ๋กœ ์‚ฌ์šฉ์ž๋ณ„ ๊ฒฉ๋ฆฌ

TTL ์ž๋™ ๋งŒ๋ฃŒ

์Šคํ† ๋ฆฌ์ง€ ์ˆ˜๋ช…์ฃผ๊ธฐ ์ •์ฑ…์œผ๋กœ ๋น„ํ™œ์„ฑ ์„ธ์…˜ ์ž๋™ ์‚ญ์ œ โ€” ๋ฐ์ดํ„ฐ ๋ณด์กด ์ •์ฑ… ์ค€์ˆ˜

์•”ํ˜ธํ™”

SSE-KMS๋กœ ์ €์žฅ ์‹œ ์•”ํ˜ธํ™”, TLS๋กœ ์ „์†ก ์‹œ ์•”ํ˜ธํ™”

takeaway

์„ธ์…˜์—๋Š” ์‚ฌ์šฉ์ž์˜ ๋Œ€ํ™”๊ฐ€ ํ†ต์งธ๋กœ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค โ€” ์ €์žฅ์†Œ ๋ณด์•ˆ์ด ๊ณง ๋Œ€ํ™” ๋ณด์•ˆ์ž…๋‹ˆ๋‹ค.

ConversationManager

SlidingWindow ยท Summarizing ยท NullConversationManager

PART 4 ยท ConversationManager

ConversationManager

๋Œ€ํ™” ๊ธธ์ด ๊ด€๋ฆฌ ๊ณ„์ธต โ€” ๋ชจ๋ธ์— ๋ณด๋‚ผ messages[] ๋ถ„๋Ÿ‰์„ ์ •์ฑ…์œผ๋กœ ๊ฒฐ์ •

ConversationManager

ํ„ด์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ๋Œ€ํ™” ์ด๋ ฅ์— ์ •๋ฆฌ ์ •์ฑ…์„ ์ž๋™ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค

  • SlidingWindow โ€” ์ตœ๊ทผ N๊ฐœ ๋ฉ”์‹œ์ง€ (๊ธฐ๋ณธ๊ฐ’)
  • Summarizing โ€” ์˜ค๋ž˜๋œ ๊ตฌ๊ฐ„์„ ์š”์•ฝ์œผ๋กœ ์••์ถ•
  • Null โ€” ์ด๋ ฅ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ
  • ์ ์šฉ ์‹œ์ : ๋งค ์‚ฌ์ดํด ์ž๋™
takeaway

์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ์ด๋ฏธ ๋™์ž‘ ์ค‘์ž…๋‹ˆ๋‹ค โ€” ๊ธฐ๋ณธ๊ฐ’ SlidingWindow(window_size=40)

PART 4 ยท ConversationManager

SlidingWindow vs Summarizing

๋Œ€ํ™” ์ด๋ ฅ์„ ์–ผ๋งˆ๋‚˜, ์–ด๋–ป๊ฒŒ ๋ณด์กดํ• ์ง€ โ€” ์†์„ฑ ๋Œ€๋น„์™€ ์„ค์ • ์ฝ”๋“œ



SlidingWindow

์ตœ๊ทผ N๊ฐœ ๋ฉ”์‹œ์ง€๋งŒ ์œ ์ง€ โ€” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ด๋ฏธ ๋™์ž‘


์œ ์ง€ ๋ฐฉ์‹์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ทธ๋ƒฅ ์‚ญ์ œ

ํ† ํฐยท๋น„์šฉ๊ณ ์ • ์ƒํ•œ โ€” ์˜ˆ์ธก ๊ฐ€๋Šฅ

๋งฅ๋ฝ์ตœ๊ทผ๋งŒ ๋‚จ์Œ ยท ์ดˆ๊ธฐ ๋งฅ๋ฝ ์œ ์‹ค

์ ํ•ฉ์ฑ—๋ด‡, FAQ, ๋‹จ์ˆœ ์ž‘์—…


SlidingWindowConversationManager(
  window_size=20  # ๊ธฐ๋ณธ๊ฐ’ 40
)



VS



Summarizing

์˜ค๋ž˜๋œ ๋Œ€ํ™”๋ฅผ ์š”์•ฝ์œผ๋กœ ์••์ถ• โ€” ์žฅ๊ธฐ ๋งฅ๋ฝ ๋ณด์กด


์œ ์ง€ ๋ฐฉ์‹์˜ค๋ž˜๋œ ๊ตฌ๊ฐ„์„ LLM์ด ์š”์•ฝ์œผ๋กœ ์••์ถ•

ํ† ํฐยท๋น„์šฉ์ ˆ์•ฝ๋˜์ง€๋งŒ ์š”์•ฝ ์ƒ์„ฑ ํ˜ธ์ถœ์ด ์ถ”๊ฐ€

๋งฅ๋ฝ์žฅ๊ธฐ ๋ณด์กด ยท ์š”์•ฝ ํ’ˆ์งˆ์— ์˜์กด

์ ํ•ฉ๊ฐœ์ธ ๋น„์„œ, ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ, ์žฅ๊ธฐ ๋ถ„์„


SummarizingConversationManager(
  summary_ratio=0.3,
  preserve_recent_messages=10
)



์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด SlidingWindow(window_size=40)๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋™์ž‘ โ€” ๊ต์ฒด๋Š” conversation_manager= ํ•œ ์ค„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. Null ์ „๋žต์€ ๋‹ค์Œ ํ‘œ์—์„œ.
PART 4 ยท ConversationManager

์„ธ ์ „๋žต์˜ ์„ ํƒ ๊ธฐ์ค€

Null๊นŒ์ง€ ํฌํ•จํ•œ ์„ธ ์ „๋žต โ€” ์›Œํฌ๋กœ๋“œ ํŠน์„ฑ์ด ๊ฐ€๋ฅด๋Š” ๊ฐˆ๋ฆผ๊ธธ

์ „๋žตํ† ํฐ ์‚ฌ์šฉ๋งฅ๋ฝ ๋ณด์กด๋น„์šฉ์ ํ•ฉ ์‹œ๋‚˜๋ฆฌ์˜ค
SlidingWindow๊ณ ์ • (N๊ฐœ ๋ฉ”์‹œ์ง€)์ตœ๊ทผ๋งŒ์˜ˆ์ธก ๊ฐ€๋Šฅ์ฑ—๋ด‡, FAQ, ๋‹จ์ˆœ ์ž‘์—…
Summarizing๊ฐ์†Œ (์š”์•ฝ)์žฅ๊ธฐ ๋ณด์กด์š”์•ฝ ํ˜ธ์ถœ ์ถ”๊ฐ€๊ฐœ์ธ ๋น„์„œ, ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ
NullConversationManager๊ด€๋ฆฌ ์•ˆ ํ•จ (๊ณ„์† ๋ˆ„์ )์ „์ฒด ์œ ์ง€์ถ”๊ฐ€ ํ˜ธ์ถœ ์—†์Œstateful ๋ชจ๋ธ, ์ˆ˜๋™ ๊ด€๋ฆฌ
takeaway

๋ง์„ค์—ฌ์ง€๋ฉด ๊ธฐ๋ณธ๊ฐ’ ๊ทธ๋Œ€๋กœ โ€” SlidingWindow๋กœ ์‹œ์ž‘ํ•˜๊ณ , ์ดˆ๊ธฐ ๋งฅ๋ฝ ์œ ์‹ค์ด ๋ณด์ด๋ฉด Summarizing์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

Memory

MemoryManager ยท Recall ยท Injection ยท Extraction

PART 5 ยท Memory

MemoryManager

์žฅ๊ธฐ ๊ธฐ์–ต ๊ณ„์ธต โ€” ์„ธ์…˜์ด ๋๋‚˜๋„ ๋‚จ๋Š” ์‚ฌ์‹ค๊ณผ ์„ ํ˜ธ๋ฅผ ์ถ•์ 

MemoryManager

๋Œ€ํ™”์—์„œ ๊ธฐ์–ตํ•  ์‚ฌ์‹ค์„ ์ถ”์ถœํ•ด ์ €์žฅํ•˜๊ณ , ๊ด€๋ จ ๊ธฐ์–ต์„ ์ฐพ์•„ ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค

  • Extraction โ€” ๋Œ€ํ™”์—์„œ ์‚ฌ์‹ค ์ถ”์ถœ
  • Storage โ€” ์Šคํ† ์–ด์— ์ €์žฅ
  • Recall โ€” ๊ด€๋ จ ๊ธฐ์–ต ๊ฒ€์ƒ‰
  • Injection โ€” ์ปจํ…์ŠคํŠธ ์ฃผ์ž…
takeaway

Session์ด ์ด ๋Œ€ํ™”๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด, Memory๋Š” ์ด ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

PART 5 ยท Memory

MemoryManager ๊ธฐ์–ต ์‚ฌ์ดํด

์ถ”์ถœยท์ €์žฅ์€ ์“ฐ๊ธฐ, ๊ฒ€์ƒ‰ยท์ฃผ์ž…์€ ์ฝ๊ธฐ โ€” ๋„ค ๋‹จ๊ณ„ ๋ชจ๋‘ ์ž๋™, ๊ฐœ๋ฐœ์ž๋Š” ์Šคํ† ์–ด๋งŒ ์—ฐ๊ฒฐ

PART 5 ยท Memory

Memory ๊ตฌํ˜„

MemoryManager ์„ค์ •์œผ๋กœ ์žฅ๊ธฐ ๊ธฐ์–ต ํ™œ์„ฑํ™”

ํ•ต์‹ฌ ํฌ์ธํŠธ

BedrockKnowledgeBaseStore
์žฅ๊ธฐ ๊ธฐ์–ต ์ €์žฅ์†Œ โ€” knowledge_base_id๋กœ ์—ฐ๊ฒฐ
MemoryManager(stores=)
์Šคํ† ์–ด ๋ฆฌ์ŠคํŠธ ์žฅ์ฐฉ โ€” ๊ฒ€์ƒ‰ยท์ถ”์ถœยท์ฃผ์ž…์ด ์ž๋™
์“ฐ๊ธฐ
๋Œ€ํ™”์—์„œ ๊ธฐ์–ตํ•  ์‚ฌ์‹ค์„ ์ถ”์ถœํ•ด ์Šคํ† ์–ด์— ๊ธฐ๋ก
์ฝ๊ธฐ
์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ์–ต๋งŒ recallํ•ด ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…

์ฝ”๋“œ

python
from strands import Agent
from strands.memory import MemoryManager
from strands.vended_memory_stores import BedrockKnowledgeBaseStore

# ์Šคํ† ์–ด โ€” Bedrock Knowledge Base๋ฅผ ์žฅ๊ธฐ ๊ธฐ์–ต ์ €์žฅ์†Œ๋กœ
store = BedrockKnowledgeBaseStore(
    config={"knowledge_base_id": "KB12345678"},
    name="user-memory",
)

# ๋งค๋‹ˆ์ € ์žฅ์ฐฉ โ€” ๊ฒ€์ƒ‰ยท์ถ”์ถœยท์ฃผ์ž… ์ž๋™
agent = Agent(memory_manager=MemoryManager(stores=[store]))

# ์ฒซ ๋Œ€ํ™” โ€” ๊ธฐ์–ต ์ถ”์ถœ + ์ €์žฅ
agent("๋‚˜๋Š” Python๊ณผ us-east-1 ๋ฆฌ์ „์„ ์„ ํ˜ธํ•ด")

# ๋‚˜์ค‘ ๋Œ€ํ™” โ€” ์ž๋™ recall + injection
agent("์ƒˆ Lambda ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜")  # Python + us-east-1 ์ž๋™ ์ ์šฉ
PART 5 ยท Memory

Memory ํ™œ์šฉ ํŒจํ„ด

์žฅ๊ธฐ ๊ธฐ์–ต์œผ๋กœ ์—์ด์ „ํŠธ์˜ ๊ฐœ์ธํ™” ์ˆ˜์ค€์„ ๋†’์ด๋Š” 3๊ฐ€์ง€ ํŒจํ„ด

์‚ฌ์šฉ์ž ์„ ํ˜ธ๋„

์–ธ์–ด, ๋ฆฌ์ „, ์ฝ”๋”ฉ ์Šคํƒ€์ผ, ์ถœ๋ ฅ ํ˜•์‹ ๋“ฑ ๋ฐ˜๋ณต๋˜๋Š” ์„ ํ˜ธ ์ถ•์ 

๊ณผ๊ฑฐ ๊ฒฐ์ • ์ด๋ ฅ

์ด์ „ ์ž‘์—…์˜ ๊ฒฐ๊ณผ์™€ ๊ฒฐ์ •์„ ๊ธฐ์–ตํ•˜์—ฌ ์ผ๊ด€์„ฑ ์œ ์ง€

๋„๋ฉ”์ธ ์ง€์‹

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ํŒ€ ์ปจ๋ฒค์…˜, ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ถ•์ 

takeaway

์„ธ ํŒจํ„ด์˜ ๊ณตํ†ต์  โ€” ๋งํ•˜์ง€ ์•Š์•„๋„ ์•„๋Š” ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์žฌ๋ฃŒ์ž…๋‹ˆ๋‹ค.

Context Management

์ง€ํ‚ค๊ธฐ โ€” ์••์ถ•ยท์˜คํ”„๋กœ๋“œ ยท ๋ฉˆ์ถ”๊ธฐ โ€” CheckpointยทHITL

PART 6 ยท Context Management

Context Management

๋งค ํ˜ธ์ถœ์˜ ๋ชจ๋ธ ์ž…๋ ฅ์„ ํ•œ๋„ ์•ˆ์— ์ง€ํ‚ค๋Š” ์ž๋™ ๋ฐฉ์–ด, ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰์„ ๋ฉˆ์ท„๋‹ค ์ด์–ด๊ฐ€๋Š” ์ œ์–ด

Context Management

์ปจํ…์ŠคํŠธ ํ•œ๋„ ๋ฐฉ์–ด 2๊ฐ€์ง€ ยท ์‹คํ–‰ ์ •์ง€ยท์žฌ๊ฐœ ์ œ์–ด 2๊ฐ€์ง€

  • context_manager
  • ContextOffloader
  • Checkpoint
  • Interrupts
takeaway

์ง€ํ‚ค๊ธฐ(๋ฐฉ์–ด โ†’ ์˜คํ”„๋กœ๋“œ), ๊ทธ๋‹ค์Œ ๋ฉˆ์ถ”๊ธฐ(์ฒดํฌํฌ์ธํŠธ โ†’ ์Šน์ธ) ์ˆœ์„œ๋กœ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

PART 6 ยท Context Management

์ง€ํ‚ค๊ธฐ vs ๋ฉˆ์ถ”๊ธฐ

์ง€ํ‚ค๊ธฐ = ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•œ๋„๋ฅผ ๋„˜์ง€ ์•Š๊ฒŒ ์œ ์ง€ ยท ๋ฉˆ์ถ”๊ธฐ = ์‹คํ–‰์„ ๋ฉˆ์ท„๋‹ค ๋‹ค์‹œ ์ž‡๋Š” ์žฌ๊ฐœ

์ง€ํ‚ค๊ธฐ

ํ•œ๋„ ์•ˆ์—์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณดํ˜ธ

  • context_manager โ€” ์ž„๊ณ„์น˜ ๊ฐ์ง€ ํ›„ ์„ ์ œ ์š”์•ฝ (์ดˆ๊ณผ ์ง€์† ์‹œ ์žฌ์š”์•ฝ)
  • ContextOffloader โ€” ํฐ ๋„๊ตฌ ๊ฒฐ๊ณผ๋Š” ์ €์žฅ์†Œ๋กœ
  • ๋‹ค๋ฃจ๋Š” ๊ฒƒ: ๋งค ํ˜ธ์ถœ์˜ ๋ชจ๋ธ ์ž…๋ ฅ (ํ† ํฐ)
  • ์–ป๋Š” ๊ฒƒ: ๋น„์šฉ ์ ˆ๊ฐ ยท ์œˆ๋„์šฐ ์ดˆ๊ณผ ๋ฐฉ์ง€

๋Œ€ํ™”๊ฐ€ ์•„๋ฌด๋ฆฌ ๊ธธ์–ด์ ธ๋„ ํ˜ธ์ถœ์ด ์‹คํŒจํ•˜์ง€ ์•Š๊ฒŒ โ€” ์„ค์ •๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ฉˆ์ถ”๊ธฐ

์‹คํ–‰์„ ์ •์ง€ํ–ˆ๋‹ค๊ฐ€ ์ด์–ด๊ฐ€๊ธฐ

  • Checkpoint โ€” ์‹œ์Šคํ…œ์ด ๊ณ„ํš์ ์œผ๋กœ ์ •์ง€
  • Interrupts โ€” ์‚ฌ๋žŒ์˜ ์Šน์ธ ๋•Œ๋ฌธ์— ์ •์ง€
  • ๋‹ค๋ฃจ๋Š” ๊ฒƒ: ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ํ๋ฆ„
  • ์–ป๋Š” ๊ฒƒ: ์žฅ๊ธฐ ์ž‘์—… ๋ถ„ํ•  ยท HITL ์•ˆ์ „์žฅ์น˜

๋ฉˆ์ท„๋‹ค๊ฐ€ ์ด์–ด์„œ ์žฌ๊ฐœ โ€” ๋‘˜์˜ ์ฐจ์ด๋Š” ๋’ค์—์„œ ์ž์„ธํžˆ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

takeaway

์ง€ํ‚ค๊ธฐ๋Š” ์„ค์ •๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฐœ์ž…, ๋ฉˆ์ถ”๊ธฐ๋Š” ๋ฉˆ์ถ˜ ์ง€์ ์„ ์ฝ”๋“œ๋กœ ์žฌ๊ฐœ โ€” ์„ฑ๊ฒฉ์ด ๋‹ฌ๋ผ ๋„ท์„ ํ•จ๊ป˜ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PART 6 ยท Context Management

context_manager ์ž๋™ ๋ฐฉ์–ด

์ง€ํ‚ค๊ธฐ โ‘  โ€” ํ•œ๋„ ์ ‘๊ทผ ๊ฐ์ง€ ์‹œ ์„ ์ œ ์š”์•ฝ + ๋Œ€์šฉ๋Ÿ‰ ๋„๊ตฌ ๊ฒฐ๊ณผ ์˜คํ”„๋กœ๋”ฉ ๊ฐœ์ž…

  1. 1
    ์ž„๊ณ„์น˜ ๊ฐ์ง€

    ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ํ† ํฐ ์ˆ˜๊ฐ€ ๋ชจ๋ธ ํ•œ๋„์˜ 85%๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ž๋™ ํŠธ๋ฆฌ๊ฑฐ.

  2. 2
    ์„ ์ œ ์š”์•ฝ

    ์˜ค๋ž˜๋œ ๋Œ€ํ™”๋ฅผ LLM์ด ์š”์•ฝ์œผ๋กœ ์••์ถ•. ํ•ต์‹ฌ ์ •๋ณด(๊ฒฐ์ •, ์‚ฌ์‹ค, ์ž‘์—… ์ƒํƒœ)๋ฅผ ๋ณด์กด.

  3. 3
    ์˜คํ”„๋กœ๋”ฉยท์žฌ์š”์•ฝ

    ๋Œ€์šฉ๋Ÿ‰ ๋„๊ตฌ ๊ฒฐ๊ณผ๋Š” ContextOffloader๊ฐ€ ์Šคํ† ๋ฆฌ์ง€๋กœ ์˜คํ”„๋กœ๋“œ. ์š”์•ฝ ํ›„์—๋„ ์ดˆ๊ณผ๊ฐ€ ์ง€์†๋˜๋ฉด ๋ฐ˜์‘์ ์œผ๋กœ ์žฌ์š”์•ฝ.

  4. 4
    ๋ชจ๋ธ ํ˜ธ์ถœ

    ์••์ถ•๋œ ์ปจํ…์ŠคํŠธ๋กœ ์ •์ƒ ์ถ”๋ก  ์ง„ํ–‰. ์‚ฌ์šฉ์ž์—๊ฒŒ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋™์ž‘.

None
๊ธฐ๋ณธ๊ฐ’ โ€” ์ž๋™ ๊ฐœ์ž… ์—†์Œ, ConversationManager ์ •์ฑ…๋งŒ ๋™์ž‘
'auto'
์š”์•ฝ + ์˜คํ”„๋กœ๋”ฉ์„ ์ž๋™ ์ ์šฉ โ€” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๋•์…˜ ๊ถŒ์žฅ
'agentic'
๋ชจ๋ธ์ด ์Šค์Šค๋กœ ์••์ถ•ยท์˜คํ”„๋กœ๋”ฉ ์‹œ์ ์„ ํŒ๋‹จ (ํ† ํฐโ†”์ •ํ™•๋„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„)
takeaway

๊ฐ์ง€ยท์š”์•ฝยท์˜คํ”„๋กœ๋”ฉ ์ „๋ถ€ ์ž๋™ โ€” ๊ฐœ๋ฐœ์ž ์ฝ”๋“œ๋Š” context_manager='auto' ํ•œ ์ค„์ž…๋‹ˆ๋‹ค.

PART 6 ยท Context Management

ํฐ ๋„๊ตฌ ๊ฒฐ๊ณผ๋Š” ๋ฐ–์œผ๋กœ โ€” ContextOffloader

์ง€ํ‚ค๊ธฐ โ‘ก โ€” "ํฐ ๋„๊ตฌ ๊ฒฐ๊ณผ๋„ ๋งค๋ฒˆ ๋‹ค์‹œ ์ „์†ก"๋˜๋Š” ๋น„์šฉ์„ ์˜คํ”„๋กœ๋”ฉ์œผ๋กœ ์ฐจ๋‹จ

ํ•ต์‹ฌ ํฌ์ธํŠธ

max_result_tokens
์ด ํฌ๊ธฐ๋ฅผ ๋„˜๋Š” ๋„๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋กœ ์ด๋™ (๊ธฐ๋ณธ 2500)
preview_tokens
์ปจํ…์ŠคํŠธ์—๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋งŒ ๋‚จ๊น€ (๊ธฐ๋ณธ 1000)
storage
InMemory ยท File ยท S3 ์ €์žฅ์†Œ ์„ ํƒ
Unified Storage
์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค โ€” ์˜คํ”„๋กœ๋” ์ €์žฅ์†Œ์— ์ž๋™ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(auto-namespace) ์ ์šฉ
retrieve_offloaded_content
์›๋ณธ์ด ํ•„์š”ํ•˜๋ฉด ์ž๋™ ๋“ฑ๋ก๋œ ๋„๊ตฌ๋กœ ์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ์กฐํšŒ

์ฝ”๋“œ

python
from strands import Agent
from strands.vended_plugins.context_offloader.plugin import ContextOffloader
from strands.vended_plugins.context_offloader.storage import S3Storage

# 2500ํ† ํฐ ์ดˆ๊ณผ ๋„๊ตฌ ๊ฒฐ๊ณผ๋ฅผ S3๋กœ โ€” ์ปจํ…์ŠคํŠธ์—๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋งŒ
agent = Agent(
    model="us.anthropic.claude-sonnet-4-6",
    plugins=[ContextOffloader(
        max_result_tokens=2500,
        preview_tokens=1000,
        storage=S3Storage(bucket="ctx-offload"),
    )],
)

# ์›๋ณธ์ด ํ•„์š”ํ•˜๋ฉด retrieve_offloaded_content ๋„๊ตฌ๋กœ ์ž๋™ ์กฐํšŒ
PART 6 ยท Context Management

์ง€ํ‚ค๊ธฐ ๋‘ ๋„๊ตฌ์˜ ๋ถ„๋‹ด โ€” context_manager + ContextOffloader

๊ณ ๋ฅด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•จ๊ป˜ ์ผœ๋Š” ์กฐํ•ฉ โ€” ์ง€ํ‚ค๋Š” ๋Œ€์ƒ์ด ๋‹ค๋ฆ„

context_manager

์Œ“์—ฌ๊ฐ€๋Š” ๋Œ€ํ™” ์ด๋ ฅ์„ ์ง€ํ‚จ๋‹ค

  • ๋Œ€์ƒ: ๋Œ€ํ™” ์ด๋ ฅ ์ „์ฒด (ํ† ํฐ ํ•ฉ๊ณ„)
  • ๋ฐฉ์‹: ์ž„๊ณ„์น˜ ๊ฐ์ง€ โ†’ ์„ ์ œ ์š”์•ฝ (์ดˆ๊ณผ ์‹œ ์žฌ์š”์•ฝ)
  • ์‹œ์ : ํ•œ๋„์— ์ ‘๊ทผํ•  ๋•Œ๋งŒ ๊ฐœ์ž…
  • ๊ฒฐ๊ณผ: ์ด๋ ฅ์ด ์••์ถ•๋˜์–ด ํ•œ๋„ ์•ˆ์œผ๋กœ

์„ค์ •์€ context_manager='auto' ํ•œ ์ค„ โ€” ํ‰์†Œ์—๋Š” ๊ฐœ์ž…ํ•˜์ง€ ์•Š๋‹ค๊ฐ€ ํ•œ๋„ ์ ‘๊ทผ ์‹œ์—๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ContextOffloader

ํฐ ๋„๊ตฌ ๊ฒฐ๊ณผ ํ•˜๋‚˜๋ฅผ ๊ฒฉ๋ฆฌํ•œ๋‹ค

  • ๋Œ€์ƒ: ์ž„๊ณ„์น˜๋ฅผ ๋„˜๋Š” ๊ฐœ๋ณ„ ๋„๊ตฌ ๊ฒฐ๊ณผ
  • ๋ฐฉ์‹: ์ €์žฅ์†Œ๋กœ ์˜คํ”„๋กœ๋“œ + ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋งŒ ์œ ์ง€
  • ์‹œ์ : ํฐ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ๊ธฐ๋Š” ์ฆ‰์‹œ
  • ๊ฒฐ๊ณผ: ์›๋ณธ์€ ๋ฐ–์—, ํ•„์š”ํ•˜๋ฉด ๋„๊ตฌ๋กœ ์กฐํšŒ

ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์žฅ์ฐฉ โ€” ๋Œ€ํ™”๊ฐ€ ์งง์•„๋„ ๋„๊ตฌ ๊ฒฐ๊ณผ ํ•˜๋‚˜๊ฐ€ ํฌ๋ฉด ์ด์ชฝ์ด ๋ง‰์Šต๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

๋‘ ๋„๊ตฌ๋Š” ๊ฒฝ์Ÿ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ถ„๋‹ด ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. context_manager๋Š” ๋Œ€ํ™”๊ฐ€ ๊ธธ์–ด์ ธ์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ, ContextOffloader๋Š” ๋„๊ตฌ ๊ฒฐ๊ณผ ํ•˜๋‚˜๊ฐ€ ์ปค์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ๊ฐ ๋ง‰์•„์š”. ๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ๋Š” ๋ณดํ†ต ๋‘˜ ๋‹ค ์ผญ๋‹ˆ๋‹ค. ๊ฐ€์šด๋ฐ๊ฐ€ VS๊ฐ€ ์•„๋‹ˆ๋ผ ํ”Œ๋Ÿฌ์Šค์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค.

PART 6 ยท Context Management

๋ฉˆ์ถ”๊ธฐ ๋‘ ๋ฐฉ์‹ โ€” Checkpoint vs Interrupts

๋‘˜ ๋‹ค "๋ฉˆ์ท„๋‹ค ์ด์–ด๊ฐ€๊ธฐ" โ€” ์ฐจ์ด๋Š” ๋ฉˆ์ถ”๋Š” ์ฃผ์ฒด์™€ ์ด์œ 

Checkpoint

์‹œ์Šคํ…œ์ด ๋ฉˆ์ถ˜๋‹ค

  • ๋„๊ตฌ ์‚ฌ์ดํด ๊ฒฝ๊ณ„์—์„œ ๊ณ„ํš์  ์ผ์‹œ ์ •์ง€
  • ์žฅ๊ธฐ ์ž‘์—… ๋ถ„ํ• , ์žฌ๋ฐฐํฌยท์ค‘๋‹จ ๋Œ€๋น„
  • stop_reason="checkpoint"๋กœ ๋ฐ˜ํ™˜
  • ์žฌ๊ฐœ: checkpointResume๋ฅผ ๋‹ด์•„ ์žฌํ˜ธ์ถœ

์‹คํ–‰์„ ์ชผ๊ฐœ ๋‘์—ˆ๋‹ค๊ฐ€ ์ด์–ด ๋ถ™์ด๋Š” ์šฉ๋„ โ€” ์‚ฌ๋žŒ์˜ ๊ฐœ์ž… ์—†์ด๋„ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

Interrupts

์‚ฌ๋žŒ ๋•Œ๋ฌธ์— ๋ฉˆ์ถ˜๋‹ค

  • ๊ณ ์œ„ํ—˜ ๋„๊ตฌ ์ง์ „ ์Šน์ธ ๋Œ€๊ธฐ (HITL)
  • BeforeToolCallEvent์—์„œ event.interrupt()
  • stop_reason="interrupt"๋กœ ๋ฐ˜ํ™˜
  • ์žฌ๊ฐœ: interruptResponse๋ฅผ ๋‹ด์•„ ์žฌํ˜ธ์ถœ

์‚ฌ๋žŒ์˜ ์Šน์ธ/๊ฑฐ๋ถ€๊ฐ€ ๊ณง ์žฌ๊ฐœ ์กฐ๊ฑด โ€” ํ”„๋กœ๋•์…˜ ์•ˆ์ „๋ฒจํŠธ์ž…๋‹ˆ๋‹ค.

PART 6 ยท Context Management

Checkpoint โ€” ์ผ์‹œ ์ •์ง€์™€ ์žฌ๊ฐœ

๋ฉˆ์ถ”๊ธฐ โ‘  โ€” ๋„๊ตฌ ์‚ฌ์ดํด ๊ฒฝ๊ณ„์—์„œ ๋ฉˆ์ท„๋‹ค๊ฐ€ ์ด์–ด์„œ ์žฌ๊ฐœ (experimental, ์ƒํƒœ ์บก์ฒ˜๋Š” take_snapshot()์ด ๋ณ„๋„)

ํ•ต์‹ฌ ํฌ์ธํŠธ

checkpointing=True
์ฒดํฌํฌ์ธํŠธ ํ™œ์„ฑํ™” โ€” experimental ๊ธฐ๋Šฅ
stop_reason="checkpoint"
๋„๊ตฌ ์‚ฌ์ดํด ๊ฒฝ๊ณ„์—์„œ ์ผ์‹œ ์ •์ง€ํ•˜๋ฉฐ ๋ฐ˜ํ™˜
to_dict / from_dict
์ง๋ ฌํ™”ํ•ด ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ๋ณด๊ด€, checkpointResume๋กœ ์žฌ๊ฐœ
์ฃผ์˜
๋Œ€ํ™” ์ด๋ ฅ์€ ์บก์ฒ˜ํ•˜์ง€ ์•Š์Œ โ€” ์˜์†ํ™”๋Š” SessionManager ๋ณ‘ํ–‰

์ฝ”๋“œ

python
from strands import Agent

# ์ฒดํฌํฌ์ธํŠธ ํ™œ์„ฑํ™” โ€” tool_use ์‚ฌ์ดํด ๊ฒฝ๊ณ„์—์„œ ์ผ์‹œ ์ •์ง€ (experimental)
agent = Agent(model="us.anthropic.claude-sonnet-4-6", checkpointing=True)

# ์‹คํ–‰ โ€” ์‚ฌ์ดํด ๊ฒฝ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด stop_reason="checkpoint"๋กœ ๋ฐ˜ํ™˜
result = agent("ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•ด์ค˜")

# ์ง๋ ฌํ™” โ€” ์ฒดํฌํฌ์ธํŠธ๋ฅผ dict๋กœ ๋ณ€ํ™˜ํ•ด ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ๋ณด๊ด€
saved = result.checkpoint.to_dict()

# ์žฌ๊ฐœ โ€” ์ €์žฅํ•œ dict๋ฅผ checkpointResume๋กœ ๊ทธ๋Œ€๋กœ ๋˜๋Œ๋ ค ์ „๋‹ฌ
agent({"checkpointResume": {"checkpoint": saved}})
PART 6 ยท Context Management

Interrupts โ€” ๋ฉˆ์ถ”๊ณ , ๋ฌป๊ณ , ์žฌ๊ฐœํ•˜๋Š” ์ ˆ์ฐจ

๋ฉˆ์ถ”๊ธฐ โ‘ก โ€” ๊ณ ์œ„ํ—˜ ๋™์ž‘ ์•ž์—์„œ ์‚ฌ๋žŒ์˜ ์Šน์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” HITL 4๋‹จ๊ณ„

  1. 1
    ํŠธ๋ฆฌ๊ฑฐ

    BeforeToolCallEvent์—์„œ event.interrupt(name, reason) ํ˜ธ์ถœ โ€” ๊ณ ์œ„ํ—˜ ๋™์ž‘(ํŒŒ์ผ ์‚ญ์ œ, ๊ฒฐ์ œ) ์ „์— ๋ฐœ๋™.

  2. 2
    ์ผ์‹œ ์ •์ง€

    stop_reason="interrupt"๋กœ ๋ฐ˜ํ™˜ โ€” ์žฌ๊ฐœ์— ํ•„์š”ํ•œ ์ •๋ณด๋Š” result.interrupts์— ๋‹ด๊น€.

  3. 3
    ์‚ฌ์šฉ์ž ํ™•์ธ

    ์™ธ๋ถ€ ์‹œ์Šคํ…œ(UI, Slack, API)์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์Šน์ธ/๊ฑฐ๋ถ€๋ฅผ ์š”์ฒญ.

  4. 4
    ์žฌ๊ฐœ ๋˜๋Š” ์ค‘๋‹จ

    ์‘๋‹ต์„ interruptResponse๋กœ ๋‹ด์•„ ์žฌํ˜ธ์ถœํ•˜๋ฉด ์ด์–ด์„œ ์‹คํ–‰ โ€” ๊ฑฐ๋ถ€ ์‘๋‹ต์ด๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ๋Œ€์•ˆ ํƒ์ƒ‰.

HumanInTheLoop
๋‚ด์žฅ HITL โ€” from strands.vended_interventions.hitl, Agent(interventions=[...])๋กœ ์žฅ์ฐฉ
allowed_tools
์Šน์ธ ์—†์ด ํ†ต๊ณผ์‹œํ‚ฌ ๋„๊ตฌ ๋ชฉ๋ก โ€” ๋‚˜๋จธ์ง€๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋ฌป์Šต๋‹ˆ๋‹ค.
ask='stdio'
๊ธฐ๋ณธ์€ ์ฝ˜์†” ์Šน์ธ โ€” ์ฝœ๋ฐฑ์„ ๋„˜๊ธฐ๋ฉด Slackยท์›น UI๋กœ ์—ฐ๋™
takeaway

๊ณ ์œ„ํ—˜ ๋„๊ตฌ ์•ž์—์„œ ๋ฉˆ์ถ”๊ณ , ์‚ฌ๋žŒ์˜ ์Šน์ธ์œผ๋กœ๋งŒ ์ง€๋‚˜๊ฐ‘๋‹ˆ๋‹ค โ€” ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ์˜ ์•ˆ์ „๋ฒจํŠธ

์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์—์ด์ „ํŠธ์˜ ์ง€๋Šฅ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Session ยท Conversation ยท Memory ยท Context โ€” 4๊ณ„์ธต์œผ๋กœ ๊ธฐ์–ต์„ ์„ค๊ณ„