답은 발명하는 게 아니라 수렴시키는 것
개인 AI 어시스턴트 런타임을 직접 만들어 굴리는 기록. 4편.
방향이 안 보일 때 내가 오래 하던 행동은 더 생각하는 것이었다. 앉아서 옵션을 나열하고 장단점을 재고 하나를 고른다.
지금은 다르게 한다. 방향이 안 보이는 건 생각이 부족해서가 아니라 리서치가 부족해서다. 리서치를 하고, 나온 걸 보고 더 팔지 어디를 팔지 판단하고, 그 판단으로 또 판다. 계속 돌리면 답은 대체로 하나로 수렴한다.
이걸 워크플로로 못 박았다. 이 글은 그 설계와, 그걸 처음 실전에 돌렸을 때 벌어진 일이다.
한 라운드의 구조
한 라운드는 넷으로 돈다. 팬아웃 → 종합 → 적대 → 판단.
팬아웃: 레인을 동시에 연다
네 종류의 레인을 같은 라운드에서 연다. 넓게 갈지 깊게 갈지를 고르는 게 아니다.
| 레인 | 하는 일 |
|---|---|
| 넓게 | 지형 전수, 선행 사례, 경쟁·유사 서비스, 대안 스택 |
| 깊게 | 1차 소스 원문 — 공고 PDF, 접수 화면, 데이터 실물, 저장소 코드, 약관 |
| 관점 | 같은 주제를 다른 이해관계자 눈으로 — 심사위원, 경쟁자, 사용자, 규제기관 |
| 적대 | 확증이 아니라 반증을 찾는 전용 레인 |
관점 레인이 따로 있는 이유가 있다. 폭은 쿼리 수가 아니라 관점 수에서 나온다. 스탠포드의 STORM 연구는 관점 기반 질문 생성으로 커버리지가 10%포인트, 조직성이 25%포인트 올랐다고 보고한다. 같은 주제에 쿼리를 스무 개 던지는 것보다 관점을 다섯 개 세우는 게 낫다.
레인마다 컨텍스트를 격리한다. LangChain이 Open Deep Research를 만들면서 실측한 게 있다. 한 컨텍스트에 여러 주제를 물으면 각 주제를 덜 깊게 파고 끝난다. 그래서 레인은 별 세션이나 서브에이전트로 돌린다.
그리고 레인 산출은 파일에 직접 쓴다. 요약을 말로 전달하면 전언 게임이 되어 증거가 샌다.
폭은 질의 가치에 비례시킨다
| 과제 | 폭 |
|---|---|
| 단순 사실 확인 | 팬아웃 없음. 1스레드 3~10 호출 |
| 비교·선택 | 2~4 레인 |
| 전수조사·착수 리서치 | 10+ 레인 |
이게 왜 필요하냐면, 깊이는 의지가 아니라 예산이기 때문이다. Anthropic의 멀티에이전트 리서치 보고에 따르면 BrowseComp 성능 분산의 80%를 토큰 사용량 단독이 설명한다. 반대로 팬아웃은 채팅 대비 약 15배 토큰을 쓴다. 마감 시각 하나 확인하는 데 열 개 레인을 여는 건 실패다.
종합: 네 칸으로 분류한다
발견을 사실 / 패턴 / 가설 / 모르는 것으로 나눈다. 인사이트로 승격하는 조건이 둘이다. 독립 출처가 두 개 이상이고, 우리 결정을 실제로 바꾼다.
두 번째 조건이 중요하다. 재밌지만 결정을 안 바꾸는 발견은 인사이트가 아니라 트리비아다.
적대: 매 라운드 최소 세 개
라운드 끝에 붙이는 장식이 아니라 처음부터 열어두는 레인이다.
- 반증 쿼리를 별도로 돌린다. 확증 쿼리만 던지면 확증만 나온다.
- 반대 포지션을 한 문단으로 최선을 다해 변호한다. 허수아비로 세우면 무효다.
- 에코 챔버를 점검한다. 소스들이 서로 베낀 것 아닌가. 같은 보도자료를 재탕한 것 아닌가. 합의는 수렴이 아니다.
- 킬러 질문: 이미 이걸 한 사람은 누구고 왜 실패했나. 이게 쉬웠다면 왜 아직 아무도 안 했나. 우리가 유리하다고 믿는 근거를 사실은 남들도 다 아는 것 아닌가.
형식적인 한 줄, "리스크: 시간 부족" 같은 건 적대가 아니다. 반론은 사실을 데리고 와야 한다.
판단: 이 루프의 축
라운드를 닫기 전에 명시적으로 답한다. 더 팔 것인가 멈출 것인가. 판다면 어디를. 지금 잡힌 잠정 방향은 무엇이고 이번 라운드가 그걸 바꿨는가 굳혔는가.
판단을 안 적고 다음 검색으로 넘어가면 라운드는 늘어나는데 방향은 안 생긴다. 그게 자료 수집과 리서치의 차이다.
증거를 다루는 규칙
소스 등급. 1차는 공고 원문, 접수 화면, 데이터 실물, 저장소 코드, 법령, 공식 API 문서다. 결정 근거로 쓸 수 있다. 2차는 기사, 후기, 요약 사이트다. 1차를 찾는 포인터이고 단독 근거는 안 된다. 3차는 검색 스니펫과 내 기억과 통념이다. 이건 소스가 아니라 검증 대상이다.
요약본과 원문이 충돌하면 원문이 이긴다. 실제로 요약 공고에 없던 배점표가 원문 PDF에서 나왔고, 그 표의 최대 배점 항목이 요약본에서 언급조차 안 된 항목이었던 적이 있다.
판정은 네 값이다. 확인 / 유력 / 미확인 / 반증. 두 문장이 여기 붙는다. 후보를 찾은 것은 확인이 아니다. 그리고 검색 부재는 부재의 증거가 아니다.
검증 경제학. 모든 주장을 같은 강도로 검증하지 않는다. 오류 비용 곱하기 검증 비용을 보고 깊이를 배분한다. 틀리면 제출 자체가 무효가 되는 사실은 1차 원문 이중 확인, 색깔 정도의 사실은 1회 확인 후 잔여 리스크만 적는다.
언제 멈추나
정지 조건이 셋이고, 셋을 다 만족할 때만 멈춘다.
- 새 라운드가 결정을 바꾸지 않는다. 새 소스가 나와도 방향이 그대로다.
- 적대 레인의 최강 반론에 사실 기반 응답이 있다. "리스크로 관리한다"는 회피지 응답이 아니다.
- 남은 미지수가 리서치로는 못 없애고 실행해야 풀리는 것뿐이다.
라운드 수는 계획이 아니라 판단의 출력이다. "세 라운드 돌자"고 미리 정하지 않는다.
그리고 반대 방향의 실패도 있다. 비수렴 신호를 만나면 라운드를 늘리지 말고 질문을 바꾼다. 라운드마다 방향이 뒤집히면 문제 정의가 틀린 것이다. 소스는 늘어나는데 새 사실이 없으면 에코 챔버다. 결론은 같은데 근거가 전부 2차면 아직 1차를 안 본 것이다.
하드 스톱도 있다. 라운드 수는 안 정하지만 시간 예산은 정한다. 마감 있는 일은 가용 시간의 3분의 1을 권장한다. 초과하면 최선 가설과 미해소 리스크 목록을 적고 착수한다. 리서치는 착수를 미루는 알리바이가 아니다.
병렬의 함정
팬아웃은 공짜가 아니다. Cognition이 실측한 게 있다. 병렬 에이전트는 서로의 암묵적 결정을 못 봐서 조립 단계에서 깨진다.
그래서 규칙이 하나 있다. 팬아웃은 조사까지. 집필과 최종 판단은 단일 스레드. 보고서 섹션을 병렬로 쓰면 결과물이 조각난다. LangChain이 같은 사고를 겪고 그 설계를 철회했다.
처음 실전에 돌렸을 때 무슨 일이 있었나
이 루프를 다섯 레인으로 처음 돌렸다. 주제는 "내 작업 기록을 한국어 장문 콘텐츠로 만드는 작법"이었다.
두 가지가 예상과 달랐다.
첫째, 레인 하나가 조용히 죽었다. 다섯 개를 발주했는데 파일이 넷만 생겼다. 실패 메시지도 없었다. 죽은 걸 몰랐다면 그 구멍은 영구히 안 메워졌을 것이다. 그래서 규칙을 추가했다. 종합에 들어가기 전에 발주한 파일이 전부 실재하는지 파일 시스템으로 확인한다. 죽은 레인은 복구 웨이브로 재발주하되, 그때 발주서에 "이미 수렴한 것" 목록을 넣어 중복 조사를 막는다.
둘째, 이게 더 중요하다. 원문 해부 레인이 자기 표본을 반증했다.
그 레인의 임무는 "실제로 크게 퍼진 한국어 장문을 모아 구조를 해부하라"였다. 여덟 편을 읽고 해부까지 마쳤는데, 마지막에 이렇게 적어놨다. 공개 지표로 확산이 확인되는 건 여덟 편 중 두 편뿐이고, 나머지는 공개 조회가 33에서 43회다. 그러니 작법 표본으로는 쓰되 성공 사례라고 부르지 않겠다고.
이 자기 반증이 그 라운드의 최대 발견이었다. 구조가 좋아도 유통이 없으면 안 퍼진다는 사실을, 좋은 구조를 가진 여덟 편의 실제 지표가 증명했다.
여기서 규칙 하나가 더 나왔다. 표본 적격 판정이 분석보다 먼저다. "X한 사례 N개를 모아 패턴을 뽑아라"는 과제에서, 모은 사례가 정말 X인지를 먼저 판정해야 한다. 아니면 아무 관계 없는 것들의 공통점을 패턴이라고 쓰게 된다.
그리고 루프가 목표의 전제를 공격했다
적대 레인이 결론이 아니라 목표를 공격했다.
내가 받은 목표는 "콘텐츠를 최대한 많이 올리기"였다. 적대 레인이 세 개의 근거를 들고 왔다. Ahrefs가 자사 색인 약 140억 페이지를 분석했더니 96.55%가 검색 유입 0이었다는 것. Google이 품질 자기점검에서 대량 생산을 경고 신호로 명시한다는 것. 주 1회 발행 목표가 품질 하락과 포기로 이어진 개인 회고가 있다는 것.
여기서 할 수 있는 반응이 둘이다. 목표를 내리거나, 목표의 단위를 다시 정의하거나.
목표를 내리는 건 답이 아니다. 목표는 상수로 두는 게 맞다. 대신 "많이"의 단위를 바꿨다.
- ❌ 발행 수 쿼터 — 소재를 발명해서 채우는 것
- ✅ 이미 실측 근거가 존재하는 작업을 남김없이 글로 회수하는 것
내 저장소에는 17일 캠페인 로그, 실측 순위 세 개, 제출 이력, 지출 분석이 글로 쓰이지 않은 채 쌓여 있다. 이건 대량 생산이 아니라 재고 회수다. 그리고 실측 숫자 없는 글은 쓰지 않는다는 게이트가 붙으면, 소재가 마를 때 글이 발명되는 게 물리적으로 불가능해진다.
목적함수 재정의도 판단 칸에 적는다. 원래 지시 원문을 그대로 옆에 두고 대조할 수 있게 남긴다. 그래야 나중에 "내가 목표를 슬쩍 바꿔치기한 것 아닌가"를 검증할 수 있다.
남은 질문
이 루프를 설계할 때 가장 어려웠던 건 정지 조건이었다. 리서치는 무한히 할 수 있고, 계속 하면 뭔가 계속 나오니까 멈추는 게 항상 조금 불안하다.
그래서 정지 조건을 "충분히 알았다는 느낌"이 아니라 **"새 라운드가 결정을 바꾸지 않는다"**로 잡았다. 느낌은 측정할 수 없고 결정 변화는 측정할 수 있다.
물어야 할 건 이거다. 지난 라운드가 내 결정을 바꿨나? 안 바꿨으면 두 가지 중 하나다. 수렴했거나, 질문이 틀렸거나. 소스는 늘어나는데 결정이 안 바뀐다면 후자를 먼저 의심하는 게 맞다.