Skip to content

CH 09 · 핵심 서브시스템과 한 메시지의 흐름

전체 글자 수약 2,730자소요 시간약 14분선수 지식CH 08 플러그인 트리난이도개념 이해

본 장 목표

CH 08에서 dsh는 "플러그인 트리"라고 했습니다. 이번 장은 거기에 한 걸음 다가갑니다. 트리 위의 핵심 플러그인(서브시스템)들이 각각 무엇을 담당하고 서로 어떻게 조율하는지 살펴보고, 이어서 한 메시지를 처음부터 끝까지 따라갑니다. Enter 키를 누르는 순간부터 응답이 돌아오기까지 사이에서 어떤 일이 일어나는지. 이 두 가지를 보면 dsh가 내부적으로 어떻게 동작하는지 파악할 수 있습니다.

핵심 서브시스템: 식당의 뒷주방 팀

CH 08의 작은 식당 비유를 이어갑니다. 주방은 한 사람이 아니라 분업이 명확한 팀이며, 각자 자기 일을 맡아 다음 사람에게 인계합니다. dsh의 핵심 서브시스템이 바로 이 팀입니다.

서브시스템직원 역할담당 영역
agent-loop주방장기본 드라이버: "다음에 무엇을 할지" 결정 — 모델에 요청하고, 도구를 호출하고, 결과를 수집. 전체 루프를 이끔
llm테이크아웃 라인 운영자어댑터를 통해 외부 모델과 연결, 메시지를 내보내고 응답을 받아들임
tools도구 캐비닛 + 문지기도구 레지스트리 + 통제된 실행 파이프라인. 각 에이전트는 자신만의 것을 사용(scope 격리)
system-prompt플레이팅 담당다양한 플러그인이 등록한 프롬프트 조각과 도구 스키마를 "모델에게 보이는 접시"로 조합
session장부추가 전용 세션 로그: 보낸 것, 모델의 응답, 실행된 도구 — 모두 기록
scope작업대 격리각 에이전트의 등록이 자기 구획 안에서만 유효하도록 만들어, 서로 간섭하지 않게 함

서로 어떻게 조율하는지 다음 다이어그램으로 살펴보겠습니다.

핵심 서브시스템의 협업 방식(일러스트레이션)

기억법: 주방장(agent-loop)이 명령을 내리고, 플레이팅 담당(system-prompt)이 준비하고, 라인 운영자(llm)가 테이크아웃을 부르고, 도구 캐비닛(tools)이 도구를 내밀고, 모든 결과는 장부(session)에 기록됩니다. 장부는 다음 장의 주인공입니다.

핵심 단위: step과 turn

흐름을 보기 전에 먼저 두 용어를 구분하겠습니다. 두 용어는 전체 사슬을 이해하는 토대입니다.

  • step = 모델 요청 한 번 + 그에 따른 도구 호출. 모델이 "사고 + 행동"을 한 번 하는 것이 step 하나입니다.
  • turn = step의 모음이거나 0개. 첫 입력을 받아들인 시점부터 더 이상 처리할 일이 없을 때까지입니다.

왜 한 번의 응답에 step이 여러 개일까요? 모델이 흔히 "조금 사고 → 도구 호출 → 결과를 보고 다시 사고 → 다른 도구 호출…"을 충분히 되었다고 느낄 때까지 반복한 뒤 최종 응답을 내놓기 때문입니다. 이 전체 사슬이 하나의 turn이고, 그 안의 각 "사고 + 행동"이 하나의 step입니다. 공식 표현은 다음과 같습니다. turn은 첫 입력을 받아들이기 전에 열리고, 처리할 일이 더 이상 없을 때 닫힙니다.

실생활 비유: 한 끼 식사를 주문하면(turn), 웨이터가 여러 번 오갑니다(step) — 먼저 요리가 가능한지 확인하고, 그다음 서빙하고, 추가로 더 필요한지 묻고 — 주문이 완전히 끝날 때까지.

한 메시지의 흐름: Enter 키부터 응답까지

이제 메시지를 처음부터 끝까지 따라가 봅니다. 다음 다이어그램을 위에서 아래로 따라가 보십시오.

한 메시지의 흐름: Enter 키부터 응답까지(일러스트레이션)

turn/start: turn이 열립니다. Enter를 누르기 전에는 이 turn이 시작하지 않았고, 누른 뒤 turn이 먼저 열리며 "입력 수령" 단계로 들어갑니다.

② 입력 수령(inbox). 모든 입력은 먼저 inbox라는 우편함으로 들어갑니다. 보낸 메시지는 주방장을 즉시 깨워 일을 시작하게 합니다. 반면 "주입된 컨텍스트"(CH 04에서 본 종류)는 일단 우편함에 머물면서, 다른 실제 메시지가 깨우는 것을 기다립니다. 그래서 "데이터 주입" 자체는 흐름을 끊지 않습니다.

③ 조립: 프롬프트 + 도구 스키마. system-prompt가 다양한 플러그인이 등록한 조각들을 한 접시에 모아, 모델에게 "당신은 누구이고, 어떤 도구가 있으며, 도구의 모양은 이렇다"라고 알려줍니다.

agent/pre-step: 모델이 무엇을 볼지 결정. 이 단계는 첫 번째 "실시간 확장 지점"입니다. 플러그인은 여기에서 내보낼 내용을 다시 쓰거나 곧장 거부할 수 있습니다. 거부되거나 빈 내용으로 다시 쓰여도, turn은 평소처럼 닫히고 기록이 남습니다. 로그에는 "한 번 시도했지만 실행하지 않았다"고 표시됩니다.

step/start: 장부 작성 + 히스토리 인출. 보낸 메시지는 user/message로 세션 로그에 기록되며, 동시에 이번 turn의 모델 히스토리가 로그로부터 투영됩니다(deriveMessages()). 모델이 보는 모든 것은 로그에서 옵니다. 이 문장은 계속 반복해서 등장합니다.

⑥ 모델 요청 → 응답 수령. agent/request가 요청을 보내고(가로채기 가능), llm/stream이 응답을 스트리밍하며, 모델의 응답은 assistant/message로 로그에 기록됩니다.

⑦ 도구를 호출해야 할까? 모델이 "내가 행동해야 한다"고 판단하면 tool/call → 실행 → 결과 tool/result가 로그로 다시 기록됩니다. 실행 전후에 가로채기 지점이 있습니다(pre/post-execute). 도구가 필요 없다면 다음 단계로 건너뜁니다.

step/end: 더 할 일이 있는가? 도구 결과를 모델이 다시 처리해야 하거나(또는 새 입력이 들어오면) 새로운 step을 열어 "입력 수령"으로 돌아갑니다. 처리할 일이 없을 때까지 진행한 뒤, agent/turn-stoppingturn/end로 이 turn을 종료하고 최종 응답이 표시됩니다.

기억해 둘 핵심 구분: 다이어그램 오른쪽에는 두 종류의 이벤트가 표시되어 있습니다.

  • 영속 이벤트(turn/*, step/*, user/message, assistant/*, tool/*): 세션 로그에 기록되며 재시작 후에도 남습니다.
  • 실시간 확장 지점(agent/pre-step, agent/request, llm/stream, tools/*): 실행 중에만 유효하며, 플러그인은 이를 활용해 동작을 가로채고 바꾸지만 그 자체로 장부에 남지는 않습니다.

이는 CH 08의 "이벤트는 확장 지점"과 호응합니다. 진행 중인 작업을 관찰하거나 가로채려면 실시간 이벤트를 보고, 사실을 남기려면 영속 이벤트를 쓰십시오.

모델의 기억은 어디서 오는가

한 문장으로 말하면 이렇습니다. 세션 로그가 곧 모델이 보는 컨텍스트입니다. 이번 turn에서 모델이 "기억하는" 것은 모델 자체가 기억하는 것이 아니라, 시스템이 로그로부터 투영한 히스토리입니다. 따라서 "모델이 보는 것이 곧 기록된 것"은 dsh의 엄격한 규칙입니다. 모델 요청에 도달하는 모든 것은 로그로부터 재구성 가능해야 하며, 런타임은 이를 불변식(invariant)으로 검사합니다. 이 규칙이 전체 설계의 축이며, CH 10에서 자세히 다룹니다.

앞서 챕터와의 간단한 교차 참조: CH 04에서 본 "Trajectory 뷰" — 그 ASSISTANT / TOOL 타임라인 — 사실은 이 세션 로그의 시각화일 뿐입니다. 모델이 한 말, 호출한 도구, 그 결과 모두 로그로부터 렌더링됩니다. "왜 앞에서 한 말을 기억하지?"라고 물으면 답은 단순합니다. 모델이 기억하는 게 아니라 로그가 기억하는 것입니다. 매번 질의 전에 시스템이 로그로부터 히스토리를 투영해 모델에 넘기는 것입니다.

이번 장에서 배운 것

아래 항목들을 스스로 점검할 수 있으면 합격입니다.

  • [ ] 핵심 서브시스템의 분업(agent-loop / llm / tools / system-prompt / session)을 말하고, 서로 어떻게 조율하는지 설명할 수 있다
  • [ ] step과 turn의 차이를 설명할 수 있다(step = 모델 요청 한 번 + 도구; turn = step의 모음이거나 0개)
  • [ ] 다이어그램을 따라 한 메시지의 전체 흐름을 차례대로 따라갈 수 있다. turn/start → 입력 수령 → 조립 → pre-stepstep/start → 모델 요청 → 도구 호출 → step/endturn/end
  • [ ] 영속 이벤트와 실시간 확장 지점을 구분하고, 각각의 목적을 말할 수 있다(증거 남기기 vs 가로채기)
  • [ ] "모델이 보는 것이 곧 기록된 것"이라는 규칙의 의미를 말할 수 있다

Open Source · MIT · Community Driven