업무용 AI 비서의 탄생 (2편) 기억을 입히는 이중 인덱싱

목차
1편의 비서는 질문마다 백지에서 도구를 긁어서 과거 맥락이 쌓이지 않았습니다. 그래서 제 질문과 검색어를 마크다운으로 남기고 로컬 SQLite 벡터 저장소에 증분 인덱싱했습니다. 검색은 뜻으로 찾는 방식과 키워드로 찾는 방식을 묶었고, 흩어진 조각 기록은 도메인별로 군집해 패턴을 뽑았습니다. 그 결과 프롬프트에 과거 맥락과 인사이트가 얹혀 답이 더 좁혀져 돌아옵니다. 오래된 기억과 잘못된 군집은 여전히 사람이 걸러야 합니다.
이전 편 요약
1편 - 도구를 한 에이전트에 엮기에서는, 이슈 트래커·사내 위키·모니터링·운영 DB를 사람이 손으로 오가던 자료 수집을, 네 도구를 MCP로 한 비서에 물려 LLM이 직접 모으게 바꾼 이야기를 다뤘습니다. 자료를 줍는 노동이 사람에서 비서로 넘어갔습니다.
이번 편은 그 비서의 약점 하나에서 출발합니다.
비서가 매번 백지에서 시작하는 게 아쉬웠다
1편의 비서는 빨랐지만, 질문이 끝나면 방금 한 일을 깨끗이 잊었습니다. 매번 백지에서 네 도구를 긁으니, “저번에 비슷한 이슈를 봤는데” 하는 맥락이 도무지 쌓이질 않았습니다.
사람은 같은 이슈를 두 번째 보면 첫 번째보다 빠릅니다. 어디를 봐야 하는지, 전에 뭐가 원인이었는지 기억하기 때문입니다. 비서에게는 그 기억이 없었습니다. 그래서 두 번째로 한 일이 비서에게 기억을 붙이는 것이었습니다.
질문을 기록으로, 기록을 검색 가능한 기억으로
먼저 제가 비서에게 던진 질문과 검색어들을 마크다운 파일로 차곡차곡 남겼습니다. 거창한 DB가 아니라, 그냥 텍스트 기록입니다.
그리고 이 마크다운을 로컬 SQLite에 벡터 검색을 얹은 저장소에 증분 인덱싱했습니다. 벡터 저장소는 문장을 좌표(숫자 묶음)로 바꿔서, 뜻이 비슷한 기록끼리 가깝게 모아두는 저장소입니다. 증분 인덱싱은 매번 전부 다시 넣지 않고 “새로 생긴 것만 골라 넣는” 방식입니다. 전체를 매번 다시 색인하면 느리고 비싸니까, 바뀐 부분만 얹는 것입니다.
이렇게 하니 비서가 과거의 내 질문과 그때 좁혀둔 원인을 다시 꺼내 볼 수 있게 됐습니다.
의미로도 찾고, 단어로도 찾는다
기억을 꺼내는 검색을 한 가지로만 하지 않았습니다. 두 방식을 겹쳤습니다.
- 의미 기반 검색: 단어가 안 겹쳐도 뜻이 비슷하면 찾아줍니다. “정산이 안 맞는다”로 물어도 예전 “결제 금액 불일치” 기록을 끌어옵니다.
- 단어 기반 검색: 특정 키워드(에러 코드, 테이블 이름)가 정확히 들어간 기록을 놓치지 않습니다.
한쪽만 쓰면 구멍이 납니다. 의미 검색만 쓰면 정확한 식별자를 흘리고, 단어 검색만 쓰면 표현이 조금만 달라도 못 찾습니다. 둘을 합친 하이브리드로 그 빈틈을 메웠습니다. 뜻도 맞고 키워드도 맞는 기록을 같이 보는 것입니다.
무의미한 조각에서 인사이트를 캐다
여기서 한 단계 더 갔습니다.
벡터 저장소에는 그 자체로는 의미 없어 보이는 조각 기록이 잔뜩 쌓입니다. 질문 하나, 검색어 하나는 따로 보면 별것 아닙니다. 이걸 그냥 두지 않고, 뜻이 가까운 것끼리 도메인별로 묶었습니다. 결제는 결제끼리, 인증은 인증끼리 모으는 식입니다. (의미 기반 군집화)
묶고 나니 흩어져 있을 땐 안 보이던 게 드러났습니다. “이 도메인에서 같은 류의 이슈가 계속 반복되고 있다” 같은 패턴입니다. 조각 하나로는 신호가 아니었던 것이, 모이니 신호가 됐습니다.
정리하면 인덱싱을 두 겹으로 돌립니다.
- 1차 (검색층): 기록을 검색하기 좋게 벡터로 색인합니다. 의미·단어 하이브리드 검색이 여기서 돕니다.
- 2차 (인사이트층): 색인된 조각을 도메인별로 군집해, 프롬프트에 얹을 인사이트로 가공합니다.
flowchart TD
Q[내 질문·검색어] -->|마크다운으로 기록| MD[질의 기록]
MD -->|증분 인덱싱| V[(로컬 SQLite<br/>벡터 저장소)]
V -->|1차: 의미+단어 하이브리드 검색| H[과거 비슷한 맥락]
V -->|2차: 도메인별 의미 군집| C[도메인 인사이트]
NEW[새 질문] --> P[풍성한 프롬프트]
H --> P
C --> P
P --> LLM[LLM 응답]
style V fill:#ede9fe,stroke:#7C3AED,stroke-width:2px,color:#1a1a1a
style P fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#1a1a1a
style LLM fill:#e0f2fe,stroke:#0EA5E9,stroke-width:2px,color:#1a1a1a그래서 비서의 답이 달라졌다
이 두 겹을 거치고 나면, 비서가 LLM에게 건네는 프롬프트가 달라집니다.
예전엔 “방금 긁어온 날것의 자료”만 넘겼습니다. 지금은 거기에 “과거의 비슷한 맥락”과 “도메인 단위로 묶인 인사이트”까지 얹어서 넘깁니다. 같은 질문이어도 LLM이 받는 재료의 밀도가 다릅니다. 재료가 풍성하고 정확하니, 한 번에 더 좁혀진 답이 돌아옵니다.
자료를 모으는 시간이 줄어든 데다 비서가 건네는 맥락이 두꺼워지면서, 같은 시간에 더 많은 이슈를 더 정확하게 보게 됐다고 느낍니다. 다만 스톱워치로 재거나 따로 측정한 값은 없고, 어디까지나 제 체감입니다.
기억에도 그늘은 있다
기억을 붙이면 다 좋아질 것 같지만, 새로 생긴 위험도 있었습니다.
- 오래된 기억: 과거의 원인이 지금도 맞다는 보장은 없습니다. 시스템이 바뀌면 옛 기억이 오히려 비서를 헷갈리게 합니다. 그래서 기억은 “참고”로만 쓰고, 결론의 근거로는 항상 지금의 도구 데이터를 우선합니다.
- 잘못된 군집: 엉뚱한 조각이 한 도메인으로 묶이면, 거기서 뽑은 인사이트도 틀립니다. 군집 결과는 가끔 사람이 들여다봐야 합니다.
- 커지는 인덱스: 기록이 쌓일수록 저장소가 커지고 비용도 늡니다. 오래되고 안 쓰는 기록은 주기적으로 정리합니다.
1편에서 적은 대로, 비서가 똑똑해져도 그 결과를 의심하고 검증하는 일은 사람 몫으로 남습니다.
시리즈를 마치며
1편에서 비서는 여러 도구를 엮어 자료 수집을 대신하기 시작했고, 2편에서는 그 위에 기억을 얹어 과거 맥락과 도메인 인사이트까지 스스로 챙기게 됐습니다.
처음엔 알트탭을 덜 누르고 싶었을 뿐인데, 만들고 나니 일하는 방식이 바뀌어 있었습니다. 자료를 줍고 모으던 시간이 비서에게 넘어간 자리에, 비서가 모아온 걸 판단하고 결정하는 시간이 들어왔습니다. 기억이 오래될수록 낡은 내용을 어떻게 걷어낼지가 다음에 손볼 부분입니다.
