ChatGPT가 당신이 아닌 경쟁사를 추천하고 있을지도 모릅니다 — 이를 확인하기 위한 도구를 구축한 방법
요약
AI 엔진(ChatGPT, Claude, Perplexity, Gemini) 내 브랜드 가시성을 측정하기 위한 도구 구축 과정을 다룹니다. API 호출의 병렬 처리 문제 해결과 비용 효율적인 텍스트 분석 로직 설계 방법을 설명합니다.
핵심 포인트
- Promise.allSettled를 사용하여 특정 엔진의 오류가 전체 스캔에 영향을 주지 않도록 설계
- 서버리스 함수의 타임아웃을 방지하기 위해 대규모 병렬 실행 대신 순차적 실행 방식 채택
- 비용과 결정론적 결과를 위해 LLM 대신 원문 텍스트 기반의 단순 탐지 로직 사용
ChatGPT가 당신이 아닌 경쟁사를 추천하고 있을지도 모릅니다 — 이를 확인하기 위한 도구를 구축한 방법
ChatGPT에게 최고의 프로젝트 관리 도구(project management tool)가 무엇인지 물어보세요. 또는 스타트업을 위한 최고의 CRM은 무엇인지, 혹은 당신의 카테고리에서 최고인 것이 무엇인지 물어보세요. 그러면 ChatGPT는 특정 브랜드가 포함된 구체적인 답변을 내놓을 것입니다. 만약 그 답변에 당신의 브랜드가 없다면, 당신은 잠재 고객이 있었는지조차 모르는 사이에 고객을 놓친 것입니다.
이것이 바로 제가 Relevyn을 통해 측정하고자 했던 문제입니다. ChatGPT, Claude, Perplexity, Gemini와 같이 인터넷의 새로운 첫 페이지로 조용히 자리 잡고 있는 AI 엔진들 사이에서 브랜드의 가시성(visibility)이 얼마나 되는가 하는 점입니다. 실제로 이를 측정하는 것은 생각보다 훨씬 더 흥미로운 엔지니어링 문제라는 것이 밝혀졌습니다.
네 개의 API, 네 가지의 서로 다른 실패 방식
가장 명백한 접근 방식은 네 개의 엔진 모두에 동일한 프롬프트(prompt)를 보내고 누가 언급되는지 확인하는 것입니다. 하지만 현실은 각 제공업체가 각자의 일정에 따라 서로 다른 방식으로 실패한다는 점입니다.
초기 버전은 모든 작업을 Promise.all을 사용하여 병렬(parallel)로 실행했습니다. 이는 하나의 엔진이 느려지거나 오류가 발생하면 전체 스캔이 함께 중단된다는 것을 의미했습니다. 이를 Promise.allSettled로 교체하여 문제를 해결했습니다. 이제 Perplexity에서 타임아웃(timeout)이 발생하더라도, 아무런 결과도 얻지 못하는 대신 나머지 세 개의 엔진으로부터 결과를 얻을 수 있습니다.
const responses = await Promise.allSettled(
engines.map((engine) => callEngine(engine, prompt))
);
각 엔진 호출에는 자체적인 재시도 로직(3회 시도, 503 오류 시 짧은 백오프(backoff) 적용)과 자체 타임아웃이 적용되며, 하나의 요청이 지연되어 전체 스캔이 멈추지 않도록 시간 제한을 두고 실행됩니다. 그럼에도 불구하고, 우리는 스캔당 6개의 프롬프트를 3개로 줄여야 했고, 한 번에 대규모 병렬로 실행하는 대신 순차적(sequentially)으로 실행해야 했습니다. 4개의 엔진 × 6개의 프롬프트가 결합된 지연 시간(latency) 때문에 서버리스 함수(serverless function)의 타임아웃이 계속 발생했기 때문입니다.
또 다른 LLM을 판독기로 사용하지 않고 텍스트 점수 매기기
여기서 유혹적인 방법은 각 응답을 LLM에 전달하고 "브랜드가 언급되었는가, 그리고 긍정적이었는가?"라고 묻는 것입니다. 우리는 핵심 탐지(detection) 단계에서 의도적으로 그 방식을 택하지 않았습니다. 그 방식은 더 느리고, 비결정론적(non-deterministic)이며, 하루에 수천 번 실행되어야 하는 작업에 비용을 추가하기 때문입니다.
대신, 원문 텍스트(raw text)에 대한 단순 탐지 로직을 사용합니다. 브랜드 이름이 존재하는가? 응답의 어느 부분에서 처음 나타나는가? 어떤 문장이 이를 언급하며, 해당 문장들이 긍정적 혹은 부정적 언어로 치우쳐 있는가? 동일한 응답 내에 경쟁사 이름이 존재하는가? "AI에게 AI를 채점하라고 요청하는 것"보다는 덜 우아해 보일 수 있지만, 이 방식은 빠르고 비용이 들지 않으며, 매번 동일한 입력에 대해 동일한 점수를 부여합니다. 이는 누군가에게 점수가 변했다고 말해야 하는 상황에서 매우 중요한 요소입니다.
스캔에 실제로 드는 비용
네 개의 상용 LLM API를 대상으로 대규모 쿼리를 실행하는 것은 공짜가 아니지만, 의도적으로 설계한다면 생각보다 저렴합니다. 대량의 탐지 작업에는 저렴한 모델을 사용하고, 출력 결과에 대한 추론 품질(reasoning quality)이 실제로 중요한 경우에만 더 비싼 모델을 혼합하여 사용하면, 전체 멀티 엔진 스캔 비용은 약 $0.06–0.09 범위 내에서 발생합니다. 저희가 초기에 저지른 값비싼 실수는 트래픽이 적은 베타 단계에서 프롬프트 캐싱 헤더(prompt caching headers)를 켜두었던 것입니다. 해당 트래픽 수준에서는 캐싱 이득 없이 지연 시간(latency)만 늘리고 간헐적인 503 오류를 유발했습니다. 이를 제거한 것이 그 어떤 재시도 로직(retry logic)보다 더 많은 신뢰성 문제를 해결했습니다.
우리의 생각을 바꾼 발견
정확히 동일한 브랜드에 대해 2주 간격으로 정확히 동일한 쿼리를 실행하더라도, 정확히 동일한 답변을 얻을 수는 없습니다. 이 모델들은 정적인 조회(static lookups) 방식이 아닙니다. 모델은 매번 답변을 새롭게 생성하며, 마지막 질문 이후 학습(training) 및 검색(retrieval) 과정에서 변경된 모든 요소에 의해 답변이 형성됩니다.
이는 일회성 "AI 가시성 감사(AI visibility audit)"가 거의 아무런 정보도 제공하지 못한다는 것을 의미합니다. 그것은 움직이는 표적을 찍은 사진일 뿐입니다. 실제로 유용한 유일한 방법은 추세(trend)를 관찰하는 것이며, 이것이 바로 Relevyn이 단일 보고서가 아닌 모니터링 도구로서 작동하는 근본적인 이유입니다.
자신의 브랜드가 어디에 위치하는지 확인하고 싶다면, 스캔은 무료입니다: relevyn.com.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기