Skip to content
ย 
ย 

Latest commit

ย 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿง  Remember

AI ๋น„์„œ๊ฐ€ ์ง„์งœ "๊ธฐ์–ต"ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒฝ๋Ÿ‰ ์ธ์ง€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ


์ด๊ฒŒ ๋ญ”๊ฐ€์š”?

AI ๋น„์„œ(ChatGPT, Claude, OpenClaw ๋“ฑ)๋Š” ๋Œ€ํ™”๊ฐ€ ๋๋‚˜๋ฉด ๋ชจ๋“  ๊ฑธ ์žŠ์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

"์–ด์ œ ๋ญ ๋จน์—ˆ์–ด?"๋ผ๊ณ  ๋ฌผ์œผ๋ฉด ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋ถ„๋ช… ์–ด์ œ ๋งํ–ˆ๋Š”๋ฐ.

๋ณดํ†ต ์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  MEMORY.md ๊ฐ™์€ ํŒŒ์ผ์— ๊ธฐ์–ต์„ ์ ์–ด๋‘๋Š”๋ฐ:

  • ๐Ÿ“„ ํŒŒ์ผ์ด ์ ์  ์ปค์ ธ์„œ โ†’ ํ† ํฐ ๋‚ญ๋น„
  • ๐Ÿ—‘๏ธ ์˜ค๋ž˜๋œ ์ •๋ณด๊ฐ€ ์Œ“์—ฌ์„œ โ†’ ์ˆ˜๋™ ์ •๋ฆฌ ํ•„์š”
  • ๐Ÿ” ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์„œ โ†’ ๊ฒ€์ƒ‰์ด ๋ถ€์ •ํ™•

Remember๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์‚ฌ๋žŒ์˜ ๋‡Œ์ฒ˜๋Ÿผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.


์‚ฌ๋žŒ์˜ ๋‡Œ๋Š” ์–ด๋–ป๊ฒŒ ๊ธฐ์–ตํ•˜๋‚˜์š”?

  1. ์ž์ฃผ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฑด ๊ฐ•ํ•ด์ง„๋‹ค โ†’ ๋งค์ผ ๋จน๋Š” ์•ฝ ์ด๋ฆ„์€ ์ ˆ๋Œ€ ์•ˆ ์žŠ์Œ
  2. ์•ˆ ์“ฐ๋Š” ๊ฑด ์ž์—ฐํžˆ ์‚ฌ๋ผ์ง„๋‹ค โ†’ 3๋…„ ์ „ ์ ์‹ฌ ๋ฉ”๋‰ด๋Š” ๊ธฐ์–ต ๋ชปํ•จ
  3. ๋น„์Šทํ•œ ๊ฑด ํ•ฉ์ณ์ง„๋‹ค โ†’ "์„œ์šธ ๋ง›์ง‘" ๊ธฐ์–ต๋“ค์ด ํ•˜๋‚˜๋กœ ๋ฌถ์ž„
  4. ํ•˜๋‚˜๋ฅผ ๋– ์˜ฌ๋ฆฌ๋ฉด ๊ด€๋ จ๋œ ๊ฒƒ๋„ ๋”ฐ๋ผ์˜จ๋‹ค โ†’ "์ถ•๊ตฌ" ํ•˜๋ฉด "FC์„œ์šธ" "์ฃผ๋ง๊ฒฝ๊ธฐ" "์ง๊ด€"

Remember๋Š” ์ด 4๊ฐ€์ง€๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.


ํ•ต์‹ฌ ๊ธฐ๋Šฅ 3๊ฐ€์ง€

1. ๐Ÿงน ๋ง๊ฐ ๊ณก์„  (FSRS)

"์•ˆ ์“ฐ๋Š” ๊ธฐ์–ต์€ ์ž์—ฐํžˆ ์‚ฌ๋ผ์ง„๋‹ค"

  • ์ž์ฃผ ์ฐพ๋Š” ๊ธฐ์–ต โ†’ ์ ์  ๊ฐ•ํ•ด์ง (stability โ†‘)
  • ์˜ค๋ž˜ ์•ˆ ์“ด ๊ธฐ์–ต โ†’ ์ ์  ํ๋ ค์ง โ†’ ์ž๋™ ์ •๋ฆฌ
  • ๊ฒฐ๊ณผ: ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€๋จ, ํ† ํฐ ์ ˆ์•ฝ

2. ๐Ÿ”— ์ค‘๋ณต ๋ณ‘ํ•ฉ

"๋น„์Šทํ•œ ๊ฑด ํ•ฉ์ณ์ง„๋‹ค"

  • "FC์„œ์šธ ์ข‹์•„ํ•จ" + "K๋ฆฌ๊ทธ ์‹œ์ฆŒ๊ถŒ ์žˆ์Œ" โ†’ ์ž๋™์œผ๋กœ ํ•˜๋‚˜๋กœ
  • ๋ชจ์ˆœ๋˜๋ฉด ์ƒˆ ์ •๋ณด๊ฐ€ ์ด๊น€: "์ข‹์•„ํ•˜๋Š” ์ƒ‰ ๋นจ๊ฐ•" โ†’ "์ข‹์•„ํ•˜๋Š” ์ƒ‰ ํŒŒ๋ž‘"
  • ๊ฒฐ๊ณผ: ์ค‘๋ณต ์—†๋Š” ๊น”๋”ํ•œ ๊ธฐ์–ต

3. ๐Ÿ” ์—ฐ๊ด€ ๊ฒ€์ƒ‰

"ํ•˜๋‚˜๋ฅผ ๋– ์˜ฌ๋ฆฌ๋ฉด ๊ด€๋ จ๋œ ๊ฒƒ๋„ ๋”ฐ๋ผ์˜จ๋‹ค"

  • "์ถ•๊ตฌ" ๊ฒ€์ƒ‰ โ†’ "K๋ฆฌ๊ทธ" + "์ฃผ๋ง๊ฒฝ๊ธฐ" + "ํ™ˆ๊ฒฝ๊ธฐ" ๊ฐ™์ด ๋‚˜์˜ด
  • ํ‚ค์›Œ๋“œ ๋งค์นญ + ์˜๋ฏธ ์œ ์‚ฌ๋„ ๋™์‹œ ์‚ฌ์šฉ
  • ๊ฒฐ๊ณผ: ๋†€๋ผ์šธ ์ •๋„๋กœ ์ •ํ™•ํ•œ ๊ฒ€์ƒ‰

์„ค์น˜ (30์ดˆ)

npm install @reallygood/remember

๋˜๋Š” ๊ธ€๋กœ๋ฒŒ CLI๋กœ:

npm install -g @reallygood/remember

์˜์กด์„ฑ: better-sqlite3 ํ•˜๋‚˜๋ฟ. ๋ฌด๊ฒ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์‚ฌ์šฉ๋ฒ•

JavaScript API

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 }

CLI

# ๊ธฐ์–ต ์ €์žฅ
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 ์—ฐ๋™

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% ๊ฒ€์ƒ‰ ์‹คํŒจ ๊ฐ์†Œ (์ถœ์ฒ˜)

๋น„์šฉ ์ ˆ๊ฐ (ํ•˜๋ฃจ 20์„ธ์…˜ ๊ธฐ์ค€)

๋ชจ๋ธ 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

About

๐Ÿง  Lightweight cognitive memory for AI agents - FSRS, dedup merge, associative recall

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages