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) библиотека:
- ищет релевантные узлы по TF-IDF, тегам, strength и confidence;
- добавляет найденный контекст в prompt;
- вызывает переданную модель;
- возвращает строку ответа;
- по умолчанию сохраняет запрос и ответ в граф;
- связывает новый запрос с использованными воспоминаниями.
Для отладки 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file memnet_agent-0.1.2.tar.gz.
File metadata
- Download URL: memnet_agent-0.1.2.tar.gz
- Upload date:
- Size: 42.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27c4086e65d2d99e0a1cd589edf67a11841d9daca8fb107371180fef18a33726
|
|
| MD5 |
818eadf2424e18bb33218833acc19d28
|
|
| BLAKE2b-256 |
8817a575bca826b49cd0579005b9354c2bb8c95df0cad7f085cb3cc8a2c2b366
|
Provenance
The following attestation bundles were made for memnet_agent-0.1.2.tar.gz:
Publisher:
release.yml on Alex-zcl/memnet-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
memnet_agent-0.1.2.tar.gz -
Subject digest:
27c4086e65d2d99e0a1cd589edf67a11841d9daca8fb107371180fef18a33726 - Sigstore transparency entry: 2350323963
- Sigstore integration time:
-
Permalink:
Alex-zcl/memnet-agent@353aae94219563119380da8021b4957db3df8bc7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Alex-zcl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@353aae94219563119380da8021b4957db3df8bc7 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file memnet_agent-0.1.2-py3-none-any.whl.
File metadata
- Download URL: memnet_agent-0.1.2-py3-none-any.whl
- Upload date:
- Size: 33.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4dfb29643a1690ab175b04f8972881d4a7adb0f62aefff34b4cd32b9f6cb607
|
|
| MD5 |
fb6558561ed07a42216fd664c106b3cb
|
|
| BLAKE2b-256 |
25468a28e37b84d1766d7e61e77bf9c4bb80c9c61165f1c63644d297d79997fd
|
Provenance
The following attestation bundles were made for memnet_agent-0.1.2-py3-none-any.whl:
Publisher:
release.yml on Alex-zcl/memnet-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
memnet_agent-0.1.2-py3-none-any.whl -
Subject digest:
b4dfb29643a1690ab175b04f8972881d4a7adb0f62aefff34b4cd32b9f6cb607 - Sigstore transparency entry: 2350324548
- Sigstore integration time:
-
Permalink:
Alex-zcl/memnet-agent@353aae94219563119380da8021b4957db3df8bc7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Alex-zcl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@353aae94219563119380da8021b4957db3df8bc7 -
Trigger Event:
workflow_dispatch
-
Statement type: