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

Memory: ความ​จำ​สั้น​กับ​ความ​จำ​ยาว

บท​ที่​แล้ว​คุณ​ต่อ tool ตัว​ที่​สี่ searchOrderKnowledge ให้ agent ดึง​ข้อมูล​ที่​เกี่ยวข้อง​จาก​คลัง​นโยบาย​เข้า​มา​ใส่ context ตอน runtime แต่ retrieval ตอบ​ได้​แค่​คำถาม​เดียว — “มี​อะไร​ใน​คลัง​ที่​ตรง​กับ​คำถาม​นี้​บ้าง” มัน​ตอบ​ไม่​ได้​ว่า “เทิร์นที่​แล้ว​เรา​คุย​อะไร​ค้าง​ไว้” หรือ “ลูกค้า​คน​นี้​บอก​อะไร​กับ​เรา​เมื่อ session ก่อน” เพราะ​ข้อมูล​พวก​นั้น​ไม่​ได้​อยู่​ใน​คลัง มัน​คือ​สิ่ง​ที่ agent เจอ​เอง​ระหว่าง​ทำงาน บท​นี้​คือ​เรื่อง​ของ ความ​จำMemoryกลไก​ที่​ให้ agent รักษา​ข้อมูล​ไว้​ข้าม​ขอบเขต​ของ context window — แบ่ง​เป็น Short-term Memory (ประวัติ​ที่​อยู่​ใน​หน้าต่าง) กับ Long-term Memory (โน้ต​ที่​เขียน​เก็บ​ไว้​ภายนอก) ต่าง​จาก Retrieval ตรง​ที่ memory คือ agent เขียน​และ​อ่าน​โน้ต 'ของ​ตัวเอง' ส่วน retrieval คือ​ค้น​จาก​คลัง​ที่​มี​อยู่​แยก​ต่างหากArchitecture — ที่ agent เก็บ​สิ่ง​ที่​มัน​ได้​เรียนรู้​ไว้​เอง แล้ว​เอา​กลับ​มา​ใช้

📦 code ตัวอย่าง

บท​นี้​ต่อยอด agent Order ตัว​เดิม (repo kaen-food-ordering — กำลัง​จัด​ทำ) โดย​เพิ่ม ชั้น​ความ​จำ​ยาว ที่ agent เขียน/อ่าน​เอง​ได้ เรา​จะ​สร้าง​สอง​เกรด: (ก) ที่​เก็บ​แบน saveMemory(key, value) ลง file JSON — ไม่​ต้อง​ใช้ embeddings เลย และ (ข) ความ​จำ​เชิง​ความหมาย​ที่ ใช้ vector store ตัว​เดิม​จาก​บท​ที่ 2 ซ้ำ โดย​แยก​ด้วย field Kind = "memory" code ฝั่ง​แชต​ยัง​ยึด​กติกา​เดิม​จาก​คอร์ส #15 ทุก​ข้อ

เริ่ม​จาก​แยก​ให้​ขาด​ก่อน เพราะ​สอง​คำ​นี้​ปน​กัน​บ่อย​มาก

ความ​จำ​สั้นShort-term Memoryประวัติ​บทสนทนา​ที่​อยู่ 'ใน' context window ตอน​นี้ — คือ running `List<ChatMessage>` ที่​สะสม​ทุก​เทิร์น เป็น​ความ​จำ​ที่​หาย​ไป​เมื่อ​รีเซ็ต context หรือ​เมื่อ​ถูก compact จึง​ต้อง​รักษา​แต่​สิ่ง​ที่​จำเป็น​ไว้​ให้​อยู่​ใน​งบArchitecture คือ​ประวัติ​บทสนทนา​ที่ อยู่​ใน context window — running list ของ ChatMessage ที่​คุณ​ส่ง​เข้า model ซ้ำ​ทุก​เทิร์น​ตั้งแต่​คอร์ส #15 มัน​คือ​ความ​จำ “ใช้งาน” ที่ agent เห็น​ตอน​นี้ แต่​มัน​มี​จุด​อ่อน​สอง​ข้อ​ที่​ตายตัว: มัน กิน​งบ token (ยิ่ง​ยาว​ยิ่ง​กิน — เรื่อง​ของ​บท​ที่ 4) และ​มัน ไม่​คง​อยู่ พอ session จบ หรือ​พอ​เรา​ทำ compaction (บท​ที่ 5) เพื่อ​รักษา​งบ ประวัติ​ก้อน​นั้น​ก็​หาย​ไป สิ่ง​ที่​ไม่​ได้​ถูก​บันทึก​ไว้​ที่​อื่น​ก็​หาย​ตาม​ไป​ด้วย

ความ​จำ​ยาวLong-term Memoryโน้ต​ที่ agent เขียน​เก็บ​ไว้ 'นอก' context window แล้ว​อ่าน​กลับ​ข้าม session (structured note-taking / agentic memory) — agent เป็น​คน​ตัดสิน​ใจ​เอง​ว่า​จะ​จด​อะไร (เช่น file NOTES.md หรือ memory tool ของ Anthropic) สาย​วิชา​นี้​ทอด​จาก MemGPT (2023) มา​ถึง memory tool (2025) ควร​จับ​คู่​กับ Compaction: memory รักษา​สิ่ง​ที่​ต้อง​รอด​จาก​การ​สรุปArchitecture คือ​โน้ต​ที่ agent เขียน​เก็บ​ไว้ นอก context window แล้ว​อ่าน​กลับ​มา​ได้ — ข้าม session ข้าม​การ reset หัวใจ​ของ​มัน​คือ​คำ​ว่า agent เขียน​เอง: agent เป็น​คน​ตัดสิน​ใจ​ว่า​อะไร​ควร​ค่า​แก่​การ​จำ แล้ว​บันทึก​ลง​ที่​เก็บ​ของ​มัน​เอง (file JSON, ตาราง SQLite, หรือ vector store) พอ context ถูก​ล้าง มัน​ก็​อ่าน​โน้ต​ของ​ตัวเอง​กลับ​มา​แล้ว​ทำงาน​ต่อ Anthropic เรียก​รูปแบบ​นี้​ว่า “Structured note-taking, or agentic memory, is a technique where the agent regularly writes notes persisted to memory outside of the context window.”

เทียบเท่า​ใน​ภาษา​ที่ Anthropic ใช้ — “Like Claude Code creating a to-do list, or your custom agent maintaining a NOTES.md file, this simple pattern allows the agent to track progress across complex tasks, maintaining critical context and dependencies that would otherwise be lost across dozens of tool calls.” มัน​เรียบ​ง่าย​ถึง​ขั้น​เป็น file NOTES.md file เดียว​ก็ได้ แต่​ผล​ของ​มัน​คือ​สิ่ง​ที่​ความ​จำ​สั้น​ทำ​ไม่​ได้ — “After context resets, the agent reads its own notes and continues … This coherence across summarization steps enables long-horizon strategies that would be impossible when keeping all the information in the LLM’s context window alone.”

flowchart TB
  subgraph WIN["context window — งบจำกัด"]
    STM["ความจำสั้น<br/>ประวัติแชตในหน้าต่าง"]
  end
  subgraph OUT["นอกหน้าต่าง — คงอยู่ข้าม session"]
    LTM["ความจำยาว<br/>โน้ตที่ agent เขียนเอง<br/>JSON · SQLite · vector store"]
  end
  A["agent"] -->|"เขียน: saveMemory"| LTM
  LTM -->|"อ่านกลับ: just-in-time"| A
  A --> STM
  STM -->|"reset หรือ compaction"| X["หาย ถ้าไม่ได้บันทึกไว้"]
  classDef longmem fill:#0891b2,stroke:#064e5b,color:#f8fafc;
  class LTM longmem;

คำ​บรรยาย​ภาพ: ความ​จำ​สั้น​คือ​ประวัติ​แชต​ที่​อยู่​ใน​หน้าต่าง — กิน​งบ token และ​หาย​เมื่อ reset หรือ compaction ส่วน​ความ​จำ​ยาว (ช่อง​สี​ฟ้า) อยู่​นอก​หน้าต่าง agent เป็น​คน​เขียน​เอง​ผ่าน saveMemory และ​อ่าน​กลับ​แบบ just-in-time เมื่อ​ต้อง​ใช้ สิ่ง​ที่​บันทึก​ลง​ชั้น​ยาว​เท่านั้น​ที่​รอด​ข้าม session

🔁 taxonomy สาม​ชั้น​ของ Chip Huyen (เรียบเรียง ไม่ใช่​คำ​ต่อ​คำ)

Chip Huyen จัด​กรอบ​ความ​จำ​ของ agent เป็น​สาม​ชั้น — (เรียบเรียง​จาก AI Engineering ใช้​เป็น​โครง ไม่ใช่​การ​อ้าง​คำ​ต่อ​คำ): ความ​รู้​ภายใน ที่​ฝัง​อยู่​ใน weights ของ model (ตายตัว แก้​ไม่​ได้​ตอน runtime), ความ​จำ​สั้น คือ​หน้าต่าง context ที่​ไม่​คง​อยู่, และ ความ​จำ​ยาว คือ​ที่​เก็บ​ภายนอก​ที่​คง​อยู่​ข้าม session บท​นี้​โฟกัส​สอง​ชั้น​หลัง — ชั้น​ที่ คุณ ใน​ฐานะ​วิศวกร​ออกแบบ​ได้

นี่​คือ​เส้น​แบ่ง​ที่​ต้อง​ปัก​ให้​ชัด เพราะ code ของ​สอง​อย่าง​นี้ หน้าตา​เหมือน​กัน — ทั้ง​คู่ upsert ข้อความ​ลง store แล้ว search กลับ​มา แต่​แนวคิด​ต่าง​กัน​ที่ ใคร​เป็น​เจ้าของ​ข้อมูล:

  • retrieval (บท​ที่ 2) ค้น​จาก คลัง​ที่​มี​อยู่​ก่อน​แล้ว เป็น​อิสระ​จาก agent — นโยบาย​คืน​เงิน, FAQ, record ออเดอร์ ข้อมูล​พวก​นี้​มี​อยู่​ไม่​ว่า​จะ​มี agent หรือ​ไม่ agent แค่​ไป อ่าน มัน
  • memory คือ agent เขียน​โน้ต​ของ​ตัวเอง แล้ว​อ่าน​กลับ — สิ่ง​ที่​มัน ตัดสิน​ใจ​ว่า​จะ​จำ จาก​สิ่ง​ที่​มัน​เจอ ข้อมูล​นี้​ไม่มี​อยู่​ก่อน จนกว่า agent จะ​สร้าง​มัน​ขึ้น

กล่าว​อีก​แบบ: retrieval คือ การ​ค้น จาก​คลัง​ของ​คน​อื่น memory คือ การ​จด​แล้ว​เปิด​กลับ​มา​ดู สมุด​ของ​ตัวเอง จุด​ที่​สับสน​คือ​ทั้ง​คู่ มัก​ใช้​โครงสร้าง​เก็บ/ค้น​ตัว​เดียวกัน — ความ​จำ​ยาว​เชิง​ความหมาย​ก็​เก็บ​และ​เรียกคืน​ผ่าน vector store แบบ​เดียว​กับ retrieval นั่น​คือ สิ่ง​ที่​ทำให้​มัน​เป็น “memory” ไม่ใช่​โครงสร้าง​ที่​ใช้​เก็บ แต่​คือ การ​ที่ agent เป็น​ผู้​เขียน และ ตัดสิน​ใจ​เอง​ว่า​จะบันทึก​อะไร นี่​คือ​เหตุผล​ที่​บท​นี้​จะ​เอา collection ตัว​เดิม​จาก​บท​ที่ 2 มา​ใช้​ซ้ำได้ตรงๆ — store เดียว หลาย Kind

ราก​ของ​แนวคิด​นี้​ย้อน​ไป​ได้​ถึง​งาน MemGPT (2023) ที่​ยืม​อุปมา​จาก​ระบบ​ปฏิบัติการ​มาใช้ตรงๆ — “the illusion of an extended virtual memory via paging between physical memory and disk.” มัน​แบ่ง​ความ​จำเป็น​สอง​ชั้น​เหมือน​ที่​เรา​เพิ่ง​แยก​ไป — “Main context consists of the LLM prompt tokens—anything in main context is considered in-context… External context refers to any information that is held outside of the LLMs fixed context window.” — และ​หัวใจ​ที่​ยัง​จริง​จน​วัน​นี้​คือ ตัว agent เป็น​คน​แก้​ความ​จำ​เอง: “Memory edits and retrieval are entirely self-directed: MemGPT autonomously updates and searches through its own memory based on the current context.” สอง​ปี​ต่อ​มา Anthropic ทำ​แนวคิด​เดียวกัน​นี้​ให้​เป็น feature พร้อม​ใช้​ใน​ชื่อ memory tool

รูป​ที่​ง่าย​ที่สุด​ของ​ความ​จำ​ยาว​ไม่​ต้อง​มี vector อะไร​ทั้งนั้น มัน​คือ tool saveMemory(key, value) ที่​เขียน​ลง file JSON file เดียว นี่​คือ “two-layer memory” ของ​คอร์ส #12 (บท​ที่ 4) ที่​จับ​ต้อง​ได้​จริง​เป็น​ครั้ง​แรก:

using Microsoft.Extensions.AI;
using System.Text.Json;
// ที่เก็บความจำยาวฝั่ง client — file JSON file เดียวที่ agent เป็นเจ้าของ
const string memoryPath = "order-agent-memory.json";
Dictionary<string, string> LoadMemory() =>
File.Exists(memoryPath)
? JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(memoryPath)) ?? new()
: new();
AITool saveMemory = AIFunctionFactory.Create(
(string key, string value) =>
{
var mem = LoadMemory();
mem[key] = value; // agent เป็นคนเลือกว่าจะจำอะไร
File.WriteAllText(memoryPath, JsonSerializer.Serialize(mem));
return $"saved: {key}";
},
name: "saveMemory",
description: "บันทึกโน้ตถาวร (key -> value) ที่ต้องอยู่รอดข้าม session เช่นข้อจำกัดอาหารประจำตัวของลูกค้า");

แล้ว​ตอน​เริ่ม session ใหม่ ให้ อ่าน​ความ​จำ​กลับ​มา​แล้ว​ฉีด​เข้า system prompt — นี่​คือ​ขา “อ่าน​กลับ” ของ​วงจร:

var mem = LoadMemory();
var memoryBlock = mem.Count == 0
? "(ยังไม่มีโน้ตความจำ)"
: string.Join("\n", mem.Select(kv => $"- {kv.Key}: {kv.Value}"));
var system = new ChatMessage(ChatRole.System,
"คุณคือผู้ช่วย support ลูกค้าของบริการฟู้ดเดลิเวอรี\n" +
"โน้ตความจำระยะยาวที่คุณเคยบันทึกไว้:\n" + memoryBlock);
// system message นี้ต่อเข้า loop เดิมจาก #15 — x-api-key, anthropic-version: 2023-06-01,
// model id "claude-opus-4-8" (ตัวอย่าง ณ 2026-07), ไม่ส่ง temperature, อ่านคำตอบจาก content[]
var options = new ChatOptions { Tools = [saveMemory, searchOrderKnowledge, getOrder, getDeliveryStatus, issueRefund] };

เท่า​นี้​ก็​ครบ​วงจร​ความ​จำ​ยาว​ขั้น​พื้นฐาน​แล้ว — agent เขียน​ผ่าน saveMemory ระหว่าง​ทำงาน แล้ว​รอบ​หน้า​อ่าน​กลับ​ผ่าน system prompt ไม่มี embeddings ไม่มี vector store ไม่มี key ที่​สอง​ของ provider ไหน​เลย ถ้า​จำนวน​โน้ต​ยัง​น้อย​และ​คุณ​อยาก​จับ​คู่ตรงๆ ด้วย key นี่​คือ​รูป​ที่​ควร​เริ่ม — อย่า​เพิ่ง​เอื้อม​ไป​หา vector DB โดย​ไม่​จำเป็น

เกรด (ข): ความ​จำ​ยาว​เชิง​ความหมาย — ใช้ vector store ตัว​เดิม​ซ้ำ

หัวข้อ​ที่​มีชื่อ​ว่า “เกรด (ข): ความ​จำ​ยาว​เชิง​ความหมาย — ใช้ vector store ตัว​เดิม​ซ้ำ”

พอ​โน้ต​เยอะ​ขึ้น​จน​การ​จับ​คู่​ด้วย key ตรงๆ ไม่​พอ — คุณ​อยาก​ถาม​ว่า “ลูกค้า​คน​นี้​เคย​บอก​ข้อ​จำกัด​อะไร​ไว้​บ้าง” แล้ว​ให้​มัน​ค้น​ด้วย​ความหมาย ไม่ใช่ key เป๊ะๆ — ตรง​นี้​แหละ​ที่​ความ​จำ​ยาว​กับ retrieval มา​บรรจบ​กัน​ที่​โครงสร้าง​เดียวกัน เรา​เอา collection ตัว​เดิม​จาก​บท​ที่ 2 มา​ใช้​ซ้ำ​ได้​เลย เพียง​แยก​ด้วย field Kind:

// embedder และ col คือของเดิมจากบทที่ 2 (IEmbeddingGenerator + VectorStoreCollection<string, OrderDoc>)
// จำกติกาจากบทที่ 2: Claude ไม่มี embeddings endpoint — embedder ตัวนี้คือ provider ที่สอง
// (text-embedding-3-small, 1536 มิติ ตรงกับ [VectorStoreVector(Dimensions: 1536)])
// เขียนความจำ — Kind = "memory" แยกมันออกจาก policy/faq/order ใน store เดียวกัน
var note = "ลูกค้า 10432 แพ้ถั่ว — เวลาแนะนำเมนูต้องเลี่ยงเมนูที่มีถั่วทุกครั้ง";
await col.UpsertAsync(new OrderDoc
{
Id = $"mem-{Guid.NewGuid():N}",
Kind = "memory", // field IsIndexed จากบทที่ 2 — กรองได้
Text = note,
Embedding = (await embedder.GenerateAsync(note)).Vector
});
// อ่านกลับ — search เฉพาะ record ที่เป็น memory (กรองด้วย Kind ที่ indexed ไว้)
ReadOnlyMemory<float> q =
(await embedder.GenerateAsync("ลูกค้า 10432 มีข้อจำกัดอาหารอะไรไหม")).Vector;
var recallOptions = new VectorSearchOptions<OrderDoc> { Filter = d => d.Kind == "memory" };
await foreach (VectorSearchResult<OrderDoc> r in col.SearchAsync(q, top: 3, recallOptions))
Console.WriteLine(r.Record.Text); // .Record คือโน้ต, .Score คือความใกล้

1 store, สอง Kind"policy"/"faq"/"order" คือ retrieval (คลัง​ของ​คน​อื่น) ส่วน "memory" คือ​ความ​จำ​ของ agent เอง กรอง​แยก​กัน​ด้วย Kind ที่ indexed ไว้​แล้ว การ​ค้น​ทั้ง​สอง​ฝั่ง​ใช้ semantic searchSemantic Searchการ​ค้น​ด้วย​ความ​คล้าย​ของ​ความหมาย (vector search) แทน​การ​จับ​คู่​คำ​ตรง​ตัว​แบบ keyword/BM25 — เปลี่ยน query เป็น embedding แล้ว​หา record ที่​เวกเตอร์​อยู่​ใกล้​ที่สุด เป็น​แกน​หลัก​ของ RAG; แต่​วิธี term-based อย่าง BM25 ก็​เป็น baseline ที่​แข็งแรง​และ​เบา​กว่า ไม่​ต้อง​รีบ​เอื้อม​ไป​หา vector DB เสมอ​ไปArchitecture กลไก​เดียวกัน แต่​ความหมาย​ต่าง​กัน​ตาม​ที่​แยก​ไว้​ข้าง​บน

ให้​ความ​จำ​อยู่​รอด​ข้าม​การ​รีส​ตาร์ตจริงๆ

InMemoryVectorStore จาก​บท​ที่ 2 หาย​ทั้งหมด​เมื่อ process จบ ซึ่ง​ขัด​กับ​หัวใจ​ของ​ความ​จำ​ยาว ถ้า​ต้องการ​ให้​โน้ต​อยู่​รอด​ข้าม​การ​รีส​ตาร์ต​โดย​ไม่​ต้อง​ตั้ง server ให้​สลับ​ไป​ใช้ SqliteVec (ยัง prerelease เหมือน concrete store ตัว​อื่น — ใส่ --prerelease ตอน​ติดตั้ง) มัน​ให้ file เดียว​ที่ persist ลง disk จริง โครง MEVD ที่​เหลือ ([VectorStoreKey], [VectorStoreVector(Dimensions: 1536)], UpsertAsync, SearchAsync) ไม่​ต้อง​แก้​เลย

คำถาม​ที่​ยาก​กว่า code คือ เมื่อไร​ควร​เขียน และ​เขียน​อะไร Anthropic ทำ memory tool เป็น feature พร้อม​ใช้​แล้ว — “The memory tool lets Claude store and retrieve information across conversations in a directory of memory files. Claude can create, read, update, and delete files that persist between sessions, building up knowledge over time without keeping everything in the context window.” — และ​มัน​ทำงาน​แบบ just-in-time ตรง​กับ​ที่​บท​ที่ 2 วาง​ไว้: “Memory supports just-in-time context retrieval. Rather than loading all relevant information up front, an agent records what it learns in memory files and reads them back on demand.”

สิ่ง​ที่​น่า​เรียนรู้​ที่สุด​คือ protocol ว่า​เมื่อไร​ควร​เขียน ที่ Anthropic ฉีด​เข้าไป​ให้ model เอง​อัตโนมัติ — มัน​บอก model ว่า “IMPORTANT: ALWAYS VIEW YOUR MEMORY DIRECTORY BEFORE DOING ANYTHING ELSE.” และ​เตือน​ให้​สมมติ​ว่า​จะ​ถูก​ขัดจังหวะ​เสมอ — “ASSUME INTERRUPTION: Your context window might be reset at any moment, so you risk losing any progress that is not recorded in your memory directory.” กติกา​เรียบ​ง่าย​ที่​ถอด​มา​ใช้​กับ agent Order ของ​คุณได้ตรงๆ: อ่าน​ความ​จำ​ก่อน​เริ่ม​ทำงาน​ทุก​ครั้ง และ บันทึก​ทุก​สิ่ง​ที่​ต้อง​รอด​ข้าม​การ reset ทันที​ที่​รู้ — เช่น​เหตุผล​การ​คืน​เงิน​ที่​ตัดสิน​ไป​แล้ว หรือ​ข้อ​จำกัด​อาหาร​ของ​ลูกค้า ไม่ใช่​รอ​จน​จบ session

ความ​จริง​ของ connector: memory tool ใน .NET

tool entry ของ Anthropic คือ {"type": "memory_20250818", "name": "memory"} — แค่​นั้น​คือ config ทั้งหมด และ​ตัว tool นี้ GA บน Messages API แล้ว (ไม่​ต้อง​ใส่ beta header) แต่ helper ฝั่ง C# ยัง​อยู่​ใน namespace beta: Tools = [new MemoryTool20250818()] โดย​มี subclass ของ BetaAbstractMemoryTool ขับ​ผ่าน client.Beta.Messages.ToolRunner(...) จุด​ที่​ต้อง​เข้าใจ​ให้​ชัด — “The memory tool operates client-side: Claude requests file operations, and your application executes them. You control where and how the data is stored through your own infrastructure.” คือ Anthropic ไม่​ได้​เก็บ​ความ​จำ​ให้​คุณ model แค่ ขอ ให้​อ่าน/เขียน file ส่วน​ที่​เก็บ​จริง (JSON, SQLite, vector store อย่าง​ใน​บท​นี้) คือ​ของ​คุณ​ทั้งหมด กติกา​ฝั่ง​แชต​ยัง​เหมือน #15 ทุก​ข้อ

ทำไม​เรา​ถึง​ยอม​ลงแรง​ทำ​ที่​เก็บ​ภายนอก​ทั้งหมด​นี้? เพราะ​ความ​จำ​ยาว ซื้อ​งบ token คืน​มา — ทุก​อย่าง​ที่​ย้าย​ออก​ไป​อยู่​นอก​หน้าต่าง​คือ token ที่​ไม่​ต้อง​แบก​ไว้​ใน​หน้าต่าง​ทุก​เทิร์น Chip Huyen สรุป​เหตุผล​ไว้​ตรง — “The agentic pattern often deals with information that exceeds a model’s context limit. A memory system that supplements the model’s context in handling information can significantly enhance an agent’s capabilities.”

แต่​ความ​จำ​กับ compaction (บท​ที่ 5) แก้​คนละ​ครึ่ง​ของ​ปัญหา​เดียวกัน และ​ควร​ใช้​คู่​กัน Anthropic แนะตรงๆ — “For long-running agents, consider using both: compaction keeps the active context small without client-side bookkeeping, and memory preserves the information that must survive summarization.” compaction ย่อ​ประวัติ​ให้​เล็ก​โดย​ไม่​ต้อง​จัดการ​เอง ส่วน memory รักษา​สิ่ง​ที่ ต้อง รอด​จาก​การ​ย่อ​ไว้​อย่าง​ตั้งใจ

⚠️ ตัวเลข 84% / 39% เป็น​ผล​จาก​การ​วัด​ครั้ง​เดียว

Anthropic รายงาน​ว่า memory คู่​กับ context editing ให้ “84% token savings and a 39% performance improvement” — ตัวเลข​นี้​มา​จาก eval แบบ web-search 100 เทิร์น ครั้ง​เดียว ใน​เงื่อนไข​เฉพาะ ให้​อ่าน​มัน​เป็น ทิศทาง​ของ​หลักการ (ย้าย​ของ​ออก​นอก​หน้าต่าง​ช่วย​ได้​ทั้ง​งบ​และ​คุณภาพ) ไม่ใช่​ตัวเลข​รับประกัน​ที่​จะ​ได้​ซ้ำ​กับ agent ของ​คุณ ผล​จริง​ขึ้น​กับ​งาน​และ​วิธี​วัด — ซึ่ง​เป็น​เหตุผล​ว่า​ทำไม​คอร์ส #13 (evals) ถึง​จำเป็น

ความ​จำ​สั้น​คือ​ประวัติ​ใน​หน้าต่าง — ใช้งาน​ได้​ทันที​แต่​กิน​งบ​และ​หาย​เมื่อ reset ความ​จำ​ยาว​คือ​โน้ต​ที่ agent เขียน​เอง​ไว้​นอก​หน้าต่าง​แล้ว​อ่าน​กลับ​ข้าม session สิ่ง​ที่​ทำให้​มัน​เป็น memory ไม่ใช่​โครงสร้าง​ที่​เก็บ (จะ​เป็น JSON แบน หรือ vector store ตัว​เดียว​กับ retrieval ก็ได้) แต่​คือ agent เป็น​ผู้​เขียน​และ​ตัดสิน​ใจ​เอง​ว่า​จะ​จำ​อะไร — ต่าง​จาก retrieval ที่​ค้น​จาก​คลัง​ของ​คน​อื่น คุณ​สร้าง​มา​แล้ว​สอง​เกรด​และ​เห็น​ว่า​มัน​ซื้อ​งบ token คืน​มา​ได้ แต่​ต้อง​จับ​คู่​กับ compaction เพื่อ​รักษา​สิ่ง​ที่​ชี้ขาด​ไว้​ให้​รอด — ซึ่ง​คือ​เรื่อง​ของ​สอง​บท​ถัด​ไป: บท​ที่ 4 วัด​งบ token จริง แล้ว​บท​ที่ 5 ลงมือ​ทำ compaction


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้

บท​นี้​อิง​ต้นทาง​ที่​ลง​วัน​ที่​กำกับ อ่าน​ต่อ​ได้​โดยตรง:

  • Anthropic, “Effective context engineering for AI agents” (2025-09-29) — structured note-taking / agentic memory, การ​อ่าน​โน้ต​กลับ​หลัง context reset และ​การ​จับ​คู่ memory กับ compaction สำหรับ agent ที่​รัน​ยาว
  • Anthropic, “Memory tool” (tool id memory_20250818, เข้าถึง 2026-07-19) — memory tool ที่​เก็บ/เรียก​ข้อมูล​ข้าม conversation, การ​ทำงาน​แบบ just-in-time, ความ​เป็น​เจ้าของ​ฝั่ง client และ protocol “view memory before doing anything / assume interruption”
  • Anthropic, “Context management” (Sept 2025) — ตัวเลข 84% token / 39% performance จาก eval 100 เทิร์น (ผล​การ​วัด​ครั้ง​เดียว ลง​วัน​ที่​กำกับ)
  • Chip Huyen, “AI Engineering” — chapter summaries (2025) — โครง taxonomy สาม​ชั้น​ของ​ความ​จำ (ความ​รู้​ภายใน / สั้น / ยาว — ใช้​เป็น​โครง เรียบเรียง ไม่ใช่​คำ​ต่อ​คำ)
  • Chip Huyen, “Agents” (2025-01-07) — ระบบ​ความ​จำ​ที่​เสริม context ของ model ช่วย​ยก​ความ​สามารถ​ของ agent เมื่อ​ข้อมูล​เกิน​เพดาน context
  • Packer et al., “MemGPT: Towards LLMs as Operating Systems” (2023-10) — อุปมา virtual memory ของ OS, การ​แบ่ง main context กับ external context และ​การ​ที่ agent แก้/ค้น​ความ​จำ​ของ​ตัวเอง​แบบ self-directed

เช็กความเข้าใจ — บทที่ 3

ข้อ 1 / 3

อะไรคือความต่างที่ 'ตัดสิน' ว่าสิ่งหนึ่งเป็น memory ไม่ใช่ retrieval?