История о том, как превратить ИИ-агента из «золотой рыбки» с памятью в 128к токенов в полноценного цифрового сотрудника с долгосрочным хранилищем знаний.Зачем бИстория о том, как превратить ИИ-агента из «золотой рыбки» с памятью в 128к токенов в полноценного цифрового сотрудника с долгосрочным хранилищем знаний.Зачем б

Как мы с моим ботом OpenClaw сделали ему семантическую память на AlloyDB Omni за полчаса

2026/02/13 14:32
5м. чтение

История о том, как превратить ИИ-агента из «золотой рыбки» с памятью в 128к токенов в полноценного цифрового сотрудника с долгосрочным хранилищем знаний.

Зачем боту память, если есть контекст?

Современные LLM обладают огромными контекстными окнами (у Claude 4.6 это 1М токенов), но это все еще «оперативка». Как только сессия заканчивается или проект перерастает масштаб одного файла, бот начинает «забывать» важные архитектурные решения, предпочтения автора и факты из прочитанных ранее статей.

Мы с моим агентом Полифемом (работающим на базе фреймворка OpenClaw) решили пойти дальше обычного RAG и построить Graph-RAG на стероидах, используя возможности AlloyDB Omni и концепцию SPO (Subject-Predicate-Object).

==AlloyDB Omni — PostgreSQL сервер, переписанный Google, в котором встроены функции обращения к LLM, векторизации строк. Умеет строить и динамически дообучать высокоскоростные индексы кластеризации эмбеддингов на алгоритмах приблизительных ближайших соседей.==

Обычный RAG режет текст на куски (чанки) и ищет похожие. Это дешево, но часто ведет к потере связей. Наш подход в рамках концепции SDD (Skill-Driven Development) был иным:

  1. Сущности (Entities): Хранятся отдельно на английском языке (чтобы избежать проблем с падежами). Каждая сущность имеет свой векторный отпечаток.

  2. Утверждения (Statements): Бот не просто сохраняет абзац, он формулирует атомарный факт. Например: [Claude 4.6] -> [has] -> [1M context window].

  3. Гибридный поиск: AlloyDB Omni позволяет нам одновременно использовать векторный поиск (pgvector) для поиска по смыслу и классический полнотекстовый поиск для точности.

Реализация за 30 минут

Шаг 1: "Zero Trust" Инфраструктура

Первым делом мы создали изолированный проект OmniMemory. Бот сам подготовил .env с ключами доступа к моему удаленному серверу AlloyDB в облаке и Vertex AI для генерации эмбеддингов. Несмотря на то, что сервер довольно скромный (всего 8 ГБ RAM), AlloyDB Omni прекрасно справляется с нашими задачами семантического поиска.
Бот написал себе инструкцию по разработке:

# Omni-Memory Project Semantic Graph-RAG system for AI agents, built on AlloyDB Omni. ## Project Structure - `schemas.py`: Pydantic models for SPO (Subject-Predicate-Object) logic. - `init_db.sql`: SQL schema with `pgvector`, `pg_trgm`, and `ivfflat` indexes. - `db_setup.py`: Database initialization script. - `.env`: (Ignored in Git) Environment configuration. ## Setup 1. Ensure the AlloyDB Omni cluster is running. 2. Run `db_setup.py` to create the `omny_brain` database and apply the schema.

Шаг 2: Schema-First

Мы обговорили Pydantic-модели, которые стали контрактом между логикой бота и базами данных.

  • Таблица entitiesсодержит уникальные узлы графа.

  • Таблица facts: связи между узлами, сформулированный факт и оригинальный контекст (на случай, если захочется проверить первоисточник). Бот сделал себе схему:

from pydantic import BaseModel, Field from typing import Optional, Dict, Any, List from uuid import UUID, uuid4 from datetime import datetime class EntitySchema(BaseModel): """ Represents a unique concept or object in English. """ id: UUID = Field(default_factory=uuid4) name: str = Field(description="Unique name in English (e.g., 'Claude 4.6')") metadata: Dict[str, Any] = Field(default_factory=dict, description="Type, description, etc.") class FactSchema(BaseModel): """ Represents a structured statement connecting entities. """ id: UUID = Field(default_factory=uuid4) subject_id: UUID = Field(description="Reference to the Subject entity") predicate: str = Field(description="Relationship (e.g., 'uses', 'outperforms')") object_id: UUID = Field(description="Reference to the Object entity") content: str = Field(description="The formulated fact statement in Russian or English") context: str = Field(description="Original snippet for detailed nuance") source_url: Optional[str] = Field(None, description="Source URL") metadata: Dict[str, Any] = Field(default_factory=dict) created_at: datetime = Field(default_factory=datetime.utcnow) class FactCreateRequest(BaseModel): """ Helper schema for the agent to prepare data for storage. """ subject_name_en: str predicate: str object_name_en: str fact_text: str original_context: str source: str

Шаг 3: SQL реализация

Бот написал SQL-скрипт инициализации базы omni_brain с применением схемы данных. Мы использовали расширения:

  • pgvector: для семантической кластеризации сущностей.

  • pg_trgm: для поиска по похожим названиям (если я опечатаюсь в вопросе).

  • ivfflat: для мгновенного поиска среди миллионов фактов.

-- SQL Initialization for Omny-Memory (AlloyDB Omni) -- Enable extensions CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS vector; CREATE EXTENSION IF NOT EXISTS pg_trgm; -- Entities Table (Canonical English names) CREATE TABLE IF NOT EXISTS entities ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name TEXT UNIQUE NOT NULL, embedding VECTOR(768), metadata JSONB DEFAULT '{}', created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Index for entity name similarity CREATE INDEX IF NOT EXISTS idx_entities_name_trgm ON entities USING gin (name gin_trgm_ops); -- Vector index for entity clustering CREATE INDEX IF NOT EXISTS idx_entities_embedding ON entities USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); -- Facts Table (SPO structure + Content) CREATE TABLE IF NOT EXISTS facts ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), subject_id UUID REFERENCES entities(id), predicate TEXT NOT NULL, object_id UUID REFERENCES entities(id), content TEXT NOT NULL, context TEXT NOT NULL, embedding VECTOR(768), source_url TEXT, metadata JSONB DEFAULT '{}', created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Full-text search index for facts CREATE INDEX IF NOT EXISTS idx_facts_content_fts ON facts USING gin (to_tsvector('english', content)); -- Vector index for semantic RAG CREATE INDEX IF NOT EXISTS idx_facts_embedding ON facts USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

Затем он написал всю Python-обвязку, запустил скрипты и создал в базе нужные функции записи и извлечения. Весь код на гитхабе

Первые тесты

Мы скормили боту статью про новую модель Claude 4.6. Полифем сам:

  1. Выделил ключевые сущности.

  2. Перевел их на английский для нормализации.

  3. Сгенерировал векторы через text-embedding-005.

  4. Сохранил всё в облачной базе.

Когда я спросил: «Что там с контекстом у новой модели Клод?», бот нашел семантически близкие сущности и выдал структурированный ответ из базы с точностью совпадения 0.83.

Итог

За полчаса мы перевели модель «вопрос-ответ» к модели «накопление-анализ». Теперь мой бот — это развивающаяся база знаний, которая помнит всё: от параметров новых моделей до архитектурных особенностей удаленного облака.

Что дальше? Теперь мы планируем научить бота строить визуальные графы связей прямо в Obsidian, чтобы я мог буквально «видеть», как связаны технологии в его голове.


Статья подготовлена в соавторстве с агентом Полифемом в рамках проекта OpenClaw. Он накидывает драфт по своим логам, я пишу читаемый текст.

Вопросы Полифему можно задавать в канале t.me/veriga_pro_AI

Источник

Возможности рынка
Логотип OpenClaw
OpenClaw Курс (OPENCLAW)
$0.0013709
$0.0013709$0.0013709
+391.53%
USD
График цены OpenClaw (OPENCLAW) в реальном времени
Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу [email protected] для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.