Память, которая не сжирает бюджет: зачем это нужно
Открою счет за февраль 2026. $312 за OpenClaw Pro. Половина токенов ушла на то, чтобы агент помнил, как я вчера ругался с заказчиком. Абсурд? Да. Знакомо? Наверняка. В нашей статье "OpenClaw vs память-ориентированные агенты" мы разобрали архитектурную войну. Суть проста: OpenClaw тащит весь контекст в промпт, и вы платите $2.1 за каждую тысячу токенов воспоминаний. Каждый день. Всегда.
Локальная векторная база режет этот счет на 75%. Вместо того чтобы кормить модель историей целиком, вы храните ее в дешевом хранилище (Chroma, Weaviate) и достаете оттуда только релевантные куски по запросу. Стоимость хранения падает до $0.8/K токенов, и это разово. А еще память становится практически бесконечной. Звучит как магия, но это просто инженерия. Грязная, сложная, но рабочая.
Telegram Business Bot здесь не случайность. Это канал коммуникации, где агент работает с реальными людьми. Он запоминает предпочтения клиентов, историю заказов, детали проектов. Без долгой памяти он каждый раз начинает диалог с чистого листа - и выглядит как беспомощный идиот.
Арсенал: что берем в бой в марте 2026
Инструменты должны быть острыми. И актуальными. Вот стек, который работает прямо сейчас.
- OpenClaw Kraken-1.5 (или новее). На 03.03.2026 это последняя стабильная версия с контекстом 128K. Если вышли Kraken-2.0 - берите ее. Главное - поддержка внешних плагинов и API.
- MemU MemNet v2. Библиотека для управления векторной памятью. В феврале 2026 вышло второе поколение с улучшенными эмбеддингами и кэшированием. Берем только его.
- Chroma DB 0.5.x. Локальная векторная база, которая не требует танцев с облаками. Простая, на Python, идеально для наших целей. Альтернативы - Weaviate или Qdrant, но они сложнее.
- Telegram Business API. Да, он уже вышел и стабилен. Позволяет ботам работать в официальном аккаунте бизнеса с расширенными метками и меню. Ключевой момент - авторизация через BotFather с флагом
business. - Python 3.11+. Старые версии не возьмем - будут тормоза с асинхронностью.
1Готовим базу: ставим Chroma и MemU
Сначала локальное хранилище. Устанавливаем Chroma - она будет лежать в вашей файловой системе, никаких внешних сервисов.
pip install chromadb==0.5.0 memu-net==2.3.1 openaiПочему именно эти версии? Chroma 0.5.0 исправила критические базы с индексацией, которые были в 0.4.x. MemU 2.3.1 - последняя стабильная на март 2026, с поддержкой новых моделей эмбеддингов от OpenAI и Cohere. Если поставите старую - получите ошибку Invalid embedding dimension.
Теперь инициализируем базу. Создадим Python скрипт init_memory.py:
import chromadb
from memu import MemuClient
# Создаем персистентный клиент Chroma
chroma_client = chromadb.PersistentClient(path="./openclaw_memory")
# Коллекция для долгосрочной памяти
collection = chroma_client.get_or_create_collection(
name="openclaw_conversations",
metadata={"hnsw:space": "cosine"} # Используем косинусную схожесть
)
# Инициализируем клиент MemU
memu = MemuClient(
collection=collection,
embedding_model="text-embedding-3-large", # Актуальная модель от OpenAI на 2026
auto_flush=True # Автосохранение
)
print("Векторная база готова. Путь: ./openclaw_memory")Не используйте устаревшую модель text-embedding-ada-002. Она дает менее точные эмбеддинги и медленнее. text-embedding-3-large - текущий стандарт. Если хотите сэкономить, есть text-embedding-3-small, но для бизнес-бота лучше брать точность.
2Пришиваем память к OpenClaw
Теперь нужно заставить OpenClaw обращаться к векторной базе. Открываем конфигурационный файл OpenClaw (обычно config/agents.yaml). Ищем секцию memory и меняем ее.
Было (типичная конфигурация):
memory:
type: "in_context"
max_tokens: 128000Стало:
memory:
type: "external"
module: "memu_integration"
params:
db_path: "./openclaw_memory"
collection_name: "openclaw_conversations"
top_k: 5 # Сколько фрагментов памяти доставать для контекста
similarity_threshold: 0.78 # Порог релевантности. Ниже - игнорируемСоздаем сам модуль интеграции. Файл memu_integration.py в папке плагинов OpenClaw:
import sys
sys.path.append('.')
from memu import MemuClient
import chromadb
import yaml
class MemuIntegration:
def __init__(self, params):
self.client = chromadb.PersistentClient(path=params['db_path'])
self.collection = self.client.get_collection(params['collection_name'])
self.memu = MemuClient(
collection=self.collection,
embedding_model="text-embedding-3-large"
)
self.top_k = params['top_k']
self.threshold = params['similarity_threshold']
def remember(self, query: str, user_id: str):
"""Ищет в памяти релевантные фрагменты для пользователя."""
results = self.memu.search(
query=query,
user_id=user_id,
limit=self.top_k,
min_score=self.threshold
)
return [res['text'] for res in results]
def memorize(self, text: str, user_id: str, metadata: dict = None):
"""Сохраняет новый фрагмент в память."""
self.memu.add(
text=text,
user_id=user_id,
metadata=metadata or {}
)Теперь OpenClaw будет при каждом запросе сначала искать в памяти релевантные прошлые разговоры, и только потом формировать промпт. Токены экономятся дико.
3Telegram Business Bot: не просто обертка
Обычный бот - это скучно. Business Bot дает метки, категории, быстрые ответы. Но главное - у него официальный статус. Создаем через BotFather:
/newbot
Имя: YourCompany Assistant
Username: yourcompany_assistant_bot
Теперь включаем бизнес-режим:
/setbusiness — и следуем инструкциям.Получаем токен. Теперь пишем интегратор на Python с библиотекой python-telegram-bot==21.0 (актуальная на 2026).
Основной скрипт бота (bot_core.py):
from telegram import Update, BusinessMessage
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from openclaw import OpenClawClient # Предполагаем, что есть клиент OpenClaw
from memu_integration import MemuIntegration
import asyncio
# Инициализация
openclaw = OpenClawClient(api_key="your_key")
memory = MemuIntegration({
'db_path': './openclaw_memory',
'collection_name': 'openclaw_conversations',
'top_k': 5,
'similarity_threshold': 0.78
})
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = str(update.effective_user.id)
user_message = update.message.text
# Шаг 1: Ищем в памяти релевантное
relevant_memories = memory.remember(user_message, user_id)
memory_context = "\n".join(relevant_memories) if relevant_memories else ""
# Шаг 2: Формируем промпт с памятью
prompt = f"""Контекст из прошлых разговоров:
{memory_context}
Текущий запрос пользователя: {user_message}
"""
# Шаг 3: Отправляем в OpenClaw
response = await openclaw.async_generate(prompt, user_id=user_id)
# Шаг 4: Сохраняем новый диалог в память
memory.memorize(
text=f"Пользователь: {user_message}\nАссистент: {response}",
user_id=user_id,
metadata={"type": "dialog"}
)
# Шаг 5: Отправляем ответ
await update.message.reply_text(response)
async def main():
application = Application.builder().token("YOUR_BOT_TOKEN").build()
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
await application.run_polling()
if __name__ == "__main__":
asyncio.run(main())Бот теперь не просто пересылает запросы. Он помнит. Если клиент спросит "напомни, что мы обсуждали про дизайн логотипа", бот найдет в памяти все разговоры про логотипы и даст связный ответ. Без необходимости тащить в контекст всю историю переписки.
Подводные камни, о которые спотыкаются 9 из 10 инженеров
Теория гладкая. Практика - ухабистая. Вот что сломает вам систему, если не знать.
- Эмбеддинги ломают структуру. MemU по умолчанию разбивает текст на чанки. Если вы сохраняете длинный диалог, он может разрезать реплику пополам. Решение: настраивайте
chunk_sizeиchunk_overlapв MemuClient. Для диалогов я ставлюchunk_size=500иoverlap=50. - Порог релевантности - черная магия. Поставите
similarity_threshold=0.9- память почти никогда не сработает. Поставите 0.5 - в контекст полезут случайные фрагменты. Золотая середина 0.75-0.8, но тестируйте на своих данных. Запустите eval-скрипт, который проверяет точность поиска. - Telegram Business API лимитирует. Нельзя отправлять больше 30 сообщений в секунду на один бот. Если у вас тысячи клиентов, ставьте очередь (message queue). Я использую Redis + RQ для асинхронной обработки.
- OpenClaw может "забыть" про внешнюю память. Если в конфиге указан
type: "external", но модуль не загружен, агент просто проигнорирует память и будет работать в режиме короткого контекста. Всегда проверяйте логи при старте: там должно бытьLoaded external memory module: memu_integration.
FAQ: ответы на вопросы, которые вы постесняетесь задать
| Вопрос | Ответ |
|---|---|
| Сколько это стоит в деньгах? | Хранение 1 млн токенов в Chroma: ~$0.8. В OpenClaw (in-context) это стоило бы $2100 каждый месяц. Локальная база - разово. |
| А если сервер упадет? | Chroma хранит данные на диске. Поднимите заново - память на месте. Сделайте бэкап папки openclaw_memory. |
| Можно ли использовать русские эмбеддинги? | Да. MemU v2 поддерживает мультиязычные модели, например intfloat/multilingual-e5-large. Укажите ее в embedding_model. |
| Бот будет помнить каждого пользователя отдельно? | Да, если передавать user_id в MemU. Память изолирована. Можно сделать и общую память для всех - просто не указывайте user_id. |
| Это замедлит ответы? | На 50-100 мс из-за поиска по векторной базе. Но вы сэкономите секунды на генерации (меньше токенов в промпте). В целом - быстрее. |
И последнее. Не делайте память слишком умной. Если она будет сохранять каждый чих, в контекст начнут попадать мусорные фрагменты. Настройте фильтрацию: сохраняйте только диалоги длиннее 50 символов, где есть существительные и глаголы. MemU v2 умеет это из коробки через параметр min_significance_score. Используйте.
Теперь ваш OpenClaw помнит всё. И не требует за это дополнительных денег. Разве что за электричество, если крутите на своей железяке. Но это уже другая история.