Vấn đề không chỉ là “bộ nhớ”
LLM agent có thể đọc codebase lớn, giải thích subsystem lạ và hỗ trợ tìm attack surface. Nhưng khi một cuộc điều tra kéo dài nhiều giờ, model dễ quên điều gì đã được xác nhận, nhắc lại hướng đã bị loại hoặc tiếp tục suy luận từ một giả định không còn đúng.
Các hệ memory phổ biến thường lưu conversation và observation, tạo embedding rồi tìm lại đoạn liên quan cho câu hỏi mới. Cách này giải quyết câu hỏi “thông tin nào trong quá khứ có liên quan?”, nhưng chưa tự trả lời câu hỏi quan trọng hơn: “với mọi điều đã học được, hiện tại điều gì vẫn đúng?”
Ví dụ, một agent từng ghi nhận object_a trỏ tới object_b và từ đó kết luận attacker điều khiển được một kernel object. Nếu debugger sau đó chứng minh quan sát đầu tiên sai, retrieval có thể trả về cả mệnh đề cũ, kết luận phụ thuộc và thông tin sửa sai. Model lại phải tự phân biệt chúng trong prompt.
Nhìn memory như program analysis
Program analysis vốn làm việc với fact, rule và kết luận được suy ra. Khi input thay đổi, engine có thể cập nhật phần kết quả bị ảnh hưởng thay vì tính lại toàn bộ trạng thái.
Từ phép so sánh đó, tác giả xây Lemmalog, một Datalog engine dành cho LLM. Kiến trúc chia công việc thành hai phần:
- LLM xử lý phần mơ hồ: natural language, source code, debugger output và ghi chú được chuyển thành fact có cấu trúc.
- Datalog xử lý phần xác định: áp dụng rule, duy trì derived fact và cập nhật kết luận khi input thay đổi.
Ví dụ, từ ba fact controls(attacker, object_a), points_to(object_a, object_b) và kernel_object(object_b), engine có thể suy ra attacker kiểm soát một kernel object. Nếu quan hệ points_to bị rút lại, kết luận phụ thuộc cũng bị invalidation tự động.
Ý tưởng cốt lõi là không bắt LLM dựng lại toàn bộ trạng thái từ transcript ở mỗi lượt. Model đóng vai trò front-end xác suất; fact database và rule engine trở thành intermediate representation cùng lớp phân tích xác định.
Retraction, provenance và thời gian
Xóa fact khó hơn thêm fact. Một kết luận có thể có nhiều đường suy diễn: nếu c được hỗ trợ bởi cả a và b, xóa a không được phép xóa c. Lemmalog vì vậy theo dõi cách mỗi derived fact được tạo ra và chỉ rút kết luận khi mọi nguồn hỗ trợ phù hợp đã mất.
Cơ chế này tạo thêm provenance. Khi agent nói một exploit candidate khả thi, người dùng có thể hỏi kết luận đó đến từ observation và rule nào. Nếu không có chuỗi bằng chứng, mệnh đề không thuộc trạng thái được duy trì.
Fact cũng có validity interval. Một primitive có thể được xem là khả thi từ 10:14 đến 12:37 rồi bị thay bằng trạng thái không khả thi. Nhờ giữ khoảng thời gian, hệ thống vừa trả lời được trạng thái hiện tại, vừa giải thích vì sao trước đây agent đã theo đuổi một chiến lược khác mà không đặt hai fact mâu thuẫn vào cùng prompt.
Vector database vẫn hữu ích cho semantic retrieval. Lemmalog không thay thế nó; kiến trúc kết hợp episodic memory cho context mơ hồ với deductive state cho truth, dependency, retraction và provenance.
Kết quả LongMemEval
Tác giả chạy Lemmalog ba lần trên một split LongMemEval gồm 102 câu hỏi. Hệ thống đạt:
- F1: 0,463 ± 0,010;
- accuracy: 0,575 ± 0,004.
Trong bảng kết quả được công bố, PropMem đạt 0,550 F1 và SimpleMem đạt 0,480, nên Lemmalog chưa dẫn đầu. Tuy nhiên, nó cao hơn gấp đôi Full Context ở mức 0,222 trong bảng so sánh; một lượt full-context GPT-4.1 do tác giả tự chạy đạt 0,197.
Điểm đáng chú ý nhất là nhóm Knowledge Update — dạng bài mà một fact ban đầu đúng rồi bị thông tin mới thay thế. Lemmalog đạt 0,579, cao hơn PropMem 0,528 và Full Context 0,202 trong run đại diện.
Context đưa vào reader model cũng nhỏ hơn nhiều: khoảng 2.700 token cho mỗi câu hỏi, so với 104.000 token của full context, tức khoảng 38 lần ít hơn. Chi phí extraction vẫn tồn tại, nhưng chỉ trả một lần cho conversation; full-context prompting phải đọc lại toàn bộ history ở mỗi query.
Kết quả LoCoMo
LoCoMo lớn hơn, với 1.986 câu hỏi trên 10 conversation dài. Qua ba lần chạy, Lemmalog đạt 0,533 ± 0,001 F1. Kết quả tổng vẫn dưới PropMem 0,605, OpenClaw 0,557 và Full Context 0,542.
Dù vậy, cấu trúc fact giúp hệ thống mạnh hơn full context ở một số nhóm được thiết kế phù hợp:
- temporal reasoning: 0,454 so với 0,369;
- adversarial false-premise: 0,707 so với 0,509.
Ở LoCoMo, reader nhận khoảng 3.400 token mỗi câu hỏi thay vì 18.900 token của full context, giảm khoảng sáu lần.
Những bug cho thấy front-end quan trọng hơn engine
Phần lớn cải thiện không đến từ Datalog evaluator “thông minh” hơn, mà từ sửa cách dữ liệu đi vào và ra khỏi analysis state.
Entity resolution từng biến “Honda Civic”, “my car” và “the Civic” thành ba object khác nhau. Date từng được so sánh bằng internal ID của Datalog symbol thay vì timestamp thực. Một relevance filter không nhận ra owns và own cùng gốc, khiến toàn bộ count line biến mất. Reader cũng từng được hướng dẫn chống hallucination quá mạnh đến mức từ chối câu hỏi cần đếm hoặc tổng hợp dù bằng chứng đã có.
Các lỗi này nhấn mạnh rằng structured memory chỉ tốt khi bước extraction, normalization, entity reconciliation và retrieval tạo ra một IR đủ chính xác. Nếu extractor bỏ sót booking, rule engine hoàn hảo cũng không thể trả lời câu hỏi về booking đó.
Giới hạn và hướng thử nghiệm tiếp theo
Lemmalog chưa chứng minh Datalog đã giải quyết LLM memory. LongMemEval chỉ có 102 câu hỏi; LoCoMo là benchmark conversation chứ không phải vulnerability research. Hệ thống vẫn yếu ở inference mơ hồ: trên LoCoMo, điểm inferential là 0,164, thấp hơn PropMem 0,289. Việc ép một preference có điều kiện thành tuple vô điều kiện có thể làm mất ý nghĩa trước khi Datalog xử lý.
Kiến trúc hợp lý vì vậy không phải “vector hoặc symbolic”, mà là hai lớp bổ sung nhau:
- deductive state giữ fact, rule, time, provenance và retraction;
- episodic memory giữ source text và context mơ hồ để semantic retrieval.
Thử nghiệm tiếp theo của tác giả là cho agent chạy một cuộc điều tra lỗ hổng dài, rồi đo xem maintained state có ngăn nó hồi sinh giả thuyết đã chết và bịa quan hệ giữa các observation hay không.
Dev nên quan tâm vì sao
Nếu agent phải làm việc dài hơi, tăng context window không phải lựa chọn duy nhất. Có thể tách natural-language understanding khỏi state management, lưu dependency có provenance và dùng deterministic invalidation khi sự thật thay đổi.
Điều đáng học từ Lemmalog chưa phải một benchmark thắng tuyệt đối. Đó là cách biến lỗi “model quên” thành các bài toán engineering cụ thể: schema, entity identity, temporal normalization, aggregation, retrieval và nguồn gốc bằng chứng. Những bài toán này có test được, debug được và không đòi hỏi model lớn hơn để sửa.