Las citas de RAG fallan cuando el LLM no puede vincular un reclamo a una URL de origen. El JSON escrito por Scavio le da a cada fragmento recuperado un campo de enlace, lo que hace que el paso de la cita sea determinista. Este tutorial recorre la construcción.
Requisitos previos
- Python 3.10+
- Clave API de Scavio
- Una clave API de LLM
Guia paso a paso
Paso 1: Recuperar candidatos
Scavio /busca la pregunta.
import os, requests
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def retrieve(q, n=8):
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H, json={'query': q}).json()
return r.get('organic_results', [])[:n]Paso 2: Cree una lista de fuentes numeradas
Cada fuente tiene un índice.
def sources(results):
return [(i, r['link'], r.get('snippet', '')) for i, r in enumerate(results, start=1)]Paso 3: Solicite al LLM marcadores de citas
Instrucción estricta.
# Prompt:
# 'Answer the question using ONLY the provided sources.
# Every claim must be followed by [N] where N is the source index.
# Sources:
# [1] {url}: {snippet}
# [2] {url}: {snippet}
# ...'Paso 4: Validar marcadores de citas
Comprobación de expresiones regulares antes de mostrar al usuario.
import re
def validate(answer, n_sources):
cites = set(int(m) for m in re.findall(r'\[(\d+)\]', answer))
return cites and max(cites) <= n_sourcesPaso 5: Representar respuesta con citas vinculadas
[1] se convierte en un enlace en el que se puede hacer clic.
def render(answer, sources):
out = answer
for i, url, _ in sources:
out = out.replace(f'[{i}]', f'[[{i}]]({url})')
return outEjemplo en Python
# Per query: 1 Scavio call + 1 LLM call. Cost ~$0.005-0.02 depending on LLM.Ejemplo en JavaScript
// Same in TS.Salida esperada
User-facing answer with clickable citations. Each citation links to the original source, satisfying RAG trust requirements.