Создание постоянной операционной системы агента ИИ в стиле EverMem с иерархической памятью, векторным поиском FAISS, хранилищем SQLite и автоматизированным объединением памяти

В этом руководстве мы создаём операционную систему (ОС) агента ИИ в стиле EverMem. Мы объединяем краткосрочный контекстуальный контекст (STM) с долгосрочной векторной памятью, используя FAISS, чтобы агент мог вспомнить соответствующую информацию из прошлого перед генерацией ответа. Наряду с семантической памятью мы также храним структурированные записи в SQLite для сохранения метаданных, таких как метки времени, оценки важности и сигналы памяти (предпочтение, факт, задача, решение).

Установка окружения

Для начала установим необходимые библиотеки и импортируем все зависимости, необходимые для работы с памятью, встраиваниями, генерацией и сохранением данных. Определим вспомогательные функции для хеширования, временных меток, безопасного отсечения и управления каталогами для поддержки стабильной основы ОС агента. Также введём класс `MemoryItem`, который служит основной структурированной единицей, представляющей каждый элемент памяти, хранящийся в нашей системе.

«`python
import os, time, json, math, sqlite3, hashlib
from dataclasses import dataclass
from typing import List, Dict, Any, Optional
import numpy as np
import faiss
import torch
from sentence_transformers import SentenceTransformer
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

def nowts():
return int(time.time())

def _sha(s: str) -> str:
return hashlib.sha256(s.encode(«utf-8″, errors=»ignore»)).hexdigest()[:16]

def ensuredir(p: str):
os.makedirs(p, exist_ok=True)

def safeclip(text: str, max_chars: int = 1800) -> str:
text = (text or «»).strip()
if len(text) <= max_chars:
return text
return text[:max_chars].rstrip() + » …»

@dataclass
class MemoryItem:
mid: str
role: str
text: str
created_ts: int
importance: float
tokens_est: int
meta: Dict[str, Any]
«`

Класс EverMemAgentOS

Инициализируем класс `EverMemAgentOS` и настраиваем модель встраивания, модель генерации, выбор устройства и параметры памяти. Создаём схему SQLite для постоянного хранения и инициализируем индекс FAISS для поиска по векторам для долгосрочной памяти.

«`python
class EverMemAgentOS:
def init(
self,
workdir: str = «/content/evermemagentos»,
db_name: str = «evermem.sqlite»,
embedding_model: str = «sentence-transformers/all-MiniLM-L6-v2»,
gen_model: str = «google/flan-t5-small»,
stmmaxturns: int = 10,
ltm_topk: int = 6,
consolidate_every: int = 8,
consolidatetriggertokens: int = 1400,
compresstargetchars: int = 420,
seed: int = 7,
):
# …
«`

Взаимодействие с агентом

Реализуем логику семантического поиска и форматирования, которая позволяет агенту извлекать соответствующие долгосрочные воспоминания перед рассуждением. Определим, как структурированы краткосрочная память и извлечённые долгосрочные воспоминания, и как они внедряются в подсказки для контекстной генерации.

«`python
def formatstm(self) -> str:
turns = self.stm[-self.stmmaxturns:]
chunks = []
for t in turns:
chunks.append(f»{t[‘role’].upper()}: {t[‘content’]}»)
return «\n».join(chunks).strip()

def formatltm(self, ltm_items: List[MemoryItem] -> str:
# …
«`

Заключение

Мы создали работающий агент, ориентированный на память, который ведёт себя не как чат-бот без состояния, а как постоянный помощник, который учится на основе взаимодействий. Мы реализовали оценку важности для определения приоритетов, векторный поиск для быстрого извлечения соответствующего контекста и периодическое объединение для сжатия нескольких воспоминаний в долговечные сводки, улучшающие долгосрочный вызов.

Вопросы:

1. Какие технологии используются для создания постоянной операционной системы агента ИИ в стиле EverMem?

Ответ:

Для создания постоянной операционной системы агента ИИ в стиле EverMem используются следующие технологии:
* краткосрочный контекстуальный контекст (STM);
* долгосрочная векторная память с использованием FAISS;
* хранилище SQLite для сохранения метаданных;
* автоматизированное объединение памяти.

2. Какие функции используются для управления каталогами и обеспечения стабильной основы ОС агента?

Ответ:

Для управления каталогами и обеспечения стабильной основы ОС агента используются следующие функции:
* `ensuredir(p: str)` — создаёт каталог, если он не существует;
* `safeclip(text: str, max_chars: int = 1800) -> str` — обрезает текст, если его длина превышает заданное значение.

3. Какие параметры используются при инициализации класса `EverMemAgentOS`?

Ответ:

При инициализации класса `EverMemAgentOS` используются следующие параметры:
* `workdir: str` — каталог для работы;
* `db_name: str` — имя файла SQLite;
* `embedding_model: str` — модель встраивания;
* `gen_model: str` — модель генерации;
* `stmmaxturns: int` — максимальное количество шагов в краткосрочной памяти;
* `ltm_topk: int` — количество элементов для извлечения из долгосрочной памяти;
* `consolidate_every: int` — частота объединения памяти;
* `consolidatetriggertokens: int` — количество токенов для запуска объединения памяти;
* `compresstargetchars: int` — количество символов для сжатия;
* `seed: int` — начальное значение для генерации случайных чисел.

4. Какие функции используются для форматирования краткосрочной и долгосрочной памяти?

Ответ:

Для форматирования краткосрочной памяти используется функция `formatstm(self) -> str`, которая возвращает строку с форматированными элементами краткосрочной памяти.

Для форматирования долгосрочной памяти используется функция `formatltm(self, ltm_items: List[MemoryItem] -> str`, которая принимает список элементов долгосрочной памяти и возвращает строку с форматированными элементами.

Источник