Skip to main content

memnet-agent

memnet-agent превращает любую текстовую модель в агента с долговременной ассоциативной памятью-графом.

Модель отвечает за генерацию текста. Библиотека отвечает за:

  • поиск связанных воспоминаний перед инференсом;
  • добавление новых запросов и ответов в граф;
  • чтение документов без генерации ответа;
  • decay, merge, split, prune и ассоциативный synthesis во время «сна»;
  • импорт, сохранение и перенос графа;
  • генерацию итеративного train-датасета из текущей памяти.

Статус: alpha. Синтезированные узлы являются ассоциациями, а не автоматически проверенными фактами.

Установка

После публикации в PyPI:

pip install memnet-agent

Локально из исходников:

python -m pip install -e ".[dev]"

1. Самый простой агент

Передайте callable, который получает строку prompt и возвращает строку ответа:

from memnet_agent import MemoryAgent


def my_model(prompt: str) -> str:
    # Здесь может быть локальная нейросеть, HTTP-клиент или SDK провайдера.
    return "Ответ модели"


agent = MemoryAgent(model=my_model)
print(agent.ask("Запомни, что релиз запланирован на пятницу"))
print(agent.ask("Когда запланирован релиз?"))
agent.close()

agent(text) является коротким алиасом для agent.ask(text).

2. Передача готового объекта модели

Автоматически поддерживаются объекты с методом:

  • generate(prompt);
  • invoke(prompt);
  • predict(prompt);
  • complete(prompt);
  • chat(prompt).
from memnet_agent import MemoryAgent

llm = SomeFrameworkModel(...)
agent = MemoryAgent(model=llm)
answer = agent.ask("Что мы обсуждали раньше?")

Если метод называется иначе:

agent = MemoryAgent(model=llm, model_method="run_text")

Ответы форматов str, LangChain-подобный .content, OpenAI-подобный choices, словари и типовые результаты Hugging Face pipeline преобразуются в текст автоматически. Для нестандартного SDK используйте маленький callable-адаптер.

3. Как проходит инференс

При agent.ask(text) библиотека:

  1. ищет релевантные узлы по TF-IDF, тегам, strength и confidence;
  2. добавляет найденный контекст в prompt;
  3. вызывает переданную модель;
  4. возвращает строку ответа;
  5. по умолчанию сохраняет запрос и ответ в граф;
  6. связывает новый запрос с использованными воспоминаниями.

Для отладки retrieval:

result = agent.ask_with_trace("Что известно о договоре?")

print(result.answer)
for hit in result.memories:
    print(hit.score, hit.node.text)

Отключение обновления графа:

agent = MemoryAgent(model=my_model, update_memory=False)

Сохранять запросы, но не ответы:

agent = MemoryAgent(model=my_model, remember_responses=False)

4. Чтение информации без ответа

learn() и ingest() добавляют материал в граф, но ничего не отвечают пользователю:

agent.learn(
    """
    Проект Atlas использует PostgreSQL.
    Технический владелец — Анна.
    Следующий review назначен на 18 августа.
    """,
    source="project-atlas-notes",
)

agent.learn("docs/architecture.txt")

Большой текст автоматически разбивается на перекрывающиеся смысловые chunks.

Можно скрытно прогнать каждый chunk через основную модель перед сохранением:

agent.learn(document, preprocess_with_model=True)

В этом режиме модель получает инструкцию создать компактные фактические notes; результат пользователю не выводится.

5. Режимы сна

A. Сон после простоя

Это режим по умолчанию. После периода без активных запросов выполняется обслуживание графа:

from memnet_agent import MemoryAgent, SleepConfig

agent = MemoryAgent(
    model=my_model,
    sleep=SleepConfig.idle(
        after_seconds=20,
        maintenance_every_seconds=60,
    ),
)

B. Сон по часам

В указанное окно обычный инференс блокируется, но learn() продолжает работать, а граф обслуживается в фоне:

agent = MemoryAgent(
    model=my_model,
    sleep=SleepConfig.scheduled(
        start="02:00",
        end="05:00",
        timezone="Europe/Amsterdam",
    ),
)

Разрешить срочные запросы во время окна сна:

sleep=SleepConfig.scheduled(
    start="02:00",
    end="05:00",
    timezone="Europe/Amsterdam",
    allow_interrupt=True,
)

C. Постоянные memory-workers

Несколько daemon workers регулярно консолидируют общий граф, пока основной агент отвечает:

agent = MemoryAgent(
    model=my_model,
    sleep=SleepConfig.workers(
        count=3,
        maintenance_every_seconds=15,
    ),
)

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

Ручной сон

agent = MemoryAgent(model=my_model, sleep=SleepConfig.off())
report = agent.sleep(max_syntheses=5)
print(report)

6. Сохранение и экспорт графа

agent.export_graph("memory.sqlite")  # основной рабочий формат
agent.export_graph("memory.json")    # переносимый JSON
agent.export_graph("memory.graphml") # Gephi / Cytoscape / NetworkX
agent.export_graph("memory.zip")     # SQLite + JSON + manifest

Автосохранение после изменений:

agent = MemoryAgent(
    model=my_model,
    storage_path="state/memory.sqlite",
    auto_save=True,
)

Рекомендуется закрывать агент через context manager:

with MemoryAgent(model=my_model, storage_path="memory.sqlite") as agent:
    print(agent.ask("Привет"))

7. Подключение внешнего графа

При создании:

agent = MemoryAgent.from_graph(my_model, "shared-memory.zip")

Или позже:

agent.load_graph("team-memory.json", replace=True)

Объединение внешнего графа с текущим:

agent.load_graph("second-memory.sqlite", replace=False)

Импортируются SQLite, JSON и zip bundles. GraphML предназначен для визуализации и экспорта, а не для обратного импорта.

8. Итеративный train-датасет

agent.generate_training_dataset(
    "training.jsonl",
    iterations=3,
    max_examples_per_iteration=5000,
    format="chat",  # chat | instruction | graph
)

Чтобы между итерациями граф проходил консолидацию:

agent.generate_training_dataset(
    "training-evolving.jsonl",
    iterations=4,
    consolidate_between_iterations=True,
)

Потоковая работа без файла:

for record in agent.iter_training_dataset(iterations=2):
    train(record)

9. Асинхронная модель

answer = await agent.aask("Сформируй краткое резюме")
result = await agent.aask_with_trace("Что связано с Atlas?")

10. CLI

memnet-agent info memory.sqlite
memnet-agent validate memory.sqlite
memnet-agent convert memory.sqlite memory.graphml
memnet-agent dataset memory.sqlite train.jsonl --iterations 3 --format chat

Публичный API

from memnet_agent import (
    AgentResult,
    AssociativeMemory,
    MemoryAgent,
    MemoryHit,
    SleepConfig,
)

Низкоуровневый MemoryNet оставлен доступным для прямой работы с графом.

Ограничения версии 0.1.0

  • Retrieval пересчитывает TF-IDF по графу и рассчитан на небольшие и средние локальные памяти. Для миллионов узлов нужен embedding/ANN backend.
  • Background workers используют потоки и один синхронизированный граф; это безопасный maintenance, но не распределённая обработка.
  • Библиотека не проверяет истинность текста модели.
  • Не храните секреты и персональные данные без собственного шифрования и политики доступа.

Разработка

python -m pip install -e ".[dev]"
pytest
python -m build
python -m twine check dist/*

Пошаговая публикация находится в PUBLISHING.md.

Лицензия

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

memnet_agent-0.1.0.tar.gz (39.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

memnet_agent-0.1.0-py3-none-any.whl (32.2 kB view details)

Uploaded Python 3

File details

Details for the file memnet_agent-0.1.0.tar.gz.

File metadata

  • Download URL: memnet_agent-0.1.0.tar.gz
  • Upload date:
  • Size: 39.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for memnet_agent-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2700fb6d6ae0b34ffe6377aa50894fe8a95a44f1d3442a929bd542df0d6bfd60
MD5 222779f514ae850ce02a6d31bf7c3eb6
BLAKE2b-256 f3ddb2755db331e58f94ae4cefed0b27f88aefd00249e33080cf458ece6ca3e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for memnet_agent-0.1.0.tar.gz:

Publisher: release.yml on Alex-zcl/memnet-agent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file memnet_agent-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: memnet_agent-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 32.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for memnet_agent-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dedc49172c529694790e1085decd5504a1b252be7e2934feb75d11dedffd54bc
MD5 51c359096633e3f6351eaf0c55e29b4c
BLAKE2b-256 7b6a327ed29f765b580e90e5548ba1b653056bd638edb74702648c6f1550edfc

See more details on using hashes here.

Provenance

The following attestation bundles were made for memnet_agent-0.1.0-py3-none-any.whl:

Publisher: release.yml on Alex-zcl/memnet-agent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page