La arquitectura moderna predeterminada para chatbots de bases de conocimiento
La búsqueda tradicional en una base de conocimiento devuelve enlaces; el usuario los lee. RAG lo convierte en una respuesta conversacional de un solo paso con citas. Bien hecho, los usuarios obtienen respuestas en 2 segundos en lugar de rebuscar en 5 documentos. Mal hecho, el chatbot alucina y tu CTO prohíbe el proyecto durante un año. Esta página explica la diferencia.
La pila mínima viable para producción
- Almacén vectorial: pgvector si ya tienes Postgres; Pinecone o Qdrant para una opción gestionada
- Embeddings: text-embedding-3-large, llamado directamente contra OpenAI; Kunavo no ofrece embeddings y la llamada de embeddings es una solicitud separada de la llamada de generación en cualquier caso
- Recuperación: híbrida (vector + BM25 con fusión de rangos recíprocos)
- Generación: Claude Sonnet 5 con cache_control en el prompt del sistema
- Interfaz: respuestas en streaming, renderizado de citas y fallback «No lo sé»
from openai import OpenAI
client = OpenAI(api_key="sk-kn-...", base_url="https://api.kunavo.com/v1")
def chat(question: str, history: list[dict]) -> dict:
chunks = hybrid_retrieve(question, k=5) # vector + BM25
context = "\n\n---\n\n".join(
f"[doc:{c['id']}] {c['text']}" for c in chunks
)
resp = client.chat.completions.create(
model="claude-sonnet-5",
messages=[
{"role": "system", "content": [{
"type": "text",
"text": (
"Answer only from Context. Cite [doc:N] for each claim. "
"If Context doesn't answer, say 'I don't have that.' "
"Be concise, no throat-clearing."
),
"cache_control": {"type": "ephemeral"},
}]},
*history,
{"role": "user", "content": f"# Context\n{context}\n\n# Q\n{question}"},
],
max_tokens=600,
)
answer = resp.choices[0].message.content
cited_ids = parse_citations(answer) # extract [doc:N] references
return {"answer": answer, "sources": [c for c in chunks if c["id"] in cited_ids]}Coste a escala de producción
- Indexación inicial: aproximadamente $0.25 para 5.000 documentos de 500 tokens cada uno
- 1.000 consultas/día: aproximadamente $210/mes con caché
- 10.000 consultas/día: aproximadamente $2.100/mes
- Si usas Haiku 4.5 en lugar de Sonnet: aproximadamente 4 veces más barato y con una calidad de respuesta de aproximadamente 85 %
Desglose completo de la arquitectura en la guía de implementación de RAG. Notas de ajuste específicas por idioma en el análisis profundo de RAG en japonés y la guía de RAG en español.
Los tres patrones que realmente evitan las alucinaciones
- Cita cada afirmación: etiquetas
[doc:42]en la salida del modelo. Si el id citado no está en el conjunto recuperado, es una alucinación: bloquéala y regístrala - Rechazo explícito en el prompt del sistema: «Si el contexto no responde, di “No tengo esa información”». Sin esto, el modelo completa la respuesta usando conocimiento del mundo
- Límite de salida de 600 tokens: las respuestas breves suelen ser respuestas precisas. Las invenciones adicionales aparecen sobre todo en salidas más largas
Qué enviar en la semana 1 frente a la semana 4
| Semana | Hito |
|---|---|
| 1 | 100 documentos, una única estrategia de segmentación, búsqueda vectorial básica, conjunto de evaluación de 10 preguntas y aproximadamente 70 % de recall@5 |
| 2 | Corpus completo, recuperación híbrida, conjunto de evaluación de 100 preguntas, citas obligatorias y beta interna |
| 3 | Ajustar la segmentación según las preguntas fallidas, publicar para usuarios internos y medir CSAT |
| 4 | Monitorización y panel de costes, límite de gasto diario y beta pública o lanzamiento en producción |
Empieza en /app/signup
Una recarga de $10 cubre la indexación inicial de aproximadamente 100.000 documentos y 1.500 consultas de prueba, más que suficiente para un prototipo funcional, y el saldo nunca caduca. Después, lee la guía completa de RAG para conocer los patrones de producción.
Preguntas frecuentes
How much does one RAG chatbot query cost?
About $0.007 per query on Claude Sonnet 4.6 with prompt caching active, or about $0.001 on Claude Haiku 4.5 — which returns roughly 85% of the quality at one-seventh of the cost.
How do I stop a RAG chatbot from hallucinating?
Three patterns do most of the work: require the model to cite a [doc:N] id for every claim, put an explicit refusal instruction in the system prompt, and cap the answer with max_tokens=600. Then verify every cited id appears in the retrieved set before rendering the answer.
What chunk size should a RAG index use?
1,000–1,500 characters per chunk with 100–200 characters of overlap, split with RecursiveCharacterTextSplitter and embedded with text-embedding-3-large.
Is vector search alone enough for RAG retrieval?
No. Hybrid retrieval combines vector similarity with BM25 keyword search and merges the two with reciprocal rank fusion, taking the top 5 chunks.