사전 등록 문서

사전 등록(초안): 인용 파이프라인 해부 — 어디서 탈락하는가

  • 상태: v5 — 설계 잠금(FROZEN). 이후 설계를 더 다듬지 않는다. 착수 조건만 남음. (누적 수정 13건 — 10절)
  • 작성 2026-08-17
  • 선행: backlink-serp-citation · search-surface-divergence · query-rewriting
  • 이 문서는 별도 실험이던 "Retrieved-but-not-cited"를 한 설계 안에 흡수한다. 같은 수집으로 둘 다 답할 수 있고, 나누면 같은 호출을 두 번 사게 된다.

0. 왜 질문을 바꾸는가

지금까지 일곱 실험이 "무엇을 더 최적화할까"를 물었고, 답이 계속 부정형으로 돌아왔다.

이미 확인한 것
진단 점수 ↔ 인용 r = −0.07 (관계 없음)
최고점 표본 2곳 인용 0회
taehacri.com SEO 87 / GEO 88 · A등급 · 인용 0
백링크 ↔ 인용 색인 통제 후에도 남지만 ρ ≤ 0.29
색인 ↔ 인용 9.53배 — 지금까지 가장 큰 단일 효과

"무엇을 넣으면 오르는가"로는 여기서 더 못 나간다. 어디서 떨어지는지를 봐야 한다.

자사 사례가 그 질문을 강제한다

  • 사이트맵에 insights 88편이 전부 등재돼 있는데 도메인 한정 검색에서 회수되지 않는다
  • Gemini 에 브랜드를 직접 물으면 10/10, 발견형은 지역 3/30 · 전국 0/15

"AI 가 인트릭스를 모른다"가 아니다. 발견 과정에서 후보로 끌려오지 않는다. 이 둘은 처방이 완전히 다르다.


1. 측정이 가능한지 먼저 확인했다 (2026-08-17)

설계를 쓰기 전에 API 가 각 단계를 실제로 주는지 확인했다. 이게 안 되면 이 실험은 없다.

되는 것

include: ["web_search_call.action.sources"] 를 붙이면 회수된 후보 전체가 온다. 인용된 것만이 아니다.

질의: "서울에서 피부과 잘하는 곳 추천해줘"
  web_search_call 2라운드
    1라운드: 팬아웃 질의 3개 → 출처 18개
    2라운드: 팬아웃 질의 4개 → 출처 21개
  회수 도메인 20 · 인용 도메인 5 → 인용률 25%, 회수됐으나 미인용 15개

url_citation annotation 에 start_index · end_index 가 있어 답변의 어느 구간이 어느 출처에 붙었는지도 잰다.

검색은 여러 액션으로 나뉜다 (구조 단정은 하지 않는다)

파일럿에서 web_search_call2개 나왔고, 1번은 탐색형 질의, 2번은 1번에서 찾은 도메인을 site: 로 지목하는 검증형이었다.

액션1: 팬아웃 3개 (대한피부과학회 피부과 전문의 찾기 서울 …) → sources 18
액션2: 팬아웃 4개 (site:snubh.org 피부과 서울대학교병원 진료과 …) → sources 21

🔴 이것을 "OpenAI 검색은 2라운드 구조다"로 확정하지 않는다. 관측 1회다. API 스키마상 액션 타입은 search 외에 open_page·find_in_page 도 가능하다. 데이터에는 action_indexaction.type전부 저장하고, 몇 개가 나오는지는 결과로 보고한다. 2개만 계속 나오면 그때 구조라고 부른다.

sources 가 무엇인지 실측했다 — 구글 SERP 가 아니다

sources 를 "검색엔진이 반환한 후보"로 읽으면 안 된다. 같은 팬아웃 질의 3개를 그대로 구글(Serper)에 던져 대조했다.

도메인
sources (액션1) 18
구글 상위10 합집합(같은 질의 3개) 18
겹침 2 (11%)

sources 에만 있던 것: sungyesa.com · karb.or.kr · health.chosun.com · doctorsnews.co.kr 등 16개.

🔴 "OpenAI 는 구글을 쓰지 않는다"고 쓰지 않는다. 11% 겹침으로 증명되는 것은 백엔드 제공자가 아니다. 구글을 쓰되 재순위·필터를 강하게 걸어도 같은 결과가 나온다. 실측으로 말할 수 있는 것은 이것뿐이다.

OpenAI sources 와 동일 질의의 구글 상위 결과는 크게 다르며, 구글 SERP 를 P3 의 대리변수로 쓸 수 없다.

백엔드가 무엇인지는 이 실험의 결론일 필요가 없다. 따라서 두 가지가 따라온다.

  1. P3 을 "검색 결과 후보 진입"이라 부르지 않는다. sources 는 OpenAI 검색이 참조한 출처 집합이다. 이름을 참조 집합 진입(consulted-source entry) 으로 둔다. 여기 없다고 해서 "검색엔진 결과에 없었다"고 말할 수 없다.
  2. Serper 로 P3 을 대리 측정하는 것은 불가능하다. 11% 겹침은 대리 지표가 아니라 다른 것을 재는 것이다. (이 사실 자체가 별도 원장감이다)

2. 퍼널 정의 — 단계·단위·분모

애매한 단계를 두면 나중에 비율이 무엇의 비율인지 모르게 된다. 분모를 못 박는다.

단계 정의 관측 단위 분모 모델
P1 검색 발동 web_search_call 이 1개 이상 호출 전체 호출 양쪽
P2 팬아웃 생성된 검색어 수·내용 호출 검색 발동 호출 양쪽
P3 참조 집합 진입 어느 액션에서든 action.sources 에 등장 (호출 × 도메인) 검색 발동 호출 OpenAI만
P4 참조 후 미인용 P3 통과했으나 인용 없음 (호출 × 도메인) P3 통과 도메인 OpenAI만
P5 인용 url_citation 에 등장 (호출 × 도메인) P3 통과 도메인 OpenAI만
P6 인용 뒷받침 구간 인용 span 의 합집합 길이 문자 답변 전체 길이 양쪽
P7 브랜드 언급 답변 본문에 상호 문자열 호출 전체 호출 양쪽

🔴 P4·P5 를 검색 액션에 귀속시키지 않는다. url_citation 에는 어느 web_search_call 에서 왔는지 가리키는 id 가 없다(실측: 키가 type·url·title· start_index·end_index 뿐). 액션1에서 발견한 것을 인용했는지 액션2 검증 후 인용했는지 구별할 방법이 없다. 최종 인용 여부는 호출 단위로만 판정한다.

대신 검색 행동은 별도 축으로 기록한다 — 귀속이 아니라 기술(記述)이다.

항목 정의
action_index 몇 번째 검색 액션인가
action_type search / open_page / find_in_page
first_seen_action 그 도메인이 처음 등장한 액션 번호
re_seen 두 개 이상 액션에서 반복 등장했는가
site_targeted site: 연산자로 지목됐는가

🔴 P6 을 "흡수"라 부르지 않는다. API 가 알려주는 것은 "이 답변 구간이 이 인용과 연결돼 있다"이지 "이 URL 에서 내용을 가져와 생성했다"가 아니다. 이름을 인용 뒷받침 구간 비율(citation-supported text coverage) 로 둔다. 그리고 span 을 단순 합산하지 않는다 — 한 문장에 출처가 셋 붙으면 같은 구간을 세 번 세게 되어 100%를 넘길 수 있다. 합집합 길이 ÷ 전체 길이로 계산한다.

Gemini 는 퍼널이 아니라 별도 지표로 둔다

Gemini 는 groundingChunks 가 이미 인용된 집합이라 P3 이 없다. 따라서 P4·P5 도 정의되지 않는다(분모가 없다). 앞선 초안은 P5 분모를 "P3 통과 도메인 · 양쪽 모델"로 적었는데 그 자체가 모순이었다. 다음만 기록한다.

검색 발동 여부 · webSearchQueries · 인용 발생 여부 · 인용 출처 수 · 인용 뒷받침 구간 비율 · 브랜드 언급.

OpenAI 퍼널의 재현 실험으로 Gemini 를 쓰지 않는다.

3. 두 모집단 — 시장과 자사를 분리한다

한 배터리로 둘 다 하려 하면 자사가 후보에 거의 안 들어와 표본이 비고, 시장 퍼널은 자사와 무관한 값이 된다. 분리한다.

(A) 시장 퍼널 — 손실이 일반적으로 어디서 나나

  • 질의: 기존 배터리 144개(6업종 × 24). 하나도 바꾸지 않는다 — 기존 수집분과 대조 가능
  • 모델: gpt-5.6-luna · gemini-3.7-flash
  • 반복: k=3
  • 호출: 144 × 2 × 3 = 864

(B) 자사 퍼널 — 우리가 어디서 떨어지나

  • 질의: GEO·AI 검색 최적화 관련 40개. 지역형 24(지역 8 × 문형 3) + 전국형 16 (예: 부산 GEO 업체 추천 · AI 검색 최적화 대행사 · 생성형 엔진 최적화 컨설팅) ✅ 고정 완료(2026-08-17)scripts/research/backlink/queries-self.json (40개 전문)
  • 모델: 같음 · 반복 k=5 (자사 등장이 희소해 표본을 더 쌓는다)
  • 호출: 40 × 2 × 5 = 400

질의를 어떻게 골랐나 — 근거와 한계

지역 8곳: 기존 배터리 10곳 중 충북·강원을 뺐다. 남은 8 = 서울·경기·부산·인천· 대구·대전·광주·경남(특별시 1 + 광역시 5 + 도 2). 규칙은 "광고·웹 대행사가 실재하는 광역 단위"다. 🔴 이 선택은 결과에 편향을 준다. 개별업체가 아예 등장하지 않는 지역을 빼면 자사 P4·P5 가 실제보다 높게 나온다. 자사 퍼널 추정치는 이 8개 광역권에 조건부이며 도 단위로 일반화하지 않는다. F2a·F2b 는 같은 질의로 코호트를 재므로 짝 비교가 유지된다.

문형 3종: L-A·L-B 는 기존 배터리 A·B 와 같은 골격이라 시장 퍼널과 대조된다. L-C 는 구매자가 실제로 쓰는 문제 진술형(챗GPT에 우리가 안 나와)이다.

용어는 구글 자동완성으로 검증했다(Serper, 12씨앗, 2026-08-17). 두 개를 뺐다.

뺀 용어 자동완성이 가리킨 것 판단
LLM 최적화 llm inference 최적화 · llm 서빙 최적화 · llm 토큰 최적화 ML 엔지니어링. 대행사 질의가 아니다
AEO 단독 aeo 인증 · aeo payment 관세청 수출입안전관리 우수업체. GEO AEO 로 병기해야 뜻이 선다

실재가 확인돼 그대로 쓴 것: geo 업체 추천 · geo 대행사 추천 · geo 최적화 업체 · geo 전문 업체 · geo 컨설팅 업체 · geo aeo 업체 · 생성형 엔진 최적화(geo) · ai 검색 엔진 최적화.


4. 규모 근거 — 정밀도 계산

검정력이 아니라 비율 추정의 정밀도로 정한다. 퍼널은 군 비교가 아니라 단계별 통과율 추정이다.

95% 신뢰구간 반폭 기준 필요 관측 수:

참값 ±10%p ±5%p ±3%p ±2%p
0.02 8 31 84 189
0.05 19 73 203 457
0.25 73 289 801 1,801

🔴 위 표를 그대로 쓰면 안 된다. 관측이 독립이 아니기 때문이다. 한 호출에서 나온 출처 20개는 같은 질문·같은 검색행동·같은 응답 안에서 나왔고, 같은 질의를 k=3 반복한다. 초안에서 "8,600 관측 → ±0.9%p"라고 쓴 것은 오류다.

기존 수집분으로 급내상관을 추정했다(질의 138개, 질의당 반복 9.8회):

rho 설계효과 유효표본 실제 정밀도
0.10 6.9 1,246 ±2.4%p
0.20 12.8 672 ±3.3%p
0.77(실측 상한) 46.2 186 ±6.2%p

실측 0.77 은 "질의별 기관 비중"의 반복 간 상관이라 개별 출처 인용 이진값의 rho 보다 높게 잡힌 상한이다. 그래도 ±0.9%p 는 어떤 가정에서도 나오지 않는다.

따라서 신뢰구간은 공식으로 내지 않는다. 최종 CI 는 질의를 1차 군집으로 하는 군집 부트스트랩으로 낸다 — 질의 144개를 복원추출하고 그 질의에 속한 k=3 호출과 출처를 통째로 함께 뽑아 2,000회. 정밀도는 ±3~6%p 를 예상 범위로 두고 시작한다.

(A) 시장 퍼널 — 864호출

  • P1(미발동)·P7(브랜드 언급)은 단위가 호출이라 군집 문제가 작다 → OpenAI 432호출 기준 ±2.2%p
  • P4·P5 는 위 군집 부트스트랩으로 낸다

(B) 자사 퍼널 — 400호출

🔴 여기도 군집이 있다. 초안에 "자사 도메인 1개라 군집 문제가 없다"고 썼는데 오류다. 도메인이 하나여도 질의 40개 × k=5 구조라 같은 질의의 5회는 독립이 아니다. 부산 GEO 업체 추천 이라는 질문 자체가 자사를 잘 끌어오는 질문이면 그 5회는 함께 움직인다. 군집 구조가 시장은 질의 → 호출 → 출처, 자사는 질의 → 호출일 뿐 질의 수준 군집은 같다.

→ 자사 P3 도 질의 40개를 1차 군집으로 하는 부트스트랩으로 낸다. 유효 표본은 호출 200이 아니라 질의 40에 가깝다. 참값 2% 기준 단순 계산이면 ±1.9%p 지만 군집을 반영하면 실질 정밀도는 그보다 넓다. 구체 값은 부트스트랩 결과로 낸다.

  • 0 이 나올 경우 — 두 값을 구분해 쓴다. 초안은 이 둘을 섞었는데 estimand 가 다르다.

    무엇의 확률인가 관측 상한
    질의 단위 발견확률 P(k=5 중 1회 이상 등장) 질의 40개 전부 0 7.2%
    호출 단위 P3 P(한 호출의 참조 집합에 등장) 호출 200개 전부 0 군집 때문에 단순 상한 1.5% 를 쓰지 않는다

    전부 0 이면 부트스트랩도 CI 정보를 만들지 못한다. 그때는 이렇게 쓴다 — "질의 40개 모두에서 5회 반복 중 한 번도 등장하지 않았다. 질의 단위 발견확률의 95% 상한은 약 7.2% 다." 7.2% 를 호출 단위 P3 의 상한처럼 쓰지 않는다.

비용

항목 호출 추정
시장 퍼널 OpenAI 432 약 $82
시장 퍼널 Gemini 432 약 $12
자사 퍼널 OpenAI 200 약 $38
자사 퍼널 Gemini 200 약 $6
합계 1,264 약 $138

파일럿 20호출로 include 가 응답 크기·단가에 미치는 영향을 먼저 확인한다.


5. 사전 지정 가설

# 가설 반증 조건
F1 OpenAI 가 참조한 출처의 과반이 인용되지 않는다P(인용 | 참조) < 0.5 CI 하한 ≥ 0.5 면 반증. 0.5 를 걸치면 판정 불가
F2a 발견 병목 같은 질의 안에서 자사 P3 통과율이 경쟁 코호트 중앙값보다 낮다 (Δ<0) Δ 의 95% CI 하한 ≥ 0 이면 반증. 0 을 걸치면 판정 불가
F2b 선택 병목 P3 통과 조건에서 자사 인용률이 코호트보다 δ=10%p 이상 열등하지 않다(비열등성) Δ 의 95% CI 상한 < −δ 면 반증(= 선택 병목 존재). −δ 를 걸치면 판정 불가
F3 뒤 액션에 처음 등장하는 도메인 비율은 20% 미만이다 CI 하한 ≥ 0.20 이면 반증. 0.20 을 걸치면 판정 불가
F5 인용 뒷받침 구간 비율(P6)이 출처 유형에 따라 다르다 유형 간 차이가 5%p 미만이면 반증

🔴 F1 을 "최대 손실 구간"으로 묻지 않는다. 정의상 P4 + P5 = 100% 라 둘 중 무엇이 크냐는 동어반복이고, 시장 전체의 P3 진입률은 분모가 없다 — 인터넷의 모든 도메인을 분모로 "진입 못 한 비율"을 계산할 수는 없다. 측정 가능한 형태로 바꿨다. (파일럿 1회 관측은 5/20 = 25%였다)

🔴 F2a 는 질의별 짝으로 본다. 자사와 코호트가 같은 40개 질의에 모두 노출되므로, 질의마다 자사 P3 통과율 − 코호트 중앙 P3 통과율 을 계산해 40개 차이값을 만든다. 그 차이의 중앙값과 CI 를 질의 단위 부트스트랩으로 낸다. 이러면 "원래 아무도 못 찾는 질의"와 "다 잘 찾는 질의"의 난이도 차가 자동으로 상쇄된다. 자사 8% 대 코호트 17% 처럼 전체 평균끼리 비교하는 것보다 강하다.

판정표 — 사후 해석 여지를 없앤다

🔴 "유의하지 않음"을 "차이 없음"으로 쓰지 않는다. 세 갈래로만 판정한다.

가설 지지 반증 판정 불가
F1 P(인용|참조) < 0.5 CI 상한 < 0.5 CI 하한 ≥ 0.5 0.5 포함
F2a Δ(자사−코호트) < 0 Δ CI 상한 < 0 Δ CI 하한 ≥ 0 0 포함
F2b 자사가 δ 이상 열등하지 않음 Δ CI 하한 > −δ Δ CI 상한 < −δ −δ 포함
F3 < 0.20 CI 상한 < 0.20 CI 하한 ≥ 0.20 0.20 포함

F2b 의 비열등성 여유 δ = 10%p 로 사전 고정한다. 이 값을 결과를 보고 바꾸지 않는다. 5%p 로 잡으면 P3 표본이 훨씬 많이 필요해 이 규모로는 거의 항상 판정 불가가 된다. 10%p 는 "실무적으로 의미 있는 열세"의 하한으로 잡은 값이다.

🔴 F2b 를 "유의하게 낮지 않았다"로 판정하지 않는다. 자사 30% · 코호트 50% · p=0.20 이면 "유의하지 않음"이지만 실제로 20%p 낮은 것일 수 있다. 비열등성으로 물어야 답이 나온다.

F2b 의 Δ 를 정확히 정의한다

가설만 적고 추정량을 안 적으면 분석 때 자의가 들어간다. 못 박는다.

자사 조건부 인용률   = 자사의 P3 통과 건수 중 P5 비율          (질의별이 아니라 전체 풀링)
경쟁사 j 조건부 인용률 = 업체 j 의 P3 통과 건수 중 P5 비율
코호트 기준선        = 15개 경쟁사 조건부 인용률의 중앙값
Δ                  = 자사 조건부 인용률 − 코호트 기준선

자사 P3 가 희소해 F2a 처럼 질의별 차이를 만들 수 없다. 전체 풀링으로 낸다.

부트스트랩 절차: 질의를 복원추출할 때마다 위 네 줄을 처음부터 다시 계산한다 (자사 비율·경쟁사 15개 비율·중앙값·차이 순서로). 미리 계산한 값을 재사용하지 않는다.

🔴 계산 불가 replicate 규칙: 어떤 부트스트랩 표본에서 자사 P3 통과가 5건 미만이면 그 replicate 의 Δ 는 계산하지 않는다. 계산 불가 replicate 가 전체의 20% 를 넘으면 F2b 전체를 판정 불가 로 끝낸다. 남은 replicate 만으로 CI 를 내면 자사가 우연히 많이 통과한 표본만 남아 편향된다.

🔴 F2b 는 표본이 없으면 검정하지 않는다. 자사 P3 통과율이 2% 라면 200호출에서 기대 관측이 4건이다. 4건에서 인용이 0·1·2회면 조건부 인용률이 0%·25%·50% 로 튄다. P3 통과가 30건 미만이면 판정 불가(NOT ESTIMABLE) 로 끝낸다. "차이가 없다"고 쓰지 않는다.

🔴 비교 대상은 "시장 평균"이 아니다. 시장 퍼널은 피부과·변호사 등 다른 업종이라 그것과 비교하면 자사 효과 + 업종 효과 + 질의 효과가 섞인다. 대신 자사 40개 질의 안에서 사전 고정한 경쟁 코호트(GEO·SEO 업체 10~20곳)를 두고, 같은 질의에서 각 도메인의 참조 진입률인용률 | 진입 을 비교한다. 코호트 선정 기준과 목록은 수집 전에 문서에 고정한다.

F2a·F2b 가 이 실험의 핵심이다. F2a 만 성립하면 문제는 콘텐츠가 아니라 발견이고, F2b 가 반증되면 들어가고도 지는 것이라 선택 문제다. 지금은 둘이 섞여 있고 처방이 완전히 다르다. 둘 다 답이 안 나올 수도 있다 — 그 경우 F2b 는 판정 불가로 남긴다.

⚠️ F4(질의어 일치도)는 탐색으로 내린다. 어느 팬아웃 질의가 어느 출처를 끌어왔는지 알 수 없어 비교 대상 정의가 임의가 된다. 굳이 본다면 "같은 액션의 팬아웃 질의 각각과의 유사도 중 최대값"으로 못 박고, 주 결론에는 쓰지 않는다. 이번 실험의 목적은 어디서 떨어지는지 특정이지 왜 선택되는지 설명이 아니다.


6. 분석 (사전 고정)

  • 모든 추정치를 질의 군집 부트스트랩으로 낸다. 예외 없다. 🔴 초안은 "반복 없는 단순 호출 지표(P1·P7)만 Wilson"이라 했는데 틀렸다 — P1·P7 도 시장 144질의 × k=3, 자사 40질의 × k=5 로 같은 질의를 반복한다. 독립 호출이 아니다. Wilson 은 반복이 없는 파일럿에만 쓴다. 정규 근사를 쓰지 않는다 — 0 에 가까운 비율에서 음수 하한이 나온다
  • 군집 부트스트랩을 기본으로 한다 — 시장·자사 양쪽 모두. 질의를 복원추출하고 그 질의에 딸린 호출·출처를 통째로 함께 뽑아 2,000회. 독립 이항으로 계산하지 않는다 (급내상관 실측 상한 0.77, 설계효과 최대 46)
  • F2a: 질의별 자사 − 코호트 중앙값 차이의 중앙값 + 질의 단위 부트스트랩 CI
  • F4(탐색): 출처마다 같은 액션의 팬아웃 질의들과의 자카드 중 최댓값을 쓴다. 인용/미인용 두 군을 Mann-Whitney 로 비교하되 주 결론에 쓰지 않는다
  • 출처 유형: research_domains.kind그대로 쓴다. 이 실험 때문에 규칙을 고치지 않는다. 새로 등장한 도메인은 같은 스크립트로 분류하고 needs_review 건수를 함께 보고
  • 검색 행동 축(action_index·first_seen_action·re_seen·site_targeted)은 기술 통계로만 낸다. 인용을 액션에 귀속시키지 않는다
  • 검색 미발동 호출은 P2 이후 분모에서 제외하되 건수와 비율을 반드시 보고

7. 이 설계가 답하지 못하는 것

  1. 어느 팬아웃 질의가 어느 출처를 끌어왔는지 — API 가 라운드 단위로만 준다. 따라서 "이 검색어에 맞춰 쓰라"는 처방은 못 낸다.
  2. Gemini 의 참조 손실 — 후보 풀을 주지 않는다. Gemini 는 P3·P4·P5 가 정의되지 않는다(분모가 없다).
  3. 인과 — 관찰이다. "후보에 넣으면 인용된다"는 개입 실험이 필요하다.
  4. 웹 앱 — API 기준이다. 표면이 바뀌면 결과가 갈린다는 것을 이미 확인했다(자카드 0.065).
  5. 자사 P3 이 0 으로 나올 경우 그 이유(색인·권위·주제 불일치 중 무엇인지)는 이 설계로 못 가른다. 후속 실험이 필요하다.

8. 왜 이것부터인가 — 다른 실험과의 관계

이 실험이 F2 를 그러면 다음은
성립(후보 진입 실패) Fan-out Coverage RCT · Title×Answerability 의 retrieval 층에 집중
반증(선택에서 패배) Retrieved-but-not-cited pairwise · Freshness/Evidence RCT 로

지금 이 둘을 모른 채 개입 실험을 설계하면 어느 층을 건드릴지 못 정한다. 개입은 페이지 제작 비용이 크고 크덤집 RCT 때문에 10/05 까지 막혀 있다. 그때까지 자산을 건드리지 않는 측정으로 층을 특정해 두는 것이 이 실험의 값이다.


8-1. 경쟁 코호트 선정 기준 (수집 전 고정)

🔴 코호트가 결과를 좌우한다. 센 곳만 넣으면 자사가 나쁘게, 약한 곳만 넣으면 좋게 나온다. 그래서 사람이 고르지 않는다. 기준을 먼저 정하고 기계적으로 뽑은 뒤 목록을 문서에 박는다.

선정 절차

  1. 모집단 — 자사 퍼널 질의 40개를 Serper 로 먼저 돌려 구글 상위 30 에 등장한 도메인 전체를 모은다. 이 단계는 AI 를 쓰지 않는다(순환 방지).
  2. 자격 필터 — 아래를 전부 충족
    • 도메인 대장 분류가 business (기관·플랫폼·미디어 제외)
    • GEO·SEO·AI 검색 최적화를 주 서비스로 명시한 국내 업체
    • 자체 도메인 보유 · 구글 색인 10페이지 이상
  3. 제외 — 자사(intrix.kr) · 자문 관계사 · 동명 법인 5개 이상인 상호 (엔티티 실패로 결과가 오염된다 — 실측된 실패 유형)
  4. 표집 — 자격 통과분을 구글 등장 빈도 순으로 정렬해 상·중·하 3구간으로 나누고 각 구간에서 5곳씩 = 15곳. 상위만 뽑으면 자사가 불리하고, 하위만 뽑으면 유리하다.
  5. 고정 — 최종 15곳을 id·도메인·구간과 함께 이 문서에 적고 커밋한다. 수집 시작 후에는 바꾸지 않는다.

왜 이 기준인가

  • 구글 등장 빈도로 층화하는 이유: 우리가 재려는 것은 "OpenAI 참조 집합 진입"인데, 그 선정 기준을 OpenAI 로 잡으면 순환이 된다. 독립 엔진인 구글을 층화 변수로만 쓴다. 🔴 다만 구글 상위 = OpenAI 참조 후보가 아니다(실측 겹침 11%). 층화에만 쓰고 기준선으로 해석하지 않는다.
  • 3구간 균등 표집: 코호트 중앙값이 특정 구간에 쏠리지 않게 한다. F2a 가 중앙값 비교라 분포 모양이 결론을 바꾼다.
  • 15곳: 질의별 중앙값을 안정적으로 내려면 홀수이고 10 이상이 필요하다. 40 질의 × 16 도메인(자사 포함) = 640 관측이면 짝 비교에 충분하다.

한계

코호트는 "구글에 잡히는 GEO 업체" 다. 구글에도 안 잡히는 업체는 애초에 들어오지 않으므로 비교군이 실제 시장 전체보다 강한 쪽에 치우친다. 자사가 낮게 나와도 "시장 전체보다 못하다"가 아니라 "구글에 잡히는 동종 업체들보다 못하다" 로 읽는다.


확정 코호트 15곳 (2026-08-17, 시드 20260817)

자격 통과 72곳 → 등장 빈도 3분위(24/24/24) → 고정 시드 Fisher–Yates 로 각 5곳. 재현: npx tsx scripts/research/backlink/{collect-cohort-serp,select-cohort,sample-cohort}.ts

코호트 ID 구간 등장 질의수 최고 순위
C01 16 1
C02 1 24
C03 2 27
C04 23 1
C05 6 18
C06 1 23
C07 2 20
C08 3 2
C09 6 16
C10 1 19
C11 2 3
C12 5 6
C13 1 21
C14 4 19
C15 1 13

🔴 도메인은 공개하지 않는다. 개별 업체의 순위·인용 수를 실명으로 공개하지 않는 것이 이 저장소의 원칙이다. 대신 사후에 목록을 바꾸지 않았음을 검증할 수 있게 커밋값을 남긴다.

정렬된 15개 도메인을 개행으로 이어붙인 문자열의 SHA-256
8755234727bc618b549bdaec2be8f28be0189292e363275aadc62181958d53f3

결과 공개 시 원본 목록을 함께 내면 이 해시로 대조할 수 있다. 원본은 비공개 저장소의 scripts/research/backlink/cohort-final.json 에 2026-08-17 자로 커밋돼 있다.

수집 중 드러난 사실 4가지를 함께 남긴다.

  1. 🔴 Serper 는 num 을 무시한다. num:30 을 줘도 페이지당 9~10건만 온다. 첫 수집이 상위 10 만 긁어 도메인 79개로 끝났고, page 로 다시 받으니 271개였다. google-overlap/collect.ts:97 에 이미 적혀 있던 사실을 새 스크립트에서 되풀이했다.
  2. 🔴 중·하 구간이 사실상 겹친다. 자격 통과 72곳 중 절반 가까이가 40질의 중 1개에만 등장한다. 하위 구간은 전부 1질의이고 중위도 1~4질의다. 층화가 의도만큼 분리되지 않았다. 기준을 바꾸지 않고 그대로 간다 — 여기서 층화 규칙을 손보면 사전 고정의 의미가 없다. 대신 코호트 중앙값이 저빈도 업체에 좌우될 수 있다는 것을 결과 해석에 명시한다.
  3. 봇 차단 8곳을 SERP 스니펫으로 재판정했다. 403 은 업체 품질이 아니라 클라우드플레어 설정이다. 다만 본문을 못 읽으면 국적을 확인할 수 없으므로 국내 여부는 도메인 증거 (.kr TLD 또는 kr. 서브도메인)로만 인정했다. 구글이 한국 로케일 스니펫에 한글을 섞어주기 때문에 스니펫의 한글 비율은 국적 증거가 못 된다 — 북미 대행사가 그 경로로 한 번 통과했다.
  4. 같은 브랜드는 병합한다. masstige.iomasstige.biz 로 접었다. TLD 만 다른 같은 회사가 15칸 중 2칸을 먹으면 그 회사가 중앙값을 두 번 끌어당긴다.

🔴 남은 수작업 하나 — 8-1 절 3단계의 "동명 법인 5개 이상" 은 상호 조회가 필요해 자동화하지 않았다. 수집 시작 전에 15곳 상호를 확인하고, 해당하는 곳이 있으면 같은 시드로 그 구간에서 다음 순번을 올린다(다시 뽑지 않는다).


9. 착수 조건

  • 자사 퍼널 질의 40개 확정 — queries-self.json (3절)
  • 경쟁 코호트 15곳 — 위 표
  • 파일럿 20호출 (2026-08-17) — 아래
  • 이 문서 공개 등록

파일럿 결과 (10질의 × 2모델 × 1회 = 20콜, 20/20 성공)

항목
OpenAI 호출당 참조(P3) 22.8건
OpenAI 호출당 인용(P5) 4.4건
P(인용|참조) 0.193 (참조 228 → 인용 44)
Gemini 호출당 인용 8.4건 (해소 실패 0)
OpenAI 토큰 입력 21,466 · 출력 1,562 (호출당 평균)
본 수집 200콜 추정 입력 4.3M · 출력 0.31M 토큰

include 는 작동한다. 참조 집합이 호출당 22.8건 나온다. 이게 없으면 P3 자체가 없다.

🔴 Gemini P5 는 하마터면 통째로 날아갈 뻔했다. 첫 파일럿에서 인용 호스트가 호출당 0~1개로 나왔는데, 전부 vertexaisearch.cloud.google.com 리다이렉터였다. 해소하니 호스트 종류 1개 → 46개, 호출당 8.4개가 됐다. agency-visibility/resolve.ts 가 이미 푼 문제인데 새 수집기에서 되풀이했다. 해소는 resolve-funnel.ts 로 분리했다.

🔴 자사 표본 — F2b 가 판정 불가로 끝날 가능성이 크다

OpenAI 참조 OpenAI 인용 Gemini 인용
자사 0/10 0/10 0/10

같은 파일럿에서 코호트 15곳 중 7곳이 등장했고(OpenAI 참조 4곳), 구글 상위 30 에서도 자사는 40질의 중 1개(11위)뿐이었다.

0/10 은 "0" 이 아니다 — 3의 법칙으로 호출당 참조율의 95% 상한은 약 26% 다. 다만 본 수집 200콜에서 자사 P3 가 30건에 닿으려면 호출당 15% 가 필요하고, 점추정은 그 반대를 가리킨다. 사전 지정대로 자사 P3 < 30 이면 F2b 는 NOT ESTIMABLE 로 끝낸다 — 이 결과를 보고 기준을 낮추지 않는다.

그렇다고 실험이 죽지 않는다. 오히려 이쪽이 더 명확한 결론이다.

가설 자사 P3 가 0 에 가까울 때
F1 P(인용|참조) < 0.5 시장·코호트 표본으로 검정된다. 파일럿 점추정 0.193
F2a 발견 병목 Δ 가 강하게 음수 → 지지. "우리는 선택에서 진 게 아니라 발견되지 않는다"
F2b 선택 병목 NOT ESTIMABLE. 조건부 인용률을 낼 분모가 없다
F3 · P1~P7 영향 없음

착수한다. 발견 병목이 확인되면 다음 개입은 인용률이 아니라 참조 집합 진입을 겨냥해야 한다는 뜻이고, 그게 이 실험을 하는 이유다.

  • 진단 큐 비어 있는지 확인 후 배포

10. 변경 이력

  • 2026-08-17 초안 v1.
  • 2026-08-17 v2 — 외부 검토로 오류 4건을 고쳤다. ① P3 을 "후보 진입"에서 참조 집합 진입으로 개명. sources 가 구글 SERP 와 11%밖에 안 겹치는 것을 실측해 확인했다 — 검색엔진 순위 병목이라 단정할 수 없다. ② P4·P5 의 액션 귀속을 삭제. url_citation 에 검색 호출 id 가 없다(실측). 액션 축은 기술 통계로만 남긴다. ③ ±0.9%p 삭제. 관측이 질의 안에서 군집돼 있다. 급내상관 실측 상한 0.77, 설계효과 46, 유효표본 186 → ±6.2%p. 최종 CI 는 군집 부트스트랩으로 낸다. ④ F2 를 F2a(발견)·F2b(선택)로 분리하고, F2b 는 P3 통과 30건 미만이면 판정 불가로 끝낸다. 비교 대상도 시장 평균이 아니라 같은 질의 안의 경쟁 코호트로 바꿨다. 그 밖에 P6 을 "흡수"에서 인용 뒷받침 구간 비율로 고치고 span 합집합 계산을 명시, Gemini 를 퍼널에서 분리(P3 없으면 P4·P5 분모도 없다), F4 를 탐색으로 강등, "2라운드 구조" 단정을 관측 기술로 완화했다.
  • 2026-08-17 v3 — 3건 추가 수정.자사 퍼널의 군집을 놓쳤다. 도메인이 하나여도 질의 40 × k=5 라 질의 수준 군집이 그대로 있다. 시장만 고치고 자사에서 같은 실수를 반복했다. 양쪽 다 부트스트랩으로. 0 일 때 상한도 1.5%(호출 기준)가 아니라 7.2%(질의 기준) 로 정정. ⑥ F1 재정의. P4+P5=100% 라 "최대 손실 구간"은 동어반복이고 시장 P3 는 분모가 없다. P(인용|참조) < 0.5 로 바꿔 측정 가능하게 했다. ⑦ F2a 를 질의별 짝 비교로. 같은 40개 질의에 자사와 코호트가 함께 노출되므로 질의 난이도를 짝으로 상쇄한다. 평균끼리 비교하는 것보다 강하다.
  • 2026-08-17 v4 — 판정 규칙 3건 수정. 여기까지가 사전등록 조건이었다."CI 가 0 을 포함하면 반증"은 틀렸다. 그건 반증이 아니라 판정 불가다. 모든 가설을 지지/반증/판정불가 세 갈래 표로 잠갔다. ⑨ F2b 를 비열등성으로 재정의. "유의하게 낮지 않음"은 "낮지 않음"의 증거가 아니다. 자사 30%·코호트 50%·p=0.20 이면 유의하지 않지만 실제로 20%p 낮다. 여유 δ=10%p 를 사전 고정했다. ⑩ 7.2% 의 estimand 를 명시. 그것은 질의 단위 발견확률의 상한이지 호출 단위 P3 의 상한이 아니다. 두 값을 섞어 쓰지 않는다. 그리고 6절의 Wilson 목록에 자사 P3 가 남아 있던 모순을 정리했다.
  • 2026-08-17 1차 수집·분석 결과 (400콜, 실패 0) — 9절 아래에 적었다. 🔴 F2a 추정량이 퇴화했다. 40/40 질의에서 코호트 중앙 P3율이 0 이라 차이가 음수가 될 수 없다. 사전 규칙의 기계적 출력은 '반증'이지만 검정력 0 인 검정으로 가설을 기각하지 않는다 — 판정 불가로 남긴다. 임계값은 손대지 않았고, 추정량이 뒷받침 못 하는 판정을 거부하는 가드만 넣었다. 8-1 절 한계에 "중앙값이 저빈도 업체에 좌우될 수 있다"고 적어놓고 조치하지 않은 결과다. 🔴 수집기가 명세를 다 담지 않았다. P6(인용 span)·P7(답변 본문)·액션 축을 저장하지 않아 F3·F5 를 계산할 수 없다. 2차 수집으로 채운다(아래).
  • 2026-08-17 v5 — 3건 수정 후 설계 잠금.P1·P7 도 군집이다. "반복 없는 단순 호출 지표"라 했는데 시장 144×k=3, 자사 40×k=5 로 같은 질의를 반복한다. 군집을 세 번째로 놓쳤다. 모든 추정치를 질의 군집 부트스트랩으로 통일했다. ⑫ F2b 의 추정량을 정의했다. 가설만 있고 "코호트 인용률"을 하나의 수로 만드는 방법이 없었다. 전체 풀링 → 경쟁사 15개 중앙값 → 차이로 고정하고, 부트스트랩마다 처음부터 재계산하며, 계산 불가 replicate 가 20% 를 넘으면 판정 불가. ⑬ "OpenAI 는 구글을 쓰지 않는다"를 삭제. 11% 겹침이 증명하는 것은 백엔드가 아니다. "구글 SERP 를 P3 의 대리변수로 쓸 수 없다"까지만 쓴다.

🔒 여기서 설계를 잠근다. 더 다듬는 것은 이제 researcher degrees of freedom 을 늘리는 쪽이다. 이후 변경은 수집 시작 전이라도 이 이력에 사유와 함께 남긴다.