AI ๋น์๊ฐ ์ง์ง "๊ธฐ์ต"ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒฝ๋ ์ธ์ง ๋ฉ๋ชจ๋ฆฌ ์์คํ
AI ๋น์(ChatGPT, Claude, OpenClaw ๋ฑ)๋ ๋ํ๊ฐ ๋๋๋ฉด ๋ชจ๋ ๊ฑธ ์์ด๋ฒ๋ฆฝ๋๋ค.
"์ด์ ๋ญ ๋จน์์ด?"๋ผ๊ณ ๋ฌผ์ผ๋ฉด ๋ชจ๋ฆ ๋๋ค. ๋ถ๋ช ์ด์ ๋งํ๋๋ฐ.
๋ณดํต ์ด๊ฑธ ํด๊ฒฐํ๋ ค๊ณ MEMORY.md ๊ฐ์ ํ์ผ์ ๊ธฐ์ต์ ์ ์ด๋๋๋ฐ:
- ๐ ํ์ผ์ด ์ ์ ์ปค์ ธ์ โ ํ ํฐ ๋ญ๋น
- ๐๏ธ ์ค๋๋ ์ ๋ณด๊ฐ ์์ฌ์ โ ์๋ ์ ๋ฆฌ ํ์
- ๐ ์ฐพ๊ธฐ ์ด๋ ค์์ โ ๊ฒ์์ด ๋ถ์ ํ
Remember๋ ์ด ๋ฌธ์ ๋ฅผ ์ฌ๋์ ๋์ฒ๋ผ ํด๊ฒฐํฉ๋๋ค.
- ์์ฃผ ๋ ์ฌ๋ฆฌ๋ ๊ฑด ๊ฐํด์ง๋ค โ ๋งค์ผ ๋จน๋ ์ฝ ์ด๋ฆ์ ์ ๋ ์ ์์
- ์ ์ฐ๋ ๊ฑด ์์ฐํ ์ฌ๋ผ์ง๋ค โ 3๋ ์ ์ ์ฌ ๋ฉ๋ด๋ ๊ธฐ์ต ๋ชปํจ
- ๋น์ทํ ๊ฑด ํฉ์ณ์ง๋ค โ "์์ธ ๋ง์ง" ๊ธฐ์ต๋ค์ด ํ๋๋ก ๋ฌถ์
- ํ๋๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ๊ด๋ จ๋ ๊ฒ๋ ๋ฐ๋ผ์จ๋ค โ "์ถ๊ตฌ" ํ๋ฉด "FC์์ธ" "์ฃผ๋ง๊ฒฝ๊ธฐ" "์ง๊ด"
Remember๋ ์ด 4๊ฐ์ง๋ฅผ ์ฝ๋๋ก ๊ตฌํํ์ต๋๋ค.
"์ ์ฐ๋ ๊ธฐ์ต์ ์์ฐํ ์ฌ๋ผ์ง๋ค"
- ์์ฃผ ์ฐพ๋ ๊ธฐ์ต โ ์ ์ ๊ฐํด์ง (stability โ)
- ์ค๋ ์ ์ด ๊ธฐ์ต โ ์ ์ ํ๋ ค์ง โ ์๋ ์ ๋ฆฌ
- ๊ฒฐ๊ณผ: ๋ฉ๋ชจ๋ฆฌ๊ฐ ํญ์ ๊นจ๋ํ๊ฒ ์ ์ง๋จ, ํ ํฐ ์ ์ฝ
"๋น์ทํ ๊ฑด ํฉ์ณ์ง๋ค"
- "FC์์ธ ์ข์ํจ" + "K๋ฆฌ๊ทธ ์์ฆ๊ถ ์์" โ ์๋์ผ๋ก ํ๋๋ก
- ๋ชจ์๋๋ฉด ์ ์ ๋ณด๊ฐ ์ด๊น: "์ข์ํ๋ ์ ๋นจ๊ฐ" โ "์ข์ํ๋ ์ ํ๋"
- ๊ฒฐ๊ณผ: ์ค๋ณต ์๋ ๊น๋ํ ๊ธฐ์ต
"ํ๋๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ๊ด๋ จ๋ ๊ฒ๋ ๋ฐ๋ผ์จ๋ค"
- "์ถ๊ตฌ" ๊ฒ์ โ "K๋ฆฌ๊ทธ" + "์ฃผ๋ง๊ฒฝ๊ธฐ" + "ํ๊ฒฝ๊ธฐ" ๊ฐ์ด ๋์ด
- ํค์๋ ๋งค์นญ + ์๋ฏธ ์ ์ฌ๋ ๋์ ์ฌ์ฉ
- ๊ฒฐ๊ณผ: ๋๋ผ์ธ ์ ๋๋ก ์ ํํ ๊ฒ์
npm install @reallygood/remember
๋๋ ๊ธ๋ก๋ฒ CLI๋ก:
npm install -g @reallygood/remember
์์กด์ฑ: better-sqlite3 ํ๋๋ฟ. ๋ฌด๊ฒ์ง ์์ต๋๋ค.
import { Remember } from '@reallygood/remember'; // 1. ์ด๊ธฐํ (SQLite ํ์ผ ํ๋๋ก ๋) const mem = new Remember({ dbPath: './my-memory.db' }); // 2. ๊ธฐ์ต ์ ์ฅ await mem.store('์ฌ์ฉ์๋ K๋ฆฌ๊ทธ ์์ฆ๊ถ์ ๊ฐ์ง๊ณ ์๋ค', { category: 'fact', tags: ['K๋ฆฌ๊ทธ', '์ถ๊ตฌ'] }); await mem.store('์ฃผ๋ง๋ง๋ค ํ๊ฒฝ๊ธฐ ์ง๊ด์ ๊ฐ๋ค', { category: 'fact', tags: ['์ฃผ๋ง', 'K๋ฆฌ๊ทธ', '์ถ๊ตฌ'] }); // 3. ๊ฒ์ โ "์ถ๊ตฌ"๋ง ๊ฒ์ํด๋ ์ฐ๊ด ๊ธฐ์ต ๋ค ๋์ด! const results = await mem.recall('์ถ๊ตฌ'); // โ [ // { content: 'K๋ฆฌ๊ทธ ์์ฆ๊ถ ๋ณด์ ', score: 0.95 }, // { content: '์ฃผ๋ง ํ๊ฒฝ๊ธฐ ์ง๊ด', score: 0.82 } // ] // 4. ๊ธฐ์ต ์ ๋ฆฌ (์ค๋๋ ๊ฑฐ ์๋ ์๋ฉธ) await mem.consolidate(); // 5. ํต๊ณ const stats = await mem.stats(); // โ { total: 150, active: 120, archived: 30, avgRetention: 0.72 }
# ๊ธฐ์ต ์ ์ฅ remember store "์ปคํผ๋ ์๋ฉ๋ฆฌ์นด๋ ธ ์ ํธ" --category preference # ๊ฒ์ remember recall "์ปคํผ" # ํต๊ณ ๋ณด๊ธฐ remember stats # ๊ธฐ์ต ์ ๋ฆฌ (๋ง๊ฐ ๊ณก์ ์ ์ฉ) remember consolidate # ๊ธฐ์กด MEMORY.md์์ ๊ฐ์ ธ์ค๊ธฐ remember import --file MEMORY.md # ๋งํฌ๋ค์ด์ผ๋ก ๋ด๋ณด๋ด๊ธฐ remember export --format markdown
| Remember | Vestige | mem0 | MemGPT | |
|---|---|---|---|---|
| ์ธ์ด | JavaScript | Rust | Python | Python |
| ์ค์น | npm install |
Rust ๋น๋ | Docker+Qdrant | pip + ์ค์ |
| ํฌ๊ธฐ | ~์๋ฐฑKB | 22MB+130MB | ์GB | ์GB |
| ์์กด์ฑ | SQLite๋ง | Nomic ๋ชจ๋ธ | Qdrant ์๋ฒ | OpenAI ํ์ |
| ์คํ๋ผ์ธ | โ (BM25 ๋ชจ๋) | โ | โ | โ |
| ๋์ | ์ํ ๋น์/๋ฒ์ฉ | ์ฝ๋ฉ ์์ด์ ํธ | ์ฑ๋ด | ์ฑ๋ด |
| ํต์ฌ ์ฒ ํ | ๊ฐ๋ณ๊ณ ์ค์ฉ์ | ์ ๊ตํ๊ณ ํ์ ์ | ํด๋ผ์ฐ๋ ์ฐ๋ | ์์จ ์์ด์ ํธ |
Remember๋ ์๋ฒ ๋ฉ ์์ด๋ ์์ ํ ๋์ํฉ๋๋ค (BM25 ํค์๋ ๊ฒ์).
๋ ์ ํํ ๊ฒ์์ ์ํ๋ฉด ์๋ฒ ๋ฉ์ ์ผค ์ ์์ต๋๋ค:
// ์๋ฒ ๋ฉ ์์ด (๊ธฐ๋ณธ๊ฐ, ๊ฐ์ฅ ๊ฐ๋ฒผ์) new Remember({ embedMode: 'none' }); // Cerebras (๋ฌด๋ฃ, ๋น ๋ฆ) new Remember({ embedMode: 'cerebras' }); // ๋ก์ปฌ Ollama (์คํ๋ผ์ธ, ํ๋ผ์ด๋ฒ์) new Remember({ embedMode: 'ollama' }); // OpenAI (๊ฐ์ฅ ์ ํ) new Remember({ embedMode: 'openai' });
OpenClaw AI ์์ด์ ํธ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค:
// examples/openclaw-integration.js import { Remember } from '@reallygood/remember'; const mem = new Remember({ dbPath: '/Users/you/clawd/memory.db', embedMode: 'cerebras' // ๋ฌด๋ฃ API }); // ๋ํ์์ ์ค์ํ ๋ด์ฉ ์๋ ์ ์ฅ mem.store('์ฌ์ฉ์๊ฐ ๋คํฌ๋ชจ๋๋ฅผ ์ ํธํจ', { category: 'preference' }); // ์ ์ธ์ ์์ ์ ๊ด๋ จ ๊ธฐ์ต ๋ถ๋ฌ์ค๊ธฐ const context = await mem.recall('์ฌ์ฉ์ ์ ํธ'); // ๋งค์ผ consolidate (ํฌ๋ก ์ก) await mem.consolidate();
Remember์ ์ธ ๊ฐ์ง ํต์ฌ ๊ธฐ๋ฅ์ ์ค์ ๋๊ณผํ ์ฐ๊ตฌ์ ๊ธฐ๋ฐํฉ๋๋ค:
| ๊ธฐ๋ฅ | ๋๊ณผํ ์๋ฆฌ | ๋ ผ๋ฌธ |
|---|---|---|
| ๋ง๊ฐ ๊ณก์ | FSRS (Free Spaced Repetition Scheduler) | Piotr Wozniak, 1985 |
| ์ค๋ณต ๋ณํฉ | ๊ธฐ์ต ํตํฉ (Memory Consolidation) | Squire & Alvarez, 1995 |
| ์ฐ๊ด ๊ฒ์ | ํ์ฐ ํ์ฑํ (Spreading Activation) | Collins & Loftus, 1975 |
130๋ ์ ๊ธฐ์ต ์ฐ๊ตฌ๋ฅผ 400์ค์ JavaScript๋ก.
AI ๋น์๋ฅผ ๋งค์ผ ์ฐ๋ค ๋ณด๋ ๋๊ผ์ต๋๋ค:
"์ด ๋ ์, ์ด์ ํ ์๊ธฐ๋ฅผ ์ ๋ ๋ฌผ์ด๋ณด์ง?"
MEMORY.md๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฑด ํ๊ณ๊ฐ ์์์ต๋๋ค. ํ์ผ์ ์ปค์ง๊ณ , ์ค๋๋ ๊ฑด ์์ด๊ณ , ์ฐพ๋ ๊ฑด ์ด๋ ต๊ณ . Vestige ๊ฐ์ ์ข์ ์๋ฃจ์ ์ด ์์ง๋ง Rust ๋น๋์ 130MB ๋ชจ๋ธ ๋ค์ด๋ก๋๋ ๋๋ฌด ๋ฌด๊ฑฐ์ ์ต๋๋ค.
๊ทธ๋์ ๋ง๋ค์์ต๋๋ค. SQLite ํ๋, JavaScript 400์ค, npm install ํ ์ค์ด๋ฉด ๋๋๋ AI ๊ธฐ์ต ์์คํ
.
์ฌ๋์ ๋๊ฐ ํ๋ ๊ฒ์ฒ๋ผ:
- ์ค์ํ ๊ฑด ๊ฐํํ๊ณ
- ์ ์ฐ๋ ๊ฑด ์๊ณ
- ๋น์ทํ ๊ฑด ํฉ์น๊ณ
- ๊ด๋ จ๋ ๊ฑด ๊ฐ์ด ๋ ์ฌ๋ฆฐ๋ค
PR๊ณผ ์ด์ ํ์ํฉ๋๋ค!
git clone https://github.com/reallygood83/remember cd remember npm install npm test
์ค์ ์ด์ ์ค์ธ AI ๋น์(493์ค MEMORY.md, 344๊ฐ ๊ธฐ์ต)์์ ์ธก์ ํ ๊ฒฐ๊ณผ์ ๋๋ค.
| MEMORY.md (์ ์ฒด ๋ก๋ฉ) | Remember (recall) | ์ ๊ฐ๋ฅ | |
|---|---|---|---|
| ์ธ์ ๋น ํ ํฐ | 14,460 | 344 | 97.6% |
๐ ์ด ์์น๋ ๊ณผ์ฅ์ด ์๋๋๋ค. ๊ฒ์ ๊ธฐ๋ฐ ๊ฒ์(RAG)์ ์ ์ฒด ๋ฌธ์ ๋ก๋ฉ ๋๋น 90-99% ํ ํฐ ์ ๊ฐ์ด ์ ๊ณ ํ์ค์ ๋๋ค. โ Elasticsearch Labs: RAG๋ full-context ๋๋น 1,250๋ฐฐ ๋ฎ์ ์ฟผ๋ฆฌ ๋น์ฉ (์ถ์ฒ) โ Anthropic: BM25 + ์๋ฒ ๋ฉ ํ์ด๋ธ๋ฆฌ๋๊ฐ ๊ธฐ์กด RAG ๋๋น 49% ๊ฒ์ ์คํจ ๊ฐ์ (์ถ์ฒ)
| ๋ชจ๋ธ | Before/์ | After/์ | ์ ์ฝ/์ |
|---|---|---|---|
| Claude Opus (/1M tokens) | .14 | .10 | .04 |
| Claude Haiku (/bin/zsh.80/1M tokens) | .94 | /bin/zsh.17 | .77 |
| GPT-4o (.50/1M tokens) | .69 | /bin/zsh.52 | .17 |
| MEMORY.md | Remember | |
|---|---|---|
| ๊ฒ์ ์๊ฐ | ~2-3์ด (ํ์ผ ํ์ฑ) | ~10ms (SQLite) |
| ์๋ ํฅ์ | โ | 200x |
| ์์ | MEMORY.md | Remember |
|---|---|---|
| 3๊ฐ์ (300๊ฐ ๊ธฐ์ต) | ํ์ผ ์ปค์ง๊ธฐ ์์ | ์๋ ๊ด๋ฆฌ |
| 6๊ฐ์ (500๊ฐ) | ์๋ ์ ๋ฆฌ ํ์ | FSRS๊ฐ ์๋ ์ ๋ฆฌ |
| 1๋ (1000๊ฐ+) | ๊ฐ๋น ๋ถ๊ฐ | ๋ง๊ฐ ๊ณก์ ์ด ~300๊ฐ๋ก ์ ์ง |
| ์ฃผ์ฅ | ๊ทผ๊ฑฐ |
|---|---|
| FSRS ๋ง๊ฐ ๊ณก์ | Anki ํตํฉ, ๋ฆฌ๋ทฐ 20-30% ๊ฐ์ + ๋์ผ ๊ธฐ์ต๋ฅ ์ ์ง (FSRS benchmark) |
| BM25 ๊ฒ์์ด ์ ์ฒด ๋ก๋ฉ๋ณด๋ค ํจ์จ์ | RAG ์ ๊ณ ํ์ค, 1,250x ๋ฎ์ ๋น์ฉ (Elasticsearch Labs) |
| ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ (BM25+๋ฒกํฐ) | Anthropic Contextual Retrieval: ๊ฒ์ ์คํจ 49% ๊ฐ์ |
| ์ ํ์ ๊ฒ์์ด ์ ํ๋๋ ๋์ | ๋ถํ์ํ ์ปจํ ์คํธ ์ ๊ฑฐ โ ํ๊ฐ(hallucination) ๊ฐ์ |
MIT
AI์๊ฒ ์ง์ง ๊ธฐ์ต์ ์ ๋ฌผํ์ธ์ ๐ง
Built with โค๏ธ by reallygood83