0fdc12695e
ci / JVM build + tests (push) Failing after 1m57s
- README.md в каждом подмодуле: для библиотек — описание проблемы, подключение через maven-central/caffeine, версии в gradle/libs.versions.toml. Для запускаемых модулей — команды запуска + переменные среды с дефолтами. - Корневой README.md переписан как навигационный хаб: что это, где клиенты, где серверы, как собрать, как опубликовать. - build.gradle.kts: per-module POM-description через единую карту в rootProject.extra (порядок важен — нужно ДО apply плагина KMP, поэтому beforeEvaluate в subprojects). - .gitea/workflows/ci.yml (новый): build + jvmTest + shadowJar на PR/push main. - .gitea/workflows/release.yml (обновлён): публикует библиотеки в caffeine Nexus + собирает 3 fatjar'а и крепит их к release как бинарные ассеты.
73 lines
3.3 KiB
Markdown
73 lines
3.3 KiB
Markdown
# :memory-vector — `pw.binom.agentik.memory.vector`
|
|
|
|
**Реализация долговременной памяти поверх JVector (ANN-индекс) + SQLite (метаданные) + эмбеддингов.**
|
|
JVM-only (JVector не публикует KMP-таргеты; на Android ART работает через Java 11
|
|
scalar fallback).
|
|
|
|
## Какую проблему решает
|
|
|
|
`:memory-md` хорош для малых объёмов и дев-окружения, но при тысячах заметок
|
|
keyword-overlap поиск не справляется. Vector-бэкенд считает **эмбеддинги**
|
|
заметок, складывает в JVector ANN-индекс, ищет по cosine similarity.
|
|
`recency-re-rank` подмешивает свежесть, чтобы новые факты не тонули в старых.
|
|
|
|
## Архитектура
|
|
|
|
```
|
|
┌───────────────────────┐
|
|
user-query ─►│ EmbeddingProvider │ (HTTP /v1/embeddings или SIGLIP2 on-device)
|
|
└─────────┬─────────────┘
|
|
▼
|
|
┌───────────────────────┐
|
|
│ MemoryVectorStore │
|
|
│ ├─ JVector (cosine) │ ◄── ANN-search
|
|
│ └─ SQLite (мета) │ ◄── заметки + lastUsedAt + useCount
|
|
└───────────────────────┘
|
|
```
|
|
|
|
Бэкенды эмбеддингов (через `AGENTIK_EMBEDDING_BACKEND`):
|
|
|
|
- **`HTTP`** — POST на `${OPENAI_BASE_URL}/v1/embeddings`. Семантический поиск
|
|
через OpenAI-совместимый endpoint (vLLM, OpenAI, LiteLLM-proxy).
|
|
Кэширование LRU(256) на уровне `EmbeddingHttpProvider` для дедупликации.
|
|
- **`SIGLIP`** — on-device SigLIP2 через ONNX Runtime (768-мерный вектор).
|
|
Никаких внешних вызовов; модель и токенизатор должны лежать на диске.
|
|
|
|
## Подключение
|
|
|
|
```kotlin
|
|
plugins { kotlin("jvm") }
|
|
|
|
dependencies {
|
|
implementation("pw.binom.agentik:memory-vector:$version")
|
|
// Транзитивно: :memory-api + jvector + sqldelight + text-embedding-kmp
|
|
}
|
|
```
|
|
|
|
`:standalone` инициализирует бэкенд автоматически по `AGENTIK_MEMORY_BACKEND=vector`
|
|
+ `AGENTIK_EMBEDDING_BACKEND=…`.
|
|
|
|
## Размерности
|
|
|
|
| Backend | Модель | Dim |
|
|
|---|---|---|
|
|
| `HTTP` (OpenAI) | `text-embedding-3-small` (default) | 1536 |
|
|
| `HTTP` (OpenAI) | `text-embedding-3-large` | 3072 |
|
|
| `SIGLIP` | SigLIP2-base | 768 (фиксировано) |
|
|
|
|
Для `HTTP` размерность управляется через `AGENTIK_EMBEDDING_DIMENSION`; для
|
|
`SIGLIP` — определяется автоматически.
|
|
|
|
## Где смотреть версии
|
|
|
|
- `version` из `gradle.properties` (`version=0.1.0`)
|
|
- релизы: `https://git.binom.pw/subochev/agentik/releases`
|
|
|
|
## Сборка
|
|
|
|
```bash
|
|
./gradlew :memory-vector:build
|
|
```
|
|
|
|
JVM-only. Тянет `pw.binom.agentik:memory-api` и `com.github.jvector:jvector:3.0.6`.
|