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
Demo en terminal: rag-db-advisor responde una pregunta en japonés sobre elegir una base vectorial para 100 mil documentos, devolviendo bloques de evidencia medida con números de recall y latencia y sus registros de origen

Tres pasos

  1. Pregunta rag-db-advisor ask "…" Una pregunta en texto libre, por CLI o MCP. Sin cuestionario que llenar.
  2. 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.
  3. Tú decides --llm / tu LLM vía MCP La 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)

4.3 s · 6 chunks de evidencia · síntesis con gpt-4o

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:

BackendQué ocurreQué vesComprobació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
Captura de pantalla del terminal: rag-db-advisor responde una pregunta en japonés, cada bloque de evidencia encabezado por su ID de chunk y registro de origen, con líneas medidas de recall, latencia y verificación de índice
Así se ve una respuesta: cada bloque declara su ID de chunk y su fuente, así que cada afirmación se rastrea hasta un registro.

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-advisorPreguntar directo a un LLMann-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

Todos los productos →

← Todos los productos