애드타입
경력근거: 형태가 다른 데이터를 LLM과 AI Agent가 이해하고 활용할 수 있는 지식 구조로 전환하는 일이 중요합니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
서베이레이더·리뷰레이더·애드맵·페르소나 AI 라는 제품군 명칭과 '리뷰, 검색, 커뮤니티, 서베이, 공간, 매체 데이터처럼 형태가 다른 데이터를 LLM과 AI Agent가 이해하고 활용할 수 있는 지식 구조로 전환' 이라는 공고 문장이 이 도구의 입력 축과 그대로 겹칩니다. 지하철·버스·편의점·사이니지 같은 오프라인 접점 어휘도 매체 인벤토리 더미의 축으로 썼습니다. 이 포트폴리오는 RAG 검색 구조·Agent 워크플로우·스키마 강제 출력 구현을 보여주며, 옥외광고 매체 플래닝 실무 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
공고가 리뷰·검색·커뮤니티·서베이·공간·매체처럼 형태가 다른 데이터를 LLM 과 AI Agent 가 쓸 수 있는 지식 구조로 바꾸는 일을 이 포지션의 중심에 둡니다. 이 도구의 입력 파이프라인이 바로 그 전환 작업입니다.
공고가 리서치·분석·요약·제안·리포트 생성을 수행하는 Agentic AI 시스템을 명시합니다. 질문을 받아 검색과 근거 조합을 거쳐 리포트 초안까지 이어지는 이 도구의 흐름이 같은 모양입니다.
서베이레이더·리뷰레이더·애드맵·페르소나 AI 라는 제품군 명칭이 설문·리뷰·공간·매체라는 이 도구의 입력 축과 겹칩니다. 같은 데이터 축으로 만든 포트폴리오라 면접에서 제품 이야기로 바로 이어집니다.
브랜드·캠페인 질문(예: 편의점 접점에서 20대에게 닿으려면 어떤 매체 조합이 맞는지)을 입력하면, 더미 리뷰·설문 문서와 매체 인벤토리 테이블에서 근거를 검색해 인용을 붙인 전략 리포트 초안 JSON 과 화면을 돌려주는 콘솔입니다. 모든 인용은 원문의 실제 문장 조각이어야 통과되도록 검증기를 함께 만듭니다.
캠페인 제안서를 쓸 때마다 리뷰 캡처와 설문 엑셀, 매체 단가표를 폴더마다 뒤져 복사해 붙이던 광고 기획자입니다. 질문 하나를 넣으면 어떤 소비자 반응과 어떤 매체 데이터가 근거인지 출처까지 달린 초안을 받아 검토부터 시작하고 싶은 사람입니다.
리뷰·설문·매체처럼 형태가 다른 데이터를 하나의 검색 가능한 지식 구조로 묶고 LLM 이 근거 인용을 강제당하면, 광고 전략 초안 작성이 자료 수집 작업에서 검토 작업으로 바뀝니다.
더미 리뷰 10건·설문 5건·매체 30행을 지식 구조로 적재하고, 질문 입력부터 인용 검증을 통과한 리포트 초안 JSON 과 Next.js 화면까지 Vercel 배포로 도는 완결품입니다.
AWS 에 Docker 이미지로 배포해 운영하고, 리포트 30건의 인용 원문 일치율과 하드 케이스 30종 강건성 결과를 리포트로 남긴 상태입니다.
리포트에 매체 인벤토리 기반 추천 목록(미등록 매체는 미매핑 표기)이 붙고, 대량 리뷰 태깅을 Claude Haiku 배치로 돌려 토큰 비용 변화를 기록한 상태입니다.
질문을 넣으면 근거 인용 목록과 전략 리포트 초안이 나오는 흐름을 시연합니다(더미 리뷰 10건·설문 5건·매체 30행 기준).
리포트의 모든 인용이 원문 문서의 실제 문장 조각인지 검증 스크립트로 전수 확인해 100% 통과를 보여줍니다(표본: 리포트 30건, 자동 검증).
결측 유동인구·미등록 매체·지명 표기 흔들림을 섞은 하드 케이스 30종을 넣어도 출력 JSON 형식이 깨지지 않습니다.
위 수치는 정답과 데이터를 작성자가 만든 더미 자가채점이라 성능 증명이 아닙니다. 실제 리포트 채택률과 근거 적합성은 애드타입의 실데이터와 실제 기획자 검수가 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직하게 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 게 당연해지는 함정이 있습니다. 결측 유동인구, 마스터에 없는 매체, 같은 지명의 다른 표기를 더미에 일부러 섞습니다.
실데이터로 바꾸면 리뷰·설문의 길이와 어투 분포가 달라져 청킹·검색 파라미터 재조정이 필요합니다. 이는 도입 단계 과제로 분리합니다.
이 포트폴리오는 RAG·Agent 워크플로우 구현을 보여줌할 뿐, 옥외광고 매체 플래닝 실무 전문성은 주장하지 않습니다. 매체 추천 reason 문구는 데이터 근거 표시일 뿐 실무 플래너 판단을 대체하지 않는다고 면접에서 밝힙니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
오프라인 매체(지하철·버스·편의점·사이니지 등) 인벤토리입니다. 리포트의 매체 추천 근거이자 미매핑·결측 처리를 시연하는 축입니다.
| media_id | media_type | location_raw | district_id | daily_traffic | unit_price_krw | operator |
|---|---|---|---|---|---|---|
| MD-001 | 지하철 | 성수역 2번 출구 통로 | D-성동 | 48,200 | 3,200,000 | 메트로애드 |
| MD-002 | 버스 | 146번 외부 랩핑 | D-강남 | 31,000 | 2,100,000 | 시티버스미디어 |
| MD-003 | 편의점 | 성수동2가 CU 창측 사이니지 | D-성동 | 5,200 | 450,000 | 리테일뷰 |
| MD-004 | 편의점 | 성수2가 씨유 창측 | D-성동 | — | 450,000 | 리테일뷰 |
| MD-005 | 사이니지 | 코엑스 동측 대형 LED | D-강남 | 120,000 | 18,000,000 | 스크린웍스 |
다음 JSON Schema 를 그대로 만족하는 오프라인 매체 인벤토리 행을 30개 더 만들어 주세요: {"type":"object","properties":{"media_id":{"type":"string"},"media_type":{"type":"string","enum":["지하철","버스","편의점","리테일","사이니지","건물"]},"location_raw":{"type":"string"},"district_id":{"type":["string","null"]},"daily_traffic":{"type":["integer","null"]},"unit_price_krw":{"type":["integer","null"]},"operator":{"type":"string"}},"required":["media_id","media_type","location_raw","operator"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) daily_traffic 또는 unit_price_krw 가 null 인 결측 행 5개 이상, (2) daily_traffic 0(휴업)과 200000 이상(초대형) 경계값 행, (3) 같은 장소를 다르게 적은 location_raw 표기 흔들림 쌍 3쌍 이상(예: 성수동2가/성수2가, CU/씨유), (4) district_id 가 null 인 미배정 행. 형식 깨뜨리기 시도 3건(문자 traffic 등)은 별도 목록으로 분리해 표시할 것.{"type":"object","properties":{"media_id":{"type":"string"},"media_type":{"type":"string","enum":["지하철","버스","편의점","리테일","사이니지","건물"]},"location_raw":{"type":"string"},"district_id":{"type":["string","null"]},"daily_traffic":{"type":["integer","null"]},"unit_price_krw":{"type":["integer","null"]},"operator":{"type":"string"}},"required":["media_id","media_type","location_raw","operator"]}리뷰·설문 주관식·커뮤니티 글처럼 형태가 다른 소비자 반응 문서입니다. 리포트 인용의 원문이 되는 축입니다.
성수 CU 앞에서 새로 나온 제로 음료 광고를 봤는데 매대 바로 옆이라 그 자리에서 집어 들었다. 지하철 광고보다 손이 가는 거리가 가깝다.
강남역 스크린도어 광고는 매일 보는데 브랜드 이름이 기억에 남는 건 사실이다. 근데 바로 구매로 이어진 적은 없다.
다음 JSON Schema 를 그대로 만족하는 소비자 반응 문서를 20건 더 만들어 주세요: {"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]} title 은 '리뷰 R-###'·'설문 S-### 주관식'·'커뮤니티 C-###' 세 유형을 섞고 매체 유형(지하철·버스·편의점·리테일·사이니지·건물)을 고르게 다룰 것. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 연령·매체가 미기입된 응답 3건, (2) 서로 상반된 평가(같은 매체를 좋게/나쁘게) 쌍 2쌍, (3) 광고와 무관한 잡담이 섞인 문서 2건(검색이 걸러내야 함), (4) 같은 매체를 다른 이름으로 부르는 표기 흔들림(씨유/CU 등) 2건.{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}| Python | 리뷰·설문 정제, 청킹·임베딩 파이프라인과 Agent 워크플로우 구현 언어입니다 |
| TypeScript | 리포트 콘솔 프런트와 출력 JSON 타입 정의를 한 몸으로 관리합니다 |
| React | 리포트 초안에서 인용을 클릭하면 원문 문단이 하이라이트되는 화면을 만듭니다 |
| Next.js | 콘솔 앱 프레임워크이며 1주차 완성품을 Vercel 로 바로 배포합니다 |
| Node.js | 인용 원문 일치 검증 API 의 런타임입니다 |
| NestJS | 매체 조회·리포트 저장 API 를 모듈 구조로 정리합니다 |
| PostgreSQL | 매체 인벤토리와 생성된 리포트를 저장하고 미매핑 매체를 구분 조회합니다 |
| MySQL | 고객사가 기존 매체 대장을 MySQL 로 줄 때를 가정한 적재 호환 스키마를 검증합니다 |
| AWS | 2주차부터 Docker 이미지를 AWS 에 배포해 운영합니다 |
| GCP | 3주차 임베딩 배치 잡을 GCP 에서 병행 실행해 비용을 비교합니다 |
| Docker | 로컬과 AWS 배포 환경을 같은 이미지로 맞춥니다 |
| LLM | 근거 요약과 리포트 문구 생성을 맡되, 인용 정답 여부는 원문 일치 검증기가 결정합니다 |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 AWS 배포와 인용 정확도 자가채점으로 넘어갑니다.
✓ pass → 매체 추천 축과 Haiku 배치 비용 절감으로 확장합니다.
질문에 대한 전략 리포트 초안입니다. 모든 주장 문장이 어느 원문을 인용했는지 추적됩니다.
{"type":"object","properties":{"question":{"type":"string"},"answer_summary":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"source_type":{"type":"string","enum":["review","survey","community","media"]},"source_id":{"type":"string"},"quote":{"type":"string"}},"required":["source_type","source_id","quote"]}},"recommended_media":{"type":"array","items":{"type":"object","properties":{"media_id":{"type":["string","null"]},"media_raw":{"type":"string"},"reason":{"type":"string"}},"required":["media_raw","reason"]}},"hedge":{"type":"string"}},"required":["question","answer_summary","evidence","hedge"]}[
{
"question": "20대에게 신제품 음료를 알리려면 어떤 오프라인 접점이 맞을까요?",
"answer_summary": "구매 접점과 가까운 편의점 매체가 20대 반응에서 반복적으로 언급됩니다. 결제 대기 시간을 쓰는 계산대 스크린과 매대 인접 사이니지를 우선 검토할 만합니다.",
"evidence": [
{
"source_type": "review",
"source_id": "R-101",
"quote": "매대 바로 옆이라 그 자리에서 집어 들었다"
},
{
"source_type": "survey",
"source_id": "S-201",
"quote": "편의점 계산대 스크린은 결제 기다리며 끝까지 보게 된다"
},
{
"source_type": "survey",
"source_id": "S-204",
"quote": "오프라인에서 보고 온라인에서 확인하는 흐름이 자연스럽다"
}
],
"recommended_media": [
{
"media_id": "MD-003",
"media_raw": "성수동2가 CU 창측 사이니지",
"reason": "20대 유동이 있는 성수 상권의 매대 인접 매체입니다"
},
{
"media_id": "MD-011",
"media_raw": "GS25 서울숲점 계산대 상단",
"reason": "결제 대기 시선을 쓰는 계산대 상단 위치입니다"
}
],
"hedge": "합성 더미 기준의 근거 조합이라 실제 매체 성과를 뜻하지 않습니다."
},
{
"question": "브랜드 인지도가 목표라면 대형 사이니지 한 곳과 지하철 반복 노출 중 무엇이 낫나요?",
"answer_summary": "더미 반응에서는 대형 LED 의 화려함보다 반복 노출의 기억 효과 언급이 더 구체적입니다. 인지도 목표라면 반복 노출 매체를 기본으로 두고 대형 매체는 보조로 검토하는 안을 제시합니다.",
"evidence": [
{
"source_type": "survey",
"source_id": "S-202",
"quote": "반복 노출이 있어야 각인되는 것 같다"
},
{
"source_type": "survey",
"source_id": "S-203",
"quote": "몇 주째 같은 광고가 있으면 결국 검색해보게 된다"
},
{
"source_type": "review",
"source_id": "R-102",
"quote": "브랜드 이름이 기억에 남는 건 사실이다"
}
],
"recommended_media": [
{
"media_id": "MD-008",
"media_raw": "강남역 스크린도어",
"reason": "일 유동이 크고 반복 노출이 구조적으로 보장됩니다"
},
{
"media_id": null,
"media_raw": "신촌역 개찰구(인벤토리 미등록)",
"reason": "미매핑 매체는 인벤토리 등록 후 검토 대상으로 표기합니다"
}
],
"hedge": "합성 더미 기준의 근거 조합이라 실제 매체 성과를 뜻하지 않습니다."
},
{
"question": "직장인 타깃 B2B 서비스는 어디에 광고해야 하나요?",
"answer_summary": "평일 직장인 밀집 공간의 로비 사이니지가 타깃 낭비가 적다는 반응이 있습니다. 다만 해당 매체의 주말 소등과 유동 0 표기를 함께 안내해 집행 기간 설계가 필요합니다.",
"evidence": [
{
"source_type": "community",
"source_id": "C-302",
"quote": "타깃이 직장인이면 오히려 낭비가 없겠다"
}
],
"recommended_media": [
{
"media_id": "MD-010",
"media_raw": "판교 테크원 로비",
"reason": "직장인 밀집 로비 매체이며 유동 0 은 휴무일 계측값이라 평일 기준 재확인이 필요합니다"
}
],
"hedge": "근거 문서가 1건뿐이라 확신도가 낮다고 리포트에 함께 표기합니다. 합성 기준 추정입니다."
}
][자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식이 깨진 리포트가 화면에 나가는 것을 차단). 2. evidence 의 모든 quote 가 source_id 원문 body 의 실제 문장 조각(공백 정규화 후 substring)인지 확인합니다(인용 조작·환각 차단). 3. recommended_media 의 media_id 가 media_inventory 에 실재하는지, 미등록이면 media_id 가 null 이고 reason 에 미매핑 안내가 있는지 확인합니다(참조 무결성). [수동 검증 · 사람이 표본 확인] 1. answer_summary 가 인용 근거의 범위를 넘어서 과장하지 않는지 리포트 10건을 표본 검토합니다. 2. 근거가 1건 이하일 때 hedge 에 확신도 낮음 표기가 있는지 확인합니다.
근거: 형태가 다른 데이터를 LLM과 AI Agent가 이해하고 활용할 수 있는 지식 구조로 전환하는 일이 중요합니다