전시기획자가 Claude API로 만든 '환각 0%' 뉴스 인텔리전스 자동화

소개

시도하고자 했던 것과 그 이유

저희 팀은 여러 전시회를 기획·운영하는 업무를 맡고 있습니다. 평소에 각 전시 분야의 산업 뉴스를 꾸준히 보면서 참가업체 유치 타겟이나 정부 지원금, 협업기관, 프로그램 아이디어 같은 걸 뽑아내면 좋겠다는 생각이 있었어요.

문제는 이걸 사람이 매일 직접 하기엔 현실적으로 별도 시간을 내야 하고, 그러다 보니 간헐적으로만 이뤄진다는 거였습니다. 그래서 뉴스 자동 수집 → Claude API 분석 → Notion 공유까지 한 번에 흐르는 파이프라인을 만들어보기로 했습니다.

여기서 제가 가장 신경 쓴 부분은 "AI가 그럴듯하게 지어낸 정보(환각)는 단 하나도 안 된다"는 거였어요. 실제 업무에 AI가 만들어낸 가짜 기업명이나 가짜 지원금, 가짜 금액이 하나라도 섞이면 리포트 전체를 못 믿게 되니까요. 그래서 이 프로젝트의 1순위 설계 원칙은 성능이 아니라 '환각 방지'였습니다.


진행 방법

사용한 도구

  • Claude Code : 전체 설계부터 코딩, 디버깅, 운영까지 페어 프로그래밍 파트너로 활용

  • Claude API (claude-sonnet-4-6) : 기사 본문을 전시기획 관점으로 분석하는 엔진

  • 네이버 검색 Open API : 뉴스 수집 (Google News API 대신 채택 — 국내 기사 커버리지가 압도적)

  • notion-client (Python) : 분석 결과를 Notion DB에 자동 업로드

  • Python 3.10+ : anthropic, notion-client, schedule 등


어떻게 활용했나 — 환각 방지 3중 장치

핵심은 "AI에게 잘 부탁하기"가 아니라 구조적으로 환각이 끼어들 수 없게 만드는 거였습니다. 3겹으로 방어선을 깔았어요.

① 시스템 프롬프트에서 근거 인용을 최우선 규칙으로 못 박기

Copy<anti_hallucination_rules>
이 규칙은 다른 모든 지시보다 우선한다. 위반 시 리포트 전체의 신뢰가 무너진다.

- 기사 본문에 명시되지 않은 사실(수치, 기업명, 금액, 일정, 인용)은 절대 만들어내지 않는다.
  근거가 없으면 해당 필드는 null 또는 빈 배열로 둔다.
- 모든 actionable_insight 와 핵심 주장에는 evidence_quote(기사 원문에서 직접 발췌/요약한 근거)를
  반드시 포함한다. 근거를 댈 수 없는 인사이트는 출력하지 않는다.
- 애널리스트의 제안(전략·아이디어)은 '사실'이 아니라 '해석'이다. 이는 evidence_quote 로
  뒷받침된 합리적 확장이어야 하며, 기사에 적힌 것처럼 단정하지 않는다.
- 확신이 없으면 confidence 를 낮추고, 추측을 사실로 승격시키지 않는다.
- 예산·기업명 등 민감 정보는 보수적으로. 모르면 null.
</anti_hallucination_rules>

② 분석 결과 JSON 스키마에 evidence_quote(근거 발췌)와 stance(사실/해석 구분) 필드를 의무화

Copy"actionable_insights": [
  {
    "title": "인사이트 제목",
    "description": "구체적 실행 방안 (120자 이내)",
    "evidence_quote": "이 인사이트의 근거가 된 기사 원문 발췌 (필수. 없으면 이 인사이트 삭제)",
    "stance": "fact_based | analyst_inference",
    "responsible_party": "public | private | joint",
    "estimated_budget": "예상 예산 또는 null (기사에 없으면 null)"
  }
]

③ 그래도 AI가 근거 없이 항목을 내놓으면, 코드 레벨에서 자동 삭제

프롬프트만 믿지 않고, 분석 결과를 받은 직후 evidence_quote가 비어 있는 항목은 후처리로 제거했습니다. 이 함수가 "AI가 룰을 어겼을 때의 최후 방어선"입니다.

Copy# evidence_quote 가 필수인 항목들(근거 없는 환각 제거 대상)
_EVIDENCE_REQUIRED_FIELDS = [
    "actionable_insights",
    "new_exhibitor_targets",
    "program_ideas",
    "funding_opportunities",
    "collaboration_suggestions",
]

@staticmethod
def _enforce_evidence(analysis: dict) -> dict:
    """evidence_quote 가 비어있는 항목을 제거해 근거 없는 주장 차단."""
    removed = 0
    for field in _EVIDENCE_REQUIRED_FIELDS:
        items = analysis.get(field)
        if not isinstance(items, list):
            continue
        kept = [
            it for it in items
            if isinstance(it, dict) and str(it.get("evidence_quote", "")).strip()
        ]
        removed += len(items) - len(kept)
        analysis[field] = kept
    if removed:
        analysis["_evidence_filtered_count"] = removed
    return analysis

추가로, JSON 파싱이 실패하더라도 거짓을 생성하지 않고 relevance_score: 0, fact_summary: "분석 실패 - 사람이 직접 검토 필요" 형태의 fallback을 반환하게 했습니다. "모르면 모른다고 말하게" 하는 게 포인트였어요.

한국 노래 목록 스크린샷

결과와 배운 점

API 키 4종 발급·검증, 가상환경 구성, Notion DB 생성을 끝내고 실전 가동에 성공했습니다. 한 번 돌리니 16건이 분석됐고, 2차 개선 후에는 6점 이상 고품질 인사이트가 6건 선별되어 Notion에 자동 업로드됐습니다. 실제로 근거 기반의 타겟 기업 제안이나 프로그램 유치 아이디어가 나왔고, 쓸 만한 수준이었습니다.

배운 점 & 팁

max_tokens는 생각보다 자주 발목을 잡는다. 인사이트가 풍부한 기사일수록 JSON이 중간에 잘려서 파싱에 실패했습니다. 3000 → 8000으로 올렸더니 파싱 실패 5건이 0건이 됐어요. 주간 리포트도 같은 문제가 있어서(4000 → 8000) 동일하게 처리했습니다. 출력이 길어질 수 있는 작업은 토큰 한도부터 의심해보세요.

(가장 큰 교훈) 검색어는 '흔한 단어'를 버리고 '고유 복합명사'로. 처음엔 일반적인 키워드로 검색했더니 관련 없는 기사 노이즈가 폭증했습니다. 네이버 뉴스 검색이 매칭을 느슨하게 하기 때문인데요, 해당 산업의 고유 복합명사로 바꾸니까 실제 산업 인사이트가 잡히기 시작했습니다. 검색어 하나 바꿨을 뿐인데 결과 품질이 체감상 몇 배는 좋아졌어요.

AI에게 자기 데이터를 의심하게 시키면 신뢰도가 올라간다. 주간 리포트 끝에 '신뢰도 메모'를 쓰게 했더니, AI가 스스로 "이번 주 수집된 기사 중 일부는 주식 시황 기사라 즉시 액션할 정보는 제한적"이라고 자기 데이터의 한계를 지적하더군요. 미확인 정보에 대해서는 주의 문구까지 달았습니다. 환각 방지 설계가 의도대로 작동한다는 걸 확인한 순간이었어요.

시행착오

처음엔 프롬프트로만 환각을 막으려 했는데, 결국 코드 후처리(_enforce_evidence)라는 안전장치가 있어야 마음이 놓였습니다. "프롬프트는 부탁, 코드는 강제" — 이 역할 분담이 핵심이었어요.

RSS 피드 4개는 끝까지 응답이 없어서 로그만 지저분해졌습니다. 네이버 수집만으로도 충분했기 때문에 결국 제거했어요. 모든 소스를 다 붙이려고 욕심내지 않는 게 낫더라고요.

도움이 필요한 부분

Notion API로는 DB '뷰(필터 탭)' 자동 생성이 안 돼서 전시회별 탭을 수동으로 만들어야 했습니다. 그리고 기사별 인사이트 도출 부분이 실제 도움이 될만한 내용인지의 검증이 필요합니다.

앞으로의 계획

현재는 전시회 2개만 운영 중인데, 나머지도 같은 '고유 복합명사' 원칙으로 검색어를 튜닝해서 확대할 예정입니다. 최종 목표는 schedule로 매주 무인 자동 실행 — 사람은 Notion에서 결과만 검토하는 형태로 만들고 내용을 고도화해 나가는 겁니다.


2
3개의 답글
밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.