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

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

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

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

0.6.0 เกี่ยวกับสิ่งที่ 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 ที่ช้าหรือล้มเหลวไม่เคยบล็อกอะไร

[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 ยังอยู่:

octobrain memory sleep-consolidate

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


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

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

นี่คือ Ebbinghaus forgetting curve ยืมตรงมาจากวิธีที่ความจำของมนุษย์ทำงาน ผลคือ การจัดอันดับดีขึ้นเอง คุณไม่ต้องไปจัดอะไรเลย ความจำที่คุณใช้จริงลอยขึ้น ส่วนอันที่เก็บครั้งเดียวแล้วไม่เคยต้องการจมลง — โดยไม่เคยถูกโยนทิ้ง

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

  • ไม่มีอะไรถูกตั้งให้เป็นศูนย์ มีพื้นความสำคัญ ความจำที่ถูกเข้าถึงน้อยจางไปด้านหลังแต่ไม่เคยหายไป Decay เป็นสัญญาณ re-rank ไม่ใช่การลบ
  • Decay คงอยู่ จำนวนครั้งที่เข้าถึงและ timestamp ครั้งเข้าถึงล่าสุดถูกเก็บและรอดผ่านการรีสตาร์ท ความรู้สึกว่า "อะไรกำลังร้อนแรง" ของความจำคุณไม่ได้รีเซ็ตทุก session
[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 แล้วหนึ่งอัน: ความสำคัญถูกดันขึ้นเหนือต้นทาง ส่วนต้นทางถูกลดน้ำหนักลงและลิงก์ไว้ใต้มันในฐานะบันทึกว่าคุณมาถึงจุดนั้นได้อย่างไร

# 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_graphremember คืน neighbor ใกล้ตัวของความจำให้อยู่แล้ว ซึ่งครอบคลุมกรณีที่พบบ่อย

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


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

คุณปรับปรุงสิ่งที่คุณไม่ได้วัดไม่ได้ 0.7.0 เพิ่ม harness สำหรับ benchmark 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 เพียงอย่างเดียว

[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 ถ้าพบอะไร เปิด issue — เราอ่าน