지식창고 화면
채팅, 회의록, 검색, 소스, 메모리, 플래닝 화면이 있다. 사용자는 자료를 고르고 질문한다.
실제 프로젝트 사례 04
Second Brain은 Obsidian 노트, 회의 오디오, 회의록, 채팅 기록, 메모리를 모아 AI 채팅의 참고자료로 붙이는 시스템이다. 초보자에게는 개인 도서관으로 설명하면 쉽다. 자료를 책장에 넣고, 질문이 오면 관련 책을 찾아 책상 위에 펼쳐준다.
meeting_chunks 4개, selected_meeting transcript 1개, working memory 2개
결정 사항, 담당자, 후속 작업을 회의록 근거와 함께 정리한다.
공개 강의용 안전 재현 화면이다. 실제 프로젝트의 개인 표시와 민감한 대화 내용은 넣지 않았다.
한 줄 지도
사용자가 직접 노트와 회의록을 뒤지지 않아도, AI가 관련 자료를 찾아 읽고 답하게 만든다.
채팅, 회의록, 검색, 소스, 메모리, 플래닝 화면이 있다. 사용자는 자료를 고르고 질문한다.
FastAPI와 claude-chat 서버가 검색, STT, provider 호출, meeting context 주입을 맡는다.
notes, meetings, meeting_chunks, chat history, memory_items, usage log가 저장된다.
Pipeline
STT는 음성을 글자로 바꾸는 기능이다. RAG는 그 글자 조각을 나중에 찾아 AI에게 붙이는 흐름이다.
회의 오디오나 노트를 넣는다. 큰 오디오는 upload job으로 처리한다.
Deepgram, Soniox, Mistral, ElevenLabs 같은 STT API가 음성을 텍스트로 바꾼다.
회의록을 조각내고 embedding을 저장한다. 각 조각은 검색 가능한 카드가 된다.
질문과 가까운 meeting_chunks, notes, memory를 찾고 순위를 섞어 고른다.
선택한 회의록과 검색 결과를 context로 붙이고, 중요한 내용은 memory로 승격한다.
AI 기본 개념 연결
회의 오디오를 텍스트로 바꾼다. 녹음 파일을 사람이 읽을 수 있는 회의록으로 푸는 단계다.
한 번에 찾기 어려운 긴 문서를 작은 카드로 나눈다. 책을 장별로 나누는 느낌이다.
각 meeting chunk를 숫자 좌표로 저장해 나중에 질문과 가까운 조각을 찾는다.
질문과 가까운 chunk를 골라 AI 컨텍스트에 넣는다. AI 앞에 관련 회의록을 펼치는 일이다.
core memory는 오래가는 사실, working memory는 지금 작업 중인 맥락이다.
STT, embedding, Claude/Codex/Gemini 호출이 각각 다른 사용량 테이블에 남는다.
Prompt Example
selected meetings는 사용자가 명시적으로 고른 회의록을 AI 책상 위에 통째로 펼쳐주는 기능이다.
<system-reminder>
<selected_meetings>
meeting_id: meet_2026_06_25
title: 제품 출시 일정 회의
speakers:
- PM: 제품 일정 담당
- Ops: 운영 담당
transcript:
PM: 출시 후보일은 7월 둘째 주입니다.
Ops: 운영 준비는 7월 첫째 주까지 끝내야 합니다.
</selected_meetings>
</system-reminder>
{
"sources": [
{
"kind": "meeting_chunk",
"title": "제품 출시 일정 회의",
"distance": 0.11,
"excerpt": "출시 후보일은 7월 둘째 주..."
},
{
"kind": "memory",
"tier": "working",
"content": "현재 제품 출시 일정 조율 중"
}
],
"instruction": "근거가 있는 내용만 답변에 사용"
}
Call → Result
사용자의 질문, provider 선택, 선택한 회의록 ID가 API 요청으로 들어가고, 백엔드는 context를 붙인 답변을 만든다.
{
"route": "/api/claude-chat",
"provider": "codex",
"message": "지난 회의에서 출시 일정 결정사항만 정리해줘",
"selected_meeting_ids": ["meet_2026_06_25"],
"sources": ["meetings", "memory", "notes"]
}
{
"answer": [
"출시 후보일은 7월 둘째 주입니다.",
"운영 준비 마감은 7월 첫째 주입니다.",
"PM과 Ops가 후속 작업 담당입니다."
],
"used_context": {
"selected_meetings": 1,
"meeting_chunks": 4,
"memory_items": 2
},
"usage_log": "llm_cli_usage_log_553"
}
Context Stack
답변 방식, 도구 사용 규칙, 현재 provider의 런타임 규칙을 넣는다.
대화 흐름을 유지하기 위해 이전 사용자/AI 메시지를 넣는다.
질문과 의미가 가까운 meeting_chunks, notes, memory를 검색해 붙인다.
사용자가 고른 회의록은 전체 transcript를 명시적으로 넣는다.
답변 후 chat history와 provider별 사용량 로그가 DB에 남는다.
DB View
| 장부 | 역할 | 초보자 비유 |
|---|---|---|
| meetings | 회의 기본 정보 | 회의 폴더 |
| meeting_transcripts | STT 결과 전문 | 회의록 원문 |
| meeting_chunks | 검색용 회의록 조각 | 색인 카드 |
| memory_items | 오래 보관할 기억 | 중요 메모장 |
| chat_sessions | 채팅 대화 기록 | 상담 기록지 |
| embed_cost_daily | 임베딩 비용 집계 | 검색 비용 영수증 |
강의 포인트
중요한 자료를 DB에 넣어두고, 질문할 때마다 관련 조각을 찾아 다시 context로 넣는다.
selected meeting은 전체 회의록 주입, semantic search는 가까운 조각 검색이다. 둘은 역할이 다르다.
STT, embedding, LLM CLI/API는 과금 방식이 달라서 사용량 로그도 기능별로 나눠야 한다.