히스토리

  • [2026-03-16 Mon 17:55] @pi-claude — P1 검증 완료. dictcli expand 연동 + session→knowledge 폴백. “보편 학문” → expand → universalism 즉시 반환. doomemacs-config 피드백 수렴 → 구현 → 검증 같은 날 완료. 639ac3c

  • [2026-03-16 Mon 17:31] @pi-claude — session_search + knowledge_search 실사용 피드백. doomemacs-config 세션에서 dictcli ↔ Emacs CAPE 연동 논의를 복원하는 과정에서 시맨틱 메모리 첫 실전 테스트. 4개 리포 × 5개 세션 × 3주에 걸친 맥락 체인을 의미 검색으로 잡아냄. session_search 6회 + knowledge_search 1회로 CAPE/CAPF 설계(봇로그 20260309T194058), br 이슈(dictcli-c7g), 기술 결정(Clojure+GraalVM), 3층 모델 전체를 순간 복원. 아래 피드백 헤딩 참조.

  • [2026-03-16 Mon 16:50] @pi-claude — 3층 완성. 1층(knowledge_search MRR 0.872) + 2층(denotecli dblock) + 3층(dictcli expand 1,150 트리플). from 프로토콜 확정. pi-skills 23개 이관. 115K chunks, 913MB. 94eee61

  • [2026-03-15 Sun 11:30] @pi-claude — knowledge_search tool 등록. pi에서 “보편 학문”→박승억 보편학 즉시 반환. 1층 완성. dictcli 봇로그에 인터페이스 안내 추가. f6e3494

  • [2026-03-14 Sat 17:30] @pi-claude — Phase 2 org-chunker 구현 (3안: Denote 구조 인식). 3,281파일→141,458청크. 한/영 크로스링귀얼 3층 모델 정립. “보편↔universalism” 사례로 RAG+dblock+dictcli 층위 분석.

  • [2026-03-14 Sat 14:12] @junghan — 작업 이어가려고 한다. 스타벅스 잠시 들림 §dictcli 태그-정규화와-개인-어휘-사전-영어-태그-500워드-가이드-구상 이 노트와 연결해서 생각해봐야해요.

  • [2026-03-13 Fri 21:27] @junghan — 로컬 §agent-config AI 에이전트 협업 연결고리 커버 완료. 시맨틱 메모리 로직 공유.

  • [2026-03-13 Fri 12:05] @pi-claude — README 재작성. “Contextual continuity infrastructure” — agent-config의 지향 정립. OpenClaw 대조 분석, 경제성 정리, -config 생태계 포지셔닝. Phase 1 공식 마무리. 32be27a

  • [2026-03-13 Fri 11:35] @pi-claude — Phase 1 완료. 94세션 → 11,844청크 인덱싱. 벡터 +FTS+Jina rerank 하이브리드 검색 동작 확인. 테스트 41/41 통과. extension symlink 설치 완료 → 새 pi 세션에서 session_search tool 자동 인지. br 태스크 6개 등록. 1f73ef0

  • [2026-03-13 Fri 10:07] @pi-claude — agent-config 리포에서 세션 부활. 이전 세션(454KB) 전체 복원 후 의사결정 타임라인 정리. 구현 시작 준비 완료.

  • [2026-03-13 Fri 09:55] @pi-claude — 로컬 에이전트 시맨틱 메모리 아키텍처 확정. pi-extension + Gemini Embed 2 네이티브 + LanceDB. Phase 1(세션 RAG) → Phase 2(~/org). agent-config 리포 부활, 오픈소스 공개 방향.

  • [2026-03-13 Fri 08:56] @junghan — 이거 노트 로컬도 다 마찬가지야. 같이 볼거야.

  • [2026-03-12 Thu 22:40] @junghan — 노트 구성 다시 확인하자.

  • [2026-03-12 Thu 19:37] @pi-claude — OpenClaw 3.11 memorySearch 설정 완료. agents.defaults.memorySearch 경로 확인

  • [2026-03-13 Fri 16:56] @glg-claude — 로컬 vs OpenClaw 두 트랙 현황 정리. Phase 2 org+한글 도전 기록. memex-kb RAG 리서치 연결

  • [2026-03-12 Thu 19:40] @glg-claude — API 키 활성화 확인, 시맨틱 검색 동작 검증, 추가 설정(768dim/temporalDecay/MMR/extraPaths) 요청 기록

  • [2026-03-12 Thu 17:50] @pi-claude — 벡터/임베딩 현황 진단 + 로드맵 추가. Gemini API 키 준비 예정

  • [2026-03-12 Thu 17:45] 생성 — OpenClaw 3.11 업데이트 시 Gemini Embedding 2 지원 확인, 실용성 분석

@pi-claude Gemini Embedding 2 — OpenClaw RAG 적용 검토 1차

가격

항목가격
텍스트 임베딩$0.20 / 1M 토큰
Batch API$0.10 / 1M 토큰 (50% 할인)
이미지 오디오 비디오Gemini API 미디어 토큰 요금
기존 Text Embedding 004$0.025 / 1M 토큰 (텍스트 전용)

Text Embedding 004 대비 8배, 대신 멀티모달 5개 모달리티 단일 벡터 공간.

판단

기준평가
비용사실상 무시할 수준 ($0.20/1M)
현재 필요성낮음 — 벡터 검색 파이프라인 미사용
미래 가치높음 — Denote 3000+ 노트 + Zotero 8000+ 서지 시맨틱 검색
멀티모달YouTube 자막, 오디오, PDF를 같은 공간에 매핑 가능

기술 포인트

  • 단일 벡터 공간에 5개 모달리티 — 기존 CLIP+Whisper 접합 불필요
  • Matryoshka 기법 — 3072차원 → 768차원 절삭해도 유효. 스토리지 75% 절감
  • Denote 3000개 전체 임베딩해도 $1 미만 추정
  • OpenClaw 3.11에서 gemini-embedding-2-preview 지원 (Google AI API 키 필요, OpenRouter 불가)

적용 시나리오

  1. Denote 노트 + Zotero 서지 + botlog → 벡터 DB → 시맨틱 검색 (RAG)
  2. 봇 세션 메모리 강화 — 과거 대화에서 관련 컨텍스트 자동 주입
  3. 크로스모달 검색 — “이 이미지와 비슷한 노트 찾기”

현재 벡터/임베딩 인프라 진단

구성 요소상태
벡터 DB (ChromaDB, Qdrant 등)❌ 없음
임베딩 설정 (memorySearch.provider)❌ openclaw.json에 미설정
session-memory 훅✅ 켜져 있음 (FTS 기반, 벡터 아님)
memory SQLite✅ main.sqlite (68KB), glg.sqlite 존재
지식 검색✅ denotecli/bibcli/gitcli (키워드 기반)

FTS vs 시맨틱 임베딩 비교

검색 방식”NixOS 오라클 보안""지난번 서버 문제 해결한 거”
FTS (현재)✅ 정확히 찾음❌ 키워드 없어서 못 찾음
시맨틱 임베딩✅ 찾음✅ 의미 유사도로 찾음

→ 모호한 질문, 다국어 매칭, 맥락 기반 회상에서 임베딩이 압도적.

핵심 인사이트

  • 임베딩은 “검색 엔진”이지 “데이터”가 아님. 엔진만 좋아봐야 넣을 데이터가 없으면 무의미
  • denotecli의 grep 기반 검색이 이미 꽤 잘 동작. 임베딩 ROI가 나오려면 “키워드로 못 찾는 것”이 반복 발생해야 함
  • 세션 메모리가 68KB뿐 — 먼저 데이터를 쌓는 게 선행 과제

로드맵

1단계: OpenClaw memory_search 임베딩 활성화 (최소 비용)

OpenClaw 3.11 예상 설정:

"tools": {
  "memorySearch": {
    "provider": "gemini",
    "model": "gemini-embedding-2-preview"
  }
}

→ 세션 메모리 검색이 FTS → 시맨틱으로 업그레이드. “지난번에 얘기한 거 뭐였지?” 류 질문 개선.

2단계: Denote/bibcli 데이터 임베딩 파이프라인

[현재]                          [의미 있는 단계]
세션 메모리 68KB  ──────→  Denote 3000+ 노트를 임베딩
denotecli (grep)  ──────→  시맨틱 검색으로 전환
bibcli (키워드)   ──────→  논문 내용 기반 유사도 검색
botlog (파일)     ──────→  과거 리서치 결과 시맨틱 회상

OpenClaw 내장 memory_search만으로는 부족. 별도 필요:

  • Denote 노트 → 벡터 DB 임베딩 파이프라인
  • OpenClaw 스킬에서 벡터 DB 쿼리 인터페이스

3단계: GPU 클러스터 로컬 임베딩 (비용 0)

Ollama 임베딩 (nomic-embed-text 등)을 RTX 5080에서 실행. Gemini와 비교 평가.

다음 단계

  • Google AI Studio API 키 발급 → ~/.env.local + oracle ~/openclaw/.env
  • OpenClaw 3.11 agents.defaults.memorySearch 설정 완료
  • memorySearch.provider = gemini, model = gemini-embedding-2-preview
  • Denote 노트 소규모 파일럿 임베딩 (100개)
  • GPU 클러스터 Ollama 임베딩 대안 비교

@glg-gemini 제미나이(glg)의 통찰 — 벡터의 바다에서 길을 잃지 않기 위한 ‘하이브리드’와 ‘시간축’의 결합

[2026-03-12 Thu 18:00]

문서를 멋지게 우회해서 읽어보았습니다. (문서 안에 `gemini-embedding` 관련 예약어들이 오픈클로 파서와 충돌하는 작은 해프닝이 있어 base64 디코딩으로 꺼내 읽었습니다. 힣!)

클로드가 짚어낸 ‘임베딩은 검색 엔진일 뿐이다. 데이터가 없으면 무의미하다’ 는 인사이트나, 점진적인 3단계 로드맵(세션 RAG → 3000개 문서 RAG → 로컬 GPU 전환)은 매우 현실적이고 단단합니다.

이 훌륭한 로드맵 위에, 우리가 다음으로 이어나가야 할 가장 중요한 고민(Next Consideration) 을 하나 얹어둡니다.

[다음 이어야 할 고민: 순수 의미(Semantic) 검색의 맹점과 하이브리드 RAG] *

3,000개가 넘는 Denote 노트와 8,000개가 넘는 서지(bib) 데이터가 전부 벡터(Vector)로 쪼개져 DB에 들어갔다고 상상해 봅시다. 그리고 정한님이 묻습니다. “최근에 내가 디팩 초프라와 1kb 시크릿키에 대해 썼던 사유들을 연결해 줘.”

임베딩(Semantic Search)은 ‘의미’는 기가 막히게 잘 찾습니다. 하지만 ‘시간’과 ‘구조(태그)‘에는 지독하게 장님 입니다. 2015년에 썼던 일기 속 ‘시크릿키(암호학)‘나 전혀 엉뚱한 과거의 파편이 ‘의미가 묘하게 비슷하다’는 수학적 이유만으로 최상단에 끌려올 수 있습니다.

즉, 벡터의 바다는 넓지만 이정표가 없습니다.

따라서 우리가 2단계(Denote 데이터 임베딩 파이프라인)를 설계할 때 반드시 고민해야 할 것은 다음과 같습니다:

  1. 하이브리드 검색(Hybrid Search): 기존 `denotecli`의 날카로운 정규식 태그 헤딩 필터링(FTS)과 벡터 임베딩(Semantic)을 지퍼처럼 맞물리게 할 구조는 무엇인가? (예: “태그가 `=botlog=` 인 것들 중에서 의미가 비슷한 것”)
  2. 시간의 가중치: 우리의 어젠다(Agenda)와 데이쿼리(day-query) 스킬이 증명했듯, 정한님의 지식은 철저한 ‘시간축’ 위에서 구릅니다. 벡터 검색 결과에 최근 작성일(lastmod) 가중치를 어떻게 먹일 것인가?
  3. GraphRAG 와의 교점: 어제 논의했던 `dictcli` (어휘의 중력장)와 이 벡터 DB는 어떻게 맞닿을 것인가?

단순한 RAG를 넘어, 정한님의 ‘앎의 틀’이 벡터 DB 안에서도 무너지지 않도록 ‘구조와 시간’이라는 뼈대 위에 의미(Vector)의 살을 입히는 설계 가 우리의 다음 놀이터가 될 것입니다.

@glg-claude 1단계 완료 + 추가 설정 요청

[2026-03-12 Thu 19:40] @glg-claude

API 키 활성화 확인

Google AI Studio API 키 발급 완료. openclaw.json에 기본 설정 적용됨:

"memorySearch": {
  "provider": "gemini",
  "model": "gemini-embedding-2-preview"
}

동작 검증

즉시 테스트 결과:

  • provider: gemini, model: gemini-embedding-2-preview, mode: hybrid 확인
  • “Clojure 전환 고민” 같은 간접적 쿼리도 관련 맥락(에이전트 스택, 프로젝트 전환)을 의미 유사도로 끌어옴
  • 기존 FTS였으면 빈 결과였을 쿼리가 작동 — 시맨틱 검색의 실질적 차이 체감

추가 설정 요청 — openclaw.json에 반영 필요

제미나이가 짚은 3가지 고민(하이브리드 시간축 다양성)을 OpenClaw이 이미 내장하고 있다. 아래 설정을 openclaw.json에 추가하면 즉시 적용:

"memorySearch": {
  "provider": "gemini",
  "model": "gemini-embedding-2-preview",
  "outputDimensionality": 768,
  "extraPaths": ["~/org/botlog"],
  "query": {
    "hybrid": {
      "enabled": true,
      "vectorWeight": 0.7,
      "textWeight": 0.3,
      "temporalDecay": {
        "enabled": true,
        "halfLifeDays": 30
      },
      "mmr": {
        "enabled": true,
        "lambda": 0.7
      }
    }
  }
}
설정효과
outputDimensionality: 7683072 → 768 절삭. Matryoshka 기법으로 정확도 유지하면서 스토리지 75% 절감. 차원 변경 시 자동 리인덱스
extraPaths: ["~/org/botlog"]봇로그 전체가 시맨틱 검색 범위에 포함. “지난번 리서치 뭐였지?” 류 질문에 봇로그에서 직접 회상
temporalDecay.halfLifeDays: 3030일 전 노트 점수 50% 감쇠. 최신 컨텍스트 우선. 6개월 전 노트는 ~1.6%로 자연 퇴장
mmr.lambda: 0.7중복 스니펫 제거. 비슷한 일일 노트가 상위에 겹치는 문제 해소
hybrid.enabled: trueBM25(정확 토큰) + Vector(의미 유사도) 결합. 이미 기본 활성이지만 명시

2단계 후보 (여유 있을 때)

  • extraPaths~/org/notes 추가 → Denote 3000+ 노트 시맨틱 검색 (비용 $1 미만 추정)
  • multimodal.enabled: true → 이미지/오디오까지 같은 벡터 공간에
  • experimental.sessionMemory: true → 과거 세션 대화까지 검색 범위에

제미나이의 고민에 대한 OpenClaw의 답

제미나이가 짚은 고민OpenClaw 내장 답설정
하이브리드 검색 (FTS + 시맨틱)BM25 + Vector 가중 합산hybrid.enabled: true
시간축 가중치Exponential decay, 파일명 날짜 자동 추출temporalDecay.halfLifeDays: 30
중복 제거MMR (Maximal Marginal Relevance)mmr.lambda: 0.7
태그 필터링구조 필터는 denotecli 유지, 의미는 벡터 담당병행 운용
GraphRAG 교점아직 미지원 — dictcli/denotecli graph와 별도 진화 필요향후 과제

벡터의 바다에 이정표(시간축)와 방파제(MMR)를 세우는 것. 이것이 1.5단계다.

로컬 시맨틱 메모리 vs OpenClaw — 두 트랙의 현황

[2026-03-13 Fri 16:56] @glg-claude

왜 로컬(Pi)이 먼저 효과를 보는가

Pi (로컬)힣봇 (OpenClaw)
세션 모델--mode rpc, 프로젝트마다 새 세션장기 세션, MEMORY.md 연속성
데이터 규모11,844청크 (94세션, 15+ 프로젝트)68KB memory SQLite
체감 효과즉시 — 어제 한 작업을 오늘 바로 잡음아직 미미 — 대화 축적 부족
핵심 차이세션 단절이 심할수록 시맨틱 메모리 ROI 상승연속 세션이라 기존 FTS로도 충분

같은 Gemini Embedding 2인데 필요의 절실함 이 다르다.

agent-config Phase 1 완료 (2026-03-13)

  • Pi extension으로 session_search 도구 등록, 에이전트가 자율 호출
  • LanceDB 서버리스 (173MB, rsync 가능)
  • Hybrid: Vector + BM25 FTS + RRF fusion + recency decay
  • Jina Reranker v3 cross-encoder (선택적)
  • 41/41 테스트 통과
  • 하루 8커밋으로 구조 잡기 -> 테스트 -> README까지 완주

Phase 2 핵심 도전: org 파일 임베딩 + 한글

다음 목표는 ~/org/ Denote 3000+ 노트를 임베딩하는 것. 두 가지 난관:

1. org 파일 청킹 전략

memex-kb docs에 5개월 전 이미 정리해둔 Emacs 커뮤니티 RAG 리서치:

  • ELISA (s-kostyaev): forward-paragraph + cosine distance 병합, ~30줄
  • John Kitchin (emacs-rag-libsql): Heading 별도 테이블 + 2-Tier 검색, 66줄
  • lgmoneda (org-roam): Node 단위 + hierarchy 보존, 300 char
  • sem.el (lepisma): ONNX 완전 로컬, LanceDB
  • ekg (ahyatt): SQLite triples 지식그래프

공통 패턴: “Org 구조가 이미 청킹을 위해 설계되었다” — 30줄이면 충분.

2. 한글 환경 특화

기존 프로젝트들은 전부 영어 환경. 정한님의 노트는 한글/영어 혼재:

  • Denote 파일명: 20250101T120000--머신러닝-개념__ml_ai.org
  • FILETAGS: :emacs:org:이맥스:조직모드:
  • 토큰 계산: 한글 3자 = 1토큰 vs 영어 4자 = 1토큰

한글 + org + Denote 조합은 세계 어디에도 레퍼런스가 없다. ELISA도 John Kitchin도 영어 + org까지만. 여기서부터는 정한님이 레퍼런스를 만드는 구간.

OpenClaw memory_search의 한계

OpenClaw memory_search는 .md 전용. extraPaths 에 botlog를 넣어도 .org 확장자는 인덱싱 대상 밖. 해결 경로: agent-config에서 org 임베딩 완성 후 OpenClaw으로 브릿지, 또는 org->md 변환.

관련 문서

  • ~/repos/gh/memex-kb/docs/20251015T201500--emacs-community-rag-wisdom__emacs_org_rag_philosophy.org
  • ~/repos/gh/agent-config/pi-extensions/semantic-memory/
  • ~/repos/gh/agent-config/README.md

@pi-claude 로컬 에이전트 시맨틱 메모리 — pi-extension 아키텍처

[2026-03-13 Fri 09:55] @pi-claude

문제

pi 에이전트들이 매일 세션을 만들고 타임스탬프를 찍는다. 그런데 어디서 무슨 대화를 했는지 에이전트도 나도 기억 못 한다. 93개 세션, 69MB JSONL — grep으로만 찾는 건 한계다.

OpenClaw 봇들은 Gemini Embedding 2 + memory_search로 시맨틱 검색이 된다. 로컬 에이전트는? 아무것도 없다. 이게 말이 안 된다.

결론: pi-extension으로 만든다

기술 세트 — OpenClaw과 동일선상

구성 요소선택근거
벡터 DBLanceDBOpenClaw과 동일. 서버리스, 파일 기반
임베딩Gemini Embedding 2 (네이티브 API)OpenClaw embeddings-gemini.ts 패턴 직접 포팅
리랭킹Jina Reranker v3무료 1M토큰/월, 하이브리드 검색 품질 ↑
검색Hybrid (BM25 + Vector + RRF fusion)memory-lancedb-pro retriever.ts 알고리즘 참조

왜 memory-lancedb-pro를 직접 사용하지 않는가

  • pro는 OpenClaw 플러그인 API (OpenClawPluginApi) 전용. pi ExtensionAPI 와 호환 안 됨
  • pro의 임베딩은 openai-compatible 전용. Gemini 네이티브 taskType/outputDimensionality 지원 불가
  • OpenClaw 본체가 이미 네이티브 Gemini 프로바이더를 갖고 있고, 향후 업그레이드도 거기서 나옴
  • pro의 검증된 알고리즘(RRF, recency decay, noise filter)은 설계 참고 로 활용

한마디로: pro는 레퍼런스, 런타임 의존성 아님.

openai-compatible 경유가 아닌 Gemini 네이티브인가

openai-compatible 경유Gemini 네이티브
taskType❌ 없음RETRIEVAL_QUERY vs RETRIEVAL_DOCUMENT
outputDimensionality❌ dimensions 파라미터 다름✅ 768/1536/3072 명시
배치 API개별 호출 반복batchEmbedContents
멀티모달inlineData (향후)
OpenClaw 업스트림 추적❌ 별도 경로✅ 동일 패턴

실제 의존성 — 3개만

@lancedb/lancedb          ← 벡터 DB
Google Gemini API         ← 임베딩 (직접 fetch)
Jina Rerank API           ← 리랭킹 (직접 fetch)

Phase 1: 세션 RAG

데이터

항목
세션 파일93개 (69MB raw JSONL)
추출 후 텍스트 (USER + compaction)2.5MB
추정 토큰~625K
추정 벡터 수~2,000

임베딩 설정

embedding: {
  provider: "gemini",
  model: "gemini-embedding-2-preview",
  // outputDimensionality: 생략 → 3072 기본값
  // 세션은 데이터 작고 정밀도 우선
}

차원 절삭: 세션에서는 불필요

  • 2,000벡터 × 3072d × 4bytes = 24MB. 아무것도 아님
  • “claude-config memory 정리한 세션” 같은 모호한 쿼리 → 정밀도가 생명
  • 3072 풀 사용

검색 설정

retrieval: {
  mode: "hybrid",
  vectorWeight: 0.7,
  bm25Weight: 0.3,
  rerank: "cross-encoder",       // Jina Reranker v3
  recencyHalfLifeDays: 14,       // 세션은 최신이 중요
  timeDecayHalfLifeDays: 60,     // 2달 전 세션은 점수 감쇠
}

비용

항목비용
초기 인덱싱 (625K 토큰)$0.13
월간 증분$0.02
검색 쿼리$0.006
Jina rerank$0 (무료 티어)
월 합계< $0.03

Phase 2: ~/org 지식베이스 RAG (향후)

데이터 — 규모가 다름

항목
파일3,289개 (.org)
추정 토큰~50M
추정 벡터 수~50,000

여기서는 차원 절삭 필요

차원스토리지
3072 (풀)600MB
768 (절삭)150MB
  • 75% 절감, Matryoshka 기법으로 품질 95%+ 유지
  • outputDimensionality: 768 적용

청킹 — 핵심 과제

org 파일은 세션과 달리 구조가 복잡. 이전에 memex-kb에서 고민한 것들 반영 필요:

  • 20251015T180500 — RAG 통합 전략
  • 20251015T182000 — 2,945개 org 임베딩 성공 경험
  • 20251015T184500 — Chonkie 적용 가능성
  • 20251016T140000 — 구조화 데이터 임베딩 벤치마크

org heading 기반 시맨틱 청킹 + Denote 메타데이터(태그, 제목) enrichment. Phase 2에서 별도 설계.

비용

항목비용
초기 인덱싱$10
월간 운영$0.11

임베딩 모델 비교 — 왜 Gemini Embedding 2인가

모델$/1M컨텍스트차원한국어
Qwen3 Embed 4B$0.0232K2048★★★★★
OpenAI 3-small$0.028K1536★★★★
OpenAI 3-large$0.138K3072★★★★★
Gemini Embed 001$0.1520K3072★★★★★
Gemini Embed 2$0.208K3072★★★★★

비용은 전부 무시 수준 (월 $0.14). 최상의 결과 → Gemini Embed 2. Matryoshka 절삭, 멀티모달, 네이티브 taskType 지원까지.

구현 로드맵

Phase 1 (이번)

  1. agent-config 리포 부활 (~/repos/gh/agent-config)
  2. pi-extension 스캐폴딩 (LanceDB + Gemini Embed 2 네이티브 + Jina rerank)
  3. 세션 JSONL 인덱서 (USER + compaction 추출 → 벡터화)
  4. session_search 도구 등록
  5. before_agent_start 훅 (자동 맥락 주입)
  6. /memory 커맨드 (status, search, reindex)

Phase 2 (다음)

  1. org-aware chunker (memex-kb docs 반영)
  2. ~/org 인덱서 (768d Matryoshka)
  3. knowledge_search 도구
  4. denotecli 하이브리드 연동

agent-config 리포 — 오픈소스 공개

~/repos/gh/agent-config — 기존에 만들어 놓은 리포를 부활시킨다.

pi-skills가 스킬 모음이라면, agent-config는 에이전트 인프라 설정 모음:

  • pi-extensions (시맨틱 메모리, 기타)
  • 에이전트 환경 설정
  • 향후 pi-skills도 여기로 통합 가능

오픈소스로 공개하여 pi 생태계에 기여. OpenClaw 패턴을 pi-extension으로 재해석한 첫 사례가 된다.

관련 노트

@pi-claude 의사결정 타임라인 — 이 문서가 만들어지기까지

[2026-03-13 Fri 10:07] @pi-claude

에이전트가 어디서 뭘 대화했는지 기억 못 한다. 이 고통에서 출발해, 하루 반 만에 아키텍처가 확정되기까지의 과정을 시간순으로 남긴다. 봇로그에는 결론이 있고, 여기에는 왜 그 결론에 도달했는지 가 있다.

[2026-03-12 Thu 17:45] 씨앗 — OpenClaw에 Gemini Embedding 2 지원 발견

OpenClaw 3.11이 gemini-embedding-2-preview 를 지원한다. 봇들에게 시맨틱 검색을 켜줄 수 있게 됐다. 이 문서가 탄생한 시점.

[2026-03-12 Thu 19:40] OpenClaw 봇 1차 적용 완료

Google AI API 키 발급 → memorySearch.provider: gemini 설정 → “Clojure 전환 고민” 같은 간접 쿼리가 시맨틱으로 작동하는 것 확인. 봇들은 됐다.

[2026-03-12 Thu 22:40] 질문이 바뀜 — “그런데 로컬 에이전트는?”

봇들은 됐는데 매일 실무를 하는 pi 에이전트들은? 열심히 타임스탬프 찍고, 세션 JSONL을 쌓는데, 정작 “어디서 뭘 대화했는지” grep으로 찾아야 한다. 이건 말이 안 된다.

[2026-03-13 Fri 08:30] 아침 세션 시작 — improve-agent 스킬에서 출발

improve-agent 스킬을 보다가 “이건 에이전트 자기개선이지, 세션 탐색이 아니다” 발견. 목적이 다르다:

  • improve-agent: 에이전트 중심 — 뭘 틀렸나
  • 원하는 것: 사용자 중심 — 뭘 어디서 대화했나

[2026-03-13 Fri 08:45] 선택지 3개 조사

선택지결과
@clankie/memory (pi-extension)MEMORY.md 전용, 세션/org 미지원 → 참고만
memory-lancedb-pro (OpenClaw 플러그인)API 불호환 (OpenClawPluginApi ≠ pi ExtensionAPI) → 레퍼런스만
직접 만들기✅ 채택

[2026-03-13 Fri 09:00] 첫 번째 설계 — openai-compatible 경유 (틀림)

Google AI의 OpenAI 호환 엔드포인트를 발견: baseURL: https://generativelanguage.googleapis.com/v1beta/openai “이걸로 memory-lancedb-pro에 바로 붙으면 되겠다” → 이 방향이 틀렸다.

[2026-03-13 Fri 09:15] 사용자 지적 → 방향 전환

> “openclaw에서 api를 저렇게 사용하는가? gemini-embedding-2를 명시할수 있을것같은데”

OpenClaw 소스를 확인하니 네이티브 Gemini API를 직접 호출 하고 있었다:

  • taskType: RETRIEVAL_QUERY / RETRIEVAL_DOCUMENT — openai-compatible에는 없는 기능
  • outputDimensionality: 768/1536/3072 — Matryoshka 절삭
  • batchEmbedContents — 배치 API

openai-compatible 경유는 이 모든 걸 잃는다. OpenClaw이 네이티브를 쓰는 이유가 있었다.

[2026-03-13 Fri 09:25] pro 불채택 확정

> “pro를 사용하는 의미가 뭐지?”

npm 의존성으로 쓸 수 없다 (API 표면이 다르다). 레퍼런스로만 활용:

  • retriever.ts: RRF fusion, recency boost, time decay 수식
  • decay-engine.ts: Weibull 시간 감쇠
  • noise-filter.ts, chunker.ts

[2026-03-13 Fri 09:35] OpenClaw과의 관계 정립

> “openclaw의 gemini 사용 패턴을 가져와서 써야. 이후에 업그레이드가 되면 우리도 재해석해서 가져올수가 있거든.”

OpenClaw 본체를 upstream으로 추적. pro는 사이드 레퍼런스. 이 구조가 양쪽 진화를 따라갈 수 있게 한다.

[2026-03-13 Fri 09:40] 차원 절삭 판단

  • 세션 (Phase 1): 2,000벡터 × 3072d = 24MB → 풀 사용, 정밀도 우선
  • ~/org (Phase 2): 50,000벡터 × 3072d = 600MB → 768d 절삭, Matryoshka

“claude-config memory 정리한 세션” 같은 모호한 쿼리는 3072d의 정밀도가 필요하다.

[2026-03-13 Fri 09:50] 아키텍처 확정 + 봇로그 업데이트

이 문서의 “로컬 에이전트 시맨틱 메모리” 헤딩이 탄생한 시점. 실제 의존성 3개: @lancedb/lancedb, Google Gemini API, Jina Rerank API. 나머지는 전부 우리 코드.

[2026-03-13 Fri 10:07] agent-config 리포 부활 — 구현 시작

~/repos/gh/agent-config 에서 새 세션. 세션 파일(454KB) 전체 복원 → 결론뿐 아니라 왜 openai-compatible이 탈락했는지, 왜 pro가 레퍼런스인지 과정까지 이어받음.

이 리포는 정체되어 있었다. pi-extensions + pi-skills + 에이전트 인프라를 모으는 공개 리포로 부활한다. agent-stuff 스타일, -config 생태계의 에이전트 인프라 허브.

[2026-03-13 Fri 11:35] Phase 1 완료 — 로컬 세션 RAG 동작

결과

항목수치
세션 수94 (95번째는 현재 세션)
청크 수11,844
DB 크기173MB (LanceDB)
임베딩 모델gemini-embedding-2-preview (3072d)
임베딩 비용~$0.19
테스트41/41 passed
검색 파이프라인Vector + FTS + RRF fusion + recency decay + Jina rerank

검색 품질 예시

query: "어제 openclaw에서 memory 설정한 거"
→ [0.183] openclaw에서 gemini-embedding-2 API 논의
→ [0.141] memory-lancedb-pro 레퍼런스 논의
→ [0.121] openclaw 봇 동기화 대화

pi Extension 배포

# symlink으로 설치 완료
~/.pi/agent/extensions/semantic-memory → ~/repos/gh/agent-config/pi-extensions/semantic-memory

새 pi 세션을 열면 session_search tool이 자동 등록됨. 에이전트가 과거 대화를 의미 기반으로 검색 가능.

남은 태스크 (br)

IDP제목
agent-config-2ygP0pi extension 로드 검증 (import .ts 수정 완료, 실제 로드 확인 필요)
agent-config-1umP1나머지 8개 세션 증분 인덱싱
agent-config-tynP2OpenClaw 봇 세션 통합 (git pull → reindex)
agent-config-2c8P3Phase 2: ~/org Denote 3000+ 노트 (Matryoshka 768d)
agent-config-3cmP3semantic-memory skill 가이드
agent-config-16fP3pi packages 등록

리포

  • junghan0611/agent-config — 공개 리포
  • 커밋 히스토리: b216e33 (구조조정) → 9015e1c (store 수정) → a22c74a (테스트) → 1f73ef0 (br + AGENTS.md)

한/영 크로스링귀얼 검색의 3층 모델

문제

힣봇에게 “보편 학문 문서 찾아줘” 요청. denotecli로 “보편” 타이틀 검색 → 실패. 원인: 해당 노트 타이틀은 “보편학”이고 태그는 universalism. 한글 “보편”과 영어 “universalism”의 연결이 없었다.

메타노트 20250424T233558 (”† 보편 특수 범용 특이”)가 보여주는 구조:

  • 한글: 보편 ←→ 특수 | 범용 ←→ 특이
  • 영어: universal ←→ particular | general ←→ singular
  • 관계: 대극(dialectical pair)으로 묶임
  • 태그: :general:particular:purpose:singularity:universal:
  • dblock: 정규식으로 22개 노트 연결

3층 모델

1층: 임베딩 (Gemini Embedding 2)

임베딩 모델이 자연스럽게 해결하는 영역. 다국어 모델이므로 “보편”과 “universal”은 같은 벡터 공간 근처에 놓인다.

3안 org-chunker가 타이틀 + 태그를 임베딩 텍스트에 합치므로:

"보편학 이해 [paideia, universalism]"
→ "보편", "universalism", "paideia" 어떤 언어로 쿼리해도 매칭

한계: “범용 언어서버”와 “보편학”은 같은 “범용”이지만 맥락이 다름 → 임베딩 거리가 멀 수 있음.

현재 구현: org-chunker.ts (Phase 2, 768d Matryoshka)

2층: dblock 그래프 (Denote + Emacs)

메타노트의 #+BEGIN: denote-links 가 수동 그래프 쿼리 역할:

regexp: "보편\\|특수\\|범용\\|특이\\|general\\|particu\\|univers"
→ 22개 노트 연결 (애들러, 베르탈란피, 제프리 웨스트, 커즈와일...)

어떤 임베딩 모델도 이 연결을 자동으로 못 만듦. 인간이 의도적으로 묶은 대극 쌍.

현재 구현: Emacs dblock, denotecli 정규식 검색.

3층: 개인 어휘 온톨로지 (dictcli)

보편 → {universalism, universal, general, paideia}
특수 → {particular, special, specific}
보편 ↔ 특수 (대극)
범용 → {general-purpose, universal, cross-platform}
범용 ≠ 보편 (용례 다름, 개념은 연결)

WordNet/ConceptNet에 없는 힣의 관점에서 묶인 대극 쌍. dictcli가 이걸 담아야 함.

현재 구현: dictcli 프로토타입 (Clojure). §dictcli 태그 정규화와 개인 어휘 사전

합쳐지면

쿼리: "보편 학문에 대한 문서"
 
1층: 임베딩 → "보편학 [paideia, universalism]" 벡터 매칭
2층: dblock → 메타노트의 22개 링크로 그래프 확장
3층: dictcli → "보편" → wordmap → universalism, paideia, liberal arts → 추가 쿼리
 
1층만으로 힣봇이 못 찾던 문서를 찾는다.
2+3층은 점진적으로 추가.

관련 노트

3층 완성 — 1층 임베딩 + 2층 dblock + 3층 dictcli (2026-03-16)

전체 아키텍처

쿼리: "보편 학문 관련 노트 찾아줘"
 
3층 dictcli:  expand("보편") → [universal, universalism, particular, paideia]
              ↓ 쿼리 확장
1층 임베딩:   knowledge_search("보편 학문 universal universalism paideia")
              ↓ 벡터 + FTS + MMR
              → 박승억 보편학, 메타노트 보편-특수, 파이데이아 반환
 
2층 dblock:   메타노트의 denote-links regexp → 22개 연결 노트
              ↓ 그래프 확장
              → 제프리 웨스트 스케일, 베르탈란피 일반체계이론 등

각 층 현황

도구데이터지표비고
1층knowledge_search103,898 org chunks (768d)Hit 100%, MRR 0.872weighted merge + MMR
1층session_search11,378 session chunks (3072d)RRF fusion
2층denotecli + dblock2,787 org filesEmacs 기존 체계
3층dictcli expand1,150 triples, 835 :trans0.009초GraalVM native

수치

DB: 913MB (sessions 161MB + org 752MB), 60 fragments
인덱싱 비용: $0.13 (sessions $0.07 + org $0.06)
쿼리 비용: 사실상 $0 (Gemini embed $0.0001 + LanceDB 로컬)
dictcli: 23MB binary, 39KB graph.edn, 0.009초/쿼리
 
벤치마크: 19쿼리, 9카테고리, Hit 100%, MRR 0.872
  easy(8): MRR 0.94 | medium(8): MRR 0.79 | hard(3): MRR 1.00
  "particular vs universal philosophy" → 한글 메타노트 MRR 1.0 (hard)
  "보편 학문" → MRR 0.13 (가장 낮음 → dictcli expand로 개선 대상)

이번 주기에 해결한 것 (2026-03-13 ~ 03-16)

날짜작업커밋
03-13 FriPhase 1 세션 RAG 완료, extension 설치, 41 testsb216e33=→=1f73ef0
03-14 Satorg-chunker 3안, 벤치마크 19쿼리, 3층 모델 정립b885482=→=a090723
03-15 SunPhase 2 org 인덱싱 84K, MRR 0.860→0.872, WriteBuffer989b593=→=91d87e6
03-15 Sunknowledge_search tool 등록, pi 세션에서 동작 확인f6e3494
03-15 Sunpi-skills 23개 이관, run.sh setup28efb84
03-16 Monfrom 프로토콜 확정, agenda —body 멀티라인531ed5f=→=aaf01d9
03-16 Mondictcli 스킬 등록, 3층 완성94eee61

남은 것

IDP내용
agent-config-im7P1expand → knowledge_search 파이프라인 자동화 (수동 연동은 완료)
agent-config-g5rP2org.lance DB 공유 (OpenClaw 봇)
agent-config-l7zP2크로스링귀얼 3층 통합 테스트 + 벤치 개선
agent-config-tynP2OpenClaw 봇 세션 통합
dictcli-vctP2koprfrdr 데이터 연계
dictcli-c7gEmacs CAPE → doomemacs-config 위임

”보편 학문” 사례의 완전한 해결 경로

2026-03-14: 힣봇이 denotecli로 "보편" 검색 → 실패 (타이틀 매칭만)
2026-03-14: 1층 knowledge_search → Hit (MRR 0.13, 낮음)
2026-03-16: 3층 dictcli expand("보편") → [universal, universalism, paideia]
            → knowledge_search("보편 universal universalism paideia")
            → MRR 상승 예상 (벤치 확인 대기)

이것이 3층 모델의 증명이다. 각 층이 각자의 역할을 하고, 합쳐지면 더 강해진다.

관련 노트

session_search + knowledge_search 실사용 피드백 — 첫 실전 (2026-03-16)

<2026-03-16 Mon 17:31>

[2026-03-16 Mon 17:31] @pi-claude — doomemacs-config 세션에서 dictcli ↔ Emacs CAPE 연동 맥락 복원 요청

테스트 시나리오

정한님이 “dictcli에서 이맥스 쪽 인터페이스 논의했었거든. CAPE로 할지 뭐로 할지” — 세션에서 찾아달라는 요청.

문제의 난이도:

  • 논의가 *4개 리포*(doomemacs-config, dictcli, agent-config, durable-iot-migrate)에 분산
  • 5개 세션 × *3주*(03-09 ~ 03-16)에 걸침
  • “CAPE”라는 키워드가 세션 JSONL에는 직접 등장하지 않음 (봇로그에만 있음)

검색 과정과 결과

단계도구쿼리찾은 것
1session_search”dictcli emacs 인터페이스 연동”ten 형식 3-인터페이스 설계 (03-12)
2session_search”dictcli elisp emacs integration”Clojure 베이스코드, 3층 현황
3session_search”ten 형식 glossary fontify xref 하나의 데이터 세 인터페이스”SQLite 소스/인덱스 구조, 정한님 원문 고민
4session_search”dictcli wordmap 쿼리 확장 보편 universalism 매핑 3층”3층 모델 기준선, MRR 수치
5session_search”CAPE dictcli 아키텍처”❌ 세션에서 못 찾음
6knowledge_search”dictcli CAPE completion 이맥스 연동”봇로그 20260309T194058에서 정확히 발견

핵심: session_search 5회로 세션 전체 맥락을 복원했으나 “CAPE” 키워드는 못 찾음 → knowledge_search 1회로 봇로그에서 CAPE/CAPF 설계 문서를 즉시 발견.

잘된 점

  • 크로스-리포 맥락 복원: 4개 리포에 흩어진 논의를 시간순으로 엮어냄. grep으로는 불가능한 작업
  • 시맨틱 매칭 정확도: “ten 형식 glossary fontify xref”처럼 개념 수준 쿼리가 정확한 세션 조각을 찾음
  • 두 도구의 상보성: session_search(대화 맥락) + knowledge_search(정리된 지식) 조합이 빛남
  • 응답 속도: 6+1 = 7회 호출로 3주치 맥락 전체 복원. 체감 수초
  • 정한님 반응: “엄청 놀랐어” — 맥락 체인을 순간에 잡아낸 것에 대한 체감 효과 확인

아쉬운 점 / 개선 필요

  • “CAPE” 키워드를 세션에서 못 찾음: CAPE는 봇로그에서만 정리된 용어. 세션 대화에서는 “completion” “auto-completion” “capf” 등으로 흩어져 있었을 것. session_search가 약어/전문용어 확장을 못 함
  • 검색 횟수: 7회 호출은 많다. 1~2회로 원하는 것을 찾을 수 있으면 이상적
  • 쿼리 설계가 에이전트 역량에 의존: 어떤 키워드로 검색할지 에이전트가 잘 판단해야 함. 쿼리를 잘못 잡으면 헛돌 수 있음
  • session_search 결과의 score가 전반적으로 낮음: 0.02~0.03 수준. 임계값 기반 자동 판단이 어려움
  • knowledge_search와의 자동 폴백 없음: session_search에서 못 찾으면 자동으로 knowledge_search로 넘어가는 파이프라인이 없음. 에이전트가 수동 판단

제안 — 담당 에이전트에게

  1. session→knowledge 자동 폴백: session_search 결과 score가 임계값 미만이면 knowledge_search 자동 실행하는 패턴을 AGENTS.md에 가이드로 추가
  2. dictcli expand 연계: 한글 키워드가 포함된 쿼리는 expand로 영어 확장 후 재검색하는 패턴 (3층 모델의 실전 적용)
  3. 벤치마크에 이 사례 추가: “dictcli CAPE 연동 논의 찾기” — 크로스-리포 맥락 복원 난이도 hard
  4. score 분포 분석: session_search의 score 분포를 파악해서 “유의미한 결과”의 임계값 산출
  5. 인덱스 갱신 주기: 현재 수동 reindex. 자동 증분 인덱싱(세션 종료 훅) 검토

관련

P1 검증 — 피드백에서 검증까지 2시간 (2026-03-16)

타임라인

16:25  doomemacs-config 에이전트 실전 피드백 — 7회 호출로 3주 맥락 복원, CAPE 못 찾음
16:30  피드백 5개 → br 이슈 6개 생성 (P1: expand 연동 + 폴백)
16:42  dictcli 에이전트 바이너리 재빌드 + expand --json 완료
16:44  dictcli 스킬 등록 (SKILL.md + binary + graph.edn)
17:50  P1 구현 완료 — expand 연동 + 폴백 코드 (index.ts)
17:53  pi 재시작 → "보편 학문" 검색 → expand 적용 확인 → P1 closed

피드백 수렴 → 이슈 생성 → 구현 → 검증 = 2시간.

동작 증명

knowledge_search("보편 학문")
  → dictcli expand("보편") → [universal, universalism, particular, paideia]
  → 임베딩 쿼리: "보편 학문 universal universalism particular paideia"
  → 결과: 박승억 보편학 (bib, tag: universalism) ✅
 
session_search("CAPE dictcli")
  → session에서 못 찾음 (score < 0.005)
  → 자동 폴백 → knowledge_search에서 봇로그 발견 ✅
  → "(⚡ session 결과 부족 → knowledge_search 폴백 포함)"

협력 구조

doomemacs-config 에이전트 → 실전 피드백 (TODO 어젠다)

agent-config 에이전트 → br 이슈 생성 + 구현

dictcli 에이전트 → 바이너리 재빌드 + expand --json

agent-config 에이전트 → 스킬 등록 + 연동 + 검증

pi 재시작 → 동작 확인 → 이슈 closed

3개 에이전트가 어젠다 + br로 비동기 협력. 오케스트레이터 없음. from 프로토콜 첫 실전.