OSS · CLI en Python + MCP
rag-db-advisor
Encuentra la base vectorial correcta para tu carga de RAG, con la evidencia adjunta.
Las respuestas a "¿qué base vectorial?" suelen estar hechas de opiniones. Esta está hecha de mediciones: pregunta qué backend encaja con tu carga de trabajo, qué significa en la práctica un número de latencia o qué trampa estás por pisar, y responde con 54 chunks de evidencia destilados de 9 configuraciones medidas. El advisor devuelve la evidencia; tu LLM escribe la respuesta.
En lugar de elegir por popularidad, elige por tu carga de trabajo.
Pruébalo en GitHub Cómo decide qué decir →
Gratis · Open Source · respuesta con evidencia en segundos
- 4.3 s tiempo de respuesta medido
- ~2 min del setup a la primera respuesta
- 54 chunks de evidencia
- Gratis Open Source · MIT
- Respuestas rastreables 54 chunks, cada uno rastreable a un registro del bench o a una trampa reproducida
- Comparación al instante 9 configuraciones × 10 mil / 100 mil pasajes, 860 queries anotadas
- Trampas antes de pisarlas 3 casos de degradación silenciosa, reproducidos antes de documentarse
- Corre dentro de Claude Code 3 herramientas MCP, sin clave de generación en el servidor
Tres pasos
- Pregunta
rag-db-advisor ask "…"Una pregunta en texto libre, por CLI o MCP. Sin cuestionario que llenar. - La evidencia vuelve
=== note:qdrant#1 (knowledge/ja/qdrant.md) ===Chunks con números medidos, cada uno encabezado por su ID y registro de origen. - Tú decides
--llm / tu LLM vía MCPLa síntesis ocurre fuera: tu LLM (o tú) escribe el veredicto, con las fuentes adjuntas.
Ejemplo: una respuesta real
rag-db-advisor ask "Voy a montar búsqueda RAG sobre 100 mil documentos en japonés. El recall debe mantenerse y la operación tiene que ser ligera. ¿Qué base vectorial?" --llm
✓ Recomendado Qdrant (HNSW)
- recall@10 0.947 (100 mil) · la mejor configuración ANN, a 0.5 puntos del techo de búsqueda exacta de 0.952
- p50 de búsqueda 3.3 ms · mismo corpus y mismos embeddings que el resto de candidatos
- LanceDB descartado · su cuantización por defecto baja el recall a 0.811
Evaluado frente a: LanceDB (recall@10 0.811 a 100 mil, cuantización integrada)
ejecución real, 2026-07-12: rag-db-advisor ask --llm --model gpt-4o, condensado del original en japonés
Qué puede sopesar la evidencia
Cada eje de abajo está cubierto por mediciones o trampas reproducidas, las dos únicas cosas admitidas en el store:
- Tamaño del dataset medido con 10 mil y 100 mil pasajes
- Calidad de retrieval recall@10, nDCG, MRR, hit@k vs verdad humana
- Latencia p50 / p95 / p99 por query
- Ruta de escritura segundos de carga masiva + índice
- Trampas operacionales 3 casos reproducidos, comprobados por máquina
- Forma de despliegue embebido vs servidor, tablas separadas
El filtrado por metadatos, la búsqueda híbrida y las estimaciones de costo quedan fuera de la evidencia de la v0.1, así que el advisor devuelve error en lugar de improvisar sobre ellas. El alcance medido es honesto sobre sus propios bordes.
Para quién es
- Ingenieros de IA que necesitan un número citable para el "por qué esta base" de un documento de diseño
- Desarrolladores de RAG que depuran "la búsqueda se siente lenta" y quieren descartar primero las trampas conocidas
- Usuarios de Claude Code que quieren respuestas sobre el stack de RAG ancladas en evidencia, sin depender del conocimiento previo del modelo
- Tech leads que revisan una propuesta de base vectorial y comprueban qué significan los números en realidad
Cuándo usarlo
- Antes de elegir una base para una nueva feature de RAG: parte de mediciones en las mismas condiciones en lugar de material de proveedor
- Cuando la búsqueda vectorial de ClickHouse "se siente lenta": el catálogo de trampas reproducidas existe exactamente para esa impresión
- Cuando en la revisión preguntan "¿por qué Qdrant?": responde con bloques de evidencia que llevan los IDs de sus registros de origen
- En plena implementación en Claude Code: tu LLM trae la evidencia vía MCP sin salir de la sesión
Instalación
pip install git+https://github.com/kenimo49/rag-db-advisor
export OPENAI_API_KEY=sk-...
rag-db-advisor ingest La clave de API se usa solo para embeddings (text-embedding-3-small). Vía MCP no hace falta clave de generación en el servidor: el servidor devuelve la evidencia y tu LLM escribe la respuesta.
Qué sabe
- Registros de medición: 9 configuraciones de backend × 2 escalas de corpus (10 mil / 100 mil pasajes MIRACL-ja, 860 queries anotadas por humanos), cada registro con calidad, latencia, ingesta y verificación de índice
- Notas operacionales: 8 archivos escritos a mano, uno por backend más principios transversales, que cubren solo comportamiento reproducido durante el trabajo del bench
- Catálogo de trampas: 3 formas en que un backend degrada sin levantar ningún error, cada una reproducida, corregida y documentada
- Salvedades de metodología integradas en las respuestas: la latencia de backends embebidos y de servidor se mide en condiciones distintas, y los números vienen de MIRACL-ja + text-embedding-3-small en un solo nodo
- 3 herramientas MCP: advise (búsqueda de evidencia), compare_backends (tabla comparativa 10k/100k), list_traps (trampas por backend). Los fallos devuelven {"error", "hint"} en lugar de excepción
Una muestra del catálogo de trampas
Tres de los siete backends traían una vía para degradar sin levantar ningún error. Las tres se pisaron durante el trabajo del bench, se reprodujeron y solo entonces se escribieron en la base de conocimiento:
| Backend | Qué ocurre | Qué ves | Comprobación por máquina |
|---|---|---|---|
| ClickHouse | Olvida la flag allow_experimental_vector_similarity_index al momento de la query y el HNSW se vuelve fuerza bruta en silencio | "HNSW" a 27 ms vs fuerza bruta a 31 ms: casi iguales | EXPLAIN indexes=1 muestra si el skip index corrió |
| Qdrant | Los segmentos bajo 20 MB no reciben índice HNSW por defecto (indexing_threshold) | Estado green, indexed_vectors_count = 0, cada query hace full scan | Confirmar indexed_vectors_count == points_count |
| Milvus | La vía de quick-setup descarta index_params en silencio y construye AUTOINDEX | Especificaste HNSW; describe_index dice AUTOINDEX | Revisar index_type vía describe_index tras la creación |
fuente: knowledge/ja/clickhouse.md · qdrant.md · milvus.md (reproducidas antes de documentarse)
Consejos que la evidencia cambia de verdad
Dos ejemplos de respuestas que se dan la vuelta cuando miras mediciones en lugar de datasheets:
Cuantización por defecto
recall@10 0.983 → 0.901
Mismo corpus de 10 mil, mismos embeddings: la mejor configuración de HNSW puro vs LanceDB IVF_HNSW_SQ, cuya cuantización integrada cuesta 8 puntos de recall (19 a 100 mil). Lee "¿entra la cuantización?", y deja de lado el "¿dice HNSW?".
fuente: knowledge/ja/lancedb.md, cross-cutting.md
El planner, con el índice al margen
2.048 filas: seq scan · 4.096 filas: index scan
pgvector construye tu índice HNSW y luego el planner de Postgres lo ignora por debajo de unos miles de filas (medido con ef_search=100). El veredicto de "HNSW se siente lento" a escala pequeña suele ser esto.
fuente: knowledge/ja/pgvector.md
Uso
# solo evidencia
rag-db-advisor ask "pgvector or Qdrant for 100k Japanese docs?"
# + síntesis con OpenAI (modelo por defecto: gpt-4o-mini)
rag-db-advisor ask "ClickHouse vector search feels slow. What should I check?" --llm
# registrar como servidor MCP en Claude Code
claude mcp add rag-db-advisor -- rag-db-advisor mcp
Negarse es una funcionalidad
El modo de fallo contra el que se construyó esta herramienta: la capa de retrieval se rompe, el LLM que llama responde en silencio con conocimiento previo y nadie lo nota. Por eso el advisor falla cerrado:
- Los fallos de búsqueda devuelven un {"error", "hint"} explícito en las tres herramientas MCP; las excepciones nunca se tragan en prosa
- Un resultado vacío también es error, y deja de ser respuesta nula: el modelo que llama ve "sin evidencia" en lugar de "sin problema, déjame adivinar"
- Ningún veredicto se genera por dentro: el advisor recupera, tu LLM (o tú) sintetiza, y las fuentes quedan adjuntas
Cada chunk se rastrea hasta un registro del bench empaquetado (knowledge/results/*.jsonl) o una nota escrita a mano sobre comportamiento reproducido (knowledge/ja/*.md). El consejo especulativo queda fuera del alcance por política.
Dogfooding: la capa de retrieval importa la propia abstracción BaseRetriever de rag-retriever-bench y guarda el conocimiento en Chroma, porque los datos del bench muestran que todos los backends de HNSW puro empatan en calidad a esta escala de corpus. El advisor sigue su propio consejo.
Por qué existe esta herramienta
Construyendo rag-retriever-bench quedó claro que los números son la parte duradera: caen en JSONL y en informes y ahí se quedan. Lo que se evaporaba era el conocimiento operacional alrededor: la flag que desactiva un índice en silencio, el umbral que deja una colección sin indexar detrás de un estado green. Las opiniones sobre bases de datos no se reproducen; las mediciones y las trampas reproducidas, sí. Así que este advisor cierra el ciclo: medir, destilar lo medido y lo vivido en una base de conocimiento, y servirlo a la siguiente pregunta. Y cuando no hay evidencia, dice que no la hay en lugar de adivinar.
Junto a un chat de LLM y ann-benchmarks
Herramientas distintas responden "¿qué base vectorial?" de formas distintas. La diferencia honesta es de dónde viene la respuesta:
| rag-db-advisor | Preguntar directo a un LLM | ann-benchmarks | |
|---|---|---|---|
| Base de la respuesta | Mediciones empaquetadas + trampas reproducidas | Conocimiento previo del modelo; fuentes no rastreables | Ejecuciones públicas de benchmark de ANN |
| Alcance | Backends de retrieval para RAG en un corpus de texto japonés (MIRACL-ja) | Cualquier cosa | Algoritmos y motores de ANN en datasets estándar (glove, sift, etc.) |
| Trampas operacionales | ✓ 3 casos reproducidos con comprobaciones por máquina | — | — |
| Cuando falta evidencia | Error explícito (fail-closed) | Responde igual | — |
| Cómo se usa | Herramientas MCP + CLI | Chat | Gráficos web |
La raya indica que la opción no cubre ese eje, y cubrir menos ejes no la hace peor: un chat de LLM es más amplio y ann-benchmarks es la referencia para el rendimiento bruto de ANN. Este advisor es estrecho a propósito: una familia de corpus, un modelo de embedding, y cada afirmación rastreable a un registro.
FAQ
¿Necesito una clave de la API de OpenAI?
Sí, solo para embeddings (text-embedding-3-small): las queries y los chunks se embeben a través de la API de OpenAI. Vía MCP el servidor no necesita clave de generación: tu LLM escribe la respuesta. La flag opcional --llm añade síntesis con OpenAI (gpt-4o-mini por defecto).
¿Mi pregunta se envía a algún lado?
El texto de la pregunta va a la API de embeddings de OpenAI para embeberse; la base de conocimiento en sí es local (Chroma, en disco). Con --llm, la pregunta y la evidencia también van a la API de chat de OpenAI para la síntesis. Vía MCP, la síntesis ocurre en el LLM que ya usas.
¿Puedo preguntar en inglés (o español)?
La búsqueda funciona entre idiomas porque corre sobre similitud de embeddings, aunque la base de conocimiento en sí está escrita en japonés, tanto las notas como los registros renderizados. Vía MCP tu LLM traduce la evidencia al escribir la respuesta. El conocimiento nativo en otros idiomas todavía no viene en la v0.1.
¿Cuánta evidencia hay dentro, exactamente?
54 chunks en la v0.1: 18 registros de medición (9 configuraciones de backend × 2 escalas de corpus de rag-retriever-bench) más 36 chunks de 8 notas operacionales escritas a mano. Si no se midió ni se vivió de verdad, no está ahí.
¿Puedo simplemente seguir su consejo para mi carga de trabajo?
Trátalo como un punto de partida medido, y deja el veredicto para después: los números son de MIRACL-ja + text-embedding-3-small en un solo nodo, y las propias respuestas llevan esa salvedad. Para tu corpus y tu infraestructura, corre rag-retriever-bench: existe exactamente para eso.
¿Qué pasa cuando no hay evidencia para mi pregunta?
Recibes un error explícito, sin adivinanzas. Las tres herramientas MCP devuelven {"error", "hint"} ante un fallo, y un resultado vacío también se trata como error, así que el LLM que llama se queda sin vía para caer en silencio en el conocimiento previo.
¿Puedo añadir mi propio conocimiento?
Sí: docs/adding-knowledge.md describe el formato de las notas y de los registros de medición. La política de la casa sigue vigente: escribe solo comportamiento que mediste o reprodujiste.
¿Por qué no genera la respuesta por sí mismo?
Reproducibilidad. Si el advisor corriera su propio LLM, la misma pregunta podría recibir veredictos distintos entre ejecuciones. Al devolver evidencia determinística y dejar la síntesis al LLM que llama, los números solo cambian cuando el bench se vuelve a correr, y cada afirmación conserva su fuente adjunta.
Sobre el autor
Creado por Ken Imoto: más de 300 artículos técnicos en Zenn, Qiita, Dev.to y este sitio, más de 40 libros en 4 idiomas, más de 400 mil páginas vistas en Zenn y Qiita, 4 artículos de investigación en Zenodo y creador del LLMO Framework.
Relacionado
Toda la evidencia viene de rag-retriever-bench, el harness de benchmark que mide el mismo corpus y las mismas queries en 9 configuraciones de backend.
Herramientas relacionadas para devs
- opencut-mcp Servidor MCP que maneja OpenCut classic desde cualquier cliente MCP. Playwright mantiene la sesión del editor; doce herramientas exponen la línea de tiempo, assets y pipeline de export. Corre contra un fork de OpenCut classic.
- mcp-scorecard Pre-flight checks for MCP servers: passive token footprint, use-case scoping, security, and name safety. LLM-facing quality scorecard.
- 404 Games Ten single-file canvas mini games for your 404 page, inspired by famous error pages. Vanilla JS, zero dependencies, theme-aware. Live on this site's 404.
- historymap Turn a YAML file into a corporate-style product-history timeline. Ten layouts, switchable right on the page. Static, self-contained, iframe-embeddable.