사전 등록 문서
사전 등록(초안): 인용 파이프라인 해부 — 어디서 탈락하는가
(주)인트릭스 · 결과가 나오기 전에 확정·공개했습니다
- 상태: 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_call 이 2개 나왔고, 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_index 와 action.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 의 대리변수로 쓸 수 없다.
백엔드가 무엇인지는 이 실험의 결론일 필요가 없다. 따라서 두 가지가 따라온다.
- P3 을 "검색 결과 후보 진입"이라 부르지 않는다.
sources는 OpenAI 검색이 참조한 출처 집합이다. 이름을참조 집합 진입(consulted-source entry)으로 둔다. 여기 없다고 해서 "검색엔진 결과에 없었다"고 말할 수 없다. - 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. 이 설계가 답하지 못하는 것
- 어느 팬아웃 질의가 어느 출처를 끌어왔는지 — API 가 라운드 단위로만 준다. 따라서 "이 검색어에 맞춰 쓰라"는 처방은 못 낸다.
- Gemini 의 참조 손실 — 후보 풀을 주지 않는다. Gemini 는 P3·P4·P5 가 정의되지 않는다(분모가 없다).
- 인과 — 관찰이다. "후보에 넣으면 인용된다"는 개입 실험이 필요하다.
- 웹 앱 — API 기준이다. 표면이 바뀌면 결과가 갈린다는 것을 이미 확인했다(자카드 0.065).
- 자사 P3 이 0 으로 나올 경우 그 이유(색인·권위·주제 불일치 중 무엇인지)는 이 설계로 못 가른다. 후속 실험이 필요하다.
8. 왜 이것부터인가 — 다른 실험과의 관계
| 이 실험이 F2 를 | 그러면 다음은 |
|---|---|
| 성립(후보 진입 실패) | Fan-out Coverage RCT · Title×Answerability 의 retrieval 층에 집중 |
| 반증(선택에서 패배) | Retrieved-but-not-cited pairwise · Freshness/Evidence RCT 로 |
지금 이 둘을 모른 채 개입 실험을 설계하면 어느 층을 건드릴지 못 정한다. 개입은 페이지 제작 비용이 크고 크덤집 RCT 때문에 10/05 까지 막혀 있다. 그때까지 자산을 건드리지 않는 측정으로 층을 특정해 두는 것이 이 실험의 값이다.
8-1. 경쟁 코호트 선정 기준 (수집 전 고정)
🔴 코호트가 결과를 좌우한다. 센 곳만 넣으면 자사가 나쁘게, 약한 곳만 넣으면 좋게 나온다. 그래서 사람이 고르지 않는다. 기준을 먼저 정하고 기계적으로 뽑은 뒤 목록을 문서에 박는다.
선정 절차
- 모집단 — 자사 퍼널 질의 40개를 Serper 로 먼저 돌려 구글 상위 30 에 등장한 도메인 전체를 모은다. 이 단계는 AI 를 쓰지 않는다(순환 방지).
- 자격 필터 — 아래를 전부 충족
- 도메인 대장 분류가
business(기관·플랫폼·미디어 제외) - GEO·SEO·AI 검색 최적화를 주 서비스로 명시한 국내 업체
- 자체 도메인 보유 · 구글 색인 10페이지 이상
- 도메인 대장 분류가
- 제외 — 자사(
intrix.kr) · 자문 관계사 · 동명 법인 5개 이상인 상호 (엔티티 실패로 결과가 오염된다 — 실측된 실패 유형) - 표집 — 자격 통과분을 구글 등장 빈도 순으로 정렬해 상·중·하 3구간으로 나누고 각 구간에서 5곳씩 = 15곳. 상위만 뽑으면 자사가 불리하고, 하위만 뽑으면 유리하다.
- 고정 — 최종 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가지를 함께 남긴다.
- 🔴 Serper 는
num을 무시한다. num:30 을 줘도 페이지당 9~10건만 온다. 첫 수집이 상위 10 만 긁어 도메인 79개로 끝났고,page로 다시 받으니 271개였다.google-overlap/collect.ts:97에 이미 적혀 있던 사실을 새 스크립트에서 되풀이했다. - 🔴 중·하 구간이 사실상 겹친다. 자격 통과 72곳 중 절반 가까이가 40질의 중 1개에만 등장한다. 하위 구간은 전부 1질의이고 중위도 1~4질의다. 층화가 의도만큼 분리되지 않았다. 기준을 바꾸지 않고 그대로 간다 — 여기서 층화 규칙을 손보면 사전 고정의 의미가 없다. 대신 코호트 중앙값이 저빈도 업체에 좌우될 수 있다는 것을 결과 해석에 명시한다.
- 봇 차단 8곳을 SERP 스니펫으로 재판정했다. 403 은 업체 품질이 아니라 클라우드플레어
설정이다. 다만 본문을 못 읽으면 국적을 확인할 수 없으므로 국내 여부는 도메인 증거
(
.krTLD 또는kr.서브도메인)로만 인정했다. 구글이 한국 로케일 스니펫에 한글을 섞어주기 때문에 스니펫의 한글 비율은 국적 증거가 못 된다 — 북미 대행사가 그 경로로 한 번 통과했다. - 같은 브랜드는 병합한다.
masstige.io를masstige.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 을 늘리는 쪽이다. 이후 변경은 수집 시작 전이라도 이 이력에 사유와 함께 남긴다.