Tại sao dung lượng đầu vào của tác nhân không nhất thiết phải tăng theo độ dài cuộc trò chuyện và những thay đổi khi điều đó dừng lại.
Nếu đã từng triển khai bất kỳ sản phẩm nào có sử dụng mô hình ngôn ngữ lớn (LLM), bạn sẽ biết rõ về chi phí. Lượt tương tác đầu tiên thì rẻ. Lượt thứ năm mươi thì không. Lượt thứ năm trăm là điều mà bạn bắt đầu phải tính toán kiến trúc xung quanh. Lịch sử cuộc trò chuyện tăng lên, lời nhắc (prompt) tăng lên, mỗi lệnh gọi đều gửi toàn bộ quá khứ trở lại mô hình và đường cong chi phí – gần như một cách xúc phạm – tuyến tính với thứ bạn thực sự muốn có nhiều hơn: tương tác hữu ích.
Các giải pháp tiêu chuẩn đã quen thuộc. Cắt bớt. Tóm tắt. Nhồi nhét N lượt gần đây và giả vờ.
Lý do dấu chân đầu vào của tác nhân không nhất thiết phải tăng theo độ dài cuộc trò chuyện và những thay đổi khi nó dừng lại.
Nếu bạn đã triển khai bất kỳ sản phẩm nào có sử dụng LLM, bạn sẽ biết về cấu trúc chi phí. Lượt đầu tiên rẻ. Lượt thứ năm mươi thì không. Lượt thứ năm trăm là điều bạn bắt đầu phải tính toán kiến trúc. Lịch sử cuộc trò chuyện tăng lên, lời nhắc (prompt) tăng lên, mỗi cuộc gọi đều gửi toàn bộ quá khứ trở lại mô hình, và đường cong chi phí – gần như một cách xúc phạm – tuyến tính với điều bạn thực sự muốn có nhiều hơn: tương tác hữu ích.
Các câu trả lời tiêu chuẩn đã quen thuộc. Cắt bớt. Tóm tắt. Nhồi nhét N lượt gần đây và giả vờ lượt 1 không quan trọng. Xây dựng một kho vector bên cạnh và hy vọng việc truy xuất chọn đúng đoạn. Mỗi phương pháp này đều hoạt động, một cách nào đó, cho đến khi nó không còn hoạt động nữa.
Semvec là một cách tiếp cận khác: thay thế lịch sử cuộc trò chuyện không giới hạn bằng một trạng thái ngữ nghĩa có kích thước cố định cộng với một bộ nhớ phân cấp, nhận biết nội dung. Lượt thứ 10 và lượt thứ 10.000 có cùng dấu chân đầu vào. Tác nhân vẫn có quyền truy cập có cấu trúc vào các quyết định, bất biến, mẫu lỗi và ngữ cảnh trước đó qua các phiên – nhưng nó phải trả tiền cho quyền truy cập đó bằng một khoản mục chi phí cố định, chứ không phải tăng lên.
Bài viết này sẽ trình bày chi tiết về ý nghĩa thực tế của điều đó, chi phí bạn phải trả (vì không có gì là miễn phí), và nơi nó phù hợp và không phù hợp.
Sự thay đổi góc nhìn: một trạng thái có kích thước cố định, không phải một bản ghi ngày càng dài
Mô hình tư duy đáng được thiết lập đầu tiên: ngừng nghĩ về "bộ nhớ" như "một lời nhắc dài hơn". Hãy nghĩ về nó như một vector nhỏ tóm tắt vị trí hiện tại của cuộc trò chuyện, cộng với một hệ thống phân cấp bộ nhớ giữ quá khứ liên quan bên ngoài, cộng với một bước truy xuất chỉ đưa vào những gì lượt tiếp theo cần.
Theo thuật ngữ của Semvec:
Trạng thái ngữ nghĩa là một vector đơn có chiều cố định. Mỗi lượt người dùng sẽ cập nhật nó. Việc cập nhật nhận biết nội dung – trạng thái hấp thụ nhiều hơn từ một lượt giới thiệu một hướng mới, và ít hơn từ một lượt chỉ xác nhận lại hướng hiện tại.
Bộ nhớ là một cấu trúc ba tầng (ngắn / trung bình / dài hạn, dung lượng mặc định là 15 / 50 / 200) chứa các lượt nhúng và các cụm được hợp nhất. Việc thăng cấp giữa các tầng được thúc đẩy bởi các mẫu truy cập và tầm quan trọng, không chỉ bởi độ mới.
Truy xuất chấm điểm các ứng viên bằng cosine(query, memory) × tier_weight, tùy chọn được tăng cường bởi các điểm neo miền và các yếu tố kích hoạt cộng hưởng (sẽ nói thêm về những điều này bên dưới). Chỉ kết quả top-K mới được đưa vào lời nhắc tiếp theo.
Lợi ích hiển thị cho người dùng được thể hiện trong các điểm chuẩn đã công bố. Điểm chuẩn nổi bật hiện tại là LOCOMO (10 cuộc trò chuyện, 1986 câu hỏi-đáp), được chạy trong thiết lập đánh giá mem0–1:1 – gpt-4o-mini đóng vai trò cả người đọc và người đánh giá, nhiệt độ 0, với lời nhắc của người đánh giá giống hệt từng byte với công cụ của mem0. Trên chỉ số LLM-as-Judge trên 1540 câu hỏi-đáp không đối kháng, Semvec đạt 0.605 so với 0.669 của mem0 – kém mem0 khoảng 6 điểm phần trăm về độ chính xác thô của người đánh giá, nhưng vượt trội so với LangMem, Zep, A-Mem, MemoryBank và Letta. Sự đánh đổi mang tính cấu trúc và nó diễn ra theo chiều ngược lại: việc nhập liệu của Semvec là EMA toán học thuần túy trên phép nhúng: không có cuộc gọi LLM nào mỗi lượt. mem0 chạy trích xuất dữ kiện dựa trên LLM khi nhập liệu, ít nhất một cuộc gọi mỗi lượt được lưu trữ (và trên các khối lượng công việc mà đường ống của nó phân nhánh, nhiều hơn nữa). Điều đó thể hiện rõ trong thời gian thực: Semvec nhập liệu cuộc trò chuyện 675 lượt conv-44 trong khoảng 3 phút so với khoảng 24,5 phút của mem0, nhanh hơn khoảng 8 lần, và trên bộ 1986 câu hỏi-đáp đầy đủ, hoàn thành trong khoảng 95 phút trong khi mem0 mất 10–12 giờ.
Về mặt token cũng cho thấy câu chuyện chi phí cố định tương tự. Cuộc gọi đọc của Semvec mang khoảng 2.000 token đầu vào so với khoảng 16.000–20.700 token của việc phát lại toàn bộ ngữ cảnh, ít hơn khoảng 8 lần mỗi lượt (so với khoảng 26.000 token đầy đủ của gpt-4-turbo).
ngữ cảnh cụ thể, gần hơn 93% ít hơn). So với ngữ cảnh đọc của mem0, hai yếu tố này tương đương nhau; khoảng cách chi phí nằm ở khâu nhập liệu, chính là nơi mà các so sánh theo lượt không thể thấy được. Một câu tóm tắt trung thực là chất lượng gần như mem0 với chi phí LLM tạo sinh bằng 0 ở khâu nhập liệu: bạn đánh đổi khoảng 6 điểm độ chính xác của đánh giá để có một nhóm chi phí khác, tính xác định và khả năng triển khai không cần kết nối mạng.
Đây không phải là các bản demo một lần được tuyển chọn. Các con số này đến từ benchmarks/run_locomo.py, được cung cấp cùng với gói phần mềm; bạn có thể tái tạo chúng trên mô hình, phần cứng và dữ liệu của riêng mình.
Quên có chọn lọc là một tính năng, không phải một lỗi
Điều thú vị về một bộ nhớ hữu hạn là nó buộc bạn phải đưa ra quyết định.
Khi một tầng bị tràn, bạn phải loại bỏ một cái gì đó. FIFO (loại bỏ cái cũ nhất) là lựa chọn mặc định lười biếng; nó cũng sai, vì tuổi tác và tầm quan trọng không giống nhau. Mặc định của Semvec sử dụng một điểm giữ lại tổng hợp cân nhắc tầm quan trọng, độ mới và tần suất truy cập, trọng số chính xác được điều chỉnh cho các khối lượng công việc sản xuất trong lõi, không phải một nút bạn có thể điều chỉnh. Một bộ nhớ cũ hơn được truy cập thường xuyên sẽ tồn tại lâu hơn một bộ nhớ mới hơn chưa bao giờ được truy cập.
Điều này nghe có vẻ hiển nhiên. Nó không phải là mặc định trong hầu hết các hệ thống, vì hầu hết các hệ thống coi bộ nhớ như một nhật ký. Việc coi nó như một tập hợp làm việc, với chính sách loại bỏ, là điều cho phép tầng dài hạn duy trì hữu ích sau lượt thứ 1.000 thay vì dần dần trở thành nhiễu.
Nếu bạn muốn độ mới thuần túy, bạn có thể bật một cờ và nhận FIFO. Vấn đề là mặc định thể hiện một quan điểm: cái gì tồn tại là cái gì được sử dụng.
Các pha, điểm neo, yếu tố kích hoạt – những thông số đáng biết
Một vài khái niệm bạn thực sự sử dụng trong mã.
Các pha. Mỗi cập nhật trạng thái trả về một nhãn pha, được chọn tự động từ sáu tùy chọn: khởi tạo, khám phá, hội tụ, cộng hưởng, ổn định, không ổn định. Bạn không cấu hình những thứ này, bạn đọc chúng và phản ứng. Khởi tạo có nghĩa là trạng thái chưa nhận đủ tín hiệu để cung cấp thông tin; bỏ qua lời nhắc "tóm tắt công việc trước đây", chưa có công việc trước đây. Khám phá có nghĩa là tính mới cao và sự liên kết bộ nhớ yếu; dựa vào kiến thức chung của LLM, việc truy xuất có ít điều để bổ sung. Ổn định có nghĩa là một đoạn hội thoại hội tụ dài; đây là thời điểm để lưu điểm kiểm tra vào đĩa. Các pha là một món quà UX, không chỉ là một tín hiệu nội bộ, chúng cho phép bạn kiểm soát các hoạt động tốn kém dựa trên trạng thái hội thoại thực tế thay vì đoán từ số lượt.
Điểm neo. Các nhúng tham chiếu kéo việc truy xuất về một miền đã biết. Nếu bạn đang xây dựng một trợ lý tích hợp SAP, hãy đăng ký một
Nguồn tin: Medium Towards AI — Tác giả: Michael Neuberger. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.