ข้ามไปยังเนื้อหา

หน่วยความจำและความรู้

หากไม่มีหน่วยความจำ การสนทนากับเอเจนต์ทุกครั้งจะเริ่มจากศูนย์ใหม่: ข้อตกลงเดิม ต้องอธิบายซ้ำ การตัดสินใจเดิมต้องถกเถียงกันอีกครั้ง ทางตันเดิมต้องสำรวจซ้ำ หน่วยความจำคือที่จัดเก็บระดับเวิร์กสเปซที่คงอยู่ข้ามการรัน และมันมีไว้เพื่อให้ ความรู้ที่เอเจนต์ตัวหนึ่งสร้างขึ้นนั้นถูกพบโดยเอเจนต์อีกตัวในภายหลัง

มันมีสามชั้น ซึ่งตอบคำถามที่ต่างกัน:

  1. ข้อเท็จจริง — สิ่งที่เป็นจริง (ข้อตกลง ผลลัพธ์ การตัดสินใจ)
  2. นโยบาย — สิ่งที่เอเจนต์ต้องทำเกี่ยวกับเรื่องนั้น (กฎเชิงบรรทัดฐาน)
  3. หน่วยความจำทำงาน — สิ่งที่เอเจนต์ตัวหนึ่งกำลังทำค้างอยู่

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

MemoryFact คือหน่วยความรู้ที่ผูกอยู่ในขอบเขตของเวิร์กสเปซและโดเมนหนึ่ง

แอตทริบิวต์ ความหมาย
domain โดเมนความรู้ (“conventions”, “decisions”, “codebase”)
topic ป้ายหัวข้อสั้น ๆ
content ข้อความความรู้
confidence 0.0–1.0 เริ่มต้นจากแหล่งที่มาและเพิ่มขึ้นเมื่อถูกกล่าวถึงซ้ำ
memoryType ชนิดของข้อเท็จจริง — กำหนดเส้นโค้งการเสื่อมตามเวลา
veracity ข้อเท็จจริงนี้ถูกรู้มาได้อย่างไร — ตั้งค่าความเชื่อมั่นเริ่มต้นและกำหนดขนาดของส่วนเพิ่มเมื่อถูกกล่าวถึงซ้ำแต่ละครั้ง
sourceObservationIds ข้อสังเกตใดที่นำไปสู่ข้อเท็จจริงนี้
supersededBy ข้อเท็จจริงใหม่ที่มาแทนที่ ถ้ามี
validUntil, recallCount, mentionCount สัญญาณการหมดอายุและการใช้งานที่ใช้ตอนเรียกคืน

สองแถวสุดท้ายคือสิ่งที่คนมักมองข้าม และเป็นตัวตัดสินว่าข้อเท็จจริง_ใด_จะปรากฏขึ้น memoryType มีพารามิเตอร์การเสื่อมแบบ Weibull ต่อชนิด ดังนั้นคำมั่นที่มีกรอบเวลา จะจางหายอย่างรวดเร็ว ในขณะที่ข้อเท็จจริงเชิงโปรไฟล์ที่มั่นคงจะไม่เป็นเช่นนั้น veracity บันทึกแหล่งที่มา — ระบุโดยมนุษย์ (น้ำหนัก 1.0) อนุมานโดยเอเจนต์ (0.7) ผลิตโดยเครื่องมือ (0.5) นำเข้า (0.6) — และน้ำหนักนั้นจะตั้งค่าความเชื่อมั่นเริ่มต้น ของข้อเท็จจริง

ข้อเท็จจริงจะไม่ถูกแก้ไขในที่เดิมเมื่อมีสิ่งขัดแย้งกัน การเขียนข้อเท็จจริงจะรัน การตรวจจับความขัดแย้งกับข้อเท็จจริงในโดเมนและหัวข้อเดียวกัน แล้วแทนที่ตัวที่แพ้ พร้อมบันทึกแถวความขัดแย้ง จุดประสงค์คือร่องรอยการตรวจสอบ: คุณเห็นได้เสมอว่าเดิม เชื่ออะไรและอะไรเข้ามาแทนที่

MemoryPolicy คือกฎเชิงบรรทัดฐานที่ได้มาจากข้อเท็จจริง ผูกอยู่ในขอบเขตของ เวิร์กสเปซและโดเมน มีแฟล็ก active และ requiredRole ซึ่งเป็นทางเลือก

นโยบายที่ active ทุกตัวในเวิร์กสเปซจะถูกฉีดเข้าไปในทุกการสั่งงาน โดยไม่กรอง — ไม่มีการกรองตามโดเมน บทบาท งาน หรือสเปซ เรื่องนี้ควรรู้ไว้ก่อนคุณเขียนนโยบาย ตัวที่ยี่สิบ เพราะนโยบายแย่งชิงหน้าต่างบริบทเดียวกับงาน นี่ก็เป็นเหตุผลที่ requiredRole บนนโยบายเป็นเพียงคำแนะนำ: มันบอกว่ากฎนี้มุ่งเป้าไปที่ใคร แต่ไม่ได้ หยุดไม่ให้กฎไปถึงคนอื่น ๆ

MemoryDomain จัดกลุ่มข้อเท็จจริงและนโยบายภายในเวิร์กสเปซ โดเมนมอบโครงสร้าง เชิงองค์กรให้กับความรู้ และเป็นหน่วยที่การให้สิทธิ์เข้าถึงเขียนอ้างอิงถึง — แต่โปรดดู คำเตือนด้านล่างก่อนจะถือว่าโดเมนเป็นขอบเขตความลับ

โดเมนอาจเป็นระดับทั้งเวิร์กสเปซ (architecture) หรือผูกกับรีโปเดียว (repo:<slug>/architecture) ชื่อเดียวกันในสองขอบเขตคือที่จัดเก็บอิสระสองแห่ง: ข้อเท็จจริงที่เป็นจริงกับโค้ดเบสหนึ่งจะไม่เขียนทับข้อเท็จจริงระดับทั้งเวิร์กสเปซ search_memory และคำนำหน่วยความจำตอนสั่งงานจะจัดอันดับหน่วยความจำที่ผูกกับรีโป ไว้ก่อนเมื่อเอเจนต์ทำงานในรีโปนั้น แต่จะไม่กรองส่วนที่เหลือออก ส่ง repo ไปกับ propose_fact / propose_policy / search_memory เพื่อเขียนหรือเพิ่มน้ำหนัก ให้ขอบเขตนั้น

การควบคุมการเข้าถึงเป็นแบบ fail-open สำหรับการอ่าน

หัวข้อที่มีชื่อว่า “การควบคุมการเข้าถึงเป็นแบบ fail-open สำหรับการอ่าน”

MemoryAccessGrant จับคู่บทบาทของเอเจนต์และโดเมนเข้ากับระดับสิทธิ์หนึ่งในสามระดับ:

สิทธิ์ ความหมาย
none ไม่มีการเข้าถึง
read ค้นหาและดึงข้อเท็จจริงได้
write จำเป็นสำหรับ propose_policy การเขียนข้อเท็จจริง (propose_fact, supersede_fact) ไม่ได้ถูกควบคุมด้วยการให้สิทธิ์

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

เอเจนต์แต่ละตัวมี AgentWorkingMemory: สมุดจดชั่วคราวแบบข้อความอิสระที่จัดคีย์ ตามเวิร์กสเปซและเอเจนต์ มันคงอยู่ข้ามการรัน เป็นส่วนตัวของเอเจนต์ตัวนั้น และ ถูกฉีดเข้าไปในพรอมต์ของมันทุกครั้งที่สั่งงาน มันคือที่อยู่ของ “ฉันรีแฟกเตอร์ auth ไปได้ครึ่งทาง” — สถานะที่ควรพาไปยังการรันครั้งถัดไป แต่ไม่ควรยกระดับเป็น ข้อเท็จจริงถาวร

ตอนสั่งงาน คำนำหน่วยความจำถูกประกอบขึ้นจากสามสิ่งเท่านั้น:

  • นโยบายที่ active ทุกตัวของเวิร์กสเปซ ในรูปแบบบรรทัด - [domain] rule
  • หน่วยความจำทำงานของเอเจนต์เอง ตามตัวอักษร
  • รายการข้อเท็จจริงสั้น ๆ ที่จับคู่ด้วยคีย์เวิร์ด สำหรับงานนี้ — ไม่เกินห้ารายการ ภายในงบประมาณประมาณ 1,200 อักขระ และเฉพาะเมื่อคำอธิบายงานยาวอย่างน้อย 20 อักขระ งานที่สั้นกว่านั้นจะไม่ได้ข้อเท็จจริงเลย

รายการสั้นนี้ใช้ FTS/คีย์เวิร์ดเท่านั้น และถูกจำกัดจำนวนอย่างจงใจ การสร้าง embedding ของคำค้นนั้นช้า และเส้นทางการสั่งงานเป็นจุดเดียวที่ความหน่วงปรากฏให้เห็นทันที จึงจงใจกันเส้นทางเชิงความหมายที่ช้าออกไป คำนำปิดท้ายด้วยการบอกให้เอเจนต์ตรวจสอบ รายการที่สำคัญด้วย search_memory ซึ่งเป็นที่ที่โมเดลการเรียกคืนเต็มรูปแบบอยู่

ไม่มีการตรวจสอบการให้สิทธิ์เข้าถึงบนเส้นทางนี้ สิ่งที่รายการสั้นค้นพบคือสิ่งที่ เอเจนต์เห็น

เครื่องมือ search_memory ที่ใช้ฝั่งเอเจนต์มีสามโหมด และเป็นการค้นหาที่ต่างกันจริง ๆ:

  • keyword — FTS5 เท่านั้น
  • semantic — ผลลัพธ์จาก BM25 และเวกเตอร์ที่หลอมรวมด้วย reciprocal rank fusion
  • hybrid (ค่าเริ่มต้น) — การเรียกคืนแบบหลายเสียง: เสียงที่จัดอันดับแล้ว สี่เสียงหลอมรวมกัน แล้วกระจายความหลากหลาย

เสียงทั้งสี่คือ lexical (FTS), semantic (เวกเตอร์ KNN), temporal (ข้อเท็จจริงที่ active ล่าสุด) และ graph — การเดินสองฮอปผ่านเส้นเชื่อมแบบ episodic จากจุดตั้งต้น lexical และ semantic ที่แข็งแกร่งที่สุด เสียง graph คือเหตุผลที่เส้นเชื่อมแบบ episodic มีอยู่ตั้งแต่แรก: มันเผยข้อเท็จจริงที่_เชื่อมโยงกับ_คำตอบของคุณโดยไม่ตรงกับ คำใดของคุณเลย เสียงต่าง ๆ ถูกถ่วงน้ำหนักตามเจตนาของคำค้นที่จำแนกไว้ (ค่าเริ่มต้น semantic มีน้ำหนักมากที่สุด ตามด้วย graph และ lexical แล้วจึง recency) คะแนนของ ผู้สมัครแต่ละรายถูกปรับตามการเสื่อมแบบ Weibull ของมัน และชุดผลลัพธ์ถูกกระจาย ความหลากหลายแบบ MMR เพื่อไม่ให้ข้อเท็จจริงเดียวที่พูดซ้ำห้าครั้งมาเบียดข้อเท็จจริง ที่ต่างกันสี่ข้อออกไป

การค้นหาหน่วยความจำบนเดสก์ท็อปและเว็บเป็นเส้นทางที่แยกออกไปและเรียบง่ายกว่า: op ของ RPC memory_fact.search เป็น FTS5 เท่านั้น เพราะไคลเอนต์แบบบาง ไม่สามารถส่ง embedding ของคำค้นไปด้วยได้ และเส้นทางแบบ hybrid ยังคงอยู่ภายใน โฮสต์ ดังนั้นการจัดอันดับที่คุณเห็นในเบราว์เซอร์หน่วยความจำจึงไม่ใช่การจัดอันดับ ที่เอเจนต์ได้จาก search_memory นี่เป็นสิ่งที่คาดไว้ ไม่ใช่บั๊ก แต่ก็หมายความว่า “ฉันค้นหาแล้วไม่เจอ” บน UI ไม่ใช่หลักฐานว่าเอเจนต์จะหาไม่เจอ

เบราว์เซอร์หน่วยความจำอยู่ที่ การตั้งค่า → เวิร์กสเปซ → หน่วยความจำ (/workspaces/<id>/settings/memory) พร้อมแท็บข้อเท็จจริง นโยบาย และกราฟความรู้

มีความไม่สมมาตรตรงนี้ที่ทำให้หลายคนประหลาดใจ: คุณแก้ไขและลบหน่วยความจำได้ แต่สร้างมันไม่ได้ ทั้งแท็บข้อเท็จจริงและแท็บนโยบายไม่มีปุ่มสำหรับเพิ่ม การสร้าง เนื้อหาเป็นเรื่องฝั่งเอเจนต์ ผ่าน propose_fact และ propose_policy (supersede_fact / supersede_policy เพื่อแทนที่) remember เขียนรายการ hot-tier ที่ผูกกับเซสชัน ซึ่ง consolidate_memory อาจยกระดับเป็นข้อเท็จจริง ในภายหลัง; record_observation และ update_my_notes เขียนสมุดจดชั่วคราวส่วนตัว ที่ถูกฉีดตอนสั่งงาน เบราว์เซอร์นี้เป็นพื้นที่สำหรับตรวจทานและแก้ไข ไม่ใช่สำหรับ สร้างเนื้อหา — ดังนั้นถ้าคุณอยากได้ข้อเท็จจริงในหน่วยความจำ วิธีใส่เข้าไปคือ บอกเอเจนต์

การดำเนินการบำรุงรักษาสองอย่างก็ถูกเรียกโดยเอเจนต์เช่นกัน ไม่ได้ตั้งเวลาไว้: consolidate_memory รวมและตัดข้อเท็จจริงที่สะสมไว้ และ harmonize_memory ประสานความเชื่อที่แยกจากกันไปในหมู่เอเจนต์ list_memory_conflicts แสดงสิ่งที่ การตรวจจับความขัดแย้งบันทึกไว้แล้ว ไม่มีอะไรมาหารันให้คุณตามตัวจับเวลา ข้อตัดสินใจจากการประชุมจะถูกเก็บเข้าสู่โดเมน decisions เมื่อขั้นตอนบันทึก การประชุมบันทึกไว้; นั่นไม่ใช่ตัวจับเวลาบนการรันเอเจนต์ที่เสร็จสิ้น