- Một lớp bộ nhớ bền vững giúp duy trì mạch hội thoại và ngữ cảnh công việc ngay cả khi phiên làm việc thay đổi, bằng cách lưu các quan sát thô dưới dạng episodes rồi tích lũy thành tri thức có cấu trúc
- Sử dụng kiến trúc độc lập với mô hình, nên có thể gắn cùng một lớp bộ nhớ cho Claude, GPT, LLM cục bộ và cả agent tùy biến; lớp lưu trữ vận hành trên PostgreSQL và pgvector
- Đảm nhiệm vai trò khác với RAG: không chỉ dừng ở truy xuất tài liệu, mà còn tích lũy các sự kiện mới, quan hệ, mục tiêu, thất bại và giả thuyết từ hội thoại, đồng thời có thể dùng cùng RAG
- Tách riêng người dùng, dự án và tri thức tự thân của agent bằng namespace và đường dẫn phân cấp; pipeline consolidation liên tục tổng hợp facts, relationships, causal links, patterns, contradictions
- Bao gồm tích hợp MCP native, mô hình tự thân dựa trên
/self, và cả vòng lặp nghiên cứu lặp lại để biến các agent dạng phiên không có ký ức thành các thực thể làm việc có tính liên tục dài hạn
Tổng quan về Stash
- Một lớp bộ nhớ bền vững nằm giữa AI agent và thế giới bên ngoài, giúp tiếp nối ngữ cảnh trước đó ngay cả khi phiên làm việc thay đổi
- Lưu các quan sát thô thành episodes, rồi tích lũy chúng thành tri thức có cấu trúc như facts, relationships, patterns, goals, failures, hypotheses
- Không thay thế chính mô hình mà tăng cường tính liên tục, được thiết kế để gắn vào bất kỳ agent nào như Claude, GPT, mô hình cục bộ, v.v.
- Nền tảng lưu trữ sử dụng PostgreSQL + pgvector
- GitHub
Cách tổ chức bộ nhớ
- Dùng namespace để tách riêng các bộ nhớ như người dùng, dự án, và tri thức tự thân của agent
- Mỗi namespace được tổ chức theo đường dẫn phân cấp; khi đọc
/projects sẽ bao gồm cả các đường dẫn con như /projects/stash, /projects/cartona
- Ghi dữ liệu chỉ diễn ra vào đúng một namespace cụ thể để ngăn ô nhiễm bộ nhớ
- Bộ nhớ liên quan đến người dùng, bộ nhớ dự án và tri thức tự thân dưới
/self được giữ không trộn lẫn với nhau
- Ví dụ cấu trúc gồm
/users/alice, /projects/restaurant-saas, /projects/mobile-app, /self/capabilities, /self/limits, /self/preferences
Khác biệt với RAG
- RAG gần với một lớp truy xuất dùng để tìm nội dung liên quan trong tài liệu, chứ không ghi nhớ hay học từ chính cuộc hội thoại
- RAG chỉ có thể xử lý những gì đã có trong tài liệu và không thể tạo ra tri thức mới từ hội thoại
- Theo dõi mục tiêu, hiểu ý định, phát hiện mâu thuẫn theo thời gian, hay suy luận nhân-quả được xem là nằm ngoài phạm vi của RAG
- Stash tự động học từ hội thoại, quyết định, thành công và thất bại, đồng thời dần xây dựng đồ thị tri thức
- Truy xuất tài liệu và ghi nhớ trải nghiệm giải quyết hai vấn đề khác nhau, nên có thể dùng RAG cùng Stash
Điểm khác so với bộ nhớ AI hiện có
- Claude.ai và ChatGPT cũng có bộ nhớ, nhưng tính năng đó bị ràng buộc với nền tảng và mô hình riêng của chúng
- Stash hoạt động độc lập với mô hình, nên có thể gắn vào cả mô hình cục bộ và mô hình riêng tư
- Quyền sở hữu dữ liệu thuộc về phía người dùng và dự án được cung cấp dưới dạng mã nguồn mở
- Bao gồm các thành phần như consolidation nền, theo dõi goals và intent, học từ failures, causal reasoning, và self-model của agent
- Theo bảng so sánh, ChatGPT Memory và Claude.ai Memory là “notepad”, còn Stash được phân loại là “mind”
Vấn đề mà Stash muốn giải quyết
- Các mô hình AI hiện nay dù suy luận tốt nhưng thiếu ký ức xuyên phiên, khiến người dùng phải giải thích lại bản thân và bối cảnh dự án mỗi lần
- Cách nhét toàn bộ lịch sử hội thoại vào prompt mỗi lần là chậm và tốn kém, đồng thời vẫn bị giới hạn bởi context window
- Thiếu một cơ chế truyền bài học để ngăn việc lặp lại các thử nghiệm thất bại ở phiên sau
- Tính năng bộ nhớ chỉ có trên một số nền tảng nhất định, khiến agent tùy biến hay LLM cục bộ phải bắt đầu mà không có ngữ cảnh từ đầu
Pipeline tích hợp
- Một tiến trình nền liên tục tổng hợp trải nghiệm để biến bộ nhớ thô thành tri thức có cấu trúc
- Ở giai đoạn Episodes, các quan sát được lưu theo kiểu append-only
- Ở giai đoạn Facts, các nhóm episode được LLM tổng hợp lại
- Ở giai đoạn Relationships, các quan hệ thực thể giữa các fact được trích xuất
- Ở giai đoạn Causal Links, các cặp nguyên nhân-kết quả giữa các fact được liên kết
- Ở giai đoạn Patterns, các mẫu trừu tượng ở mức cao hơn được rút ra
- Ở giai đoạn Contradictions, hệ thống thực hiện tự hiệu chỉnh và confidence decay
- Goal Inference tự động theo dõi các fact liên quan đến mục tiêu đang hoạt động, đồng thời làm lộ ra tiến độ và xung đột
- Failure Patterns phát hiện lỗi lặp lại và trích xuất chúng thành fact mới để giảm việc lặp lại cùng một thất bại
- Hypothesis Scan cho phép bằng chứng mới xác nhận hoặc bác bỏ các giả thuyết đang mở mà không cần can thiệp thủ công
Tích hợp MCP
- Hoạt động theo kiểu MCP native, có thể gắn vào Claude Desktop, Cursor, OpenCode, agent tùy biến, LLM cục bộ và các MCP client khác
- Có thể kết nối mà không cần SDK và cho phép dùng cùng một lớp bộ nhớ ở bất cứ đâu mà không bị vendor lock-in
- Cung cấp tổng cộng 28 công cụ, gồm remember, recall, forget, init cho đến causal links, contradictions, hypotheses
- Có thể khởi động đồng thời máy chủ MCP stdio và consolidation bằng
./stash mcp execute --with-consolidation
- Có thể chạy máy chủ SSE cho agent từ xa bằng
./stash mcp serve --port 8080 --with-consolidation
Mô hình tự thân của agent
- Khi gọi
init, hệ thống tạo bộ khung namespace /self để bắt đầu xây dựng mô hình tự thân
/self/capabilities ghi nhớ những việc agent làm tốt để dùng trong lập kế hoạch công việc
/self/limits lưu lịch sử thất bại và điểm yếu để ngăn lặp lại cùng một sai lầm
/self/preferences học cách vận hành hiệu quả nhất để dần hình thành phong cách làm việc dài hạn
Vòng lặp tự học
- Khi chạy research loop theo chu kỳ 5 phút, hệ thống lấy ngữ cảnh hiện tại từ bộ nhớ quá khứ, tự chọn chủ đề để nghiên cứu, tạo kết nối mới, hợp nhất lại rồi kết thúc
- Ở bước Orient, hệ thống gọi lại ngữ cảnh quá khứ, mục tiêu đang hoạt động, giả thuyết đang mở và các thất bại trước đó
- Ở bước Research, agent thực hiện tìm kiếm web với chủ đề do chính nó chọn
- Ở bước Think, hệ thống làm lộ ra các căng thẳng, khoảng trống và mâu thuẫn trong những gì hiện biết
- Ở bước Invent, hệ thống tạo ra các đầu ra mới như giả thuyết, mẫu hình và phát hiện
- Ở bước Consolidate, pipeline được chạy để tổng hợp raw episode thành tri thức có cấu trúc
- Ở bước Reflect + Sleep, hệ thống để lại tóm tắt phiên, thiết lập ngữ cảnh cho lần chạy tiếp theo rồi dừng lại
- Xem prompt của vòng lặp
Tương thích mô hình và hạ tầng
- Giả định một cấu hình provider duy nhất dùng API tương thích OpenAI cho cả embedding lẫn reasoning
- Hỗ trợ cấu hình cloud, local và self-hosted, đồng thời khẳng định không có vendor lock-in
- Tác giả cho biết đang kết nối OpenRouter tại local để có thể truy cập hàng trăm mô hình bằng một API key duy nhất
- Cũng hoạt động trực tiếp với Ollama, cho phép dựng bộ nhớ offline bằng các mô hình cục bộ như Qwen, Llama, Mistral
- Các backend dùng định dạng OpenAI API như vLLM, LM Studio, llama.cpp server, Together AI, Groq cũng được liệt kê là hỗ trợ
- Mô hình embedding mặc định là
openai/text-embedding-3-small, và với tổ hợp đó dùng STASH_VECTOR_DIM=1536
STASH_VECTOR_DIM chỉ có thể thiết lập trước lần chạy đầu tiên; nếu đổi sau khi khởi tạo sẽ phải reset toàn bộ cơ sở dữ liệu
Thông tin triển khai và sử dụng
- Cung cấp cấu hình Docker Compose để khởi chạy cùng lúc Postgres, pgvector và Stash
- Quy trình chạy được mô tả trong 3 bước: clone kho mã, sao chép
.env.example thành .env rồi thiết lập API key và model, sau đó chạy docker compose up
- Sau lần khởi chạy đầu tiên, trạng thái mong đợi là postgres + pgvector sẵn sàng, migration đã áp dụng, máy chủ MCP đang chờ, và consolidation nền đang chạy
- Dự án được công bố theo giấy phép Apache 2.0
- GitHub Repository
- alash3al.com
1 bình luận
Ý kiến trên Hacker News
Tôi đã bấm vào vì tưởng cuối cùng cũng có thứ kiểu hệ thống bộ nhớ của Claude.ai nhưng làm được theo kiểu portable, hóa ra hoàn toàn không phải vậy
Cái ở đây chỉ là kiểu
store/remember, còn thứ tôi thấy tốt hơn là cách một mô hình nền tóm tắt lịch sử chat để tạo ra bộ nhớBên đó hoạt động tốt hơn nhiều vì mô hình không phải tự viết bộ nhớ, nên việc giới thiệu cái này như cùng đẳng cấp với Claude.ai có vẻ hơi misleading
Tôi cũng đang vẫn tìm một hệ thống bộ nhớ kiểu đó để chuyển sang phía LibreChat nhưng vẫn chưa thấy, và hiện gần như lý do duy nhất khiến tôi còn ở lại Claude.ai là tính năng đó
Tham khảo thêm thì hệ thống đó chỉ có trên Claude.ai chứ không có trong Claude Code
autoDream, ở đây được mô tả là background memory consolidation engine: https://kuber.studio/blog/AI/Claude-Code's-Entire-Source-Code-Got-Leaked-via-a-Sourcemap-in-npm,-Let's-Talk-About-itTrải nghiệm của tôi lại hoàn toàn ngược lại, tôi chủ yếu làm https://github.com/flippyhead/ai-brain cho chính mình dùng, và vài người bạn cũng dùng
Đến giờ thì cách để AI dùng
CLAUDE.mdnhằm tìm các ký ức liên quan và tự cân nhắc khi nào, bằng cách nào nên lưu lại đang hoạt động khá tốtCách này có thể tạo cấu trúc theo mức độ ưu tiên và còn để lại ghi chú cho tương lai, nên cảm giác khá khác với kiểu chỉ tóm tắt tất cả
Việc tạo bộ nhớ bằng tool call cũng hoạt động khá ổn, và tôi cũng thấy cách tự động tạo bộ nhớ khi nén ngữ cảnh là chấp nhận được
Chỉ là nếu đã tự động tạo thì cần consolidation bất đồng bộ, và gọi nó là dreaming thì có hơi cường điệu
Phần triển khai của tôi nằm trong Elroy.bot, và tôi đã tổng hợp nhiều cách tiếp cận ở đây: https://tombedor.dev/approaches-to-agent-memory/
Nếu trích xuất bộ nhớ ở nền thì vấn đề là khó phối hợp tốt với prefix cache
Chỉ với một
LOG.mdhai tầng đơn giản (log chi tiết công việc và bài học) +MEMORY.md(ghi lại các mục được nâng cấp khi log bị cắt bớt) + stop hook chạy ở cuối lượt là cũng đi được khá xa rồiNó giống như phía sau một agent đang nói chuyện với người dùng có các trợ lý đang nghe lén cuộc trò chuyện, ghi lại các sự kiện quan trọng hoặc tìm các dữ kiện liên quan trong DB rồi chen vào kiểu
ký ức X này có vẻ liên quan đấyNếu token là miễn phí thì có vẻ dễ, nhưng làm cho nó hiệu quả lại là một bài toán khá thú vị
Những dự án hứa hẹn điều gì đó nhưng gần như không tiết lộ cách triển khai thì lúc nào cũng là một red flag lớn
Đào sâu hơn thì về cơ bản nó là
pg_vectorgắn vớimcp, cùng hai hàmrecall/rememberCuối cùng thì nó gần với RAG, và dù có thể lập luận rằng cấu trúc dữ liệu là quan trọng, nhưng hầu như mọi hệ thống bộ nhớ kiểu này từ trước đến nay đều hoạt động na ná nhau
Tôi vẫn chưa thấy trường hợp nào chứng minh được tìm kiếm của nó tốt hơn vector DB search cơ bản
memory, và cho thấy LLM thì tệ nhưng sản phẩm này giải quyết được mọi thứ như phép màuNếu nó thật sự làm được vậy thì rốt cuộc nó cũng khá giống việc gói lại một vectordb cho đẹp hơn thôi
Đã có bài review ở đây: https://zby.github.io/commonplace/agent-memory-systems/reviews/stash/
Nhiều LLM memory systems khác cũng được tập hợp ở đây: https://zby.github.io/commonplace/agent-memory-systems/
Và ở đây cũng có tổng hợp những điều người ta mong đợi ở các hệ thống kiểu này: https://zby.github.io/commonplace/notes/designing-agent-memory-systems/
Mấy agent memory systems kiểu này vừa có vẻ bị thiết kế quá mức, vừa có vẻ lại chưa được thiết kế đủ, và trông khá giống ngõ cụt
Tôi khó hình dung được một hiện thực mà nó không nhanh chóng lệch khỏi nhu cầu của các mô hình mới nhất rồi mục ruỗng đi
Ví dụ chỉ vì đã từng làm tính năng thanh toán một lần mà về sau nhiều phiên cứ bị nghiêng về hướng thanh toán do có ký ức kiểu
don't use stripeĐây là một memory layer hoàn toàn chưa được kiểm chứng, cảm giác như chỉ dựng một trang marketing hào nhoáng với những tuyên bố phóng đại mà không có ảnh chụp sử dụng thực tế nào
Tiền đề rất đơn giản. Những gì LLM vốn đã biết thì nó sẽ tiếp tục biết, nên tôi không lưu những gì LLM đã nói; còn nội dung liên quan tới code thì cứ để trong code và comment là được
Thay vào đó, có những thứ không thuộc cả hai nhóm nhưng lại tuyệt đối không được ghi lại
Khi xây dựng thứ gì đó, thường những gì đã quyết định không làm còn quan trọng hơn những gì thực sự đã làm, và tiện ích này bắt các phương án bị loại ở cuối phiên cùng với lý do, rồi lưu chúng thành system knowledge
Cuối cùng mục tiêu là giữ lại loại thông tin không thể tìm ra chỉ bằng grep trong code, mà thường chỉ nằm trong đầu đồng đội; đến giờ nó hoạt động khá ổn nhưng vẫn còn sớm
Những ký ức như
don't use stripechỉ được đưa vào ngữ cảnh khi mô hình nhận prompt làm việc liên quan tới payment processingTôi đã tìm mấy thứ như thế này một thời gian, và cũng vui khi thấy tài khoản này đã công khai phần mềm từ trước thời bùng nổ LLM
Tuy vậy, tôi muốn mỗi dự án đều có thứ kiểu
lịch sử sử dụng LLMSẽ tốt nếu có thông tin về việc có dùng LLM để tạo ra hay không, nếu có thì dùng bao nhiêu, ở giai đoạn nào, đầu ra đã được rà soát kỹ tới mức nào, và người làm có cảm thấy chất lượng ít nhất ngang hoặc tốt hơn so với tự làm một mình không
Không phải vì nghi ngờ cá nhân cụ thể nào, mà tôi muốn đó là thông tin chung cho mọi dự án, và bản thân tôi cũng định làm vậy
Chẳng ai ép ai phải dùng dự án này cả, cứ tự đọc và xem xét code rồi quyết định dùng hay không là được
Có vẻ sẽ không nhiều người thành thật thừa nhận rằng họ gần như không thiết kế, không test, và chất lượng code cũng kém
Có khi lại cần một hệ thống bên thứ ba để trả lời những câu hỏi kiểu này, dù tất nhiên nếu nó cũng dựa trên LLM thì có thể khá chủ quan
Dạo này tôi vận hành hầu hết dự án của mình xoay quanh nhiều file Markdown, dùng AI để nghiên cứu trước, lập kế hoạch và theo dõi tiến độ triển khai
Việc triển khai được làm từng bước theo kế hoạch và cũng được rà soát liên tục ở mỗi bước
Nếu bắt tôi tài liệu hóa workflow của mình thì chính các file đó là tài liệu ấy
99% code là do sinh ra, nhưng tôi chú ý để nó được sinh theo cách tôi hài lòng, và kết quả nhiều khi còn tốt hơn lúc tôi tự làm một mình
Phần mềm tốt lẫn phần mềm tệ đều có thể được tạo ra cả khi không dùng LLM lẫn khi dùng LLM
Người ta đâu có hỏi thợ mộc đã dùng búa hay nail gun, hoặc dùng cái nào cho mái nhà và cái nào cho sàn gỗ
Nếu không có nền tảng tin cậy thì cuối cùng bạn vẫn phải tự kiểm chứng chất lượng hoặc tự làm lấy, ngoài ra thì chỉ là một dạng kỳ vọng pha chút hy vọng mà thôi
Tôi vẫn chưa tìm được memory nào dùng ra hồn
Một kiểu là chỉ để lại tóm tắt cấp cao như
agents.md, nhưng như vậy lại chẳng giúp mấy cho các chi tiết cụ thể, ví dụ nhưnếu sửa phần tử này thì phải đánh dấu phần tử kia là draftNgược lại, kiểu quá chi tiết thì hoặc là chi tiết quá mức nên bị bỏ qua, hoặc là làm các chi tiết của một vùng tính năng lây nhiễm sang cả thay đổi ở vùng khác
Rốt cuộc đến giờ thứ hiệu quả nhất với tôi vẫn là không dùng bộ nhớ, mà chỉ chọn thủ công những ngữ cảnh quan trọng cho phiên/prompt đó
Source of truth về việc repository làm gì và nên làm gì rốt cuộc vẫn là repo itself
Điều bạn nói nghe giống guideline review code hơn, và những thứ như vậy thì cứ đưa tường minh vào ngữ cảnh đúng lúc có thay đổi là được
So với vậy thì hệ thống bộ nhớ vừa quá phức tạp vừa kém chính xác
Tôi tự hỏi liệu một lúc nào đó các mô hình kiểu này có continual learning hay không
Chúng đã đủ thông minh rồi, nhưng lại không có bộ nhớ thực sự nên cảm giác rất bất tiện khi làm việc cùng
Với tôi thì vài thứ đơn giản hoạt động khá tốt, công cụ ở đây là Codex
Agent.mdFunctional spec của tôi đóng vai trò
Project.mdđối với agentVà trước mỗi lần review code theo kiểu agentic, tôi tạo cây thư mục project, rồi gộp nó với codebase thành một file duy nhất và gắn timestamp vào tên file
Việc này quan trọng hơn tưởng tượng, vì nó giúp giảm việc LLM tham chiếu nhầm phiên bản cũ, đồng thời cũng tiện để xem diff nhanh mà không cần gửi cả git
Tới giờ workflow đơn giản này hoạt động khá tốt ngay cả với những codebase lớn và phức tạp
Không hiệu quả về token lắm nhưng đơn giản là nó chạy tốt
Không cần lần nào cũng phải gộp toàn bộ codebase; có thể bỏ các project đã xong, đã test, hoặc không liên quan đến công việc hiện tại
Dù vậy tôi vẫn đưa chúng vào printed directory tree để agent ít nhất biết chúng tồn tại và có thể yêu cầu file cụ thể nếu cần
Tôi tò mò không biết anh làm việc gộp đó như thế nào
Làm thủ công, chỉ gộp các file đã thay đổi, hay là kiểu lai?
LLM memory nghe thì hay trên lý thuyết, nhưng thực tế càng lớn thì lại càng bừa bộn gần như lúc chạy không có bộ nhớ
Ngay cả ví dụ ở màn hình đầu như
hãy tiếp tục làm dự án của tôithì trong thực tế hiếm ai chỉ làm một dự ánCó thể có 5 hay 10 dự án nằm trong bộ nhớ, và mỗi cái ở thời điểm lưu đều từng có ý nghĩa
Cuối cùng bạn vẫn phải chỉ định lại kiểu
hãy tiếp tục dự án sass, đổi lại chỉ nhận thêm được chút ngữ cảnh chi tiết nhưng phải lấp đầy LLM context và còn tốn thêm chi phí MCP callsNếu triển khai tử tế thì có thể vượt qua những giới hạn đó
Tôi tự hỏi liệu cái này có phải chỉ dành cho vibecoder làm việc một mình không
Khi làm dự án thực với người thật thì hệ thống này không thể có toàn bộ ký ức của cả dự án, mà bản thân tôi cũng đâu có toàn bộ ký ức đó
Chỉ cần PR khác được merge là những gì tôi nhớ đã lập tức cũ đi, và thứ tôi quan tâm chỉ là ticket của mình
Nên tôi ngày càng cảm thấy mấy thứ này có lẽ không phải công cụ cho kiểu làm việc cộng tác như vậy
Thật ngạc nhiên là dù chi phí làm phần mềm giờ gần như tiệm cận 0, người ta vẫn cố bán thứ này bằng một trang marketing vibe-coded
Không rõ ai sẽ có thời gian dùng thử cái này rồi chờ vài tuần, vài tháng để xác minh xem nó có thực sự hiệu quả không
Trên site không có bằng chứng nào cho thấy nó tốt hơn RAG hay tốt hơn việc chỉ có một thư mục file bộ nhớ cộng với grep
Vậy mà vẫn toàn là những tuyên bố trên mây, còn trang thì cuộn giật ở mức 14fps
Trông như được code trong 24 giờ trước, thành thật mà nói cảm giác quá lười biếng