# Octobrain 0.7.0: ตอนนี้ความจำของ AI คุณหลับ ลืม และโฟกัสได้แล้ว

> Octobrain 0.7.0 ทำให้ความจำดูแลตัวเองได้: sleep consolidation แบบอัตโนมัติพับความจำที่คล้ายกันให้กลายเป็น insight ที่สะอาด, half-life decay ปล่อยให้ความจำที่ไม่ได้ใช้ค่อยๆ จางหาย และ goal-anchored consolidation ยุบโน้ตที่กระจัดกระจายให้รวมรอบสิ่งที่คุณตั้งใจจะทำจริง บวกกับ HyDE recall ที่เปิดเป็นค่าเริ่มต้น (+10-30% บน query คลุมเครือ) และพื้นผิว MCP ที่กระชับเหลือ 5 เครื่องมือ นี่คือสิ่งที่เปลี่ยนและวิธีอัปเกรด

# Octobrain 0.7.0: ตอนนี้ความจำของ AI คุณหลับ ลืม และโฟกัสได้แล้ว

ความจำที่มีแต่โตขึ้นเรื่อยๆ ไม่ใช่ความจำ มันคือลิ้นชักรกๆ

เครื่องมือความจำ AI ทุกตัวที่ผ่านมาล้วนเป็นแบบสะสม: เก็บ เก็บ เก็บ กองมันใหญ่ขึ้น การค้นหาของคุณรกขึ้น และสิ่งที่คุณต้องการจริงๆ ถูกฝังอยู่ใต้โน้ตเกือบซ้ำห้าอันที่คุณเขียนเรื่องนั้นไว้เมื่ออังคารที่แล้ว ความจำที่มากขึ้นเลิกหมายความว่า recall ดีขึ้น

สมองไม่ได้ทำงานแบบนั้น มันทำ consolidate ตอนคุณหลับ มันปล่อยให้สิ่งที่ไม่ได้ใช้จางหาย มันจัดระเบียบรอบสิ่งที่คุณพยายามจะทำ ไม่ใช่ตามลำดับที่เหตุการณ์เกิดขึ้น การตัดทิ้งนั้นไม่ใช่บั๊กในความจำของมนุษย์ — มันคือเหตุผลทั้งหมดที่ทำให้ recall ยังคมอยู่

[0.6.0](/blog/octobrain-0-6-0-release) เกี่ยวกับสิ่งที่ Octobrain *หา*ได้ — อ่านเอกสารเต็ม grep ข้ามเนื้อหา indexed 0.7.0 เกี่ยวกับสิ่งที่ความจำของ Octobrain ทำ**ตอนที่คุณไม่ได้มอง** มันเลิกเป็น log แบบ passive และเริ่มทำตัวเหมือนสมอง

---

## Sleep Consolidation — ความจำที่จัดระเบียบตัวเอง

นี่คือพระเอก Octobrain ตอนนี้รัน pass แบบ "หลับ" ที่หา cluster ของความจำที่เพิ่งเกิดและคล้ายกัน แล้วพับแต่ละ cluster ให้เป็น insight ที่ consolidate แล้วเพียงอันเดียว

สมมติว่าตลอดหนึ่งสัปดาห์ agent ของคุณเก็บโน้ตห้าอันแยกกันระหว่างไล่บั๊ก rate-limiting เดียวกัน ก่อน 0.7.0 การค้นหาจะคืนผลคลุมเครือทับซ้อนกันห้าอันและปล่อยให้การจัดอันดับขึ้นกับโชค หลัง pass หลับ ห้าอันนั้นยุบเป็น insight ที่สะอาดและมั่นใจสูงขึ้นหนึ่งอัน — และต้นฉบับไม่ได้ถูกลบ มันถูกลดน้ำหนักลงและเก็บไว้เป็น provenance ดังนั้นเส้นทางย้อนกลับไปยังโน้ตดิบยังคงอยู่

ส่วนที่สำคัญ: **มันเป็นอัตโนมัติ** ไม่มี cron job ไม่มีเครื่องมือที่ agent ต้องจำว่าต้องเรียก มันกระตุ้นตัวเองแบบ lazy — ครั้งถัดไปที่ Octobrain เริ่มทำงาน ถ้าผ่านไปหนึ่งวันนับจาก pass ล่าสุด มันจะรันและถอยออกไปเงียบๆ pass ที่ช้าหรือล้มเหลวไม่เคยบล็อกอะไร

```toml
[memory]
sleep_consolidation_enabled        = true   # opt-out, not opt-in
sleep_consolidation_interval_hours = 24     # once a day
sleep_consolidation_threshold      = 0.85   # how similar memories must be to cluster
sleep_consolidation_min_cluster_size = 3    # need at least 3 to bother
sleep_consolidation_max_age_days   = 7      # only recent memories
```

ถ้าอยากบังคับให้รัน pass — เพื่อทดสอบ หรือก่อนการดึงข้อมูลครั้งใหญ่ — CLI override ยังอยู่:

```bash
octobrain memory sleep-consolidate
```

แต่ค่าเริ่มต้นคือคุณไม่ต้องไปแตะมันเลย ความจำดูแลความสะอาดของตัวเอง

---

## Half-Life Decay — การลืม อย่างจงใจ

Octobrain ตอนนี้ใช้ forgetting curve ความสำคัญของความจำทุกอันเสื่อมลงตามเวลาบนตาราง half-life — แต่ทันทีที่คุณเข้าถึงความจำอันหนึ่ง มันจะถูกเสริมความแข็งแรง ความจำที่ถูก recall บ่อยจะยังแข็งแรง ส่วนอันที่ไม่มีอะไรไปแตะค่อยๆ จางหายไปอย่างนุ่มนวล

นี่คือ [Ebbinghaus forgetting curve](https://en.wikipedia.org/wiki/Forgetting_curve) ยืมตรงมาจากวิธีที่ความจำของมนุษย์ทำงาน ผลคือ **การจัดอันดับดีขึ้นเอง** คุณไม่ต้องไปจัดอะไรเลย ความจำที่คุณใช้จริงลอยขึ้น ส่วนอันที่เก็บครั้งเดียวแล้วไม่เคยต้องการจมลง — โดยไม่เคยถูกโยนทิ้ง

มีราวกันสองอย่างที่สำคัญตรงนี้:

- **ไม่มีอะไรถูกตั้งให้เป็นศูนย์** มีพื้นความสำคัญ ความจำที่ถูกเข้าถึงน้อยจางไปด้านหลังแต่ไม่เคยหายไป Decay เป็นสัญญาณ re-rank ไม่ใช่การลบ
- **Decay คงอยู่** จำนวนครั้งที่เข้าถึงและ timestamp ครั้งเข้าถึงล่าสุดถูกเก็บและรอดผ่านการรีสตาร์ท ความรู้สึกว่า "อะไรกำลังร้อนแรง" ของความจำคุณไม่ได้รีเซ็ตทุก session

```toml
[memory]
decay_enabled       = true
decay_half_life_days = 90   # higher = memories stay relevant longer
```

คุณยังปรับ decay ต่อความจำได้ด้วย — โน้ตที่เปลี่ยนเร็วสั่งให้จางเร็วเป็นสองเท่าได้ การตัดสินใจพื้นฐานให้ช้าลงสองเท่าได้ — แต่สำหรับเกือบทุกคนค่าเริ่มต้นก็ทำงานได้ดีอยู่แล้ว

---

## Goal-Anchored Consolidation — ความจำที่มีจุดหมาย

นี่คือไอเดียที่งานวิจัยด้านความจำของ agent วนกลับมาเรื่อยๆ: **consolidate ตามเป้าหมาย ไม่ใช่ตามนาฬิกา** ความจำไม่ควรถูกสรุปแค่เพราะเวลาผ่านไป — มันควรยุบรวมรอบสิ่งที่คุณพยายามจะทำให้สำเร็จ

0.7.0 ทำให้สิ่งนั้นเป็น workflow ระดับ first-class มีความจำชนิดใหม่ชื่อ `Goal` และ lifecycle จริงสำหรับทุกความจำ — `Working → Consolidated → Archived` ความจำที่ส่งผลต่อเป้าหมายจะลิงก์ไปยังมันด้วยความสัมพันธ์ `achieves` เมื่อเป้าหมายเสร็จ คุณปิดมัน แล้ว Octobrain พับทุกความจำที่ส่งผลให้กลายเป็น insight ที่ consolidate แล้วหนึ่งอัน: ความสำคัญถูกดันขึ้นเหนือต้นทาง ส่วนต้นทางถูกลดน้ำหนักลงและลิงก์ไว้ใต้มันในฐานะบันทึกว่าคุณมาถึงจุดนั้นได้อย่างไร

```bash
# Five scattered findings, one closed goal → one durable insight
octobrain memory consolidate goal_4f2a -s "Shipped rate limiting: token bucket, 429 + Retry-After"
```

ข้ามสรุปไปแล้ว Octobrain จะสังเคราะห์ขึ้นมาเองจากชื่อของต้นทาง ไม่ว่าทางไหน สิ่งที่เคยเป็นโน้ตหลวมๆ ห้าอันกลายเป็นความจำหนึ่งอันที่มีความหมาย — ยึดอยู่กับเจตนาที่ผลิตมันขึ้นมา

และนี่คือกลไกเดียวกับที่ sleep consolidation รันอยู่ข้างใต้: แต่ละ cluster ได้เป้าหมายสังเคราะห์ขึ้นมา แล้ว pipeline ของเป้าหมายก็จัดการที่เหลือ engine consolidation เดียว สองวิธีที่จะกระตุ้น — ด้วยมือเมื่อคุณทำอะไรสำเร็จ และอัตโนมัติตอนคุณหลับ

---

## Recall ฉลาดขึ้น — HyDE-lite เปิดเป็นค่าเริ่มต้น

query คลุมเครือคือจุดที่ semantic search มักจะล้มเหลว "ไอ้เรื่อง retries นั่น" ไม่ embed ไปอยู่ใกล้โน้ตที่คุณเขียนไว้จริงๆ เลย

0.7.0 ปล่อย **HyDE-lite** query expansion และเปิดมันเป็นค่าเริ่มต้น กลไกเรียบง่าย: ทำการค้นหา pass แรก เอาผลลัพธ์อันดับต้นๆ เฉลี่ยให้เป็น centroid แล้วผสมมันกลับเข้าไปใน query เดิมของคุณก่อนการค้นหาจริง query จะเรียนรู้ว่าคำตอบของมันเองหน้าตาเป็นอย่างไรและเล็งได้แม่นขึ้น

ในทางปฏิบัตินั่นคือ **+10–30% recall บน query แบบ long-tail และที่ระบุไม่ชัด** — แบบที่มนุษย์พิมพ์กันจริงๆ มันมีต้นทุนแค่การ lookup vector เพิ่มหนึ่งครั้งต่อการค้นหา ไม่ต้องใช้ LLM (เป็นคณิตศาสตร์ล้วน) และ `remember` รวมมันไว้ให้อัตโนมัติ ฝั่ง keyword (BM25) ของการค้นหายังใช้ข้อความตามตัวอักษรของคุณ ดังนั้น query แบบ exact-match จึงไม่ได้รับผลกระทบ

คุณไม่ต้อง config อะไรเลย คำถามคลุมเครือก็แค่หาความจำที่ถูกต้องได้บ่อยขึ้น

---

## พื้นผิวเครื่องมือที่กระชับขึ้น — จาก 8 เครื่องมือ MCP เหลือ 5

ทุกเครื่องมือที่คุณเปิดผ่าน MCP กิน context ของ agent คุณ**ในทุกๆ เทิร์น** — ประมาณ 500–2000 token ของ schema ที่มันต้องอ่านก่อนทำอะไรก็ตาม พื้นผิวเครื่องมือที่บวมคือภาษีบนทุก request

เราจึงตัดพื้นผิว MCP ของ Octobrain จากแปดเครื่องมือเหลือห้า verb ที่ชัดเจน:

```
memorize     store a memory   (now with optional related_to[])
remember     recall           (HyDE expansion + 1-hop neighbors, automatic)
forget       delete           (with confirmation)
consolidate  close a goal     (fold N memories into 1 insight)
knowledge    documents        (index, read, match, search)
```

สามเครื่องมือออกจาก MCP เพราะมันไม่คุ้มกับต้นทุน schema อีกต่อไป:

- **`sleep_consolidate`** — เป็นอัตโนมัติแล้ว ดังนั้น agent ไม่ต้องเรียกมันเลย
- **`relate`** — ถูกพับเข้าไปใน `memorize` คุณส่ง `related_to[]` และลิงก์ความจำกับอันอื่น*ในการเรียกเดียวกัน*ที่เก็บมันได้ การส่งผลต่อเป้าหมายตอนนี้เป็น round-trip เดียว: เก็บผลที่พบและมาร์ก `achieves` เป้าหมายไปพร้อมกัน
- **`memory_graph`** — `remember` คืน neighbor ใกล้ตัวของความจำให้อยู่แล้ว ซึ่งครอบคลุมกรณีที่พบบ่อย

ไม่มีอันไหนหายไป — ทั้งหมดยังอยู่ใน CLI สำหรับงาน admin และ debug มันแค่ไม่กิน context ของ agent คุณสำหรับฟีเจอร์ที่ไม่ค่อยได้ใช้อีกต่อไป ห้าเครื่องมือ ห้า verb ไม่มี mode flag ที่โอเวอร์โหลด

---

## เราเริ่มวัดคุณภาพความจำแล้ว — LongMemEval

คุณปรับปรุงสิ่งที่คุณไม่ได้วัดไม่ได้ 0.7.0 เพิ่ม harness สำหรับ benchmark [LongMemEval](https://github.com/xiaowu0162/LongMemEval) — พร้อม checkpointing สำหรับการรันยาวๆ — เพื่อให้เราให้คะแนน long-term recall ของ Octobrain ข้าม release ได้บน benchmark จริงแทนที่จะใช้ความรู้สึก มันคือท่อที่คุณจะไม่มีวันได้รัน แต่มันคือเหตุผลที่ข้ออ้างเรื่อง recall และ consolidation ข้างบนเป็นข้ออ้างที่เรายืนยันได้ และเป็นวิธีที่ข้ออ้างถัดๆ ไปจะเป็นแบบนั้นด้วย

---

## เบื้องหลัง

การเปลี่ยนแปลงเงียบๆ ไม่กี่อย่างคอยทำให้ทุกอย่างเดินต่อได้ขณะที่ความจำโตขึ้น:

- **การบำรุงรักษา LanceDB เป็นระยะ** รันอัตโนมัติเพื่อให้ vector store กระชับและเร็วตลอดเวลา
- **Auto-linking และ graph retrieval แบบ async** — ความจำที่เกี่ยวข้องเชื่อมกันในเบื้องหลังโดยไม่ทำให้การเขียนที่กระตุ้นมันช้าลง
- **โมดูล SQL ที่ consolidate แล้ว** พร้อมการ escape literal แบบรวมศูนย์และการ harden — ขอบคมน้อยลง มีที่เดียวให้คิดเรื่อง query

คุณจะไม่สังเกตเห็นอะไรพวกนี้โดยตรง นั่นแหละคือจุดประสงค์

---

## 0.7.0 เป็นอย่างไรในทางปฏิบัติ

หนึ่งสัปดาห์ในชีวิตของความจำ ตั้งแต่ต้นจนจบ:

1. **จันทร์** agent ของคุณเก็บโน้ตสามอันระหว่าง debug webhook ที่ไม่เสถียร — แต่ละอันผ่าน `memorize` หนึ่งในนั้นมาร์ก `achieves` เป้าหมาย "fix webhook retries" ในการเรียกเดียวกัน
2. **ตลอดสัปดาห์** คุณถามเรื่องนั้นอยู่เรื่อยๆ แต่ละ `remember` เสริมความจำที่คุณแตะและค่อยๆ ทำให้อันที่คุณไม่ได้แตะจางลงเงียบๆ
3. **ศุกร์** คุณ ship การแก้ไขและ `consolidate` เป้าหมาย โน้ตสามอันกลายเป็น insight ที่คงทนหนึ่งอัน: _"Webhook retries: exponential backoff, idempotency keys, dead-letter after 5."_
4. **ข้ามคืน** Sleep consolidation กวาดเก็บ observation ที่เกือบซ้ำซึ่งคุณไม่เคยลิงก์ไว้อย่างชัดเจน และพับพวกนั้นด้วย
5. **เดือนถัดมา** มีคนถาม "เราจัดการ webhook failures ยังไงนะ?" — query คลุมเครือที่ HyDE ขยายออก แล้วไปลงที่ insight ที่ consolidate แล้วแทนที่จะเป็นเศษเสี้ยวที่จำได้ครึ่งๆ กลางๆ ห้าชิ้น

ไม่มีใครไปจัดอะไรเลย ความจำจัดระเบียบตัวเอง

---

## การอัปเกรด

จาก 0.6.x การ migrate เล็กน้อย:

**Config — เปลี่ยนชื่อหนึ่งที่** ถ้า section `[embedding]` ของคุณตั้ง `text_model` ให้เปลี่ยนชื่อเป็น `model` นั่นคือการเปลี่ยน config ที่ break เพียงอย่างเดียว

```toml
[embedding]
model = "fastembed:nomic-ai/nomic-embed-text-v1.5"   # was: text_model
```

**MCP clients — สามเครื่องมือย้ายไปเป็น CLI-only** ถ้า config client หรือ prompt agent ของคุณเรียก `sleep_consolidate`, `relate` หรือ `memory_graph` ผ่าน MCP ให้อัปเดต:

- ทิ้ง call `sleep_consolidate` ไปทั้งหมด — มันเป็นอัตโนมัติแล้ว
- แทนที่ `relate` ด้วย `related_to[]` ของ `memorize` เพื่อลิงก์ขณะที่คุณเก็บ (หรือใช้ `octobrain memory relate` ใน CLI สำหรับลิงก์ระหว่างความจำที่มีอยู่แล้ว)
- กรณีที่พบบ่อยของ `memory_graph` ถูกครอบคลุมด้วยผล neighbor ของ `remember` ส่วนการ traverse ที่ลึกกว่ายังอยู่ใน `octobrain memory graph`
- `consolidate_goal` ถูกเปลี่ยนชื่อเป็น `consolidate` — schema เดิม verb สะอาดกว่า

**Storage — ไม่ต้องทำอะไร** คอลัมน์ lifecycle และ access-tracking ใหม่ถูกเพิ่มในการรันครั้งแรก และความจำเก่าตั้งค่าเริ่มต้นเป็น active เต็มที่ ไม่ต้อง migrate ด้วยมือ ไม่มี downtime

**ค่าเริ่มต้น — ตอนนี้ sleep consolidation และ HyDE เปิดอยู่** ถ้าอยากได้พฤติกรรมเดิม ให้ตั้ง `sleep_consolidation_enabled = false` หรือ `[search.hyde] enabled = false` คนส่วนใหญ่ควรปล่อยให้เปิดไว้

Source และ binaries ที่ [github.com/muvon/octobrain](https://github.com/muvon/octobrain) ถ้าพบอะไร เปิด issue — เราอ่าน
