Hệ thống bộ nhớ của Claude Code: Giới hạn thực sự nằm ở đâu?

05 tháng 4, 2026·14 phút đọc

Sau khi nguồn code 512.000 dòng bị lộ, phân tích chuyên sâu cho thấy kiến trúc bộ nhớ của Claude Code không chỉ dừng lại ở giới hạn 200 dòng. Hệ thống có cơ chế "tinh hòa bộ nhớ" (autoDream) độc đáo và thiết kế 3 lớp, nhưng lại mắc những giới hạn kiến trúc nghiêm trọng như thiếu sơ đồ tri thức (knowledge graph) và khả năng tìm kiếm ngữ nghĩa.

Hệ thống bộ nhớ của Claude Code: Giới hạn thực sự nằm ở đâu?

Sau khi một người dùng công bố toàn bộ nguồn code của Claude Code lên internet tuần trước, chúng tôi đã dành thời gian nghiên cứu kỹ lưỡng hệ thống bộ nhớ. Với 512.000 dòng TypeScript trải dài trên 1.916 tệp, phần lớn các bài phân tích tập trung vào giới hạn 200 dòng trong tệp MEMORY.md. Tuy nhiên, nếu chỉ nhìn vào bề mặt, bạn sẽ bỏ lỡ những thiết kế tinh vi bên dưới. Chúng tôi đã đọc toàn bộ đường ống bộ nhớ: tác nhân trích xuất, hệ thống tinh hòa giấc mơ, mẫu tác nhân nhánh, tệp khóa, cờ tính năng, và các mẫu câu lệnh.

Kiến trúc thông minh hơn người nghĩ

Phần lớn các nhận xét đã tập trung vào giới hạn 200 dòng trong MEMORY.md và tuyên bố hệ thống bị hỏng. Đó là cách nhìn nhận bề mặt. Kiến trúc bên dưới thực sự được thiết kế tốt cho một bản v1.

Bộ ba lớp bộ nhớ với nhận biết băng thông:

Hệ thống có ba lớp, mỗi lớp có một mẫu truy cập khác nhau:

  • Lớp 1: MEMORY.md, là chỉ mục. Luôn được tải vào hệ thống prompt. Các trỏ ngắn (khoảng 150 ký tự) đến các tệp chủ đề. Giới hạn cứng là 200 dòng và 25KB. Đây là lớp duy nhất tốn token mỗi lần.
  • Lớp 2: Tệp chủ đề (các tệp markdown trong thư mục bộ nhớ). Tải theo nhu cầu. Mỗi lần, một cuộc gọi Sonnet riêng biệt đọc hồ sơ tệp và chọn tối đa 5 tệp liên quan dựa trên truy vấn hiện tại. Chúng chứa kiến thức thực tế.
  • Lớp 3: Biên bản phiên (các tệp JSONL). Không bao giờ đọc toàn bộ. Chỉ được truy cập thông qua grep có trọng tâm với các thuật ngữ tìm kiếm hẹp. Đây là lịch sử hội thoại thô, được giữ lại như tài liệu tham khảo cuối cùng.

Đây là thiết kế có ý thức về chi phí. Lớp 1 luôn trong ngữ cảnh. Lớp 2 được lấy theo nhu cầu. Lớp 3 gần như không chạm vào. Giới hạn 200 dòng trong chỉ mục không phải là sơ suất, mà là ngân sách token. Chỉ mục được chèn vào mọi hệ thống prompt.

Bốn loại bộ nhớ, bị hạn chế chặt chẽ:

Phân loại loại được thiết kế hẹp chủ ý: người dùng (bạn là ai), phản hồi (sửa lỗi VÀ xác nhận), dự án (bối cảnh công việc ongoing), và tham chiếu (trỏ đến các hệ thống bên ngoài).

Điều thú vị là những gì họ loại bỏ rõ ràng. Nguồn code có một phần "CÁI KHÔNG NÊN LƯU" riêng biệt: không có mẫu mã, không có kiến trúc, không có đường dẫn tệp, không có lịch sử git, không có giải pháp gỡ lỗi. Quy tắc là: nếu nó có thể được suy ra từ mã nguồn hiện tại thông qua grep hoặc git, đừng lưu nó. Bộ nhớ dành cho những thứ mà mã nguồn không thể nói cho bạn biết.

Loại phản hồi phức tạp hơn vẻ ngoài. Mẫu lệnh hướng dẫn mô hình ghi lại cả sửa lỗi ("đừng làm X") và xác nhận ("đúng là như vậy"). Lý do được nêu rõ trong nguồn: nếu bạn chỉ lưu sửa lỗi, bạn tránh được sai lầm trong quá khứ nhưng lại lệch đi khỏi các phương pháp đã được xác nhận. Hầu hết các hệ thống bộ nhớ chỉ bắt được phản hồi tiêu cực. Hệ thống này bắt được tín hiệu tích cực.

Sự cũ kỹ là một khái niệm quan trọng:

Có một hàm memoryFreshnessText() nối thêm cảnh báo cho mọi bộ nhớ cũ hơn một ngày: "Bộ nhớ này đã X ngày tuổi. Bộ nhớ là quan sát theo thời gian điểm, không phải trạng thái trực tiếp." Mô hình được hướng dẫn coi bộ nhớ như một gợi ý, không phải sự thật, và xác minh trước khi sử dụng. Bộ nhớ hoài nghi về chính nó.

Hệ thống "giấc mơ" mà không ai nhắc đến

Đây là phần thú vị. Claude Code không chỉ tích lũy bộ nhớ. Nó tinh hòa chúng.

autoDream: tinh hòa bộ nhớ nền

Sau ít nhất 24 giờ và ít nhất 5 phiên đã diễn ra, một quy trình nền được gọi là autoDream kích hoạt. Nó được kiểm soát bởi một cờ tính năng GrowthBook (tengu_onyx_plover), nghĩa là Anthropic có thể tinh chỉnh các ngưỡng từ xa mà không cần phát hành code.

autoDream chạy như một tác nhân nhánh con, một quy trình riêng biệt sao chép bộ nhớ cache trạng thái tệp của cha và có biên bản riêng của nó. Nó có quyền truy cập công cụ hạn chế (chỉ đọc và ghi trong thư mục bộ nhớ) để không thể làm hỏng ngữ cảnh hội thoại chính.

Tinh hòa chạy trong 4 giai đoạn:

  1. Orient: Đọc thư mục bộ nhớ. Hiểu những gì tồn tại. Soi nhanh các tệp chủ đề để tránh tạo bản sao.
  2. Gather: Tìm kiếm tín hiệu mới đáng lưu trữ. Kiểm tra nhật ký hàng ngày, phát hiện bộ nhớ mâu thuẫn với trạng thái mã nguồn hiện tại, grep các biên bản cho ngữ cảnh cụ thể (chỉ thuật ngữ hẹp, không bao giờ đọc dò dập).
  3. Consolidate: Ghi hoặc cập nhật tệp bộ nhớ. Kết hợp tín hiệu mới vào chủ đề hiện có thay vì tạo bản sao gần như giống hệt nhau. Chuyển ngày tương đối thành ngày tuyệt đối. Xóa các thực tế mâu thuẫn tại nguồn.
  4. Prune và index: Giữ MEMORY.md dưới giới hạn 200 dòng và 25KB. Xóa các trỏ lỗi thời. Rút ngắn các mục chi tiết. Giải quyết mâu thuẫn giữa các tệp.

Đây là hệ thống bộ nhớ tự sửa chữa. Nó gộp, loại bỏ trùng lặp, giải quyết mâu thuẫn và cắt tỉa mạnh mẽ. Bộ nhớ được chỉnh sửa liên tục, không chỉ được thêm vào.

Bảo vệ cuộc đua:

Một tệp khóa dựa trên PID (.consolidate-lock) ngăn nhiều quy trình chạy tinh hòa cùng lúc. Khóa có thời gian chờ lỗi cũ (1 giờ) và xác minh PID để ngăn xung đột tái sử dụng. Thời gian sửa đổi tệp khóa đóng vai trò là lastConsolidatedAt, vì vậy việc kiểm tra "chúng ta có nên tinh hòa không?" tốn chính xác một cuộc gọi stat() mỗi lần.

extractMemories: bắt lấy theo từng lần

Ngoài hệ thống giấc mơ, còn có một tác nhân trích xuất chạy sau khi mỗi truy vấn hoàn tất. Nó là một tác nhân nhánh (cùng mẫu với autoDream) xem xét cuộc hội thoại và trích xuất bộ nhớ bền vững. Đây là thứ bắt được thông tin theo thời gian thực. autoDream là thứ tinh hòa nó sau đó.

Hai quy trình viết vào cùng một thư mục bộ nhớ. Bắt lấy theo thời gian thực và tinh hòa định kỳ. Sự tương tự sinh học là очевидно: mã hóa ngắn hạn trong ngày, tinh hòa dài hạn trong lúc ngủ.

Mẫu tác nhân nhánh (Forked Agent Pattern)

Đây là nguyên mẫu kiến trúc cốt lõi làm cho mọi thứ hoạt động, và không ai đã nhắc đến nó.

runForkedAgent() tạo ra một bản sao hoàn hảo của cuộc hội thoại chính. Nó sao chép bộ nhớ cache trạng thái tệp, tạo biên bản riêng và chia sẻ bộ nhớ cache prompt của cha (phần đắt tiền). Tác nhân nhánh được trang bị công cụ hạn chế để không can thiệp vào ngữ cảnh cha.

Mẫu đơn này cung cấp năng lượng: trích xuất bộ nhớ (theo từng lần), tinh hòa bộ nhớ (autoDream), tự nén, tóm tắt tác nhân và nhiệm vụ tác nhân con. Một bộ nhớ cache, nhiều tác nhân chuyên biệt. Đây là tối ưu hóa chi phí của Anthropic để chạy trí tuệ nền cùng với cuộc hội thoại chính.

Giới hạn thực sự nằm ở đâu

Giới hạn 200 dòng chỉ mục không phải là giới hạn thực sự. Hệ thống giấc mơ quản lý giới hạn đó thông qua cắt tỉa và tinh hòa. Giới hạn thực sự nằm ở kiến trúc:

  • Không có sơ đồ tri thức (knowledge graph). Mỗi bộ nhớ là một tệp markdown cô lập. Không có cách nào để biểu thị rằng một bộ nhớ hỗ trợ bộ nhớ khác, mâu thuẫn với bộ nhớ khác, hoặc thay thế bộ nhớ khác. Hệ thống giấc mơ có thể phát hiện và giải quyết mâu thuẫn, nhưng chỉ thông qua suy luận LLM brute-force qua văn bản toàn bộ. Không có mối quan hệ có kiểu. Không có kết nối có cấu trúc.
  • Không có nhúng vector (embeddings). Tìm kiếm là một mô hình ngôn ngữ đọc tên tệp và mô tả một dòng, sau đó chọn tối đa 5 tệp. Nó rất hiệu quả cho những gì nó là, nhưng không phải là tìm kiếm ngữ nghĩa. Khi thư mục bộ nhớ tăng lên, độ liên quan của việc chọn dựa trên tên tệp giảm đi. Một bộ nhớ về "quyết định di chuyển cơ sở dữ liệu" sẽ không nổi lên khi truy vấn về "thay đổi lược đồ" trừ khi tên tệp ngẫu nhiên trùng khớp.
  • Không có bộ nhớ xuyên dự án. Mỗi dự án có một thư mục bộ nhớ cô lập, được khóa vào rễ git chuẩn. Kiến thức học được trong một dự án không thể thông tin cho công việc trong dự án khác. Không có ngữ cảnh chung, không có học chuyển đổi giữa không gian làm việc.
  • Không có bộ nhớ xuyên thiết bị hoặc sản phẩm. Thư mục bộ nhớ sống tại ~/.claude/projects/ trên hệ thống tệp cục bộ của bạn. Máy tính để bàn và máy tính xách tay của bạn có bộ nhớ riêng biệt. Claude.ai, Claude Desktop, Claude di động và Claude Code đều có các hệ thống bộ nhớ hoàn toàn riêng biệt. Kiến thức bị phân mảnh trên mọi thiết bị và giao diện bạn sử dụng.
  • Không có tính duy trì tính cách. Không có cơ chế để phong cách giao tiếp, sở thích hành vi hoặc chuyên môn lĩnh vực của mô hình tồn tại. Mỗi phiên mới bắt đầu với một bảng trắng tính cách sạch. Mọi mối quan hệ hoặc phong cách làm việc bạn thiết lập chỉ tồn tại trong cửa sổ ngữ cảnh cuộc hội thoại hiện tại.
  • Không có giao diện người dùng (GUI) cho người không kỹ thuật. Bộ nhớ là các tệp markdown trên đĩa. Quản lý chúng có nghĩa là chỉnh sửa tệp trong trình chỉnh sửa văn bản hoặc yêu cầu Claude làm nó cho bạn. Không có cổng, không có trình duyệt trực quan, không có cách cho người không lập trình viên để xem những gì được lưu trữ hoặc cách các thứ kết nối.

Thay thế lớp lưu trữ không giải quyết được vấn đề

Thay thế các tệp markdown bằng kho vector giải quyết một giới hạn (tìm kiếm dựa trên tên tệp) trong khi để lại mọi giới hạn kiến trúc khác không chạm.

Một kho vector không có sơ đồ tri thức vẫn là bộ nhớ phẳng. Bạn nhận được khả năng hồi tưởng tốt hơn trên các bộ nhớ riêng lẻ, nhưng các bộ nhớ đó vẫn là các ghi chú cô lập. Vẫn không có cách để nói "quyết định này thay thế quyết định kia" hoặc "nhận định này mâu thuẫn với giả định ban đầu của chúng ta". Bạn đang mở rộng đống ghi chú, không xây dựng kiến thức.

Cải thiện hồi tưởng là thực sự, độ tương đồng nhúng vượt qua so sánh tên tệp. Nhưng hồi tưởng chưa bao giờ là vấn đề cốt lõi. Vấn đề cốt lõi là các bộ nhớ cô lập, bất kể được tìm kiếm tốt đến đâu, không thể đại diện cho kiến thức được kết nối.

Những gì thực sự sửa chữa điều này:

  • Sơ đồ tri thức với mối quan hệ có kiểu. Không chỉ "các bộ nhớ này tương tự" (đó là những gì nhúng cung cấp) mà là kết nối có cấu trúc: hỗ trợ, mâu thuẫn, thay thế, gây ra, phụ thuộc vào, cập nhật, và nhiều hơn. Tác nhân cần xây dựng và duyệt qua một sơ đồ, không phải tìm kiếm một danh sách.
  • Bộ nhớ được quản lý bởi tác nhân. Trao cho mô hình một tập công cụ phong phú, lưu trữ, hồi tưởng, kết nối, khám phá, phản chiếu, cập nhật, và để nó quyết định điều gì quan trọng. Trích xuất bộ nhớ và autoDream của Claude Code là những bước đầu tiên theo hướng này, nhưng chúng hoạt động trên các tệp phẳng. Cùng cách tiếp cận được thúc đẩy bởi tác nhân áp dụng cho một sơ đồ tri thức là mạnh mẽ hơn nhiều. Một bài báo gần đây của Google DeepMind (Evo-Memory) cho thấy các tác nhân có bộ nhớ tự phát triển giảm nửa số bước nhiệm vụ và cho phép các mô hình nhỏ hơn đạt ngang hoặc vượt qua các mô hình lớn hơn với ngữ cảnh tĩnh.
  • Bộ nhớ có kiểu. Bốn loại của Claude Code (người dùng, phản hồi, dự án, tham chiếu) là một bước khởi đầu tốt. Nhưng một sửa lỗi khác với một nhận định, khác với một quyết định chiến lược, khác với một điểm kiểm tra. Nhiều loại có nghĩa là tác nhân (và người dùng) có thể hiểu loại kiến thức họ đang nhìn vào.
  • Duy trì tính cách. Phong cách giao tiếp, chuyên môn lĩnh vực, những quirk hành vi và ranh giới của AI của bạn nên được lưu trữ như một phần của hệ thống bộ nhớ và tải ở đầu mỗi phiên. Trên mọi thiết bị. Trên mọi nền tảng.
  • Truy cập xuyên thiết bị, xuyên nền tảng. Bộ nhớ cần có thể truy cập từ mọi nơi. Máy tính để bàn, điện thoại, IDE, trình duyệt. Được lưu trữ trên đám mây, đồng bộ hóa, xuất khẩu. Bộ nhớ chỉ cục bộ làm mảnh kiến thức của bạn trên mọi thiết bị bạn sở hữu.
  • Một cổng GUI. Người không lập trình viên cần xem những gì có trong hệ thống bộ nhớ, chỉnh sửa những gì sai, và hiểu cách các thứ kết nối. "Hãy tin chúng tôi, nó nằm trong cơ sở dữ liệu" là không đủ.

Giải pháp thực tế

Hãy tưởng tượng bạn đã làm việc với trợ lý AI trong nhiều dự án trong sáu tháng. Nó biết các sở thích lập trình của bạn, các quyết định kiến trúc, các lỗi bạn đã gặp, các chiến lược bạn đã thử, các sửa lỗi bạn đã thực hiện.

Với bộ nhớ phẳng (dù có nhúng), đó là 500 ghi chú cô lập nổi lên dựa trên từ khóa hoặc độ tương đồng ngữ nghĩa. Có ích, nhưng hạn chế.

Với sơ đồ tri thức, những bộ nhớ đó được kết nối. Tác nhân có thể truy theo cách một quyết định phát triển: "Chúng tôi chọn Postgres vào tháng 1 (quyết định). Chuyển sang DynamoDB vào tháng 3 (thay thế). Vì các vấn đề độ trễ chúng tôi gặp vào tháng 2 (gây ra). Mâu thuẫn với giả định ban đầu của chúng tôi về các mẫu đọc (mâu thuẫn)." Nó có thể khám phá các kết nối, phát hiện các mẫu, và hiểu ngữ cảnh mà tìm kiếm độ tương đồng nhúng sẽ không lộ ra.

Đó là sự khác biệt giữa đống ghi chú và cơ sở dữ liệu tri thức.

Sửa chữa trong 30 giây

Hệ thống bộ nhớ của Claude Code là một bản v1 được thiết kế tốt với những giới hạn kiến trúc thực sự. Thay thế lớp lưu trữ đặt động cơ lớn hơn vào một chiếc xe không có vô lăng.

Những gì bạn thực sự muốn là một hệ thống bộ nhớ có sơ đồ tri thức, mối quan hệ có kiểu, tìm kiếm hỗn hợp (kết hợp từ khóa, vector và duyệt sơ đồ), duy trì tính cách, một cổng GUI, và truy cập từ mọi thiết bị và nền tảng bạn sử dụng.

Và nó nên được thiết lập trong dưới một phút.

Nếu bạn sử dụng Claude.ai hoặc Claude Desktop: hãy vào Cài đặt, Kết nối, Thêm Kết nối tùy chỉnh, dán URL. Xong. Kết nối đó bây giờ có sẵn ở mọi nơi bạn sử dụng Claude, bao gồm Claude Code, Claude di động và Cowork. Bật hoặc tắt bất cứ lúc nào.

Nếu bạn sử dụng Cursor, Windsurf hoặc bất kỳ khách hàng nào tương thích với MCP: một dòng trong cấu hình MCP của bạn.

Nếu bạn đang xây dựng một cái gì đó tùy chỉnh: API REST đầy đủ.

Không Docker. Không npm install. Không biến môi trường. Không tệp cấu hình JSON.

AI của bạn nên nhớ bạn. Trong mọi phiên, mọi thiết bị, mọi nền tảng. Và bộ nhớ đó nên được kết nối, không chỉ bị tích lũy một cách vô tổ.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗