Memories / Documentación

En esta página

Búsqueda, embeddings y generación aumentada por recuperación

Memories admite la recuperación por palabras clave y semántica sobre memorias ordinarias y tarjetas de conocimiento autorizadas. La ingesta de documentos acepta texto UTF-8 y Markdown y crea una tarjeta de conocimiento cifrada normal. La extracción de archivos PDF/DOCX/binarios no es automática; conviértalos a texto antes de ingerirlos explícitamente. El contenido privado, las credenciales y los activos de archivo quedan excluidos de la recuperación.

Inicio rápido

Utilice el mismo directorio de datos/configuración para la CLI y el daemon en ejecución. Reinicie el daemon después de actualizar o cambiar la configuración del modelo. Inicialice/desbloquee como de costumbre y después ejecute:

memories rag ingest VAULT_ID notes.md --title "Research notes"
memories memory search VAULT_ID "Chinese English keywords"
memories rag search VAULT_ID "keywords" --mode bm25 --match-mode all
memories rag model-install
memories rag index VAULT_ID
memories rag search VAULT_ID "Find similar meaning" --mode vector
memories rag search VAULT_ID "Find evidence" --mode hybrid --limit 8
memories rag status VAULT_ID
memories rag ask VAULT_ID "What does the evidence say?"

rag ask requiere una URL de generación en la configuración del daemon. Para utilizar RAG léxico sin un modelo de embeddings, añada --mode bm25; la URL de generación sigue siendo necesaria. memory_search sigue siendo léxico. La búsqueda avanzada devuelve fragmentos de documentos con IDs de activo/revisión, hashes estables de los fragmentos, desplazamientos originales en bytes UTF-8, puntuaciones y etiquetas de citas. [S1] identifica una fuente dentro de un resultado; utilice sus campos id y revision para la operación ordinaria memory read, no el hash del fragmento.

BM25 para chino y fragmentos

El texto chino y multilingüe se tokeniza con Jieba. Los títulos, los cuerpos y los metadatos seguros participan en la clasificación FTS5 BM25, con pesos 5/1/2. any (predeterminado) combina palabras clave; all requiere todos los términos de la consulta; phrase requiere la frase original. Las restricciones estrictas all/phrase también filtran los candidatos vectoriales/híbridos. Las consultas se escapan y no se interpretan como operadores FTS arbitrarios.

El texto se divide cerca de los límites de frases/párrafos en fragmentos de hasta 768 caracteres Unicode, normalmente con un solapamiento de 128 caracteres. Los desplazamientos devueltos se refieren al cuerpo UTF-8 original. La búsqueda está limitada a 100 resultados solicitados, 64 términos léxicos y 1,024 bytes de consulta. La búsqueda básica memory search agrupa los fragmentos por documento; la recuperación RAG avanzada devuelve fragmentos individuales. --cards-only restringe la recuperación.

Los índices se reutilizan entre consultas. Una modificación de la bóveda, una sincronización o un cambio de política invalida su índice en caché; el bloqueo o el reinicio borra todos los índices y vectores. No se guardan como texto sin cifrar ni se añaden a las cargas de sincronización cifradas. Los límites por bóveda en caché son 10,000 fragmentos, 16 MiB de texto/metadatos de origen y 32 MiB de vectores; se almacenan en caché como máximo dos bóvedas. Las bibliotecas grandes siguen sujetas a los límites de persistencia del estado completo subyacente descritos en rendimiento.

EmbeddingGemma dentro del proceso

El motor de embeddings predeterminado es EmbeddingGemma 300M Q4 de Google mediante inferencia ONNX nativa. Se ejecuta dentro del daemon de Memories, sin necesitar Ollama, Python ni un servicio de inferencia separado. La aplicación incluye el motor de inferencia con la telemetría ONNX explícitamente desactivada antes de crear la sesión; la aplicación instala una sola vez los archivos del modelo/tokenizador (unos 209 MiB):

memories rag model-install

El instalador descarga una revisión fijada de onnx-community/embeddinggemma-300m-ONNX, verifica SHA-256, admite descargas por rangos/reintentos y nunca sustituye un archivo existente que no coincida. Los archivos existentes verificados se reutilizan. El directorio predeterminado es models/embeddinggemma dentro del directorio de datos de Memories seleccionado. Proporcione un directorio existente mediante rag.local_model_dir; debe contener el grafo ONNX Q4, sus datos externos y los archivos del tokenizador/configuración. Reinicie el daemon después de cambiar los archivos del modelo. Los pesos se rigen por separado por las Condiciones de uso de Gemma y la Política de usos prohibidos; el instalador escribe un aviso y la ficha original del modelo.

[rag]
local_model_dir = "./models/embeddinggemma"
local_threads = 4
max_tokens = 2048
# Optional mirror of the exact pinned files:
# model_download_base_url = "https://your-mirror.example/embeddinggemma"

Las rutas relativas de los modelos se resuelven junto al archivo de configuración. Reducir local_threads limita el uso de CPU; max_tokens limita la entrada del tokenizador y puede truncar entradas largas cuando se fija por debajo del número de tokens del fragmento. Los embeddings son vectores normalizados de 768 dimensiones. El modelo utiliza prefijos de tarea separados para consultas y documentos. rag index precalienta el índice; la recuperación vectorial/híbrida también calcula los embeddings que faltan a petición. Entre pasos se comprueba un presupuesto de operación de cinco minutos; los lotes completados pueden reutilizarse al reintentar mientras la bóveda y el modelo permanezcan sin cambios y desbloqueados.

URL de modelos proporcionadas por el cliente

Gemini Embedding es una API en línea, no el modelo sin conexión EmbeddingGemma. Añada rag.embedding para seleccionar un proveedor remoto; omítalo para mantener los embeddings locales. Utilice URL completas de operación y configure el modelo que espera su servicio:

[rag.embedding]
protocol = "gemini"
url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent"
model = "gemini-embedding-001"
dimensions = 768
api_key_env = "GEMINI_API_KEY"

[rag.generation]
protocol = "gemini"
url = "https://generativelanguage.googleapis.com/v1beta/models/YOUR_MODEL:generateContent"
model = "YOUR_MODEL"
api_key_env = "GEMINI_API_KEY"

Defina la variable de entorno indicada para la clave de API en el entorno del daemon. No coloque valores de claves en TOML, URL ni argumentos de comandos. Gemini utiliza x-goog-api-key; protocol = "compatible" utiliza autenticación Bearer y los formatos JSON habituales de embeddings {model,input} y de completado de chat. La respuesta de embeddings compatible debe contener entradas data indexadas con matrices embedding; la generación devuelve choices[0].message.content. Las claves son opcionales para servicios locales. Las URL remotas requieren HTTPS; HTTP solo se acepta para loopback. El parámetro opcional de embeddings dimensions se envía como outputDimensionality en Gemini o dimensions en el protocolo compatible, se comprueba al recibirlo y se incorpora a la clave del espacio vectorial. Las URL de operación no admiten credenciales, cadenas de consulta ni fragmentos.

No existe un endpoint público de modelos implícito. Configurar una URL remota de embeddings permite enviar allí los fragmentos de documentos elegibles. La generación envía únicamente los fragmentos seleccionados y la pregunta; ningún contenido almacenado de credenciales, contenido privado o archivos entra en esta canalización. Estas opciones de configuración pertenecen al daemon, no a las llamadas MCP individuales. Consulte seguridad.

Búsqueda híbrida y reclasificación

El modo vectorial utiliza similitud del coseno. El modo híbrido combina las clasificaciones BM25 y vectorial mediante fusión de rangos recíprocos (k=60). La reclasificación ligera predeterminada refuerza la cobertura de términos y las coincidencias de frases. No pretende ser un codificador cruzado entrenado. Configure un servicio de reclasificación entrenado si lo desea:

[rag.rerank]
protocol = "compatible"
url = "https://your-reranker.example/rerank"
model = "YOUR_RERANKER"
api_key_env = "RERANK_API_KEY"

La solicitud es {model, query, documents, top_n}. Su respuesta debe contener results con un index válido y único y una relevance_score finita para cada candidato. Las entradas desconocidas o duplicadas provocan un fallo en lugar de reordenar silenciosamente el documento equivocado. --no-rerank omite ambas etapas opcionales de reclasificación.

Proxies, tiempos de espera y reintentos

[rag.http]
use_env_proxy = true
proxy_url = "http://127.0.0.1:7890"
retries = 2
backoff_ms = 500
connect_timeout_seconds = 10
timeout_seconds = 60
download_timeout_seconds = 900

Los proxies explícitos prevalecen sobre la detección de proxies del entorno. Se admiten URL HTTP, HTTPS, SOCKS5 y SOCKS5h. Los valores de proxy autenticados pueden proporcionarse mediante el entorno de proxy; las URL de proxy en TOML no pueden contener credenciales. Los endpoints de modelos/espejos en loopback siempre se conectan directamente. La verificación TLS permanece activada.

retries es el número de intentos adicionales (0-5). Los fallos de conexión/lectura de la API del modelo, 429 y 500/502/503/504 pueden reintentarse con espera exponencial; los segundos de Retry-After se respetan hasta 30 segundos. Los errores de autenticación/validación, las redirecciones inseguras y las salidas malformadas del modelo no se reintentan. Las redirecciones de la API del modelo están desactivadas. Las redirecciones de descarga requieren HTTPS y se comprueba el hash de cada archivo final. El tiempo de espera de descarga es un presupuesto por archivo. Reintentar la generación puede generar cargos adicionales del proveedor. La autorización/cancelación se vuelve a comprobar entre intentos.

Respuestas, citas y MCP

memory_retrieve ofrece recuperación con un alcance limitado a los clientes MCP; memory_ask llama al servicio de generación configurado. Ambos conservan las restricciones de la concesión sobre la bóveda y los datos ordinarios. No pueden seleccionar un endpoint arbitrario ni acceder a una credencial. Las bóvedas limitadas al dispositivo rechazan las operaciones que enviarían datos a endpoints de modelos fuera de loopback; la inferencia local y los servicios de loopback configurados explícitamente funcionan. Las herramientas anteriores memory_search y memory_read siguen funcionando. La habilidad Memories incluida documenta memory_retrieve y memory_ask para clientes de IA. Después de actualizar, sustituya una habilidad instalada antigua con memories inject all --force.

La generación recibe el texto fuente como datos no confiables y no dispone de herramientas de la aplicación. El modelo debe devolver JSON estructurado de respuesta/citas, con citas como [S1] que existan realmente en el resultado. Los IDs no válidos o inventados se rechazan. Cuando no hay evidencia, no se realiza ninguna llamada de generación y el resultado indica insufficient_evidence. La validación de citas comprueba las referencias, no si cada afirmación está respaldada por los hechos; contraste las respuestas importantes con sus fuentes.

El bloqueo, las concesiones caducadas/revocadas y los cambios en el estado de las fuentes invalidan el trabajo en curso y suprimen los resultados tardíos. Una solicitud remota ya iniciada no puede retirarse. En esta versión no se añade ninguna interfaz RAG basada en modelos a la FFI móvil; la búsqueda ordinaria móvil recibe las mejoras de chino/BM25 y puede utilizar recuperación BM25.