애니모프
경력근거: 브라우저 자동화 기술을 통해 여러 AI 엔진에 하루 수만 번 질문하고, 브랜드가 어떻게 인식되고 인용되는지 분석합니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 브라우저 자동화로 여러 AI 엔진에 하루 수만 번 질문하고 브랜드가 어떻게 인식되고 인용되는지 분석한다고 밝히면서, AI 응답과 인용 출처, 브랜드 가시성 데이터 수집과 분석을 주요업무 한 줄로 적습니다. 이 포트폴리오는 그 수집 결과가 도착한 다음 자리를 만듭니다. 답변을 몇 건 모았는지가 아니라 그 답을 떠받친 주소가 우리 글인지 경쟁사 글인지 갈라야 다음에 쓸 글이 정해지고, 그 판단을 고객사 마케팅 담당자가 직접 보는 화면이 애니모프가 파는 물건입니다. 공고가 K-Beauty 대표 브랜드 5곳 이상을 고객으로 확보했다고 적은 만큼 추적 질문 목록과 자사 글 목록이 계정마다 이미 쌓여 있을 것이고, 그 두 가지가 있어야만 이 대조가 성립합니다. 다만 이 포트폴리오는 수집된 응답을 규칙으로 대조하고 화면으로 세우는 설계를 보여줍니다. 검색 엔진의 인용 선택 원리나 콘텐츠 최적화 실무 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
주요업무에 ChatGPT·Claude·Gemini 를 대상으로 하는 브라우저 자동화 시스템 개발과 하루 수만 건 규모의 질의·응답 처리 백엔드가 나란히 적혀 있습니다. 데이터를 밖에서 계속 받아 오는 일이 제품의 시작점입니다.
AI 응답과 인용 출처, 브랜드 가시성 데이터 수집과 분석을 한 줄로 묶어 주요업무에 둡니다. 답변을 몇 건 모았는지가 아니라 그 답이 어느 글을 근거로 삼았는지가 이 회사가 파는 값입니다.
정해진 기획서를 받아 구현하는 자리가 아니라 고객 문제를 이해하고 제품을 설계·배포하고 결과까지 확인한다고 못박습니다. 클라우드 인프라와 배포 파이프라인 구축도 같은 사람의 일입니다.
마케팅 담당자가 추적할 질문 목록과 세 엔진에서 받아 온 답변 원문, 우리 글과 경쟁사 글 주소를 올리면 질문마다 인용 판정이 붙습니다. 답변 원문에서 브랜드 표기를 별칭 표로 찾아 몇 번째로 불렸는지까지 규칙이 다시 읽고, 답변이 단 출처 주소를 우리 글·경쟁사 글 목록과 짝지어 겹치는지 세어 다섯 갈래로 나눕니다. 모델은 판정이 끝난 뒤 다음에 쓸 글 한 줄을 제안하는 자리에만 들어갑니다.
K-뷰티 브랜드에서 AI 검색 노출을 맡은 마케팅 담당자 — 매일 ChatGPT·Claude·Gemini 에 같은 질문을 손으로 쳐 보지만 답이 매번 달라서, 어제와 무엇이 달라졌는지 대지 못한 채 주간 보고를 쓴다
AI 답변에 이름이 나왔는지만 세면 무엇을 고칠지가 안 나옵니다. 답변이 실제로 단 출처 주소를 우리 글 목록과 짝지어 두면, 이름은 나오는데 우리 글은 한 번도 안 읽히는 질문과 경쟁사 글에 자리를 내준 질문이 갈라져 다음에 쓸 글이 정해집니다.
마케팅 담당자가 쓰는 화면 하나가 돕니다. 추적 질문 목록과 세 엔진 답변 원문, 우리 글·경쟁사 글 주소를 올리면 질문마다 판정이 붙고 판정별 묶음과 근거가 한 화면에 뜹니다. 답변 원문에서 브랜드 표기를 별칭 표로 찾고 번호 목록에서 순위를 읽는 데까지 1주차에 하며, 브라우저 자동화는 붙이지 않고 응답을 내려받은 파일로 읽는 것으로 시작합니다.
담당자가 답변 원문을 읽고 정한 판정 60건으로 일치율을 자동으로 내고, 어긋난 건이 주소 대조에서 갈라졌는지 브랜드 표기 찾기에서 갈라졌는지 나눠 리포트로 냅니다. 판정별로 다음에 쓸 글의 제목과 담을 근거를 모델이 짓고, 인용한 컬럼이 입력에 없으면 그 응답을 버립니다. 2주차부터 AWS 로 배포해 담당자가 계정으로 들어와 씁니다.
Playwright 로 세 엔진에 같은 질문을 던져 답변과 출처를 받아 오는 수집기를 붙여 사람이 올리지 않아도 판정이 매일 새로 돌고, 어제와 판정이 달라진 질문을 담당자에게 알립니다.
담당자가 질문 목록과 세 엔진 응답을 올리면 질문마다 판정이 뜨고, 어느 주소가 우리 글이고 어느 주소가 경쟁사 글인지 그 자리에서 펼쳐집니다.
출처 목록이 비어 있는 응답, 브랜드를 영문 표기로만 적은 답변, 번호 없이 줄글로만 온 답변, 순위가 1위인 극단 사례와 12위로 밀린 사례를 섞은 입력 30종을 넣어도 화면이 죽지 않고 그 질문이 왜 인용 개수 없이 남았는지 읽힙니다.
열 이름이 빠지거나 주소 칸이 비거나 인코딩이 깨진 파일 12종을 올려도 목록 대신 어느 줄이 왜 걸렸는지 이슈로 뜨고 나머지 질문은 그대로 판정됩니다.
담당자가 답변 원문을 읽고 정한 판정 60건으로 일치율을 냅니다. 단, 응답과 정답을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며 실제 적중률은 애니모프가 세 엔진에서 실제로 받아 온 응답과 고객 브랜드의 글 목록이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
일치율 수치는 제가 만든 답변 원문에 제가 정답을 매겨 낸 것이라 성능 증명이 아닙니다. 면접에서는 애니모프가 실제로 받아 온 응답을 넣었을 때 어느 판정부터 무너질지로 이야기하겠습니다.
답변을 지어낸 사람과 정답을 매긴 사람이 같으니 잘 맞는 것은 당연합니다. 출처 목록이 빈 응답, 브랜드를 영문 표기로만 적은 답변, 순위 1위와 12위, 번호 없이 줄글로만 온 답변을 더미에 일부러 섞어 쉬운 답변만 골라 푸는 함정을 피합니다.
AI 답변은 같은 질문에도 매번 달라집니다. 하루치 응답 한 벌로 판정을 확정하면 그날의 우연을 성과로 읽게 되므로 회차를 쌓아 며칠 연속 같은 판정이 나온 질문만 우선순위로 올립니다.
우리 글이 인용됐다는 사실이 곧 매출로 이어진다는 뜻은 아닙니다. 인용은 답변에 주소가 붙었다는 것까지만 말하므로 판정을 성과로 읽지 않게 근거가 된 주소를 항상 같이 보여줍니다.
실제 도입에서는 엔진마다 출처를 주는 방식이 다르고 화면 구조가 자주 바뀝니다. 수집이 깨지면 판정이 통째로 비므로 응답 원본을 그대로 남겨 두고 수집과 판정을 갈라 두었지만, 엔진별 수집 유지 보수는 도입 단계 과제로 분리합니다.
고객 계정으로 엔진에 로그인해 질문을 던지는 일은 각 엔진의 이용 약관과 계약이 있어야 하므로 이 포트폴리오의 범위 밖입니다. 여기서는 이미 받아 온 응답을 대조하는 데까지만 다룹니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
브랜드가 매일 추적하는 질문 목록입니다. 대조의 기준 축이며 어느 브랜드를 우리로 보고 어느 브랜드를 경쟁사로 볼지가 여기서 정해집니다.
| prompt_id | topic_id | question_text | target_brand | competitor_brands | tracked_since |
|---|---|---|---|---|---|
| Q-1042 | T-01 | 여드름 피부 토너 추천 | 모이스트랩 | ["세라뷰","아뜰리에벨"] | 2026-06-01 |
| Q-1057 | T-02 | 저자극 클렌징오일 순위 | 모이스트랩 | ["세라뷰","퓨어원"] | 2026-06-01 |
| Q-1063 | T-03 | 민감성 선크림 성분 비교 | 모이스트랩 | ["세라뷰","아뜰리에벨"] | 2026-06-14 |
| Q-1078 | T-04 | 앰플과 세럼 차이 | 모이스트랩 | ["퓨어원"] | 2026-06-14 |
| Q-1085 | T-05 | 모공 관리 루틴 추천 | 모이스트랩 | ["세라뷰","퓨어원"] | 2026-07-02 |
아래 JSON Schema 에 맞는 prompt_set 행을 더 만들어 주세요. {"type":"object","properties":{"prompt_id":{"type":"string"},"topic_id":{"type":"string"},"question_text":{"type":"string"},"target_brand":{"type":"string"},"competitor_brands":{"type":"array","items":{"type":"string"}},"tracked_since":{"type":"string"}},"required":["prompt_id","topic_id","question_text","target_brand","competitor_brands","tracked_since"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) competitor_brands 가 한 곳뿐인 질문과 두 곳인 질문, (2) tracked_since 가 최근 한 달 안인 질문, (3) 같은 topic_id 를 두 질문이 나눠 쓰는 경우. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"prompt_id":{"type":"string"},"topic_id":{"type":"string"},"question_text":{"type":"string"},"target_brand":{"type":"string"},"competitor_brands":{"type":"array","items":{"type":"string"}},"tracked_since":{"type":"string"}},"required":["prompt_id","topic_id","question_text","target_brand","competitor_brands","tracked_since"]}세 엔진에서 같은 날 받아 온 답변 기록입니다. answer_text 에 답변 원문이 통째로 들어 있고, 수집기가 그 원문을 훑어 붙여 둔 mentioned_brands·brand_position 이 참고값으로 따라옵니다. 출처 목록이 비어 있는 응답과 순위 칸이 빈 응답, 1위와 12위 같은 극단 순위를 의도적으로 포함합니다. 지원자는 세 엔진에 같은 질문을 던져 받은 답변을 그대로 받아 이 표를 만듭니다.
| answer_id | prompt_id | engine | asked_at | answer_text | mentioned_brands | cited_urls | brand_position |
|---|---|---|---|---|---|---|---|
| A-7001 | Q-1042 | chatgpt | 2026-09-08 | 여드름 피부 토너는 자극이 적은 제품부터 고르는 편이 좋습니다. 1.… | ["모이스트랩","세라뷰","아뜰리에벨"] | ["https://beautyblog.kr/toner-top5","https://cafe.naver.com/skin/1024","https://olive-mag.com/acne-toner"] | 3 |
| A-7002 | Q-1042 | claude | 2026-09-08 | 자극이 적은 순서로 보면 1. 세라뷰 시카 토너가 가장 자주 추천되고… | ["모이스트랩","세라뷰"] | ["https://beautyblog.kr/toner-top5","https://blog.naver.com/derma/331"] | 2 |
| A-7003 | Q-1042 | gemini | 2026-09-08 | 여드름 토너를 많이 추천되는 순서로 모으면 다음과 같습니다. 1. 닥… | ["모이스트랩","아뜰리에벨"] | ["https://olive-mag.com/acne-toner"] | 12 |
| A-7004 | Q-1057 | chatgpt | 2026-09-08 | 세정력을 먼저 보면 1. 세라뷰 딥클렌징 오일이 꼽히고, 2. 모이스… | ["세라뷰","모이스트랩"] | ["https://serabu.com/promo/cleansing-oil"] | 2 |
| A-7005 | Q-1057 | claude | 2026-09-08 | 많이 언급되는 순서는 1. 세라뷰 딥클렌징 오일 2. 라온필 클렌징 … | ["세라뷰","모이스트랩"] | ["https://serabu.com/blog/oil-rank"] | 3 |
아래 JSON Schema 에 맞는 ai_answer 행을 더 만들어 주세요. {"type":"object","properties":{"answer_id":{"type":"string"},"prompt_id":{"type":"string"},"engine":{"type":"string","enum":["chatgpt","claude","gemini"]},"asked_at":{"type":"string"},"answer_text":{"type":"string"},"mentioned_brands":{"type":"array","items":{"type":"string"}},"cited_urls":{"type":["array","null"],"items":{"type":"string"}},"brand_position":{"type":["integer","null"],"minimum":1}},"required":["answer_id","prompt_id","engine","asked_at","answer_text","mentioned_brands"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) cited_urls 가 null 인 출처 없는 응답, (2) brand_position 이 null 인 미언급 응답, (3) brand_position 이 1 인 극단 사례와 12 로 밀린 사례, (4) 같은 질문에서 엔진마다 언급 여부가 갈리는 응답 묶음, (5) answer_text 가 브랜드를 영문·띄어쓰기 표기로 적어 수집기의 mentioned_brands 와 어긋나는 응답 3행, (6) answer_text 에 「1.」 같은 번호 표지가 아예 없는 줄글 응답 3행. answer_text 는 실제 답변처럼 한국어 두세 문장으로 쓰고, 번호를 매긴 답변에서는 brand_position 이 그 번호와 같아지게 씁니다. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"answer_id":{"type":"string"},"prompt_id":{"type":"string"},"engine":{"type":"string","enum":["chatgpt","claude","gemini"]},"asked_at":{"type":"string"},"answer_text":{"type":"string"},"mentioned_brands":{"type":"array","items":{"type":"string"}},"cited_urls":{"type":["array","null"],"items":{"type":"string"}},"brand_position":{"type":["integer","null"],"minimum":1}},"required":["answer_id","prompt_id","engine","asked_at","answer_text","mentioned_brands"]}브랜드가 직접 만든 글 목록입니다. 답변이 단 주소가 우리 글인지 가르는 기준이며 아직 발행일이 정해지지 않은 글도 포함합니다.
| url | topic_id | published_at | claim_keys |
|---|---|---|---|
| https://moistlab.co.kr/journal/toner-a… | T-01 | 2026-05-12 | ["저자극","판테놀 함량"] |
| https://moistlab.co.kr/journal/cleansi… | T-02 | 2026-05-20 | ["세정력","잔여감"] |
| https://moistlab.co.kr/journal/suncrea… | T-03 | 2026-06-03 | ["무기자차","백탁"] |
| https://moistlab.co.kr/journal/ampoule… | T-04 | 2026-06-11 | ["농도 차이","사용 순서"] |
| https://moistlab.co.kr/journal/pore-ro… | T-05 | 2026-06-28 | ["모공 수축","주 2회"] |
아래 JSON Schema 에 맞는 owned_content 행을 더 만들어 주세요. {"type":"object","properties":{"url":{"type":"string"},"topic_id":{"type":"string"},"published_at":{"type":["string","null"]},"claim_keys":{"type":"array","items":{"type":"string"}}},"required":["url","topic_id","claim_keys"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) published_at 이 null 인 발행 예정 글, (2) claim_keys 가 한 개뿐인 글, (3) 한 주제에 우리 글이 하나도 없는 경우. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"url":{"type":"string"},"topic_id":{"type":"string"},"published_at":{"type":["string","null"]},"claim_keys":{"type":"array","items":{"type":"string"}}},"required":["url","topic_id","claim_keys"]}같은 주제로 경쟁사가 올린 글 목록입니다. 우리 글이 안 붙은 자리를 누가 차지했는지 이름으로 대는 기준입니다.
| url | brand | topic_id | published_at |
|---|---|---|---|
| https://serabu.com/promo/cleansing-oil | 세라뷰 | T-02 | 2026-07-30 |
| https://serabu.com/blog/oil-rank | 세라뷰 | T-02 | 2026-08-06 |
| https://atelierbel.kr/story/toner | 아뜰리에벨 | T-01 | 2026-06-22 |
| https://pureone.co.kr/guide/ampoule | 퓨어원 | T-04 | 2026-07-09 |
| https://serabu.com/blog/suncream | 세라뷰 | T-03 | 2026-06-30 |
아래 JSON Schema 에 맞는 competitor_content 행을 더 만들어 주세요. {"type":"object","properties":{"url":{"type":"string"},"brand":{"type":"string"},"topic_id":{"type":"string"},"published_at":{"type":["string","null"]}},"required":["url","brand","topic_id"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 브랜드가 한 주제에 두 건을 올린 경우, (2) published_at 이 최근인 글과 석 달 넘은 글, (3) 우리 글과 같은 주제인데 주소 규칙이 전혀 다른 경우. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"url":{"type":"string"},"brand":{"type":"string"},"topic_id":{"type":"string"},"published_at":{"type":["string","null"]}},"required":["url","brand","topic_id"]}브랜드 하나가 답변에 어떤 표기로 나올 수 있는지 모아 둔 표입니다. 답변 원문은 같은 브랜드를 한글로도 영문으로도 띄어쓰기를 넣어서도 적기 때문에, 이 표가 없으면 이름이 나온 답변을 안 나온 것으로 세게 됩니다. 지원자는 브랜드마다 공식 표기와 자사몰·기사에서 쓰는 표기를 모아 이 표를 만듭니다.
| brand | alias |
|---|---|
| 모이스트랩 | 모이스트랩 |
| 모이스트랩 | MoistLab |
| 모이스트랩 | Moist Lab |
| 모이스트랩 | 모이스트 랩 |
| 세라뷰 | 세라뷰 |
아래 JSON Schema 에 맞는 brand_alias 행을 더 만들어 주세요. {"type":"object","properties":{"brand":{"type":"string"},"alias":{"type":"string"}},"required":["brand","alias"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 브랜드마다 공식 한글 표기 자체를 한 행으로 넣어 별칭 조회를 한 갈래로 만듭니다, (2) 영문 표기와 띄어쓰기가 들어간 표기를 함께 넣습니다, (3) 한 글자만 다른 다른 브랜드 이름을 별칭으로 넣지 않습니다 — 넣으면 남의 이름이 우리 언급으로 세어집니다. 브랜드는 모이스트랩·세라뷰·퓨어원·아뜰리에벨 넷을 쓰고 브랜드마다 3~5개씩 둡니다.{"type":"object","properties":{"brand":{"type":"string"},"alias":{"type":"string"}},"required":["brand","alias"]}| TypeScript | 수집기부터 답변 원문 파싱과 대조 규칙, 화면까지 한 언어로 씁니다. 브랜드 표기 목록과 주소 목록이 섞이지 않도록 비교 함수마다 타입을 갈라 둡니다. |
| Node.js | 응답 수집 작업과 대조 계산이 도는 런타임입니다. 질문 하나에 엔진 셋을 동시에 던지고 결과를 모읍니다. |
| PostgreSQL | 질문·응답·글 목록과 회차별 판정을 담는 저장소입니다. 회차가 쌓여도 지난 판정을 남겨 어제와 오늘을 견줍니다. |
| Playwright | 3주차에 ChatGPT·Claude·Gemini 화면에 질문을 넣고 답변과 출처 목록을 받아 오는 브라우저 자동화입니다. 1주차에는 화면 흐름 시험에 씁니다. |
| React | 담당자가 보는 인용 점검 화면입니다. 판정별 묶음과 근거 표를 한 화면에 둡니다. |
| Next.js | 화면과 조회 API 를 한 프로젝트에 둡니다. 업로드와 판정 조회가 같은 라우트 트리 안에 있습니다. |
| REST API | 수집기와 화면 사이의 경계입니다. 수집기는 응답 원본만 넣고 판정 계산은 서버 한 곳에서 돕니다. |
| AWS | 2주차부터 배포·운영을 맡습니다. 응답 원본을 S3 에 남기고 RDS 로 PostgreSQL 을 띄우며 수집기를 예약 작업으로 돌립니다. |
| Docker | 수집기와 웹을 같은 이미지 규격으로 묶어 로컬과 AWS 에서 같은 방식으로 돌립니다. |
| LLM API | 판정이 다 난 뒤 질문과 우리 글의 근거 키를 받아 다음에 쓸 글 제목 한 줄을 짓습니다. 다섯 판정 값과 순위 계산에는 손대지 못합니다. |
| Claude Code | 대조 규칙 시험과 더미데이터 증강 스크립트를 쓰는 데 씁니다. 생성한 코드는 시험을 돌려 확인한 뒤 넣습니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 담당자가 정한 60건과 판정을 맞춰 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 세 엔진에 매일 직접 물어 오고 판정이 바뀐 질문을 알리는 단계로 확장합니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · prompt_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
우리 글이 인용됨우리 글 인용이름만 나오고 출처는 남의 글이름만 언급경쟁사 글이 대신 인용됨경쟁사 인용질문에서 아예 빠짐미노출엔진마다 답이 갈림엔진별 불일치추적 질문 하나에 대해 그날 세 엔진이 우리 글을 인용했는지 남기는 형식입니다. 판정 다섯 값은 답변 원문에서 다시 읽은 브랜드 언급·순위와 주소 대조 규칙이 정하고, 모델은 다음에 쓸 글 제안 문장만 씁니다.
{"type":"object","properties":{"prompt_id":{"type":"string"},"question_text":{"type":"string"},"asked_at":{"type":"string"},"verdict":{"type":"string","enum":["우리 글이 인용됨","이름만 나오고 출처는 남의 글","경쟁사 글이 대신 인용됨","질문에서 아예 빠짐","엔진마다 답이 갈림"]},"engines_checked":{"type":"integer","minimum":1,"description":"같은 prompt_id·asked_at 으로 기록된 ai_answer 행 수입니다"},"mentioned_engine_count":{"type":"integer","minimum":0,"description":"answer_text 에서 prompt_set.target_brand 의 brand_alias 표기가 하나라도 발견된 ai_answer 행 수입니다"},"owned_cited_count":{"type":["integer","null"],"minimum":0,"description":"cited_urls 가 채워진 행의 주소를 모아 같은 topic_id 의 owned_content.url 과 겹치는 주소 개수입니다"},"competitor_cited_count":{"type":["integer","null"],"minimum":0,"description":"같은 방식으로 competitor_content.url 과 겹치는 주소 개수입니다"},"lost_to_brand":{"type":["string","null"],"description":"겹친 경쟁사 주소가 있으면 그 가운데 competitor_content 에 먼저 실린 줄의 brand 이고, 판정과 무관하게 채웁니다"},"best_brand_position":{"type":["integer","null"],"minimum":1,"description":"answer_text 의 번호 목록에서 다시 읽은 엔진별 순위 가운데 가장 앞선 값이며, 어느 엔진도 부르지 않았으면 비웁니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"dataset":{"type":"string"},"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{"type":["string","number","null"]}},"required":["dataset","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["prompt_id","question_text","verdict","evidence","summary"]}[
{
"prompt_id": "Q-1085",
"question_text": "모공 관리 루틴 추천",
"asked_at": "2026-09-08",
"verdict": "우리 글이 인용됨",
"engines_checked": 3,
"mentioned_engine_count": 3,
"owned_cited_count": 1,
"competitor_cited_count": 1,
"lost_to_brand": "퓨어원",
"best_brand_position": 1,
"evidence": [
{
"dataset": "prompt_set",
"field": "target_brand",
"value": "모이스트랩"
},
{
"dataset": "ai_answer",
"field": "answer_text",
"value": "1. 모이스트랩 저널의 모공 루틴이 단계별로 가장 자세합니다."
},
{
"dataset": "owned_content",
"field": "url",
"value": "https://moistlab.co.kr/journal/pore-routine"
},
{
"dataset": "ai_answer",
"field": "engine",
"agg": "count",
"value": 3
},
{
"dataset": "competitor_content",
"field": "url",
"value": "https://pureone.co.kr/guide/pore"
},
{
"dataset": "competitor_content",
"field": "brand",
"value": "퓨어원"
}
],
"summary": "세 엔진이 모두 모이스트랩을 부르고 셋 다 모공 루틴 글을 출처로 답니다. ChatGPT 와 Claude 답변에서는 첫 번째로 불리고, 옆자리에는 퓨어원 모공 가이드가 함께 인용됐습니다.",
"hedge": null
},
{
"prompt_id": "Q-1096",
"question_text": "20대 수분크림 추천",
"asked_at": "2026-09-08",
"verdict": "우리 글이 인용됨",
"engines_checked": 3,
"mentioned_engine_count": 3,
"owned_cited_count": 1,
"competitor_cited_count": 1,
"lost_to_brand": "세라뷰",
"best_brand_position": 1,
"evidence": [
{
"dataset": "owned_content",
"field": "url",
"value": "https://moistlab.co.kr/journal/moisture-cream-20s"
},
{
"dataset": "ai_answer",
"field": "cited_urls",
"agg": "count",
"value": 3
},
{
"dataset": "ai_answer",
"field": "answer_text",
"value": "1. 모이스트랩의 20대 수분크림 글이 성분과 사용감을 함께 정리해 가장 많이 인용됩니다."
},
{
"dataset": "competitor_content",
"field": "url",
"value": "https://serabu.com/blog/moisture"
},
{
"dataset": "competitor_content",
"field": "brand",
"value": "세라뷰"
}
],
"summary": "ChatGPT 와 Claude 가 수분크림 글을 출처로 달고 Claude 답변에서는 첫 번째로 불립니다. 다만 그 Claude 답변은 세라뷰 수분 글도 함께 달았고, Gemini 는 이름은 불렀지만 출처 목록이 비어 있어 인용 대조에서 뺐습니다.",
"hedge": "출처 목록이 빈 응답은 엔진이 출처를 아예 안 준 것인지 수집이 못 읽은 것인지 갈리지 않아, 이 질문의 인용 개수는 두 엔진 기준입니다."
},
{
"prompt_id": "Q-1042",
"question_text": "여드름 피부 토너 추천",
"asked_at": "2026-09-08",
"verdict": "이름만 나오고 출처는 남의 글",
"engines_checked": 3,
"mentioned_engine_count": 3,
"owned_cited_count": 0,
"competitor_cited_count": 0,
"lost_to_brand": null,
"best_brand_position": 2,
"evidence": [
{
"dataset": "prompt_set",
"field": "target_brand",
"value": "모이스트랩"
},
{
"dataset": "ai_answer",
"field": "answer_text",
"value": "여드름 토너를 많이 추천되는 순서로 모으면 다음과 같습니다. 1. 닥터스킨 클리어 토너 2. 하루수분 토너 3. 아뜰리에벨 클리어 토너 4. 온뜰 진정 토너 5. 비타비 토너 6. 순수담 토너 7. 그린랩 토너 8. 시카홀릭 토너 9. 피부일기 토너 10. 모이스처밤 토너 11. 청담온 토너 12. MoistLab 판테놀 토너."
},
{
"dataset": "brand_alias",
"field": "alias",
"value": "MoistLab"
},
{
"dataset": "ai_answer",
"field": "cited_urls",
"agg": "count",
"value": 6
},
{
"dataset": "owned_content",
"field": "url",
"value": "https://moistlab.co.kr/journal/toner-acne"
}
],
"summary": "세 엔진이 모두 모이스트랩을 부르지만 출처 여섯 건이 전부 외부 블로그와 카페 글입니다. Gemini 는 이름을 MoistLab 으로 적어 별칭 표를 거쳐야 찾히고, 그 답변에서는 열두 번째로 밀려 목록 끝에 붙습니다.",
"hedge": null
},
{
"prompt_id": "Q-1057",
"question_text": "저자극 클렌징오일 순위",
"asked_at": "2026-09-08",
"verdict": "경쟁사 글이 대신 인용됨",
"engines_checked": 3,
"mentioned_engine_count": 3,
"owned_cited_count": 0,
"competitor_cited_count": 2,
"lost_to_brand": "세라뷰",
"best_brand_position": 2,
"evidence": [
{
"dataset": "ai_answer",
"field": "answer_text",
"value": "순위를 매기면 1. 세라뷰(Serabu) 딥클렌징 오일 2. 하루수분 오일 3. 청담온 오일 4. 모이스트랩 클렌징 오일을 들 수 있습니다."
},
{
"dataset": "competitor_content",
"field": "url",
"value": "https://serabu.com/promo/cleansing-oil"
},
{
"dataset": "competitor_content",
"field": "url",
"value": "https://serabu.com/blog/oil-rank"
},
{
"dataset": "competitor_content",
"field": "brand",
"value": "세라뷰"
},
{
"dataset": "owned_content",
"field": "url",
"value": "https://moistlab.co.kr/journal/cleansing-oil"
}
],
"summary": "세 엔진이 단 출처가 모두 세라뷰의 기획전과 순위 글입니다. 같은 주제로 쓴 우리 클렌징오일 글은 어느 답변에도 붙지 않았습니다.",
"hedge": null
},
{
"prompt_id": "Q-1063",
"question_text": "민감성 선크림 성분 비교",
"asked_at": "2026-09-08",
"verdict": "질문에서 아예 빠짐",
"engines_checked": 3,
"mentioned_engine_count": 0,
"owned_cited_count": 0,
"competitor_cited_count": 2,
"lost_to_brand": "세라뷰",
"best_brand_position": null,
"evidence": [
{
"dataset": "prompt_set",
"field": "target_brand",
"value": "모이스트랩"
},
{
"dataset": "ai_answer",
"field": "answer_text",
"value": "아뜰리에벨 데일리 선크림이 백탁이 적어 민감성 피부에 자주 추천됩니다."
},
{
"dataset": "brand_alias",
"field": "alias",
"value": "모이스트 랩"
},
{
"dataset": "competitor_content",
"field": "url",
"value": "https://serabu.com/blog/suncream"
},
{
"dataset": "competitor_content",
"field": "url",
"value": "https://atelierbel.kr/story/suncream-list"
},
{
"dataset": "owned_content",
"field": "url",
"value": "https://moistlab.co.kr/journal/suncream-ingredient"
}
],
"summary": "세 엔진 어디에도 모이스트랩이 나오지 않고 순위 칸도 비어 있습니다. 답변을 채운 것은 세라뷰와 아뜰리에벨의 선크림 글입니다.",
"hedge": "별칭 표에 실린 네 표기를 모두 찾아봐도 답변 원문에 모이스트랩이 없어 순위 칸까지 비었습니다. 표에 없는 새 표기로 불렸을 수 있어 표본을 사람이 한 번 읽습니다."
},
{
"prompt_id": "Q-1078",
"question_text": "앰플과 세럼 차이",
"asked_at": "2026-09-08",
"verdict": "엔진마다 답이 갈림",
"engines_checked": 3,
"mentioned_engine_count": 2,
"owned_cited_count": 1,
"competitor_cited_count": 1,
"lost_to_brand": "퓨어원",
"best_brand_position": 1,
"evidence": [
{
"dataset": "ai_answer",
"field": "engine",
"agg": "count",
"value": 3
},
{
"dataset": "ai_answer",
"field": "answer_text",
"value": "퓨어원 가이드는 앰플을 세럼보다 나중에 쓰라고 적습니다."
},
{
"dataset": "owned_content",
"field": "url",
"value": "https://moistlab.co.kr/journal/ampoule-vs-serum"
},
{
"dataset": "competitor_content",
"field": "url",
"value": "https://pureone.co.kr/guide/ampoule"
},
{
"dataset": "competitor_content",
"field": "brand",
"value": "퓨어원"
}
],
"summary": "ChatGPT 와 Claude 는 우리 글을 출처로 달았는데 Gemini 는 이름조차 부르지 않고 퓨어원 글만 답니다. 같은 날 같은 질문에서 엔진 사이가 갈린 자리입니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 enum 다섯 값(우리 글이 인용됨·이름만 나오고 출처는 남의 글·경쟁사 글이 대신 인용됨·질문에서 아예 빠짐·엔진마다 답이 갈림) 중 하나인지 확인합니다. 판정은 대조 규칙이 정하므로 모델이 다른 값을 쓰면 그 응답을 버립니다. 2. prompt_id·question_text·verdict·evidence·summary 다섯 필드가 모두 있는지 확인합니다. 3. engines_checked 와 mentioned_engine_count 가 0 이상인지, best_brand_position 이 1 이상인지 범위를 확인합니다. 4. 브랜드가 불렸는지는 수집기가 붙여 둔 mentioned_brands 를 믿지 않고 answer_text 에서 다시 셉니다. 그 질문의 target_brand 에 걸린 brand_alias.alias 가운데 하나라도 answer_text 에 문자열 그대로 있으면 그 엔진은 브랜드를 부른 것이고, mentioned_engine_count 는 그런 행의 수입니다. 답변이 브랜드를 영문으로 적은 A-7003 은 별칭 표를 거치지 않으면 Q-1042 의 언급 엔진 수가 3 이 아니라 2 로 잘못 나오는 줄입니다. 5. 순위도 brand_position 컬럼을 믿지 않고 answer_text 에서 다시 읽습니다. 답변을 「숫자.」 표지로 잘라 항목을 만들고, target_brand 의 별칭이 처음 들어 있는 항목의 번호가 그 엔진의 순위입니다. 번호 표지가 없거나 어느 항목에도 별칭이 없으면 그 엔진의 순위는 비고, best_brand_position 은 남은 순위 가운데 가장 작은 값입니다. 세 엔진이 모두 비면 best_brand_position 도 비웁니다. 6. owned_cited_count 와 competitor_cited_count 는 cited_urls 를 같은 topic_id 의 url 목록과 대조해 겹치는 주소 개수로 다시 계산합니다. cited_urls 가 비어 있는 엔진은 이 대조에서 뺍니다. 7. lost_to_brand 는 겹친 경쟁사 주소가 하나라도 있으면 채웁니다. 판정이 무엇이든 채우며, 겹친 주소가 둘 이상이면 competitor_content 에 먼저 실린 줄의 brand 를 씁니다. 겹친 경쟁사 주소가 없으면 비웁니다. 8. evidence 의 field 가 prompt_set·ai_answer·owned_content·competitor_content·brand_alias 에 실재하는 컬럼 이름인지 대조합니다. 없는 이름을 인용하면 요약이 지어낸 문장이라는 뜻이라 규칙이 만든 기본 문장으로 되돌립니다. 9. agg 가 없는 evidence 값이 그 컬럼에 수록된 행 값과 같은지 대조합니다. 엔진 여러 대에서 센 수치에는 agg 를 함께 적습니다. 10. summary 와 hedge 가 존댓말로 끝나는 한국어 문장인지 확인합니다. 11. 한 질문에서 target_brand 를 부른 엔진과 부르지 않은 엔진이 둘 다 있으면 엔진마다 답이 갈림으로 둡니다. Q-1078 이 조건이 성립한 경우이고, 세 엔진이 모두 부른 Q-1085 는 성립하지 않은 경우입니다. 12. 판정 순서는 엔진마다 답이 갈림, 질문에서 아예 빠짐, 우리 글이 인용됨, 경쟁사 글이 대신 인용됨, 이름만 나오고 출처는 남의 글 순으로 앞에서 걸리면 뒤를 보지 않습니다. 손을 대야 하는 급한 순서입니다. [평가 러너 · 2주차] 1. 담당자가 답변 원문을 읽고 손으로 정한 판정 60건으로 일치율을 냅니다. 어긋난 건은 주소 대조에서 갈라졌는지 브랜드 이름 대조에서 갈라졌는지 나눠 리포트에 답니다. [수동 검증 · 사람이 봅니다] 1. 이름만 나오고 출처는 남의 글로 뜬 질문의 answer_text 를 표본 20건 열어, 우리 글이 답변 내용과 실제로 같은 이야기를 하는지 확인합니다. 2. 별칭 표에 없는 표기로 브랜드가 불린 답변이 있는지 표본 20건을 읽고, 새로 나온 표기를 brand_alias 에 더합니다. 3. 어떤 질문을 추적 목록에 남길지 담당자와 정합니다. 물어보는 사람이 없는 질문에서 1순위를 잡아도 매출로 이어지지 않습니다.