memory: SigLIP2 on-device embedding (text-embedding-kmp v3)
Добавляет второй бэкенд эмбеддингов для vector-памяти: on-device SigLIP2
через ONNX Runtime. Не требует сети (HTTP), не светят тексты заметок наружу.
* gradle/libs.versions.toml: text-embedding-kmp = "3.0.0-SNAPSHOT", модули
api-jvm / siglip-jvm (group переехал с pw.binom.voice.embeddingtext на
pw.binom.ai.embeddingtext).
* settings.gradle.kts: mavenLocal() добавлен в dependencyResolutionManagement
(text-embedding-kmp публикуется локально как snapshot).
* memory-vector/SiglipEmbeddingProvider (jvmMain) — адаптер
pw.binom.voice.embeddingtext.TextEmbeddingExtractor → EmbeddingProvider:
оборачивает blocking embed() в withContext(Dispatchers.IO) + Mutex (ONNX
сессия не reentrant), размерность пробируется через probe embed("probe")
(768 для SigLIP2-base).
* memory-vector/build.gradle.kts: api(libs.text.embedding.api) +
implementation(libs.text.embedding.siglip); jvmTest получает
SiglipEmbeddingProviderTest — smoke test (skip если модель не найдена).
* standalone/AgentikConfig: новый enum EmbeddingBackend { HTTP, SIGLIP },
поля embeddingBackend / embeddingModelPath / embeddingTokenizerPath, env:
AGENTIK_EMBEDDING_BACKEND, AGENTIK_EMBEDDING_MODEL_PATH,
AGENTIK_EMBEDDING_TOKENIZER_PATH.
* standalone/Main.kt: switch на embeddingBackend при memory-backend=vector;
для SIGLIP требуются оба пути, иначе ошибка с понятным сообщением.
* standalone/README.md: обновлены env-vars, добавлены две bash-секции
(HTTP и SIGLIP) + инструкция скачивания модели с static.binom.pw.
* scripts/install-text-embedding-stub.sh: workaround для upstream бага
(siglip-jvm/*.module ссылается на api без -jvm variant). Создаёт
stub-артефакт api:3.0.0-SNAPSHOT в mavenLocal с тем же содержимым.
Удалить когда upstream починит module-metadata.
Smoke test: AGENTIK_MEMORY_BACKEND=vector AGENTIK_EMBEDDING_BACKEND=siglip
+ несуществующий путь → FileNotFoundException с понятным трейсом (значит
ONNX Runtime инициализирован, путь через factory пробрасывается корректно).
Tests: 288 total green. Fatjar 250MB (вырос из-за onnxruntime ~80MB).
Dropped: старый stub-jar pw.binom.voice.embeddingtext:api:2.0.0-SNAPSHOT.
This commit is contained in:
+33
-8
@@ -41,8 +41,11 @@ java -jar standalone/build/libs/standalone-all.jar
|
||||
| `AGENTIK_SKILLS_DIR` | _выкл._ | Каталог со скилами (`SKILL.md` / `*.yaml`) |
|
||||
| `AGENTIK_MEMORY_DIR` | `~/.agentik/memory` (md) или `AGENTIK_DB_PATH` (vector) | Каталог памяти (md); `"off"` отключает |
|
||||
| `AGENTIK_MEMORY_BACKEND` | `md` | `md` (Hermes-style §-файлы) / `vector` (SQLite + JVector + LLM-эмбеддинги) / `off` |
|
||||
| `AGENTIK_EMBEDDING_MODEL` | `text-embedding-3-small` | Модель эмбеддингов для vector-бэкенда |
|
||||
| `AGENTIK_EMBEDDING_DIMENSION` | `1536` | Размерность вектора (должна совпадать с моделью) |
|
||||
| `AGENTIK_EMBEDDING_MODEL` | `text-embedding-3-small` | Модель эмбеддингов для vector-бэкенда (только HTTP) |
|
||||
| `AGENTIK_EMBEDDING_DIMENSION` | `1536` | Размерность вектора (только HTTP; SIGLIP определяет автоматически) |
|
||||
| `AGENTIK_EMBEDDING_BACKEND` | `HTTP` | `HTTP` (POST /v1/embeddings) или `SIGLIP` (on-device, без сети) |
|
||||
| `AGENTIK_EMBEDDING_MODEL_PATH` | _только SIGLIP_ | Путь к `text_model_int8.onnx` (SigLIP2) |
|
||||
| `AGENTIK_EMBEDDING_TOKENIZER_PATH` | _только SIGLIP_ | Путь к `tokenizer.model` (sentencepiece) |
|
||||
| `AGENTIK_SOUL` | _выкл._ | Путь к `SOUL.md` — файл персоны (markdown), вставляется в начало system prompt |
|
||||
| `AGENTIK_LLM_BACKEND` | — | `openai` или `google` (см. ниже) |
|
||||
| `AGENTIK_MCP_CONFIG` | _выкл._ | Путь к JSON со списком MCP-серверов |
|
||||
@@ -218,23 +221,45 @@ context…]` блок в начало user-сообщения; после зап
|
||||
`AGENTIK_MEMORY_BACKEND` выбирает хранилище. Дефолт — `md` (Hermes-style
|
||||
§-файлы, keyword overlap, без внешних вызовов).
|
||||
|
||||
`vector` — SQLite (`AGENTIK_DB_PATH`) + JVector ANN + LLM-эмбеддинги
|
||||
(запросы на `${OPENAI_BASE_URL}/v1/embeddings`). Семантический поиск:
|
||||
cosine similarity + recency-re-rank. Те же четыре тула; та же семантика.
|
||||
`vector` — SQLite (`AGENTIK_DB_PATH`) + JVector ANN + эмбеддинги. Два
|
||||
бэкенда эмбеддингов через `AGENTIK_EMBEDDING_BACKEND`:
|
||||
|
||||
- **`HTTP` (default)** — POST на `${OPENAI_BASE_URL}/v1/embeddings`. Семантический
|
||||
поиск: cosine similarity + recency-re-rank.
|
||||
- **`SIGLIP`** — on-device SigLIP2 через ONNX Runtime (text-embedding-kmp,
|
||||
768-мерный вектор). Никаких внешних вызовов: модель и токенизатор должны
|
||||
лежать на диске. Размерность определяется автоматически (768).
|
||||
|
||||
```bash
|
||||
# Vector-бэкенд
|
||||
# Vector-бэкенд + HTTP-эмбеддинги (default)
|
||||
AGENTIK_MEMORY_BACKEND=vector \
|
||||
AGENTIK_EMBEDDING_BACKEND=http \
|
||||
AGENTIK_EMBEDDING_MODEL=text-embedding-3-small \
|
||||
AGENTIK_EMBEDDING_DIMENSION=1536 \
|
||||
java -jar standalone-all.jar
|
||||
|
||||
# Vector-бэкенд + on-device SigLIP2 (без сети)
|
||||
AGENTIK_MEMORY_BACKEND=vector \
|
||||
AGENTIK_EMBEDDING_BACKEND=siglip \
|
||||
AGENTIK_EMBEDDING_MODEL_PATH=/path/to/text_model_int8.onnx \
|
||||
AGENTIK_EMBEDDING_TOKENIZER_PATH=/path/to/tokenizer.model \
|
||||
java -jar standalone-all.jar
|
||||
```
|
||||
|
||||
Для vector требуется `AGENTIK_LLM_BACKEND=openai` (т.к. нужен
|
||||
Для HTTP-эмбеддингов требуется `AGENTIK_LLM_BACKEND=openai` (т.к. нужен
|
||||
OpenAI-совместимый `/v1/embeddings` endpoint — LiteLLM proxy тоже подходит).
|
||||
Embedding-вызовы кэшируются LRU на 256 текстов — дедупликация при повторных
|
||||
HTTP-вызовы кэшируются LRU на 256 текстов — дедупликация при повторных
|
||||
запросах одинаковых промптов.
|
||||
|
||||
Для SIGLIP нужно сначала скачать модель (~283M) и токенизатор (~4M):
|
||||
```bash
|
||||
mkdir -p /path/to/siglip-model
|
||||
curl -fSL -o /path/to/siglip-model/text_model_int8.onnx \
|
||||
http://static.binom.pw/models/siglip2/text_model_int8.onnx
|
||||
curl -fSL -o /path/to/siglip-model/tokenizer.model \
|
||||
http://static.binom.pw/models/siglip2/tokenizer.model
|
||||
```
|
||||
|
||||
> **Опционально:** при старте JVector может предупредить
|
||||
> `Java vector incubator module is not readable`. Это значит, что JIT
|
||||
> не использует SIMD (Panama Vector API) и индекс строится через скалярный
|
||||
|
||||
Reference in New Issue
Block a user