박준 · PARK JOON
프로젝트 / AI 에이전트·자동화
AI 에이전트·자동화하이브리드 RAG데이터 파이프라인Next.jsGemini개인 지식 관리

단톡방을 비공개 위키로

내 기기의 메신저 대화를 로컬에서만 처리해 방마다 일일 리포트·대화 흐름 그래프·하이브리드 RAG·AI 팟캐스트로

기간
2026.06
형태
사이드 프로젝트
상태
동작 확인
역할
원안 구조 재구현·데이터 계약 설계·에이전트 팀 운영
실제 화면 녹화 · 개인정보와 내부 주소는 가렸습니다클릭하면 멈춤·재생
14,300건초기 적재 메시지(최근 30일, 7개 방)
46개단위 테스트(게이트 17 · 검색 29)
4계층파이프라인 영역(복호화·콘텐츠·검색·웹)
6종기능별 구현 계약 문서

문제

업무·커뮤니티 단톡방이 늘어나면서 중요한 논의와 링크가 대화 속에 묻혔습니다. 메신저 내장 검색은 키워드가 정확히 맞아야 하고, 하루 동안 무슨 이야기가 오갔는지 요약해 보거나 누가 누구와 자주 대화하는지 파악할 수단이 없었습니다.

대화는 개인정보이므로 본인이 참여한 방의 본인 기기 데이터만, 외부 전송 없이 로컬에서 처리하도록 범위를 정했고, 방마다 열람을 잠글 수 있게 했습니다.

접근

  • 동료가 공유한 «매일 코드가 바뀌는 잠긴 방 위키» 원안 구조를 로컬 환경에서 재구현하는 것으로 범위를 정했습니다.
  • 파이프라인을 복호화(ingest) · 콘텐츠 빌드(content) · 순수 검색 라이브러리(searchlib) · 웹앱(web)으로 나누고, 스키마와 인터페이스를 단일 계약 문서로 고정했습니다.
  • 에이전트 팀이 병렬로 만들되 영역별 파일 소유권을 분리해 동시 편집 충돌을 막았습니다.
  • 검색은 어휘 검색과 임베딩 코사인을 RRF로 융합하고, 임베딩 실패 시 어휘 검색으로 폴백하도록 했습니다.
  • 원본 DB는 읽기와 해시 확인만 하고, 복호화 평문과 키는 작업 후 파기하도록 했습니다.

구조

복호화로컬 암호화 DB를 읽어 메시지를 정규화하고 개인정보를 마스킹합니다.
요약·임베딩방별 하루치 대화를 Gemini로 요약해 MDX로 만들고 임베딩을 생성합니다.
그래프같은 5분 창에 발화한 사람 사이의 공존 가중치로 관계 그래프를 만듭니다.
게이트방마다 매일 바뀌는 4자리 코드와 24시간 JWT 쿠키로 열람을 제한합니다.
질의응답질문을 하이브리드 검색으로 근거를 모아 답하고 출처를 보여줍니다.
자동 갱신메시지 DB 변경을 감지하면 재복호화·재빌드합니다(선택).

주요 기능

일일 리포트방별 하루치 대화를 요약한 MDX 문서를 만들고, 대화가 없던 날도 빈 리포트로 남겨 기록의 완전성을 유지합니다.
대화 흐름 그래프방 안에서 누가 누구의 발화에 이어 말하는지를 d3-force 그래프로 보여 주고, 공개 데모에는 샘플 데이터만 씁니다.
하이브리드 RAG Q&A어휘 검색과 의미 검색을 RRF(k=60)로 융합하고 최신성 가중을 더합니다.
원문 뷰어말풍선 정렬·발화자 아바타·미디어 칩·링크 카드, 방 내 키워드 검색과 점진 로드를 제공합니다.
AI 팟캐스트일일 요약을 1인 내레이션 대본으로 바꿔 TTS로 5~10분 음성을 생성합니다.
방 조직화즐겨찾기·정렬·태그·폴더와 범위 지정 검색을 지원합니다.

결과

  • 초기 빌드에서 7개 방, 최근 30일 메시지 14,300건을 적재했습니다.
  • 게이트 17개·검색 29개 단위 테스트와 타입체크·프로덕션 빌드를 통과했습니다.
  • 실데이터 없이 구조를 볼 수 있는 샘플 데이터 생성기와 설계 문서를 포함한 저장소(비공개)로 정리했습니다.
  • 개인 대화 데이터와 비밀값은 저장소에서 제외하고 코드와 구조만 남겼습니다.

포인트

여러 에이전트가 한 앱을 동시에 만들 때 가장 효과가 컸던 것은 코드보다 먼저 쓴 데이터 계약과 파일 소유권 표였습니다. 경계를 문서로 고정해 두니 병렬 작업의 충돌 지점이 줄었고, 기능을 추가할 때도 «무엇을 바꾸지 않는가»를 계약 문서에 먼저 적었습니다.

임베딩 모델을 바꾸면 기존 벡터와 공간이 호환되지 않아 전량 재임베딩이 필요하다는 점도 확인했습니다. 문서 측과 질의 측의 입력 규약을 한 곳에 정의해 두어야 검색 정합이 유지됩니다.

기술

Next.jsMDXPythonSQLCipherSQLiteGeminiGemini Embeddingfuse.jsd3-forcevitest

상단 영상은 실제 화면을 녹화한 것입니다.