2 điểm bởi GN⁺ 2023-10-17 | 1 bình luận | Chia sẻ qua WhatsApp
  • Letta là một dự án nhằm xây dựng AI dựa trên bộ nhớ nâng cao có thể học theo thời gian và tự cải thiện
  • Cách sử dụng được chia thành Letta Code, chạy agent trong terminal cục bộ, và Letta API, tích hợp agent vào ứng dụng
  • CLI yêu cầu Node.js 18+, cài đặt bằng npm install -g @letta-ai/letta-code, sau đó chạy letta để khởi chạy agent có bộ nhớ trên máy tính cục bộ
  • Agent Letta Code hỗ trợ lập trình và các tác vụ có thể thực hiện trên máy tính, hỗ trợ skillssubagents, đồng thời đi kèm các skills/subagents dựng sẵn cho bộ nhớ nâng cao và học liên tục
  • Letta không phụ thuộc mô hình, và README khuyến nghị Opus 4.5 cùng GPT-5.2 để đạt hiệu năng tốt nhất, đồng thời liên kết bảng xếp hạng mô hình để tham khảo thứ hạng
  • Letta API dùng để tích hợp agent có trạng thái vào ứng dụng, cung cấp agents API đầy đủ tính năng cùng SDK cho Python và TypeScript
    • Gói TypeScript/Node.js: @letta-ai/letta-client
    • Gói Python: letta-client
    • Ví dụ minh họa luồng tạo agent và gửi tin nhắn bằng LETTA_API_KEYLetta API key
  • Khi sử dụng Letta và các dịch vụ Letta liên quan, bạn đồng ý với privacy policyterms of service

1 bình luận

 
GN⁺ 2023-10-17
Các ý kiến trên Hacker News
  • Chúng tôi là tác giả của MemGPT. Nếu có câu hỏi liên quan đến triển khai, chúng tôi sẽ trả lời
    Nếu muốn tự dùng thử, bạn có thể xem tính năng chỉnh sửa bộ nhớ hoạt động trong bot Discord trên máy chủ Discord của MemGPT (https://discord.gg/9GEQrxmVyE). Khi trò chuyện với bot, bạn sẽ thấy quá trình MemGPT sửa đổi bộ nhớ để cập nhật hồ sơ về người dùng và về chính nó
    Tất cả đều là mã nguồn mở nên cũng có thể chạy cục bộ bằng mã ở https://github.com/cpacker/MemGPT. Kho lưu trữ cũng có ví dụ tập trung vào tài liệu, trong đó trò chuyện với MemGPT về tài liệu API của LlamaIndex

  • Tôi thắc mắc vì sao mọi thứ lại được xử lý trong một cửa sổ ngữ cảnh duy nhất. Khi thử nghiệm một thứ tương tự vài tháng trước, tôi đã song song hóa bằng nhiều agent ở các bước tiền xử lý/hậu xử lý
    Ví dụ, cửa sổ ngữ cảnh chính không biết rằng bộ nhớ đang được tạo hoặc truy xuất; bộ hậu xử lý tự động tạo và lưu bộ nhớ từ cuộc trò chuyện, đồng thời toàn bộ cuộc trò chuyện cũng được lưu vào cơ sở dữ liệu vector. Bộ tiền xử lý tự động chèn các bộ nhớ và ngữ cảnh liên quan cho phù hợp với cuộc trò chuyện, thậm chí còn viết lại lịch sử để từ góc nhìn của cửa sổ ngữ cảnh chính, các bộ nhớ đó trông như đã tồn tại ngay từ đầu
    Làm như vậy có thể tiết kiệm rất nhiều không gian trong cửa sổ ngữ cảnh chính vốn bị dùng cho các system prompt không cần thiết, v.v.

    • Đây là những điểm rất hay. Trong bối cảnh chatbot, giao việc quản lý bộ nhớ cho ai là một lựa chọn thiết kế, và tôi cho rằng nhìn chung có hai cách: quản lý bộ nhớ ngầm địnhquản lý bộ nhớ tường minh
      Cách ngầm định là “LLM chính”, hay trong chat là “luồng hội thoại”, không biết đến việc quản lý bộ nhớ chạy nền. Việc này có thể do “LLM bộ nhớ”, script dựa trên quy tắc, mạng nơ-ron nhỏ, v.v. đảm nhiệm
      Cách tường minh chính là MemGPT, trong đó một LLM xử lý tất cả. Các nghiên cứu trước đây liên quan đến chat đa phiên/đường dài thường là cách ngầm định, có một quy trình tạo bộ nhớ riêng, và kho lưu trữ bộ nhớ của chatbot tiêu dùng cũng nhiều khả năng phần lớn là ngầm định
      Quản lý bộ nhớ tường minh đòi hỏi khả năng làm theo chỉ dẫn phức tạp, nên tôi cho rằng hiện nay khó thực hiện với phần lớn LLM công khai. Chúng tôi đang xem xét các cách giải quyết như tinh chỉnh mô hình mở
      Đánh đổi đúng như bạn nói. Cách ngầm định không cần đưa toàn bộ chỉ dẫn quản lý bộ nhớ vào pre-prompt của LLM. Toàn bộ system message của MemGPT khoảng 1 nghìn token. Ngược lại, khi LLM hoạt động đúng, quản lý bộ nhớ tường minh làm toàn hệ thống đơn giản hơn nhiều, vì không còn overhead quản lý nhiều mô hình LLM trên các luồng song song
    • Một hướng tiếp cận thú vị. Tôi đang xây dựng một thứ tương tự, theo kiểu đưa dữ liệu giao dịch vào cửa sổ ngữ cảnh như một phần của vòng lặp phản hồi để viết lại lịch sử
      Tôi cho rằng LLM và xử lý ngôn ngữ tự nhiên có thể trở thành giao diện khả thi hơn cho dữ liệu có cấu trúc. Khi dữ liệu được tạo trong một bối cảnh kinh doanh cụ thể, ta trích xuất dữ liệu, tạo embedding và xây dựng cơ sở dữ liệu vector
      Ở bước hậu xử lý, sau khi mô hình chính phản hồi, bộ hậu xử lý tự động tạo và lưu bộ nhớ dựa trên cuộc trò chuyện. Nó lưu lại ngữ cảnh quan trọng mà không đặt gánh nặng công việc này lên mô hình chính. Nó cũng thực thi logic nghiệp vụ liên quan như một phần của yêu cầu rồi phản hồi lại vào hệ thống
      Ở bước tiền xử lý, trước khi gửi đầu vào mới cho mô hình chính, nó kiểm tra các bộ nhớ đã lưu, chèn ngữ cảnh liên quan và cũng thực thi logic. Có thể xem như bộ tiền xử lý cung cấp cho mô hình chính một phần “ôn lại” về các cuộc trò chuyện trước đó để chuẩn bị cho các phản hồi nhất quán hơn và giàu thông tin hơn
    • Đa agent có khá nhiều tiềm năng. Tôi nghĩ phản hồi của agent có một mức entropy nhất định, nên càng đáng để thử
  • Về phần giới hạn đã nêu, nếu các biến thể Llama 2 70B, dù đã được tinh chỉnh cho gọi hàm, vẫn tạo ra lời gọi hàm sai hoặc ảo giác ra hàm ngoài schema được cung cấp, thì có thể dùng lấy mẫu dựa trên ngữ pháp
    Ít nhất có thể đảm bảo lời gọi hàm đúng về mặt cú pháp
    [0] https://github.com/ggerganov/llama.cpp/tree/master/grammars

    • Lấy mẫu dựa trên ngữ pháp là một ý tưởng hay và rất hợp với những thứ như MemGPT. Khi thử nghiệm MemGPT với các mô hình không phải gpt-4, những vấn đề ảnh hưởng lớn nhất đến hiệu năng là dùng sai đối số hàmảo giác hàm
      Ví dụ, ngay cả mô hình lớn đã được tinh chỉnh bằng dữ liệu gọi hàm (https://huggingface.co/jondurbin/airoboros-l2-70b-2.1#agentf...) nhìn chung cũng xuất ra JSON có thể parse được, nhưng đối số hoặc tên hàm lại sai
      Chẳng hạn, khi muốn ghi dữ liệu, thay vì lời gọi working_context.append đúng đã được nêu trong pre-prompt, nó lại xuất ra lời gọi personal_diary.add hoàn toàn không được chỉ định
  • Chỉ nhìn tiêu đề, tôi tưởng đây là kỹ thuật chỉnh sửa bộ nhớ như ROME [1], tức bộ nhớ mạng nơ-ron của LLM — bộ nhớ ở cấp trọng số, chứ không phải ngữ cảnh — được thay đổi trong lúc đối thoại
    Thật may khi biết thực ra đây là một công trình RAG rất hay, và tôi sắp làm phiên bản MemEditGPT của mình
    [1] https://arxiv.org/abs/2202.05262

    • Nếu muốn đóng góp, bạn có thể mở issue hoặc PR trong kho lưu trữ. Tất cả đều là mã nguồn mở theo Apache 2.0, và chúng tôi đang tích cực xem xét việc tích hợp các workflow phổ biến vào CLI
      Đúng như bạn hiểu, MemGPT không chỉnh sửa trọng số LLM như ROME. “Bộ nhớ” mà MemGPT nói đến là ở cấp văn bản/token, không phải cấp trọng số
      Khái niệm cốt lõi là trao cho LLM khả năng chỉnh sửa một scratchpad bộ nhớ làm việc được giữ trong ngữ cảnh, đồng thời đọc và ghi ngữ cảnh bên ngoài thông qua các hàm. Một chi tiết quan trọng là để xử lý giới hạn ngữ cảnh hữu hạn, việc đọc luôn diễn ra theo trang, tức theo từng chunk
      MemGPT có thể nối chuỗi các hàm để đọc và ghi lặp lại nhiều lần từ một đầu vào người dùng duy nhất. Vì vậy, như ví dụ tài liệu API LlamaIndex trong README, nó có thể tìm kiếm một cơ sở dữ liệu tài liệu lớn, tổng hợp thông tin từ nhiều nguồn và trả về câu trả lời
  • Trong một thời gian, tôi từng nghi ngờ rằng phiên bản web của ChatGPT (chat.openai.com, không phải API) hoạt động theo kiểu này trong hội thoại. Ngay cả với lịch sử chat rất dài, cảm giác không phải là nó đột ngột quên hết mọi thứ, mà chất lượng giảm dần
    Tất nhiên cũng có thể trong ngữ cảnh có nhiều manh mối hơn tôi nghĩ
    Dù sao, tôi nghĩ những ý tưởng kiểu này nhiều khả năng sẽ trở thành tính năng cơ bản của mọi chatbot trong tương lai

    • Tóm tắt đệ quy là một cách đơn giản và phổ biến để tạo ảo giác về ngữ cảnh vô hạn. Khi cần giải phóng không gian, chỉ việc nén N tin nhắn cũ nhất thành một tin nhắn tóm tắt
      Nó có tổn hao và cuối cùng sẽ làm mất thông tin quan trọng, nhưng hiệu năng có thể suy giảm tương đối từ từ. Trong MemGPT, ngoài mọi cơ chế quản lý bộ nhớ tường minh, còn dùng cả tóm tắt đệ quy ngầm
    • Có nhiều manh mối còn lại hơn ta tưởng rất nhiều. Hơn nữa, cửa sổ ngữ cảnh dài khoảng 12 trang theo văn bản tiếng Anh tiêu chuẩn, và không gian bị lãng phí cho system prompt cũng không nhiều
      Nếu đã làm một việc dù chỉ hơi thú vị, đầu ra sẽ bị thiên lệch mạnh theo prompt. Vì chỉ có một mẫu duy nhất là đầu ra/lịch sử trước đó, một phần thông tin bị mất thay vì có một phân phối xác suất mượt mà; và vì nhiều đầu vào có thể ánh xạ tới cùng một đầu ra, lại mất thêm một phần thông tin nữa
      Nhưng prompt trong thực tế thường là cách diễn đạt dễ nghĩ ra nhất và ngắn nhất để đạt được kết quả mong muốn. Vì vậy nếu LLM suy đoán được prompt đó, cách diễn giải của nó về phần ngữ cảnh bị thiếu nhiều khả năng cũng tạm đúng. Nói cách khác, nhiều thông tin tưởng như đã biến mất vẫn được giữ trong đầu ra của LLM, và ngay cả khi ngữ cảnh cũ bị đẩy ra ngoài, lượng thông tin mất đi trong một lần cũng không quá lớn
    • Lý do ChatGPT suy giảm hiệu năng là vì nó không làm gì đặc biệt để mở rộng bộ nhớ ra ngoài độ dài ngữ cảnh
      Có nhiều kỹ thuật đơn giản để triển khai bộ nhớ có tổn hao. Ví dụ có cách average pooling token như phương pháp mà sentence transformers dùng. Tôi không rõ vì sao cách này hiếm khi được dùng để nén nhiều ngữ cảnh vào prompt. Trên thực tế nó đóng vai trò như bộ nhớ trung hạn
    • Không ai biết các mô hình đóng thực sự làm gì, nhưng nhìn một số prompt attack thì có vẻ chúng dùng tóm tắt đệ quy ngoài những thứ được nhắc đến trong luồng này
    • Cảm giác của tôi là nó cắt bỏ khỏi cuộc hội thoại đúng lượng tối thiểu cần thiết các token cũ nhất để vẫn nằm dưới giới hạn token. Nó không suy giảm như thể cuộc hội thoại có bộ nhớ trung hạn
  • Tôi không nhớ tên, nhưng đã có một ngôn ngữ lập trình bí truyền thực thi lệnh một cách bất ổn. Nếu thiết kế chương trình cẩn thận, có thể làm cho chuỗi lệnh được thực thi với độ tin cậy như 99%, 99,9%

    • Có lẽ là Java2000
      20 năm sau, cũng cách tiếp cận đó được phổ biến trong lĩnh vực hạ tầng với cái tên “chaos engineering”, một cách hoàn toàn không mỉa mai
    • Hơi giống Malbolge nhưng có vẻ không hoàn toàn giống. https://en.m.wikipedia.org/wiki/Malbolge
  • Cập nhật: Tôi vừa công khai chatbot Discord thường trực triển khai trên MemGPT. Có thể thử ở đây: https://discord.gg/9GEQrxmVyE
    Với mã trên GitHub, bạn cũng có thể chạy cục bộ demo chatbot và demo bot hỏi đáp tài liệu, nơi có thể hỏi MemGPT về tài liệu API

  • Tôi nghĩ hạn chế lớn nhất của LLM là cửa sổ ngữ cảnh. Ngay cả năng lực suy luận xuất sắc cũng thường vướng giới hạn cửa sổ ngữ cảnh trong các trường hợp sử dụng thực tế

    • Đúng vậy. Hy vọng các kỹ thuật được giới thiệu ở đây có thể gợi ý hướng thiết kế chatbot thường trực
  • Tôi đồng ý với cách giải thích rằng tóm tắt đệ quy là một cách đơn giản để xử lý cửa sổ ngữ cảnh bị tràn, nhưng về bản chất là có tổn hao và cuối cùng tạo ra những lỗ hổng lớn trong bộ nhớ hệ thống
    Nhưng MemGPT cũng đang làm điều tương tự và gặp cùng vấn đề. Nó chỉ khác một chút ở chỗ thay vì tóm tắt đệ quy mọi thứ, nó chọn lọc truy xuất lịch sử rồi tạo ngữ cảnh cho mỗi yêu cầu. Ý tưởng thì hay
    Nhưng tôi hoài nghi. Cách tiếp cận này về cơ bản dựa vào giả định rằng ngữ cảnh hiện có là ngữ cảnh có thể tóm tắt với entropy thấp, và truy vấn chỉ phụ thuộc vào một phần lịch sử
    Điều đó có thể đúng với chat hoặc “trả lời câu hỏi từ một tập tài liệu khổng lồ”. Nhưng với những trường hợp như sinh mã, nơi ngữ cảnh dày đặc thông tin không thể bỏ như các định nghĩa API cụ thể, và cần ngữ cảnh rộng như nhiều định nghĩa API, thì cả hai giả định đều sai
    Kiến trúc và cách triển khai rất thú vị, demo cũng hay, nhưng thật tiếc là các bài báo liên quan đến tóm tắt không thừa nhận những giới hạn căn bản của cách tiếp cận này

    • Cảm ơn đã xem bài báo. Để tránh hiểu lầm, xin làm rõ rằng tóm tắt đệ quy chỉ là một phần trong quản lý bộ nhớ của MemGPT
      Như bạn nói, hàng đợi hội thoại của MemGPT được quản lý bằng tóm tắt đệ quy, giống các nghiên cứu trước và nhiều triển khai chatbot. Nhưng còn có bộ nhớ LLM ở vùng “cố định” có thể đọc/ghi, không liên quan đến tóm tắt đệ quy, và trong bài báo chúng tôi gọi nó là “ngữ cảnh làm việc”
      Vì vậy MemGPT có thể truy cập cả bản tóm tắt đệ quy được tự động tạo lẫn ngữ cảnh làm việc mà MemGPT chủ động duy trì ở trạng thái cập nhật
      Hai thứ này cũng tách biệt với ngữ cảnh bên ngoài của MemGPT, được đưa vào hàng đợi hội thoại bằng lời gọi hàm. Trong mọi ví dụ, việc đọc ngữ cảnh bên ngoài không bị nén và được thực hiện theo từng trang, không qua tóm tắt
      Khi việc tóm tắt hàng đợi được kích hoạt, MemGPT nhận được thông báo hệ thống, nên nếu cần giữ lại một chi tiết cụ thể trong hàng đợi hội thoại, nó có thể ghi chi tiết đó vào ngữ cảnh làm việc trước khi bị xóa hoặc tóm tắt
      Trong ví dụ tác nhân hội thoại, ngữ cảnh làm việc được dùng để lưu các sự kiện cốt lõi về người dùng và tác nhân, nhằm duy trì cuộc trò chuyện nhất quán. Ngữ cảnh làm việc luôn được LLM nhìn thấy nên không cần truy xuất riêng
      Trong hỏi đáp tài liệu, ngữ cảnh làm việc có thể được dùng để theo dõi tác vụ/câu hỏi hiện tại và tiến độ của nó. Với truy vấn phức tạp, nó giúp MemGPT theo dõi các chi tiết như những lần tìm kiếm trước đó và các yêu cầu trang trước đó