본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 28. 09:38

오픈 소스 멀티 에이전트 팩트 체크 도구를 만들었습니다 — 작동 원리 소개

요약

오정보 문제를 해결하기 위해 LangGraph 기반의 오픈 소스 멀티 에이전트 팩트 체크 도구인 Sift를 소개합니다. Sift는 텍ran 텍스트에서 주장을 추출하고, 실시간 검색과 추론 과정을 거쳐 검증 가능한 판결을 내리는 5단계 파이프라인을 제공합니다.

핵심 포인트

  • LangGraph를 활용한 5개의 독립적인 에이전트 오케스트레이션
  • LLM의 환각 현상을 방지하기 위한 멀티 에이전트 구조 채택
  • LLaMA 3.3 70B와 Groq를 이용한 구조화된 주장 추출
  • HyDE 검색 및 Tavily 실시간 웹 검색을 통한 증거 확보

문제 정의 (Problem Statement)

우리는 오정보 (misinformation) 문제에 직면해 있습니다. 하지만 더 구체적으로 말하자면, 우리는 속도의 문제를 겪고 있습니다.
기자가 의심스러운 주장을 발견합니다. 소스를 검색합니다. 데이터베이스를 교차 참조합니다. 전문가에게 전화합니다. 판결을 작성합니다. 편집을 거칩니다. 그리고 나서야 출판됩니다. 6시간 뒤일 수도 있고, 3일 뒤일 수도 있습니다.

저는 그 간극을 메울 수 있는 무언가를 만들고 싶었습니다. 추측만 하는 챗봇이 아니라, 실제 증거를 검색하고, 그것을 바탕으로 추론하며, 왜 그런 판결에 도달했는지 설명해 주는 제대로 된 파이프라인 (pipeline) 말입니다.
그것이 바로 Sift입니다.

Sift란 무엇인가?

**Sift (Source Inspection & Fact-checking Tool)**는 어떤 텍스트든 입력받아 모든 사실적 주장 (factual claim)을 추출하고, 근거가 되는 증거를 검색하며, 인용된 출처와 전체 추론 과정 (reasoning chains)을 포함하여 감사 가능한 판결 — 참 (TRUE), 거짓 (FALSE), 또는 불확실 (UNCERTAIN) — 을 반환하는 오픈 소스 멀티 에이전트 (multi-agent) AI 파이프라인입니다.
뉴스 기사, 정치인의 연설, 바이럴 통계, WhatsApp 전달 메시지 등을 붙여넣으세요. Sift는 이를 개별 주장으로 분해하고 각각을 독립적으로 팩트 체크 (fact-check) 합니다.

왜 멀티 에이전트 (Multi-Agent)인가?

가장 단순한 접근 방식은 LLM (Large Language Model)에게 "이 주장이 사실인가요?"라고 묻는 것입니다.
문제는 LLM이 환각 (hallucinate)을 일으킨다는 점입니다. 지식 컷오프 (knowledge cutoffs)가 존재하며, 탐지하기 어려운 방식으로 자신 있게 틀린 답을 내놓기도 합니다. 그리고 결정적으로, 자신의 작업 과정을 보여주지 않습니다.
단일 LLM 호출만으로는 다음과 같은 전체 파이프라인을 안정적으로 처리할 수 없습니다:

  • 노이즈가 있는 텍스트에서 구조화된 주장 추출하기
  • 실시간 소스로부터 날짜가 명시되고 추적 가능한 증거 검색하기
  • 이야기를 지어내지 않고 상충하는 증거들 사이에서 추론하기
  • 과잉 확신을 방지하기 위해 자신의 결론을 적대적으로 검토하기
  • 무언가 잘못되었을 때 수정 사항 찾기

이 각각은 고유한 프롬프트 (prompt), 도구 (tools), 그리고 실패 모드 (failure modes)를 가질 때 이득을 얻는 별개의 작업들입니다. 이것이 제가 LangGraph를 사용하여 오케스트레이션 (orchestrated) 된 5개의 별도 에이전트를 구축한 이유입니다.

5-에이전트 파이프라인 (The 5-Agent Pipeline)

에이전트 1 — 주장 추출기 (Agent 1 — Claim Extractor)

단일 문단에도 4~5개의 서로 다른 사실적 주장 (factual claims)이 포함될 수 있습니다. 일반적인 LLM은 이를 놓치거나 혼동합니다.
이 에이전트는 Groq를 통해 LLaMA 3.3 70B를 사용하며, Pydantic 구조화된 출력 (structured output)을 활용하여 입력 텍스트에서 검증 가능한 모든 개별 주장을 추출합니다. 출력값은 타입이 지정된 주장 목록(typed list of claims)으로, 의역이나 환각 (hallucination) 없이 정확한 텍스트 그대로 제공됩니다.

에이전트 2 — 증거 탐색기 (Agent 2 — Evidence Hunter)

LLM은 인용 (citations)을 환각합니다. 실제적이고, 검색 가능하며, 날짜가 명시된 증거가 필요합니다.
이 에이전트는 pgvector에 저장된 4,270개의 인덱싱된 Guardian + Wikipedia 청크 (chunks)에 대해 HyDE 검색을 수행한 다음, 최신 데이터를 위해 Tavily 실시간 웹 검색을 실행합니다.
왜 표준 RAG 대신 HyDE를 사용할까요?
표준 RAG는 원문 주장을 임베딩 (embed)하고 유사한 텍스트를 검색합니다. "연준(The Fed)이 2024년 3월에 금리를 인상했다"와 같은 짧은 사실적 주장은 그 자체만으로는 약한 의미론적 신호 (semantic signal)를 가집니다.
HyDE (Hypothetical Document Embeddings)는 정답을 포함하고 있을 법한 가상의 문서(예: 뉴스 기사 발췌문 등)를 생성한 다음 이를 임베딩합니다. 그 결과, 더 풍부한 의미론적 신호를 얻을 수 있으며 짧은 사실적 주장에 대해 현저히 더 나은 검색 재현율 (retrieval recall)을 보여줍니다.

에이전트 3 — 종합 에이전트 (Agent 3 — Synthesis Agent)

이 에이전트는 검색된 증거만을 바탕으로 엄격하게 추론합니다. 보정된 신뢰도 점수 (confidence score)와 함께 TRUE / FALSE / UNCERTAIN (불확실)을 반환합니다.
결정적으로, 증거가 부족하거나 상충하는 경우, 근거 없는 확신을 갖는 대신 UNCERTAIN을 반환합니다. 이는 제대로 구현하기 가장 어려운 부분 중 하나였습니다. LLM은 본질적으로 잘못된 확신을 갖는 경향이 있습니다. 저는 인식론적 겸손 (epistemic humility)을 명시적으로 프롬프트에 포함하고, 신뢰도가 0인 출력을 잡아내기 위해 Pydantic 검증기 (validators)를 추가해야 했습니다.

에이전트 4 — 비판 에이전트 (Agent 4 — Critic Agent)

종합 에이전트는 증거가 주장을 부분적으로 뒷받침할 때 과잉 확신을 갖는 경향이 있습니다. 따라서 적대적 검증 (adversarial check)이 필요합니다.
이 에이전트는 모든 판결을 독립적으로 검토합니다. 근거 없는 추론을 표시하고, 1.1°C와 1.19°C의 차이가 거짓 주장이 아닌 반올림 차이인 경우를 잡아내며, 필요한 경우 신뢰도를 하향 조정합니다.
이 단계는 대부분의 팩트 체크 시스템이 생략하는 단계이지만, 경계선에 있는 주장 (borderline claims)에 있어서는 가장 중요한 단계입니다.

에이전트 5 — 교정 에이전트 (Correction Agent)

무언가가 거짓이라는 것을 아는 것만으로는 충분하지 않습니다. 사용자에게는 무엇이 '진실'인지 알아야 합니다.
이 에이전트는 FALSE(거짓) 또는 UNCERTAIN(불확실) 판정이 내려졌을 때만 작동합니다. 이 에이전트는 타겟팅된 실시간 검색 (live search)을 수행하여 정확한 정보를 찾아내고, 인용된 출처와 함께 이를 제시합니다. 조건부로 작동하므로 — TRUE(참) 판정에는 토큰을 낭비하지 않습니다.

왜 LangGraph인가?

모든 주장에 대해 파이프라인이 선형적으로 흐르지는 않습니다. 어떤 주장은 증거가 없어 합성 (synthesis) 단계를 건너뛰고 바로 비판 (criticism) 단계로 넘어갑니다. 어떤 주장은 여러 번의 검색 (retrieval) 시도가 필요합니다. 어떤 주장은 루프 (loop)를 돕니다.
LangGraph의 상태 머신 (state machine)은 조건부 분기 (conditional branching), 루프, 그리고 에이전트 간의 공유 상태 (shared state)를 깔끔하게 처리합니다. 상태는 TypedDict로 타입이 지정되어 있어 — 모든 에이전트가 동일한 상태 객체에서 읽고 씁니다.

인프라 (Infrastructure)

FastAPI는 즉시 작업 ID (task ID)를 반환합니다. Celery + Redis는 백그라운드에서 파이프라인을 실행합니다. 클라이언트는 결과를 폴링 (poll) 합니다.
**Redis 캐시 (cache)**는 결과를 7일 동안 저장합니다 — 동일한 화제의 주장에 대해 토큰을 두 번 소비하지 않기 위함입니다. API 레이어에서의 캐시 히트 (cache hit)는 Celery가 실행되기도 전인 1초 미만의 시간에 반환됩니다.
LangFuse는 모든 LLM 호출 — 프롬프트 (prompt), 출력 (output), 지연 시간 (latency), 토큰 수 (token count) — 을 추적(trace)하므로, 추측 없이도 에이전트의 실패를 디버깅할 수 있습니다.

기술 스택 (Tech Stack)

LLM: Groq API를 통한 LLaMA 3.3 70B
Embeddings: HuggingFace Inference API를 통한 all-MiniLM-L6-v2
Orchestration: LangGraph 상태 머신 (state machine)
RAG: HyDE + pgvector 하이브리드 검색 (hybrid search)
Vector DB: PostgreSQL + pgvector
API: FastAPI + Pydantic
Task Queue: Celery + Redis
Evidence Sources: Tavily (실시간) + Guardian API + Wikipedia
Observability: LangFuse + Prometheus + Grafana

사용해 보기

이 프로젝트는 완전한 오픈 소스이며 도커화 (Dockerized) 되어 있습니다. 명령어 하나로 전체 스택을 실행할 수 있습니다:

git clone https://github.com/ashg2099/Sift.git
cd Sift
cp .env.example .env
...

**http://localhost:8000**을 열고 주장을 검증하기 시작하세요.
저는 피드백을 적극적으로 기다리고 있습니다 — 특히 시스템이 깨지는 부분에 대해서 말이죠. 직접 사용해 보신다면, 시스템이 무엇을 틀리는지 꼭 알려주시면 감사하겠습니다.

GitHub: https://github.com/ashg2099/Sift
LinkedIn: https://www.linkedin.com/in/ashwin-gururaj-93943816a/

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0