출처의 거짓말을 잡아내는 AI 연구 코파일럿(Copilot) 구축하기
요약
출처 간의 정보 모순을 탐지하고 지속적인 메모리를 유지하는 AI 연구 코파일럿 'Crosscheck' 구축 방법을 소개합니다. 지식 그래프의 한계를 극복하기 위해 원문에서 직접 주장을 추출하고 LLM 판사를 활용하는 구조적 접근 방식을 제안합니다.
핵심 포인트
- 지식 그래프의 수치 평탄화 및 엔티티 병합 문제 해결
- 원문 기반의 (subject, predicate, object) 추출 방식 채택
- 구조적 사전 필터와 LLM 판사를 결합한 2단계 모순 탐지 엔진
- Llama 3.1:8b 등 소형 로컬 모델 최적화를 위한 설정 가이드
연구 도구들은 세션이 바뀌면 정보를 잊어버리고, 두 출처가 서로 상충할 때 이를 전혀 알아차리지 못합니다. Crosscheck는 cognee 상단에서 동작하는 작은 코파일럿(copilot)으로, 이 두 가지를 모두 수행합니다. 즉, 입력하는 모든 것에 대한 지속적인 메모리(persistent memory)를 유지하며, 출처가 서로 모순될 때 이를 표시해 주는 핵심 기능(hero feature)을 제공합니다. 예를 들어, "FooDB는 50,000 req/s를 유지했다" (2021년)와 "단 10,000 req/s" (2024년)와 같은 경우입니다.
명백한 설계 — 그리고 그것이 충분하지 않았던 이유
첫 번째 본능은 모순 탐지(contradiction detection)를 순수한 그래프 쿼리(graph query)로 만드는 것입니다. cognee의 지식 그래프(knowledge graph)를 구축한 다음, 여러 출처에 걸쳐 동일한 엔티티(entity)+속성(attribute)이 서로 다른 값을 가지고 있는지 찾는 방식입니다. 우아해 보이지만, 실제 로컬 스택(Ollama를 통한 llama3.1:8b)에서는 작동하지 않습니다. 두 가지 실패 사례가 나타납니다:
- 지식 그래프가 수치를 평탄화(flattens)합니다. 추출기(extractor)가 "초당 50,000 요청"을 일반적인
requests per second노드로 변환하고 숫자를 누락시킵니다. 충돌하는 값들이 그래프에 반영되지 않는 것입니다. - 엔티티(Entities)가 출처 전반에 걸쳐 병합됩니다. FooDB에 대한 모든 언급이 하나의 노드로 합쳐지기 때문에, 두 개의 처리량(throughput) 주장이 하나의 엣지(edge)로 중복 제거되어 비교할 대상이 남지 않게 됩니다.
따라서 그래프는 저장, 시각화, 인용된 검색(cited retrieval)에는 훌륭하지만, 정량적인 모순에 대한 _진실의 원천(source of truth)_이 될 수는 없습니다.
해결책: 충실한 주장(claims)을 추출하고, 구조적으로 판단하기
Crosscheck는 각 출처의 원문(raw text)에서 주장을 직접 읽어옵니다. 이는 숫자를 그대로 유지하고 소스 ID와 타임스탬프를 태깅하는 얇고 평탄한 (subject, predicate, object) 추출 방식입니다. 전체 그래프 스키마(schema)와 달리, 작은 로컬 모델로도 하나의 값을 추출하는 것은 쉽습니다. 그 다음 2단계 엔진이 작동합니다:
- 구조적 사전 필터(Structural pre-filter): 정규화된
(subject, predicate)별로 주장을 그룹화합니다. 동일한 키를 가지지만 값이 다르고 출처가 다른 쌍을 표시합니다. - LLM 판사(LLM judge): 각 후보가 실제로 모순되는지("둘 다 참일 수 없음")와 그 이유를 확인합니다.
FooDB 사례에서 이 기능은 정확히 한 번 실행되었습니다: 50k (2021년) vs 10k (2024년), 확인됨.
약한 로컬 모델에서도 cognee가 생존하게 만들기
llama3.1:8b에서 그래프를 구축하는 데만 세 가지 설정이 필요했으며, 모두 .env.example 파일에서 조정되었습니다: cognee의 구조화된 출력 (structured-output) 프레임워크를 BAML로 전환하고 (BAML의 스키마 정렬 파싱은 느슨한 JSON을 허용함), 취약한 청크 요약 (summarization) 작업(소형 모델은 수행할 수 없으며 Crosscheck에서도 사용하지 않음)을 무력화하며, 직접적인 그래프 읽기가 전체 저장소를 볼 수 있도록 **다중 사용자 액세스 제어 (multi-user access control)**를 끄는 것입니다.
자기 개선 (Self-improving)
가벼운 간극 탐지기 (gap finder)가 희소하게 연결된 노드들을 순위 매기고 LLM에게 다음 연구 질문을 요청합니다. 즉, 코파일럿이 무엇이 누락되었는지 사용자에게 알려주는 것입니다. 모든 것은 cognee의 저장소에 유지되므로, 새로운 프로세스를 실행해도 데이터를 다시 수집 (re-ingesting)할 필요 없이 다시 답변할 수 있습니다.
동일한 엔진, 두 번째 제품: Argus
모순 엔진 (contradiction engine)이 구축되자, 이것이 도메인에 구애받지 않는다는 사실이 밝혀졌습니다. "동일한 사실, 두 개의 출처, 두 개의 서로 다른 값"은 연구 분야를 훨씬 넘어 어디에서나 나타나는 형태입니다. 그래서 우리는 이 엔진을 돈(money) 문제에 적용했습니다. Argus는 지출 및 계약 누수 (leakage) 감사 도구입니다. 계약서의 한 줄("조기 결제 크레딧 발생: $2,400")과 송장의 한 줄("적용된 크레딧: $0")은 단지 달러 차이가 발생하는 모순일 뿐입니다. Argus는 Crosscheck의 claims + contradictions 코드를 변경 없이 재사용하며, 한 가지를 추가했습니다. 바로 각 발견 사항에 대한 결정론적인 달러 영향 수치입니다. 작은 데모 팩을 통해 세 가지 이슈에서 총 $5,300의 누수를 찾아냈으며, 각 이슈에는 재무 팀이 즉시 조치할 수 있는 정확한 문서와 날짜가 포함되어 있었습니다. 동일한 엔진으로 완전히 다른 문제를 해결한 것인데, 이것이 핵심입니다. 출처 간의 불일치를 잡아내는 것은 하나의 기능 (feature)이 아니라 원시적인 기술 (primitive)입니다.
Ollama에서 완전히 오프라인으로 실행됩니다. OpenAI 또는 Gemini 키를 대안으로 바로 사용할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기