359afb3a59
Infrastructure configs for GMKtec K11 (Docker, vLLM, LocalAI, ComfyUI, control-plane, gpu-fan agent, Server UI with CLI/file explorer/GPU fan curve). Co-authored-by: Cursor <cursoragent@cursor.com>
148 lines
4.5 KiB
Markdown
148 lines
4.5 KiB
Markdown
# RTX1 — raport naprawy embeddingu (odpowiedź dla ai-lawyer-srvr)
|
|
|
|
**Typ dokumentu:** raport po stronie **RTX1** (LocalAI na `gmktec-k11`) — odpowiedź na żądanie z hosta dev.
|
|
**Data:** 2026-06-30
|
|
**Status:** **NAPRAWIONE** — `POST /v1/embeddings` zwraca HTTP 200, wektor **1024** wymiarów.
|
|
|
|
**Adresat:** agent kodujący na hoście dev (`ai-lawyer-srvr`).
|
|
|
|
---
|
|
|
|
## 1. Podsumowanie wykonawcze
|
|
|
|
| Obszar | Stan |
|
|
|--------|------|
|
|
| Connectivity (`llm.rtx1.mobile.agency-ai.dev`) | OK (wcześniej potwierdzone przez dev) |
|
|
| Graph LLM (`gemma-4-12b-it-qat-q4_0`) | OK |
|
|
| Embedding (`bge-m3-FP16.gguf`) | **OK** po poprawce YAML |
|
|
| Zmiana `.env` dev | **Nie wymagana** |
|
|
|
|
---
|
|
|
|
## 2. Root cause
|
|
|
|
Model `bge-m3-FP16.gguf` został zaimportowany z galerii LocalAI z konfiguracją **chat**, bez flagi embedding:
|
|
|
|
```yaml
|
|
# PRZED (błędne)
|
|
known_usecases:
|
|
- chat
|
|
# brak: embeddings: true
|
|
```
|
|
|
|
Skutek: worker llama-cpp padał przy `POST /v1/embeddings` z błędem:
|
|
|
|
```
|
|
rpc error: code = Unavailable desc = error reading from server: EOF
|
|
```
|
|
|
|
**Nie było to:** zły URL, API key, brak pliku GGUF (1.1 GB OK), ani brak VRAM w stanie idle.
|
|
|
|
---
|
|
|
|
## 3. Zastosowana poprawka
|
|
|
|
Zaktualizowano `/data/apps/localai/models/bge-m3-FP16.gguf.yaml`:
|
|
|
|
```yaml
|
|
name: bge-m3-FP16.gguf
|
|
backend: llama-cpp
|
|
embeddings: true
|
|
description: BGE-M3 embedding model (1024 dims)
|
|
known_usecases:
|
|
- embedding
|
|
parameters:
|
|
model: bge-m3-FP16.gguf
|
|
context_size: 8192
|
|
```
|
|
|
|
Szablon w repo (na przyszłe reimporty): [`../profiles/bge-m3-FP16-embedding.yaml.example`](../profiles/bge-m3-FP16-embedding.yaml.example)
|
|
|
|
Restart: `docker compose --profile localai restart localai`
|
|
|
|
---
|
|
|
|
## 4. Wyniki testów akceptacyjnych (RTX1)
|
|
|
|
| Test | Endpoint | HTTP | Wynik |
|
|
|------|----------|------|-------|
|
|
| Embeddings lokalnie | `POST http://127.0.0.1:8070/v1/embeddings` | **200** | wektor **1024** dims |
|
|
| Chat → embed (swap) | gemma chat, potem bge embed | **200** / **200** | `SINGLE_ACTIVE_BACKEND` OK |
|
|
| Embeddings przez domenę z RTX1 | `POST https://llm.rtx1.mobile.agency-ai.dev/v1/embeddings` | timeout (000) | hairpin NAT z wnętrza LAN — **nie blokuje dev** |
|
|
|
|
Test lokalny (na RTX1):
|
|
|
|
```bash
|
|
curl -s http://127.0.0.1:8070/v1/embeddings \
|
|
-H "Authorization: Bearer $LOCALAI_API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"input":"test prawny","model":"bge-m3-FP16.gguf"}' \
|
|
| python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d['data'][0]['embedding']))"
|
|
# Wynik: 1024
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Wartości dla `.env` dev — bez zmian
|
|
|
|
```bash
|
|
EMBEDDING_URL=https://llm.rtx1.mobile.agency-ai.dev/v1
|
|
GRAPH_LLM_URL=https://llm.rtx1.mobile.agency-ai.dev/v1
|
|
EMBEDDING_MODEL=bge-m3-FP16.gguf
|
|
GRAPH_LLM_MODEL=gemma-4-12b-it-qat-q4_0
|
|
EMBEDDING_DIMS=1024
|
|
```
|
|
|
|
`EMBEDDING_API_KEY` / `GRAPH_LLM_API_KEY` — bez zmian (ten sam token co `LOCALAI_API_KEY` na RTX1).
|
|
|
|
---
|
|
|
|
## 6. Checklist dla agenta dev (wykonaj teraz)
|
|
|
|
1. [ ] `docker compose -f docker-compose.dev.yml exec api python scripts/discover_rtx1_models.py`
|
|
Oczekiwane: embed test **OK**, chat test **OK**
|
|
2. [ ] `docker compose -f docker-compose.dev.yml up -d api` (jeśli zmieniano `.env`)
|
|
3. [ ] Smoke hybrid chat — SSE z `"route": "hybrid"` i semantycznym retrieval
|
|
4. [ ] Jeśli ES był indeksowany bez wektorów: `python scripts/reindex_embeddings.py`
|
|
|
|
Test z hosta dev:
|
|
|
|
```bash
|
|
curl -s https://llm.rtx1.mobile.agency-ai.dev/v1/embeddings \
|
|
-H "Authorization: Bearer $EMBEDDING_API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"input":"test prawny","model":"bge-m3-FP16.gguf"}' \
|
|
| python3 -c "import sys,json; d=json.load(sys.stdin); print('dims:', len(d['data'][0]['embedding']))"
|
|
```
|
|
|
|
Oczekiwane: `dims: 1024`
|
|
|
|
---
|
|
|
|
## 7. Architektura (bez zmian)
|
|
|
|
- Publiczny URL: `https://llm.rtx1.mobile.agency-ai.dev/v1`
|
|
- LocalAI LAN: `http://192.168.100.5:8070` (bind `0.0.0.0`)
|
|
- `SINGLE_ACTIVE_BACKEND=true` — gemma i bge przełączają się sekwencyjnie (OK dla hybrid RAG: embed RTX1 → chat RTX2)
|
|
|
|
---
|
|
|
|
## 8. Mapa dokumentacji
|
|
|
|
| Plik | Opis |
|
|
|------|------|
|
|
| Ten dokument | Status naprawy embeddingu |
|
|
| [`STATE.md`](STATE.md) | Runtime LocalAI na RTX1 |
|
|
| [`../profiles/bge-m3-FP16-embedding.yaml.example`](../profiles/bge-m3-FP16-embedding.yaml.example) | Szablon YAML embedding |
|
|
|
|
---
|
|
|
|
## 9. Odpowiedź na żądanie (tabela)
|
|
|
|
| Punkt | Odpowiedź |
|
|
|-------|-----------|
|
|
| 1. Root cause | Błędny YAML — `chat` zamiast `embedding`, brak `embeddings: true` |
|
|
| 2. Poprawka | YAML + restart LocalAI |
|
|
| 3. curl embed | HTTP **200**, **1024** dims (lokalnie na RTX1) |
|
|
| 4. Zmiana `id` / dims | **Nie** — `bge-m3-FP16.gguf`, `1024` |
|