Abandono buscador
18%
↓ 49pp vs baseline 67%
Tickets evitables / semana
22
↓ 72% vs baseline 80/sem
Time-to-first-answer
1.4s
✓ Meta < 2s (streaming)
CTR medio resultados
61%
↑ 38pp vs 23% con Algolia
Arquitectura del sistema
📄
Contenido
12.400 artículos
FAQs + API docs
FAQs + API docs
→
✂️
Chunking
Por párrafos
grupos por doc
grupos por doc
→
🔷
Trieve API
Índice vectorial
+ BM25 híbrido
+ BM25 híbrido
→
🔍
Hybrid Search
score_threshold: 0.3
highlight + filters
highlight + filters
→
🤖
RAG + SSE
Contexto top-5
streaming tokens
streaming tokens
→
🌐
Next.js UI
Autocompletar
Chat + fuentes
Chat + fuentes
→
📊
Analytics
Top queries
Zero-results + CTR
Zero-results + CTR
Patrones de código — NeuroSaaS Help Center
📁 src/search/ingest.ts
TypeScript
// Ingesta bulk del help center NeuroSaaS
const TRIEVE_API_URL = "https://api.trieve.ai";
const DATASET_ID = process.env.TRIEVE_DATASET_ID!;
async function bulkIngest(articles: HelpArticle[]) {
const chunks = articles.flatMap((doc) => {
const paras = doc.content.split("\n\n").filter(Boolean);
return paras.map((p, i) => ({
chunk_html: p,
tracking_id: `${doc.id}-chunk-${i}`,
link: doc.url,
tag_set: doc.tags, // ["integrations","crm"]
metadata: {
title: doc.title,
category: doc.category,
updated_at: doc.updatedAt,
},
group_tracking_ids: [doc.id],
}));
});
// Batches de 120 (límite API)
for (let i = 0; i < chunks.length; i += 120) {
await trieveFetch("/api/chunks", {
method: "POST",
body: JSON.stringify(chunks.slice(i, i + 120)),
});
}
console.log(`✓ ${chunks.length} chunks indexados`);
}
📁 src/search/rag.ts
TypeScript
// RAG con streaming SSE para el chat del help center
async function streamRagQuery(
question: string,
onChunk: (text: string) => void
) {
const response = await fetch(
`${TRIEVE_API_URL}/api/chunk/generate`, {
method: "POST",
headers: {
"Authorization": `Bearer ${TRIEVE_API_KEY}`,
"TR-Dataset": DATASET_ID,
},
body: JSON.stringify({
prev_messages: [{ role: "user", content: question }],
search_type: "hybrid",
page_size: 5, // top-5 chunks como contexto
stream_response: true,
llm_options: {
system_prompt: "Responde en español usando el contexto.",
temperature: 0.3,
max_tokens: 500,
},
}),
});
const reader = response.body!.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
onChunk(decoder.decode(value));
}
}
Demo búsqueda híbrida
¿cómo conecto mi CRM con NeuroSaaS?
hybrid
1
Integración HubSpot — Mapear leads y contactos
Conecta tu cuenta de HubSpot en CRM > Integraciones. Los campos de contactos se sincronizan automáticamente cada 15 minutos...
2
Salesforce — Sincronización bidireccional
Para conectar Salesforce, genera un token OAuth en tu cuenta SF y pégalo en Configuración > CRM > Salesforce...
3
Webhooks — Eventos en tiempo real hacia CRMs
Configura webhooks para enviar eventos de leads a cualquier CRM externo. Formato JSON, autenticación HMAC...
Demo RAG streaming
🧑
¿Cuál es el límite de llamadas a la API en el plan Pro y cómo puedo aumentarlo?
En el plan Pro dispones de 1.000 requests por minuto. Si superas ese umbral, la API devolverá un error
429 Too Many Requests con un header Retry-After indicando cuántos segundos esperar.
Para aumentar el límite tienes dos opciones:
1. Upgrade a Enterprise — 10.000 req/min + SLA 99,9 %.
2. Exponential backoff — implementa reintentos automáticos en tu cliente con espera creciente (recomendado en producción).
Consulta la sección de Rate Limits en la documentación de API para ver los headers de cuota en tiempo real.
Fuentes recuperadas (top-3 de 5)
📄 API Rate Limits 0.96
📄 Plan Pro vs Enterprise 0.89
📄 Error codes & retries 0.77
Analytics — últimos 30 días
Top queries
Zero-results → gaps de contenido
"migrar de ActiveCampaign"
143
crear artículo
"API GraphQL"
98
crear artículo
"GDPR exportar datos"
87
crear artículo
"integrar Pipedrive"
76
crear artículo
"plantillas email HTML"
61
mejorar tag
"2FA autenticación"
54
crear artículo
CTR por artículo
| Artículo | Impr. | CTR |
|---|---|---|
| Integración HubSpot | 4.821 | 72% |
| API Rate Limits | 3.904 | 68% |
| Webhooks Slack | 2.341 | 65% |
| Campañas A/B test | 1.988 | 59% |
| Onboarding 7 días | 1.654 | 57% |
| Salesforce sync | 1.402 | 48% |
8 principios de implementación
01 —
Chunk inteligente
Divide por párrafos o secciones semánticas, nunca por número fijo de caracteres. Cada chunk debe ser autocontenido.
02 —
Grupos por documento
Usa
group_tracking_ids para agrupar todos los chunks de un mismo artículo y habilitar búsqueda a nivel de doc.03 —
Híbrida por defecto
Combina precisión keyword con comprensión semántica. Solo usa
fulltext en autocompletar por velocidad.04 —
Analytics desde día 1
Las queries sin resultado revelan gaps de contenido. Las de bajo CTR indican problemas de relevancia. Trackea ambas desde el inicio.
05 —
Score threshold 0.3
Filtra resultados de baja confianza. Ajusta según tu corpus: 0.3 es un buen punto de partida, afina con datos reales.
06 —
Tags para filtrar
Los tags habilitan filtros categoriales rápidos sin escanear metadata. Esenciales para búsqueda facetada por categoría o plan.
07 —
Upsert con tracking IDs
Usa
upsert_by_tracking_id para re-indexar contenido actualizado sin crear duplicados.08 —
Streaming RAG
Para UI conversacional, activa
stream_response: true y consume el SSE. Reduce latencia percibida a < 300ms.