781a310c8d
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
44 lines
2.0 KiB
Markdown
44 lines
2.0 KiB
Markdown
# modules/verbo/ — Provider de embeddings model-agnostic (era dime)
|
|
|
|
**Propósito.** Capa de embeddings estructuralmente agnóstica al modelo:
|
|
la elección de backend es config por instancia. Los vectores quedan
|
|
atados a su `ModelId` — comparar vectores de modelos distintos es un
|
|
error explícito, no un sinsentido silencioso. Un daemon permite cargar
|
|
un modelo una vez y compartirlo entre procesos.
|
|
|
|
## Crates
|
|
|
|
| crate | tipo | rol |
|
|
| -------------- | ---- | ------------------------------------------------------------ |
|
|
| `verbo-core` | lib | Contrato: `ModelId`, `EmbeddingVector` (cosine), `EmbedError`, trait `Provider` |
|
|
| `verbo-mock` | lib | Backend determinista sin modelo (FNV-1a + LCG) — para tests |
|
|
| `verbo-daemon` | lib | `Daemon` (sirve un `Provider` por socket Unix) + `DaemonClient` (lo consume como `Provider`) |
|
|
|
|
## Dependencias
|
|
|
|
- `mock`, `daemon` ← `verbo-core`.
|
|
- `daemon` ← `tokio` + `postcard` (frames con prefijo de largo).
|
|
- `verbo-core` es `#![forbid(unsafe_code)]`, sólo `serde` + `async-trait`.
|
|
|
|
## Compartir entre procesos
|
|
|
|
`verbo-daemon` resuelve la duplicación de modelos en RAM: un `Daemon`
|
|
carga el modelo una vez; N procesos lo consumen vía `DaemonClient`, que
|
|
implementa `Provider` y por tanto es indistinguible de un backend local.
|
|
Multi-instancia = un daemon por modelo, cada uno en su socket.
|
|
|
|
## Estado
|
|
|
|
Contrato + mock + daemon implementados y verdes (~25 tests).
|
|
|
|
**Pendiente** — backends de modelos reales (requieren infra/API keys):
|
|
|
|
| backend pendiente | tipo | nota |
|
|
| ----------------- | ------ | --------------------------------------------- |
|
|
| `verbo-cohere` | remoto | API Cohere — recomendado para uso remoto |
|
|
| `verbo-bge` | local | `bge-code-large` vía ONNX — recomendado local |
|
|
| `verbo-fastembed` | local | modelos ligeros (MiniLM 384d) |
|
|
|
|
Cada uno implementa `Provider` y puede servirse vía `verbo-daemon` sin
|
|
cambios — el daemon es agnóstico del backend.
|