이 글은 Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady에 제출된 내용입니다.
제가 구현한 것 (What I Built)
ContextKeeper — 파일들이 기억하고, 당신은 기억할 필요가 없습니다.
혹시 문서에서 유용한 정보를 읽었는데, 파일 이름이나 저장 위치, 혹은 정확히 어떤 단어로 검색해야 할지 잊어버린 적이 있나요?
제가 ContextKeeper를 개발한 이유가 바로 이 문제를 해결하기 위해서입니다.
ContextKeeper는 AI 기반의 개인 지식 라이브러리로, 사용자가 자연어 회상(natural-language recollections)을 통해 문서에서 잊힌 정보를 검색할 수 있도록 돕습니다. 파일 이름이나 수동 태그, 혹은 정확한 검색어에 전적으로 의존하는 대신, 사용자는 자신이 기억하는 바를 설명함으로써 관련 문서를 발견할 수 있습니다.
예를 들어, 파일 이름을 검색하는 대신 다음과 같이 검색할 수 있습니다:
“Node.js 애플리케이션에서 API 오류 처리에 대해 읽었던 그 문서.”
ContextKeeper는 문서 내용과 사용 가능한 메타데이터(metadata)를 모두 검색하고, 관련 출처 발췌문(source excerpts)을 제시하며, 결과가 왜 해당 질문에 답할 수 있는지 설명합니다. 직접 인용된 텍스트의 경우, 원본 출처에 실제로 존재하는지 검증하여 보여줍니다.
현재 이 애플리케이션은 텍스트 기반 PDF, Markdown, TXT 문서를 지원하며, 구현된 워크플로우에는 문서 정리 및 폴더 재검색 기능이 포함되어 있습니다.
저는 간단한 아이디어를 탐구하고 싶었습니다. 정보를 찾는 것이 그것을 어디에 두었는지 기억하는 것보다, 무엇을 읽었는지 기억하는 것에 더 의존한다면 어떨까?
혜택을 받는 사람들은 유용한 문서 모음집이 관리하기 어려워진 개발자, 학생, 연구원, 프리랜서 및 모든 사용자들입니다.
데모 (Demo)
여기에 ContextKeeper를 사용해 보세요:
ContextKeeper 데모 열기
가장 좋은 평가 방법은 나중에 필요할 수 있는 정보가 담긴 문서를 몇 개 인덱싱(index)한 다음, 정확한 파일 이름을 사용하지 않고 기억하는 개념을 검색해 보는 것입니다.
코드 (Code)
[GitHub repository]
The 소스 코드는 검토 및 기여가 가능합니다. 저는 ContextKeeper를 오픈소스 프로젝트로 구축하고 있으며, 그 검색 파이프라인, 문서 처리, AI 통합의 결정 과정을 문서화하고 있습니다.
어떻게 구축했는가 (How I Built It)
저는 React, TypeScript, Vite 및 Express 백엔드를 사용하여 풀스택 웹 애플리케이션으로 ContextKeeper를 구축했습니다.
이 애플리케이션의 문서 처리 워크플로우는 지원되는 파일에서 텍스트를 추출하고 검색 및 검증을 위해 출처 정보를 보존합니다. 이 앱은 로컬 브라우저 영속성(persistence)을 위해 _IndexedDB_를 사용하며, 백엔드 API가 문서 처리 작업과 AI 추론(inference)을 담당합니다.
Google Gemma를 중심으로 구축하기 (Building around Google Gemma)
이 프로젝트의 핵심 요구사항은 일반 파일 관리자에 단순히 AI 챗봇을 추가하는 것이 아니라, **문서 이해(document understanding)**의 런타임 모델로 Google Gemma를 사용하는 것이었습니다.
Gemma는 요약 생성, 주제 및 유용한 메타데이터 추출, 그리고 검색된 문서가 왜 관련성이 있을 수 있는지 설명하는 등 다양한 문서 이해 작업을 지원합니다.
검색 파이프라인은 결정론적 점수(deterministic scoring)를 문서 콘텐츠와 메타데이터 전반에 걸쳐 결합하며, 후보 선택, 출처 발췌(source excerpts), 문맥적 설명과 함께 작동합니다. 이 구분이 중요합니다: 관련성 순위 지정(relevance ranking) 및 출처 검색은 모델이 결과를 설명하는 것과는 별개입니다.
또한 저는 애플리케이션이 우아하게 실패하도록 만들고 싶었습니다. 원격 AI 추론이 불가능해지더라도, 전체 라이브러리가 사용 불가 상태가 되는 대신 결정론적 검색은 계속 작동해야 합니다. AI 생성 주장과 직접 출처 인용문은 상호 교환 가능한 것으로 취급되어서는 안 되며, 인용된 텍스트는 반드시 출처와 대조하여 확인되어야 합니다.
이 프로젝트에는 회상 기반 검색(recollection-based retrieval), 부분 구문 쿼리(partial-phrase queries), 관련 없는 검색, 증거 검증, 추론 실패, 문서 추출, 폴더 재검색 동작에 대한 자동화된 테스트가 포함되어 있습니다.
설계 결정 (Design decisions)
몇 가지 원칙이 구현을 안내했습니다:
- 단순히 답변만 검색하는 것이 아니라 증거를 검색해야 합니다. 사용자는 결과 뒤에 있는 출처(source)를 검사할 수 있어야 합니다.
- 불확실성에 대해 정직해야 합니다. 관련 없는 질의가 조작된 일치 항목을 생성해서는 안 됩니다.
- AI가 실패했을 때도 워크플로우가 유용하게 유지되어야 합니다. 원격 추론(remote inference)이 사용할 수 없을 때에도 결정론적 검색(Deterministic search) 기능은 남아 있어야 합니다.
- 원본 파일을 존중해야 합니다. ContextKeeper 라이브러리에서 문서를 제거한다고 해서 사용자의 컴퓨터에 있는 원본 파일까지 삭제되어서는 안 됩니다.
현재 구현체는 진화하는 MVP(Minimum Viable Product)입니다. 지원되는 형식과 검색 동작에는 정의된 한계가 있으며, 저는 전체 사용자 경험을 지속적으로 검증하고 있습니다.
개방형 혁신은 왜 중요한가요?
개방형 혁신(Open innovation)이 중요한 이유는 유용한 AI 애플리케이션이 단일한 폐쇄 모델이나 개발자가 의미 있게 검사할 수 없는 블랙박스 워크플로우에 의존해서는 안 되기 때문입니다.
ContextKeeper를 Gemma 기반으로 구축하면서, 저는 오픈 웨이트(open-weight) 모델 패밀리가 정의된 목적—개인 문서 검색—을 가진 실용적인 애플리케이션에 어떻게 통합될 수 있는지 탐구할 기회를 얻었습니다.
흥미로운 엔지니어링 작업은 단순히 모델을 호출하는 것만이 아닙니다. 시스템 내에서 모델이 어디에 속해야 하는지, 어떤 작업은 결정론적으로 남아 있어야 하는지, 생성된 출력을 어떻게 검증할지, 그리고 추론(inference)이 실패했을 때 유용한 기능을 어떻게 보존할지를 결정하는 것입니다.
이 프로젝트는 또한 모델 통합이 완전한 시스템의 일부로 평가되어야 함을 보여줍니다. 애플리케이션이 올바른 문서를 검색하거나 답변에 대한 증거를 보여줄 수 없다면, 생성된 설명만으로는 충분하지 않습니다.
개방형 혁신은 개발자들이 이러한 설계 선택 사항들을 실험하고, 구현체를 공유하며, 트레이드오프(trade-offs)를 검사하고, 서로의 작업 위에 구축할 수 있도록 만듭니다.
ContextKeeper에게 이것은 AI 지원 검색을 이해 가능하고 테스트 가능한 제품 역량으로 탐구한다는 것을 의미합니다. 즉, AI 출력을 자동으로 정확하다고 취급하지 않는 것입니다.
나의 에이전트 세션 (My Agent Session)
게으른 보상 (The Lazy Payoff)
정보에 대한 '기억'과 그 출처를 '찾는 노력' 사이의 간극을 줄이는 것이 목표입니다.
ContextKeeper가 없다면, 사람은 여러 파일을 열어보거나, 다양한 키워드를 시도하거나, 폴더를 탐색하거나, 부분적으로만 기억하는 구절에 대해 반복적으로 검색할 수 있습니다. ContextKeeper는 이러한 마찰(friction)을 줄이기 위해 회상된 내용을 사용하여 인덱싱된 콘텐츠와 메타데이터를 검색하도록 설계되었습니다.
저는 핵심 검색(retrieval) 및 폴더 재검색(folder-rescan) 동작을 구현하고 테스트했지만, 아직 신뢰할 수 있는 실제 시간 절약 측정치를 확립하지 못했습니다. 저는 임의로 백분율을 만들어내기보다는 정직하게 측정하는 것을 선호합니다.
유용한 다음 평가는 일반적인 파일 이름 또는 키워드 검색과 ContextKeeper의 리콜 모드(Recall Mode)를 사용하여 알려진 정보를 찾는 데 걸리는 시간을 비교하는 것입니다.
목표는 간단합니다. 정보 탐색에 쓰는 시간을 줄이고, 그 정보를 활용하는 시간에 더 많이 할애하는 것입니다.
ContextKeeper는 여전히 진화하는 중이며, 그것이 핵심입니다. 저는 실용적인 무언가를 만들고, 검색 및 증거 파이프라인(retrieval and evidence pipeline)을 테스트하며, Gemma가 어떻게 집중적이고 유용한 AI 경험을 지원할 수 있는지 탐구하고 싶었습니다.
당신의 파일들이 기억하니, 당신은 그럴 필요가 없습니다.