Chapter 6 · Explainability and Compliance Agentic Patterns

말이 흐려지는 것을
막는다

『Agentic Architectural Patterns for Building Multi-Agent Systems』 6장 — Ali Arsanjani, Juan Pablo Bustos, Thomas Kurian

5장이 여럿을 협연시키는 법이었다면, 6장은 그 협연을 믿을 수 있게 만드는 법이다. 이 장의 첫 문장이 모든 것을 요약한다. 책임 없는 자율성은 부채다. 그리고 이 장이 겨누는 적은 하나다. 위에서 내려온 지시가 아래로 내려가면서 흐려지고 잊히는 것 — 지시 표류다.

00

Two questions · A strategic guide

두 질문 — 왜 그랬는가, 그리고 확인할 수 있는가

에이전틱 시스템이 시제품을 넘어 운영 환경으로 들어가려면 효과성만큼의 신뢰성을 갖춰야 한다. 그리고 신뢰성은 두 개의 서로 다른 질문으로 갈라진다.

Explainability

설명 가능성

에이전트의 의사결정 과정을 투명하고 이해할 수 있게 만드는 데 초점을 둔다.

“에이전트는 왜 그렇게 했는가?”

Compliance

규제 준수

에이전트의 행동이 외부 규제와 내부 정책이 얽힌 그물을 지키는지 보장한다.

“규칙을 지켰는지 내가 확인할 수 있는가?”

The premise

책임 없는 자율성은 부채다

자율성이 커질수록 투명성과 책임성의 필요도 커진다. 이 장은 그 요구에 답하는 네 개의 아키텍처 패턴을 소개한다. 지시 충실도 감사, 프랙탈 사고사슬 임베딩, 지속적 지시 고정, 공유 인식 기억.

이 장이 겨누는 적 — 지시 표류

네 패턴이 각각 다른 지점을 막지만, 막으려는 대상은 하나다. 복잡한 위계형 에이전트 시스템에서 과업의 원래 의도가 희석되거나 사라지는 것. 이 책은 그것을 지시 표류(instruction drift)라 부른다.

그래서 네 패턴은 서로 배타적인 선택지가 아니라 겹겹이 쌓아 올리는 방어선이다. 안쪽부터 바깥쪽으로 이렇게 놓인다.

지시 충실도 감사 외부 · 반응 · 최종 검문 프랙탈 사고사슬 임베딩 내부 · 능동 · 자기통치 지속적 지시 고정 구조 · 예방 · 임무의 상기 공유 인식 기억 토대 · 하나의 진실 원래 지시 · 원래 의도 지시 표류 안쪽 층이 무너지면 바깥 층이 잡는다 · 바깥 층만 있으면 안쪽에서 이미 틀어진다

〈겹겹의 방어〉 네 패턴의 배치. 주홍 화살표가 사방에서 밀고 들어오는 지시 표류다.

단계가 오르면 쓰임이 깊어진다

이 패턴들은 단순한 도구 상자가 아니다. 조직의 에이전틱 시스템이 성숙할수록 적용이 깊어진다. 복잡한 단일 에이전트에도 유용하지만, 멀티 에이전트 집합체의 얽힌 상호작용을 통치하는 데에는 절대적으로 필수가 된다.

아키텍처 측면5단계 적용 (단일 에이전트)6단계 적용 (멀티 에이전트)
일차 목표단일 자율 에이전트가 책임을 지고 그 복잡한 추론이 감사 가능하도록 보장한다.협업하는 에이전트 시스템 전체가 최상위 목표와 정렬을 유지하고 집단적으로 신뢰할 만하도록 보장한다.
지시 충실도 감사단일 에이전트가 결정적 행동을 하기 전에 그 최종 출력을 감사한다.에이전트 사이의 인계를 감사해, 위계의 각 단계마다 지시 충실도가 유지되게 한다.
프랙탈 CoT 임베딩단일 에이전트의 내부 자기수정을 가능하게 해, 자기 다단계 추론을 스스로 정련하게 한다.내부 자기수정에 더해 에이전트 간 반영성을 가능하게 한다. 동료의 추론에 근거해 자기 계획을 수정한다.
지속적 지시 고정길고 여러 단계인 과업 내내 단일 에이전트가 주 목표와 제약에 집중하게 한다.원래 지시와 제약이 깊은 위계를 타고 내려가는 여정에서 살아남게 하는 데 결정적이다.
공유 인식 기억단일 에이전트에는 덜 결정적이나, 상태를 기록하거나 사람 감독자와 맥락을 공유하는 데 쓸 수 있다.에이전트 간 협업에 필수다. 중추신경계가 되어 시스템 전체가 의지하는 “지상 진실”을 제공한다.

〈표 6.1〉 설명 가능성·규제 준수 패턴과 GenAI 성숙도 모델의 매핑

P1

The external checkpoint

지시 충실도 감사 — 조용한 실패를 잡는 검문소

P1

Instruction Fidelity Auditing

지시 충실도 감사

외부반응적

문제의 배경

위계형 멀티 에이전트 시스템에서 상위 에이전트는 흔히 하위 전문가에게 과업을 위임한다. 그런데 이 에이전트들은 자기 국소 과업을 최적화하도록 설계돼 있어, 상위 제약을 의도치 않게 오해하거나 무시할 수 있다. 그 결과가 조용한 실패다. 하위 과업은 성공적으로 완료된 것처럼 보이지만, 전체 결과는 원래의 사업 의도와 어긋나 있다.

맥락

감독 에이전트가 하나 이상의 작업자 에이전트에 과업을 위임하는 멀티 에이전트 시스템. 작업 전체의 성패가 원래 지시에 명시된 모든 제약을 작업자가 엄격히 준수하는가에 달려 있다.

문제

자율 에이전트가 자기 하위 과업에 최적화하는 동안에도 원래의 상위 지시와 전역 제약에 엄격히 정렬된 상태를 유지하게 하려면, 그래서 전체 목표를 놓치는 조용한 실패를 막으려면 어떻게 해야 하는가.

해법

자동 검문소 역할을 하는 전담 감사 에이전트를 둔다. 감사자의 역할은 과업을 수행하는 것이 아니라, 작업자의 출력을 그가 받은 원래 지시와 대조하는 것이다. 행동이 확정되기 전에 최초 지시의 모든 제약과 목표가 충족됐는지 검증한다. 책임성을 강제하고 지시 표류를 막는 명시적 검증 계층이 이렇게 생긴다.

사례 — 전자상거래 할인 적용을 감사한다

세 에이전트의 목표가 각각 다르다. SupervisorAgent는 요청을 업무 규칙대로 처리하는 것, DiscountAgent는 지정된 할인을 효율적으로 적용하는 것, ComplianceAuditAgent는 다른 에이전트의 행동이 원래 지시의 모든 제약을 지켰는지 검증하는 것.

01지시 — “user123의 주문 #5678에 15% WELCOME 할인을 적용하라. 단, 첫 주문인 경우에만.
02위임과 실행DiscountAgent가 주 행동에만 집중해 15% 할인을 적용하고 {"status":"SUCCESS"}를 반환한다. “첫 주문” 제약을 확인하지 않았다.
03감사 — 거래를 확정하기 전에 감독자가 원래 지시와 작업자 출력을 ComplianceAuditAgent에 넘긴다
04검증 — 감사자가 고객 DB를 조회해 user123에게 과거 주문이 여럿 있음을 확인한다
05판정{"audit_status":"FAIL", "reason":"작업자가 '첫 주문' 제약을 확인하지 않았다. user123은 신규 고객이 아니다."}
06해소 — 감독자가 실패를 받아 할인을 되돌리고 사용자에게 적절한 메시지를 보낸다. 정책 위반이 막혔다.

전문 에이전트가 지름길을 택하더라도 독립된 감사 계층이 시스템의 무결성을 지킨다.

구현 예시 · Python
class SupervisorAgent:
    def handle_request(self, user_request):
        original_instruction = (
            "Apply a 15% 'WELCOME' discount for user 'user123', "
            "but only if this is their first order."
        )

        # 작업자 에이전트에 위임한다
        worker_result = DiscountAgent().run(instruction=original_instruction)

        # 감사 에이전트에 검증을 위임한다
        audit_verdict = ComplianceAuditAgent().run(
            original_instruction=original_instruction,
            worker_output=worker_result
        )

        if audit_verdict.get("audit_status") == "PASS":
            print("Action is compliant. Finalizing order.")
            return "Order Finalized"
        else:
            print(f"Action failed audit. Reverting. Reason: {audit_verdict.get('reason')}")
            return "Action Reverted"

class DiscountAgent:
    def run(self, instruction):
        # 이 에이전트는 할인 적용에만 잘못 집중한다
        print("DiscountAgent: Applying 15% discount as instructed.")
        return {"status": "SUCCESS",
                "action": "15% discount applied to order #5678"}

class ComplianceAuditAgent:
    def run(self, original_instruction, worker_output):
        # 실제 시스템에서는 LLM이나 다른 도구를 쓴다
        is_first_order = self.check_customer_history("user123")

        if "first order" in original_instruction and not is_first_order:
            return {
                "audit_status": "FAIL",
                "reason": ("Worker agent failed to check the 'first order' "
                           "constraint. User 'user123' is not a new customer.")
            }
        return {"audit_status": "PASS",
                "reason": "Action is compliant with all instructions."}

    def check_customer_history(self, user_id):
        print(f"ComplianceAuditAgent: Checking order history for {user_id}.")
        return False      # 과거 주문이 있다고 시뮬레이션

장점

  • 책임성과 설명 가능성 — 규제 준수를 위한 명시적 검문소를 만든다. 감사자의 근거 제시가 결정이 어떻게 왜 검증됐는지에 대한 명확하고 감사 가능한 흔적을 남겨 투명성을 높인다.
  • 신뢰성 — 하위 과업은 국소적으로 성공했으나 전체 목표는 놓치는 조용한 실패를 능동적으로 줄여, 시스템 전체를 더 견고하고 예측 가능하게 만든다.

단점

  • 성능 부담 — 감사 계층을 더하면 지연과 연산 비용이 붙는다. 점검마다 추가 도구 사용이나 LLM 호출이 필요할 수 있다. 속도와 신뢰성의 직접적 맞교환이다.

구현 지침

감사가 가장 필요한 결정적 길목을 신중히 골라야 한다. 모든 단계에 감사를 걸면 성능이 심각하게 나빠진다. 오해나 정책 위반의 위험이 가장 높은 인계 지점에 집중하라. 엄격한 준수의 필요와 수용 가능한 시스템 지연 사이에서 균형을 잡는 것이 목표다.

지시 충실도 감사는 에이전트 출력에 대한 필수적인 외부 점검을 제공한다. 그러나 이것은 사후에 작동하는 반응적 조치다. 진정으로 견고한 시스템을 지으려면 에이전트가 정렬 유지에 대해 능동적이기도 해야 한다. 다음 패턴은 자기수정 능력을 에이전트 자신의 추론 과정에 직접 심는다.

P2

The internal governor

프랙탈 사고사슬 — 생각을 되감을 수 있게 만든다

P2

Fractal Chain-of-Thought (FCoT) Embedding

프랙탈 사고사슬 임베딩

내부능동적

문제의 배경

표준 사고사슬(CoT)은 에이전트가 순차 추론을 하게 하지만, 동적인 멀티 에이전트 환경에는 너무 경직돼 있다. 이런 시스템에서 에이전트는 계획을 조율하고, 새 정보에 적응하고, 타인의 피드백에 근거해 자기 추론을 교정해야 한다. 전통적 CoT와 그 변형에는 이런 재귀적 수정과 반영적 조율의 기제가 없다.

맥락

협업적 추론과 적응을 요구하는 복잡한 문제가 멀티 에이전트 시스템에 주어졌다. 다른 에이전트가 새롭거나 상충하는 데이터를 내놓으면 한 에이전트의 초기 결론이 무효가 될 수 있고, 이전 추론 단계를 동적으로 수정할 방법이 필요하다.

문제

전통적 CoT의 정적이고 고립된 성격을 넘어서서, 에이전트의 추론 과정을 동적 자기수정, 다른 에이전트 추론과의 동기화, 여러 상세 수준에서의 분석이 가능하도록 어떻게 구조화할 것인가.

해법 — 네 가지 원리

추론 과정을 정적이고 선형인 사슬 대신 재귀적이고 다중척도인 틀로 조직한다. 추론을 재귀적으로 정련될 수 있는 자족적 단위로 나누어, 새 증거에 근거해 과거 결론을 교정하고 분석의 상세 수준을 조절하게 한다.

01 · Recursive self-correction

재귀적 자기수정

통찰을 극대화하는 동시에 오류를 최소화하는 목적함수가 추론을 이끌어, 끊이지 않는 자기수정 루프를 만든다.

02 · Dynamic context aperture

동적 맥락 조리개

초점을 넓히거나 좁힌다. 상세 분석을 위해 줌인하고, 다른 에이전트의 더 넓은 맥락을 끌어들이려 줌아웃한다.

03 · Inter-agent reflectivity

에이전트 간 반영성

다른 에이전트의 추론을 평가하고 반추하도록 설계되어, 더 나은 정렬과 더 지능적인 위임이 가능해진다.

04 · Temporal re-grounding

시간적 재접지

더 새로운 증거에 비추어 앞선 추론 단계를 공식적으로 수정할 수 있다. 정적이고 추가만 가능한 로그가 아니라 동적이고 감사 가능한 사고 과정이 된다.

사례 — 협업 연구 종합

“기후 회복력 있는 도시 설계”에 대한 문헌 검토를 전문 에이전트 팀으로 생산한다. SynthesizerAgent가 프로젝트를 이끌고 전문가들의 발견을 하나의 보고서로 종합하며, ClimateScienceAgentMaterialSustainabilityAgent가 각자 영역을 연구한다.

01초기 연구MaterialSustainabilityAgent가 초기 데이터에 근거해 헴프크리트의 이점을 강조하는 보고서를 낸다
02에이전트 간 반영 — 종합자가 요약을 공유하자, ClimateScienceAgent연안 도시의 높은 습도가 그 재료의 구조적 무결성을 해칠 수 있다고 보고한다
03시간적 재접지 — FCoT가 소재 에이전트에게 원래 평가를 수정하게 한다. 초기 추론이 “헴프크리트는 유효한 지속가능 재료이나, 특수 처리 없이는 높은 습도에서 열화할 수 있다”로 공식 교정된다. 덧붙임이 아니라 과거 결론의 직접적 수정이다
04입도 제어 — 종합자가 처음에는 문단 수준에서 통찰을 결합하다가, 초점을 문서 수준으로 조정해 최종 보고서가 사실의 나열이 아니라 응집된 서사 구조를 갖추게 한다
구현 예시 · 프롬프트 템플릿
# FCoT를 쓰는 에이전트를 위한 개념적 프롬프트 템플릿

FRACTAL_COT_PROMPT_TEMPLATE = """
**Overall Goal:**
{original_instruction}

**Shared Context & Peer Agent Summaries:**
{context_from_shared_memory}

**My Previous Reasoning Steps (Thought Units):**
{summary_of_my_previous_reasoning}

**My Next Step:**

1. **Thought:** 목표와 모든 맥락에 근거해, 나의 다음 생각 또는 가설은 무엇인가?
   [LLM이 여기서 다음 생각을 생성한다...]

2. **Self-Correction Check (Objective Function):**
   - **Objective:** 이 생각이 새로운 통찰을 극대화하며 전체 목표와 정렬되는가?
   - **Constraint:** 공유 맥락의 사실이나 나의 이전 추론과 충돌하는가?
                    중복을 낳는가?
   - **Verdict & Justification:** [LLM이 여기서 분석하고 근거를 대야 한다...]

3. **Action / Revision:**
   - **판정이 PASS이면:** 취할 행동을 진술한다(도구 호출, 기억 기록 등).
   - **판정이 FAIL이면:** 시정 행동을 진술한다. 여기에는
     *이전* 사고 단위의 수정(시간적 재접지)이 포함될 수 있다.
   [LLM이 여기서 행동 또는 수정 계획을 생성한다...]
"""

장점

  • 신뢰성과 자기수정 — 가장 큰 강점은 실시간 자기교정 추론이다. 에이전트가 자기 어긋남을 스스로 잡아 고쳐, 훨씬 견고하고 믿을 만한 결과에 이른다.
  • 설명 가능성 — 명시적 자기수정 점검과 시간적 재접지가 투명하고 감사 가능한 흔적을 만든다. 에이전트가 무엇을 결정했는지뿐 아니라 어떻게, 왜 마음을 바꿨는지까지 볼 수 있다.

단점

  • 복잡도와 부담 — 표준 CoT보다 구현이 복잡하다. 공유 맥락을 관리하고 반영 루프를 촉발할 정교한 오케스트레이션 계층이 필요하며, 지연과 토큰 비용이 늘어난다.

구현 지침

공유 기억을 관리하고 반영 루프를 촉발하며 재귀적 갱신을 다룰 수 있는 견고한 오케스트레이션 계층이 필요하다. 자기수정을 위한 명확한 목적함수를 정의하는 것부터 시작하라. 재귀적 점검에 따르는 지연과 토큰 비용 증가를 염두에 두고, 원시 속도보다 정확성과 적응성이 더 중요한 복잡하고 고가치인 과업에 이 패턴을 적용하라.

FCoT는 에이전트가 내부적으로 추론하고 자기수정하는 강력한 틀을 제공한다. 그러나 아무리 정교한 추론이라도 맥락이 유실되거나 지시가 잊히는 시스템 수준의 실패에는 취약하다. 다음 패턴은 에이전트의 내부 사고 과정에서 지시가 워크플로를 가로질러 관리되는 방식으로 시선을 옮긴다.

P3

The structural preventive

지속적 지시 고정 — 가운데서 잃어버리지 않게

P3

Persistent Instruction Anchoring

지속적 지시 고정

구조예방적

문제의 배경

긴 위계형 에이전트 사슬에서 최상위 오케스트레이터의 최초 지시는 대개 맥락의 맨 앞에 놓인다. 그런데 하위 에이전트들이 저마다의 추론과 데이터를 더하면서, 이 결정적 지시는 컨텍스트 창의 한가운데로 밀려난다.

LLM은 이 “가운데서 잃어버리는(lost in the middle)” 문제에 취약하다. 프롬프트의 맨 앞이나 맨 끝에 있지 않은 정보에 더 낮은 가중치를 준다.

맥락

깊은 위계형 멀티 에이전트 시스템에서 최초 지시가 에이전트 사슬을 타고 내려간다. 각 에이전트가 자기 추론과 데이터를 더할수록 컨텍스트 창이 커지고, 원래 지시는 우선순위가 높은 시작·끝 위치에서 점점 멀어진다.

문제

컨텍스트 창이 길어지고 어수선해질수록, 결정적인 상위 지시와 제약이 하위 에이전트에게 잊히거나 무시되지 않게 하려면 어떻게 해야 하는가. 모델의 자연스러운 최신 편향을 상쇄할 기제가 없으면, 점진적인 지시 표류가 일어나 최종 출력이 원래 의도에서 어긋난다.

해법

맥락 안의 위치와 무관하게 결정적 지시가 두드러진 상태로 남게 한다. 우선순위가 높은 목표나 제약을 의미론적으로 유의미한 태그 안에 심는 방식이다. <CRITICAL_INSTRUCTION>, [GOAL], #DO_NOT_FORGET: 같은 것들이다. 이 앵커는 사슬을 따라 내려가며, LLM이 쉽게 알아보도록 설계되어 워크플로의 매 단계마다 핵심 목표를 상기시킨다.

사례 — 재무 보고에서 제약을 지킨다

ReportingSupervisor불법적인 미래예측 진술을 넣지 않고 3분기 재무 요약을 생성해야 한다. DataExtractionAgent가 데이터를 뽑고, SummarizationAgent가 서술 요약을 만든다.

앵커 없이 · 지시가 흘러간다

지시 — 3분기 실적 요약을 생성하라.
미래예측 진술 금지
데이터 추출 — 미래예측 진술 금지 … 매출 10M, 이익 2M …
요약 생성 — 데이터: {revenue: 10M, profit: 2M}. 요약하라.
출력 — “3분기 매출 10M. 4분기에는 성장세가 가속될 전망이다.

제약이 맥락 한가운데로 밀려 사라졌다. 규제 위반이다.

앵커와 함께 · 지시가 살아남는다

지시 — 3분기 실적 요약을 생성하라.
PERSISTENT_GOAL: [NO_FORWARD_LOOKING_STATEMENTS]
데이터 추출 — 매출 10M, 이익 2M.
PERSISTENT_GOAL: [NO_FORWARD_LOOKING_STATEMENTS]
요약 생성 — 데이터: {revenue: 10M, profit: 2M}.
PERSISTENT_GOAL: [NO_FORWARD_LOOKING_STATEMENTS] 요약하라.
출력 — “회사의 3분기 실적은 매출 1천만 달러, 이익률 20%를 기록했다.”

제약이 데이터 바로 옆에 붙어 있어, 생성 시점에 보인다.

〈그림 6.4〉 지속적 지시 고정 워크플로. 두 흐름의 차이는 앵커 한 줄뿐이다.

구현 예시 · Python
class ReportingSupervisor:
    def generate_report(self):
        # 결정적 제약을 한 번 정의하고 앵커로 만든다
        anchored_instruction = "PERSISTENT_GOAL: [NO_FORWARD_LOOKING_STATEMENTS]"
        print(f"Supervisor initiated process with anchor: {anchored_instruction}")

        # 첫 에이전트에 위임한다
        data = DataExtractionAgent().run(anchored_instruction)

        # 두 번째 에이전트에 데이터와 '같은 앵커'를 함께 넘긴다
        summary = SummarizationAgent().run(data, anchored_instruction)
        print(summary)

class DataExtractionAgent:
    def run(self, instruction):
        print(f"DataExtractionAgent received instruction: {instruction}")
        return "{revenue: '10M', profit: '2M'}"

class SummarizationAgent:
    def run(self, data, instruction):
        # LLM 프롬프트가 데이터와 고정된 지시를 함께 담아,
        # 생성 시점에 제약이 보이도록 보장한다
        prompt = f"""
        Summarize the following financial data.
        Data: {data}
        {instruction}
        """
        return ("The company's Q3 performance showed a revenue of $10M "
                "with a profit margin of 20%.")

장점

  • 신뢰성 — 상류 지시의 회상률을 유의미하게 높여 지시 표류를 줄이고, 하류 에이전트가 주된 임무와 정렬된 상태를 유지하게 한다.
  • 설명 가능성 — 에이전트 간 메시지에 고정된 지시가 존재한다는 사실 자체가, 결정적 제약이 워크플로 내내 어떻게 유지됐는지에 대한 명확하고 감사 가능한 흔적이 된다.

단점

  • 프롬프트 부담 — 프롬프트에 약간의 부담을 더하고, 효과를 보려면 시스템의 모든 에이전트에 걸쳐 일관된 템플릿 구조가 필요하다.

구현 지침

앵커의 표준 형식을 정하고(예: PERSISTENT_GOAL: [...] 또는 <CONSTRAINT>...</CONSTRAINT>) 시스템의 모든 에이전트가 그 형식을 일관되게 쓰도록 하라. 그래야 사슬의 각 단계에서 지시를 안정적으로 파싱하고 다시 삽입해, LLM에 대한 가시성을 극대화할 수 있다.

지시를 기억하는 것은 절반에 지나지 않는다. 협업 환경에서 에이전트들은 현재 현실에 대한 동적 이해도 나누어야 한다. 한 에이전트가 서버 장애나 재고 변동 같은 결정적 정보를 알아냈다면, 끝없는 메시지를 주고받지 않고 어떻게 나머지 팀이 즉시 알게 할 것인가.

P4

The foundational truth

공유 인식 기억 — 바벨탑을 막는 하나의 진실

P4

Shared Epistemic Memory

공유 인식 기억

토대동기화

문제의 배경

단일 에이전트 시스템에서 “기억”은 대개 대화 이력일 뿐이다. 세션 기억이나 단기 기억이라고도 부른다. 그러나 멀티 에이전트 집합체에서 개별 컨텍스트 창에 의존하면 바벨탑 효과가 생긴다. 한 에이전트는 서버가 죽었다는 것을 알았는데 다른 에이전트는 여전히 살아 있다고 믿는다면, 그 둘의 협조된 행동은 반드시 실패한다.

맥락

에이전트들이 각자의 국소 기억으로 작동하며 서로 다른 과업을 받는 멀티 에이전트 시스템. 한 에이전트의 관찰(특정 도구 출력이나 상태 변화)이 다른 에이전트에게 자연히 전달되지 않아, 파편적이고 불완전하며 일관되지 않은 정보에 근거한 결정이 내려진다.

문제 — 세 가지 힘

통일되고 진화하는 진실의 원천이 없으면 위계 속 에이전트들은 쉽게 어긋난다. 한 에이전트가 새 데이터로 이해를 갱신해도, 그 “사실”이 전파되지 않으면 다른 에이전트는 낡은 가정 위에서 움직인다.

  • 파편화된 지식 — 각 에이전트의 “세계관”이 자기 국소 맥락에 갇힌다.
  • 손실 있는 통신 — 긴 대화 사슬로 상태를 넘기다 보면 뉘앙스가 떨어져 나간다.
  • 지상 진실의 부재 — 과업의 정본(正本) 상태를 확인할 권위 있는 기준점이 없다.

해법

특정 워크플로 안의 모든 에이전트가 읽고 쓸 수 있는 전역 스크래치패드 또는 중앙 기억 모듈을 세운다. 이 공유 기억이 집단의 권위 있는 진실 원천이 되어, 위계상의 위치와 무관하게 모든 에이전트가 같은 사실과 가정 위에서 작동하게 한다. 개별 에이전트가 고립된 추론을 수행하더라도 시스템이 응집을 유지하게 하는, “에이전트 사슬(chain-of-agents)” 같은 아키텍처의 핵심 기능이다.

사례 — 공급망 교란

세 에이전트가 공급망을 관리한다. MonitoringAgent(뉴스 피드), LogisticsAgent(배송 추적), CustomerNotificationAgent(고객 커뮤니케이션). 공유 기억의 기준 상태는 {"shipment_A1":{"status":"On Time"}, "shipment_B2":{"status":"On Time"}}이다.

01사건 감지 — 모니터링 에이전트가 주요 항만의 폭풍 보도를 감지하고 공유 기억에 기록한다. SharedMemory.update({"event_log":["Storm reported at Port X"]})
02영향 분석 — 물류 에이전트가 주기적으로 공유 기억을 읽다가 새 사건 로그를 본다. 내부 도구로 shipment_B2가 Port X를 경유함을 확인하고 상태를 Delayed로 갱신한다
03선제 행동 — 고객 알림 에이전트가 공유 기억을 읽고 shipment_B2가 지연으로 바뀐 것을 본다. 즉시 해당 고객에게 알려 서비스 불만을 예방한다

이 패턴이 없다면 고객 알림 에이전트는 사람이 수동으로 개입하거나 기한을 놓칠 때까지 지연을 알지 못한다.

구현 예시 · Python
class SharedMemory:
    def __init__(self):
        self.store = {
            "shipments": {
                "shipment_A1": {"status": "On Time"},
                "shipment_B2": {"status": "On Time"}
            },
            "event_log": []
        }

    def update(self, key, value):
        print(f"[Memory Update] Setting {key} to {value}")
        if key == "event_log":
            self.store["event_log"].append(value)
        else:
            self.store["shipments"].update(value)

    def read(self):
        return self.store

class MonitoringAgent:
    def run(self, memory):
        print("MonitoringAgent: Detected storm at Port X.")
        memory.update("event_log", "Storm reported at Port X")

class LogisticsAgent:
    def run(self, memory):
        state = memory.read()
        if "Storm reported at Port X" in state["event_log"]:
            print("LogisticsAgent: Found affected shipment_B2.")
            memory.update("shipments",
                {"shipment_B2": {"status": "Delayed",
                                  "reason": "Storm at Port X"}})

class CustomerNotificationAgent:
    def run(self, memory):
        b2 = memory.read()["shipments"]["shipment_B2"]
        if b2["status"] == "Delayed":
            print(f"Alerting customer about delay due to {b2['reason']}.")

# 오케스트레이션
shared_mem = SharedMemory()
MonitoringAgent().run(shared_mem)
LogisticsAgent().run(shared_mem)
CustomerNotificationAgent().run(shared_mem)

장점

  • 일관성 — 의미 표류를 크게 줄인다. 모든 에이전트가 과업과 환경에 대해 동기화된 이해를 갖게 되어 응집된 집단 행동이 나온다.
  • 효율 — 대량의 상태 정보를 직접 대화 메시지로 넘기는 것보다 대체로 효율적이다. 에이전트가 필요할 때 필요한 맥락만 끌어오면 된다.

단점

  • 중앙화 위험 — 고가용성과 동시 접근을 고려해 설계하지 않으면 공유 기억이 단일 실패 지점이나 성능 병목이 된다.
  • 복잡도 — 공유 상태 관리의 복잡성이 생긴다. 여러 에이전트가 같은 데이터에 동시에 쓰려 할 때의 경쟁 조건을 다룰 기제가 필요하다.

구현 지침 — 셋

  • 백킹 스토어의 선택이 결정적이다. 운영 시스템에서는 프로세스가 재시작되면 사라지는 단순 인메모리 딕셔너리를 피하라. Redis나 Memcached 같은 저지연 영속 키–값 저장소를 써야 한다. 이들은 원자적 연산을 지원해, 여러 에이전트가 동시에 상태를 갱신할 때의 경쟁 조건을 막는다.
  • TTL 또는 타임스탬프 검증 전략을 구현해야 한다. 에이전틱 시스템에서 정보는 빨리 썩는다. 5분 전에 참이던 서버 상태가 지금은 거짓일 수 있다. 모든 기억 항목이 timestampsource_agent_id를 요구하는 스키마를 강제하라. 그래야 하류 에이전트가 데이터의 신뢰도를 저울질할 수 있다. “이 사실은 20분 전 것이다. 다시 검증해야겠다.” 맹목적으로 믿는 대신에 말이다.
  • 엄격하게 타입이 정해진 도구로 노출하라. 범용 write_memory(text) 대신 update_order_status(id, status) 같은 도구를 쓴다. 그래야 공유 기억이 구조화되지 않고 파싱 불가능한 텍스트의 쓰레기장이 되는 것을 막는다.
05

Pattern composition for systemic reliability

패턴 합성 — 진짜 값어치는 겹칠 때 나온다

네 패턴은 각각 특정한 실패 지점을 막는다. 그러나 진짜 값어치는 그것들을 겹겹의 방어로 합성했을 때 실현된다. 서로 배타적인 선택지가 아니라, 견고한 운영 등급 아키텍처를 이루는 상보적 부품이다.

Layer 1 · 토대

공유 인식 기억

진실의 기초 계층이다. 모든 에이전트가 공통되고 동기화된 사실 집합과 과업 상태에 대한 공유된 이해 위에서 일하게 한다.

Layer 2 · 예방

지속적 지시 고정

임무를 끊임없이 상기시킨다. 과업이 아무리 복잡해지고 에이전트가 아무리 많아져도 핵심 목표와 제약이 맥락 “한가운데서 잃어버려지지” 않게 한다.

Layer 3 · 내부·능동

프랙탈 CoT 임베딩

내부의 능동적 자기통치 기제다. 에이전트가 작업하는 도중에 일어나는 지속적 프로세스 개선이며, 내부 추론이 목표와 정렬된 상태를 유지하게 한다.

Layer 4 · 외부·반응

지시 충실도 감사

외부의 반응적 검문소다. 결과가 확정되거나 다음 단계로 넘어가기 전에 산출물이 원래 지시를 온전히 지켰는지 검사하는 최종 품질 관문이다.

합성이 실제로 굴러가는 모습

  1. SupervisorAgent가 먼저 주 목표를 공유 인식 기억에 기록한다.
  2. 하위 과업을 WorkerAgent에 위임하면서 지속적 지시 앵커를 함께 넘긴다.
  3. WorkerAgentFCoT 임베딩으로 자기 사고 과정을 배정된 하위 목표에 계속 정렬시킨다.
  4. 최종 출력이 나오면 그것을 별도의 감사 에이전트에 넘겨, 공유 기억에 저장된 원래 최상위 지시를 지켰는지 검증한다.

Recommended practice

최소 둘, 되도록 셋을 동시에

이 패턴들을 합성하면 여러 겹의 중복 안전장치를 가진 시스템이 된다. 운영 등급 신뢰성을 위해서는 이 중 최소 두세 개를 동시에 구현하는 것이 권장되는 모범 사례다.