모든 기록
AX 인재전쟁 · 2026.09.06

틀린 걸 만들지 않으려다, 과제가 요구한 걸 만들지 않았다

AX 인재전쟁 예선에 제출한 Z3 기반 기획 검증 Codex 플러그인이 예비후보에 그친 이유를 되짚어본 회고.

틀린 걸 만들지 않으려다, 과제가 요구한 걸 만들지 않았다 대표 이미지

AX 인재전쟁 1기 예선에 메디테라피 과제로 Codex 플러그인을 제출했다. 결과는 예비후보. 5,300여 명이 참가해 자격 심사를 통과한 것이 1,277건, 본선에 오른 것이 60명이니 통과선 바로 아래에 걸린 셈이다.

이 글은 두 가지를 같이 한다. 앞부분은 내가 무엇을 만들었고 왜 그 기술을 골랐는지에 대한 설명이고, 뒷부분은 왜 통과하지 못했는지에 대한 회고다. 둘을 나누지 않은 이유는, 이번 경우 설계 판단 하나하나는 옳았는데 그것들이 합쳐지자 과제를 벗어났기 때문이다. 설명 없이는 회고가 성립하지 않는다.

먼저 밝혀둘 것이 있다. 개별 심사평은 받지 못했다. 운영진이 배포한 것은 전체 참가자를 익명 집계한 공통 리포트다. 그래서 이 글의 원인 분석은 전부 추정이다. 확정된 사실처럼 읽히는 문장이 있다면 그건 내 글쓰기의 실패다.

1. 과제

메디테라피가 낸 문제는 한 줄이었다.

매출이 될 수 있는 인플루언서 시딩 시스템을 설계하라

그리고 기업이 구조적 문제 세 가지를 예시로 붙였다.

  • SNS 데이터 세계를 온톨로지화
  • 데이터에서 인과관계 추정
  • 반복 가능한 루프로 설계

사전 공개된 대표 인터뷰에는 세 가지 질문이 있었다. 사람이 없는 새로운 시장에서도 시스템으로 진출해 성과를 낼 수 있는가. 시스템이 내린 판단으로 돈을 벌 수 있는가. 그게 사람이 하는 것보다 똑똑한가.

제약은 명확했다. 데이터가 주어지지 않았다. 스키마도 없었다. 예선은 공개·검증 가능한 자료만으로 문제를 정의하고 동작하는 플러그인을 만들어야 했다.

2. 문제를 다시 정의하기

과제 문장은 사실 답의 형태를 이미 지정하고 있다. "시딩 시스템을 설계하라"는 만들 물건을 알려주는 문장이지, 풀어야 할 문제를 알려주는 문장이 아니다. 그래서 먼저 질문으로 되돌렸다.

한정된 예산과 셀 수 없이 많은 크리에이터 풀이 있을 때, 누구에게 무엇을 언제 시딩할 것인가?

무한한 후보 공간을 유한한 예산으로 자르는 문제다. 이렇게 놓으니 다음 판단이 필요해졌다. 이 무한 공간을 내가 직접 다룰 것인가, 아니면 이미 정리된 형태로 받을 것인가.

온톨로지는 내가 만들 것이 아니라고 판단했다

기업이 제시한 첫 번째 문제가 온톨로지화였고, 아마 그들이 가장 어렵다고 본 부분이었을 것이다. 나는 이걸 만들지 않기로 했다.

이유는 역할 분담이 아니라 방법론이다. 온톨로지 스키마의 간선 가중치를 데이터 없이 추정하는 것은 가능한지 여부를 떠나 잘못된 일이라고 봤다. 없는 값을 지어내면 그 위에 쌓는 모든 것이 상상이 된다. 데이터가 확보된 뒤 데이터 사이언티스트가 할 일이다.

대신 이렇게 정리했다. 내가 연결하는 AX 작업 중 가장 앞단에 놓이는 것은 온톨로지 스키마 정립이고, 내 플러그인은 그 결과를 입력으로 받는 위치에 선다.

AI에게 무엇을 맡길지가 진짜 설계 결정이었다

여기서 이 프로젝트의 중심 판단이 나왔다.

AI는 조용하게 실수를 누적시킨다. 사람은 기획이나 작업에서 자기 실수를 발견하면 적어도 본인에게는 알려진 이슈가 된다. 하지만 AI가 놓친 부분은 사람이 의도적으로 탐색하지 않는 한 존재하지만 사라지는 이슈가 된다. 관측 가능성이 비대칭이다.

그래서 생성된 지식이 누적되는 구조를 의도적으로 배제해야 한다고 봤다. 반복 루프를 돌릴수록 좋아진다는 현대 에이전트 시스템의 전제와 정면으로 부딪히는 지점이다.

결론은 분리였다. 해석은 LLM에게, 규칙 정립과 판정은 사람과 코드에게. 판정이 실행 시점의 LLM 판단에 걸려 있으면 같은 입력에 다른 결과가 나온다. 그건 마케터가 결재를 올릴 수 있는 근거가 못 된다.

3. 만든 것

meditherapy-seeding-review — 메테라피 마케터가 작성한 시딩 캠페인 기획안이 실행 전에 기존 성과 인사이트와 예산·측정 제약을 지키는지 검토하는 Codex 플러그인이다.

하는 일:

  • canonical JSON 기획안을 검증하고 정규화
  • ambiguous / unknown 필드 탐지
  • z3-solver로 hard constraint 판정, rule id 추적
  • evidence baseline 대비 symbol set diff로 soft conflict 계산
  • 마케터가 읽을 수 있는 Markdown / JSON 리포트 출력

하지 않는 일:

  • SNS나 크리에이터 프로필 크롤링
  • ROAS 예측
  • 인플루언서 추천이나 랭킹
  • 충돌 여부를 LLM이 판단하는 것
  • 전체 온톨로지 그래프 구현

근거는 어디서 왔나

evidence baseline의 공개 출처는 피처링이 2026년 6월에 게시한 메디테라피 고객사례 인터뷰다. 여기서 마케팅 담당자의 실제 판단 기준을 뽑았다.

  • 퍼포먼스 광고 유입이 구매로 이어지지 않아 ROAS 개선이 필요했다
  • 팔로워 수보다 브랜드 핏, 진정성, 평균 릴스 조회수, ER이 중요하다
  • 나노 인플루언서 여러 명이 대형 인플루언서 1명보다 높은 전환을 만들 수 있었다
  • 여성 중심 시장이라 생각했지만 남성 인플루언서 채널에서 예상 밖의 위너 소재가 나왔다
  • 스크립트를 강제하기보다 인플루언서 자신의 언어로 소개할 때 전환이 높았다

주의한 것이 있다. 이 글은 벤더 블로그의 고객사례 인터뷰지 메디테라피의 공식 발표가 아니다. 그래서 문서 전체에서 "메디테라피 공식 전략은"이 아니라 "피처링 고객사례 인터뷰에서 담당자는"이라는 표현을 유지했다.

MVP의 baseline은 이 인터뷰에서 나온 KR / female / 20s로 잡았다.

왜 Z3인가

4학년 때 프로그램 검증 수업에서 Z3를 썼던 경험이 출발점이었다. Z3는 원래 불리언 논리식을 참으로 만드는 변수 조합이 존재하는지를 다루는 SMT solver다. SAT를 찾는 도구다.

내가 쓴 방식은 정반대다. SAT가 아니라 UNSAT 여부를 신호로 썼다. 제약이 서로 충돌해 해가 존재하지 않을 때, Z3는 그 사실을 알려준다. 그리고 각 제약에 rule id를 붙여 tracked 상태로 넣으면 어떤 규칙 때문에 충돌했는지까지 역추적된다.

이게 중요한 이유는 판정 결과가 "안 됨"으로 끝나지 않고 "무엇 때문에 안 됨"까지 나오기 때문이다. 마케터가 리포트를 받았을 때 고칠 수 있어야 한다.

도구의 철학과 반대로 쓰는 것에 대한 자각은 있었다. 다만 엔진과 구조는 그대로 쓸 수 있다고 봤다.

6개 레이어

1층 — 온톨로지를 Z3 심볼로 변환. 정형화된 온톨로지를 판정 엔진이 다룰 수 있는 심볼 집합으로 옮긴다. 표현만 다른 동일 의미는 하나의 canonical 형태로 정렬한다. 이후 층이 일관된 데이터만 다루게 하기 위해서다.

여기서 composite symbol 문제가 있었다. JP_Female_20s 같은 결합 심볼을 만들면 일본이 빠졌을 때 전혀 다른 심볼이 되고 연산량이 임의로 늘어난다. 그래서 atomic symbol을 유지하고 composite는 종속 변수로 관리하는 쪽을 택했다.

2층 — 심볼 컨텍스트 구성과 모호성 필터링. ambiguous와 unknown 필드를 여기서 분리한다. 사람이 정의하지 않은 영역을 판정 대상에서 격리하는 층이다. 정의되지 않은 것을 억지로 판정하면 앞서 말한 환각 누적 구조로 되돌아간다.

3층 — Hard constraint 판정. 반드시 지켜야 하는 규칙만 논리식으로 표현해 Z3에 넣는다. 예를 들어 ROAS를 KPI로 잡았다면 추적 링크나 쿠폰 코드가 있어야 한다. 구매 전환이 KPI라면 purchase event 측정이 연결돼 있어야 한다. 계획 비용이 승인 예산을 넘으면 안 된다.

4층 — Soft conflict 판정. 절대 규칙이 아닌 정도의 문제는 Z3가 아니라 집합 연산으로 처리한다. evidence baseline과 현재 심볼 집합의 diff를 계산한다. 시장이 KR에서 JP로 바뀌었다면 실패가 아니라 확인이 필요한 실험 변수로 표시된다. 여기서 LLM 판단을 배제한 것이 핵심이다. 주관이 개입하면 같은 기획서에 다른 답이 나온다.

5층 — 상태 결정. Hard 결과와 Soft diff를 하나의 상태로 수렴시킨다. Blocked / Revise / Experiment / Pass.

6층 — 리포트 산출. 마케터가 읽을 수 있는 형태로 출력한다. 이전 단계 산출물은 debug로 분리 저장되며 최종 결과를 바꾸지 않는다.

4. 어떻게 검증했나

CLI로 JSON을 넣고 상태가 의도대로 나오는지 확인했다.

대표 예시는 ROAS를 KPI로 설정했는데 추적 링크와 쿠폰 코드가 모두 없는 경우다. 입력에 kpis: ["roas"], measurement.tracking_link: false, measurement.coupon_code: false가 들어가면 결과는 Blocked이고, 출력에 HC_ROAS_MEASUREMENT_REQUIRED 규칙 ID가 함께 표시된다.

정상 케이스로는 baseline과 동일한 KR / female / 20s에 tracking link가 있는 기획안이 Pass로 나오는지 확인했다. 시장만 JP로 바꾸면 hard 위반은 없이 Experiment가 나오고 market KR -> JP 차이가 표시된다.

특히 의심한 것은 hard 위반과 soft 충돌이 동시에 있을 때 최종 상태가 제대로 정해지는지였다. 시장이 JP로 바뀌어 Experiment 조건이 생겨도, ROAS 측정 수단이 없으면 최종 상태가 Blocked가 되어야 한다.

--debug 플래그로 raw input, schema result, symbol context, hard constraints, solver result, soft diff, status decision, final report를 각각 파일로 남기게 했다. 디버그 출력은 최종 결과를 바꾸지 않는다.

정직하게 덧붙이면, 테스트하다가 크게 고친 부분은 없다. 테스트 과정에서 집중한 것은 새 버그를 잡는 것보다 플러그인이 판단할 수 있는 범위와 판단하지 못하는 범위를 구분하는 쪽이었다.

5. 결과와 공통 리포트

예비후보였다. 이후 운영진이 전체 집계 리포트를 보냈다. 예선은 AI가 전수 채점하고 운영진이 검수했으며, 점수가 갈린 축은 여섯 개였다.

리포트에 이런 대목이 있다.

상위권의 공통 패턴은 애매한 것의 해석은 AI에게 맡기되, 판정과 계산은 규칙이 고정된 코드로 만들어 언제 돌려도 같은 결과가 나오게 했다는 것이었다. 중요한 것은 실행할 때마다 결과가 흔들리지 않는 구조를 본인이 설계했는가였다.

내 설계의 관통 원칙과 거의 같은 문장이다. 나는 이걸 환각 누적 문제에서 독립적으로 도출했다.

또 하나. 리포트는 자기 결과물의 한계와 실패를 솔직하게 쓴 제출물이 일관되게 더 높은 점수를 받았고, 본선 진출자들이 전 항목 중 가장 높은 평균을 받은 축이 정직성이었다고 했다. 나는 못 하는 것 다섯 가지를 README에 명시했다.

그런데도 통과하지 못했다. 그래서 회고의 질문은 "무엇을 틀렸나"가 아니라 "핵심을 맞혔는데 왜 부족했나"가 된다.

6. 알고도 포기한 것

기획 로그를 다시 읽다가 한 대목에서 멈췄다. 기획 중반에 이런 정리를 해뒀다.

우리가 만족시키지 못하는데 담당자가 중요하게 생각하는 지점:

  • 실제 ROAS 개선 자체
  • 인플루언서 발굴과 섭외 운영
  • 콘텐츠 크리에이티브 품질 판단
  • 실제 구매 전환 추적
  • 캠페인 운영 자동화

좋은데, 이건 시딩 성과를 올리는 핵심 기능이라기보다 기획 QA에 가깝네 우리는 결국 좋은 인플루언서를 찾고 매출을 내야 하는데

챗지피티와 대화 도중 챗지피티에게 직접 했던 말이다. 이 갭은 놓친 게 아니다. 알고 있었고, 수용했다.

기획 과정에서 배제한 방향들을 나란히 놓으면 패턴이 보인다.

  • 인플루언서 후보 랭킹
  • SNS 기반 후보 발굴
  • 시딩당 기대 매출 / ROAS 예측
  • A/B 성과 비교 실험

각각의 배제 이유는 지금 봐도 타당하다. 데이터 없이 예측 모델을 만들면 과장이 된다. 크롤링을 구현하지 않았으면 발굴한다고 말하면 안 된다. 하나하나가 정직한 판단이었다.

문제는 네 번의 타당한 배제가 합쳐지자 과제가 명시한 축 전체가 빠졌다는 것이다. 배제한 네 가지는 전부 매출에 직접 닿는 것들이었다. 그리고 과제 제목은 "매출이 될 수 있는 인플루언서 시딩 시스템"이었다.

운영진 리포트의 본선 파트에는 이런 내용이 있다. 기술과 아이디어는 준비됐지만 수익·시장·현업 적용으로 가면 답이 얕아지는 경우가 많았고, 한 기업의 정량 채점에서 매출·공헌이익 관점은 달성률 51%로 전 항목 중 가장 낮았다고 한다.

즉 이 축은 모두가 약했던 축이다. 나는 약하게 한 것이 아니라 명시적으로 포기했다.

7. 왜 그렇게 됐나

내가 도달한 가장 정직한 포지션은 이 문장이었다.

성과 최적화 도구가 상방을 열어준다면, 이 플러그인은 반복 캠페인의 하방 리스크와 학습 누락을 줄이는 역할이다.

정확하고, 방어 가능하고, 팔리지 않는다. 상방을 남에게 넘기고 하방을 맡겠다는 선언이기 때문이다. 심사자 입장에서 "그래서 매출은 누가 만드나요"가 즉시 나온다.

여기서 내 사고의 패턴이 보인다. 불확실한 것을 만들지 않고 격리하는 것. 온톨로지를 격리했고, unknown 필드를 격리했고, LLM 판단을 격리했고, 예측을 격리했다.

이 원칙은 강력하다. 정직성 축과 AI 역할 분담 축에서 그대로 가점이 됐을 것이다. 그런데 같은 원칙이 매출 축에서는 손해로 작동했다. 격리는 틀릴 위험을 없애지만 동시에 주장할 근거도 없앤다.

더 정확히 말하면, 내가 지키려던 선은 "데이터 없이 예측하지 않는다"였다. 그런데 그게 어느 순간 "가치를 주장하지 않는다"로 확장됐다. 이 둘은 다르다. 전자는 지켜야 할 선이고 후자는 지킬 필요 없는 선이다.

8. 다시 쓴다면

같은 사실을 다르게 배열하기

인터뷰를 다시 읽으면 이렇게 쓸 수 있었다.

인터뷰에서 메디테라피가 얻은 인사이트는 전부 가정이 깨지면서 나왔다. 여성 시장인 줄 알았는데 남성 채널에서 위너가 나왔고, 스크립트를 통제해야 하는 줄 알았는데 자율성이 전환을 높였다. 즉 이 회사의 매출은 기존 공식을 의도적으로 깨는 실험에서 나온다. 그런데 지금 그 실험은 사후에 우연히 발견된다. 이 플러그인은 실험을 사전에 설계된 것으로 만든다.

하방 방어가 아니라 매출 발견 장치가 됐다. 인터뷰에 실제로 그렇게 쓰여 있다.

예측하지 않고 매출을 말하는 법

  • Blocked 1건이 막아준 손실을 금액으로 환산한다. ROAS 측정 수단 없이 집행된 캠페인 1건은 예산 전액이 측정 불가 상태가 된다. 이건 예측이 아니라 산수다.
  • 나노 다수가 매크로 1명보다 나았다는 인터뷰 인사이트를 baseline에 넣고, 이를 어기는 기획에 경고를 띄우면 과거 실측 기반의 매출 방어가 된다.
  • 예산 초과 차단은 그 자체로 공헌이익 방어다.

So what을 세 번 밀기

발견에서 멈추지 말았어야 했다.

발견: 이 회사의 인사이트는 가정이 깨지면서 나왔다 → 그럼 가정이 깨지는 지점을 관리해야 한다 (내가 멈춘 곳) → 관리하면 실험이 우연에서 설계로 바뀐다 → 실험이 설계되면 새 시장 진출 속도가 빨라진다

세 번째까지 밀면 대표가 물은 첫 번째 질문, 사람이 없는 새로운 시장에서도 시스템으로 성과를 낼 수 있는가와 정면으로 연결된다. 내 시스템은 이미 그 답인데, 문서가 거기까지 밀지 않았다.

그리고 그런 생각도 드는게, 실제로 정보 이론에서 가장 유의미한 정보는 자주 등장하는 정보뿐 아닌 굉장히 희소하게 등장하는 특이 정보들이다. 어찌보면 저런 가정을 깨는 지점을 발견하고 활용하는 시선이 약했던 것 같다.

그 외

  • 온톨로지 전제의 최소 조건 명시. 이 설계는 완성된 온톨로지를 요구하지 않는다. 크리에이터 속성이 canonical 값 집합으로 정규화 가능할 것, 규칙이 참조하는 필드가 정의돼 있을 것, 이 둘뿐이다. 2층의 unknown 격리는 애초에 온톨로지가 불완전할 것을 전제로 만든 장치다. 이렇게 썼다면 "온톨로지를 안 했다"가 "온톨로지 완성도에 의존하지 않게 설계했다"가 됐을 것이다.
  • Z3 대안 비교. 왜 단순 룰 엔진이 아니라 SMT solver인지에 대한 한 문단이 없었다. 제약이 서로 얽혀 조합적으로 충돌하는 경우에만 Z3가 정당하다.
  • 오류 누적 논증의 외부 근거. 관측 가능성 비대칭이라는 프레이밍 자체는 숫자 없이도 성립하지만, 관련 연구를 인용했다면 훨씬 단단했을 것이다. 반례가 되는 연구까지 같이 인용하고 내 설계로 답했다면 더 좋았다.

9. 아직 모르는 것

  • 개별 심사평을 받지 못했다. 위의 원인 분석은 전부 추정이다.
  • 예선은 AI 전수 채점이었다. 채점기가 매출 축에 실제로 얼마나 가중치를 뒀는지 나는 모른다.
  • 통과한 제출물들이 매출 축을 어떻게 다뤘는지도 모른다. 다들 비슷하게 보수적이었다면 내 진단은 틀렸다.
  • 88대 1 경쟁에서는 여러 축에서 조금씩 부족해도 걸린다. 단일 원인으로 설명하려는 시도 자체가 과적합일 수 있다.

회고

이번 기획을 보게 되면 놓친 것들에 의하여 잘못된 설계를 했다는 생각이 든다.

사실 배제된 방향을 보게 되면 실제 매출이라는 목표와 강하게 연결되어있는 가치들이 많다. 오히려 보게되면, 내가 선택한 방향은 하방을 강하게 끌어올리는 것을 지향하기 때문에 매출과의 직접적 연결은 배제된 가치들보다 적게된다.

정보이론에서는 편향과 관련한 말이 나온다. 나는 생존 편향 지식만 바라본 것이 아닌가 생각이 든다. 실제 내가 활용할 때 아름다운 지식들은 죽은 이들의 몸 속에 박혀있었는데 말이다.

이 부분이 조금은 뼈아프게 다가오고 내가 기획을 잘하기 위해서는 이러한 부분을 놓쳐서는 안된다고 생각이 든다.

2기가 열리면?

이번에는 듣고 싶어하는 이야기에 대해서 한 번 이야기 해볼까 생각도 있다.