Los robots de atención al cliente que se basan en bases de conocimiento estáticas alucinan con detalles de productos, precios e información de políticas obsoletos. Agregar un paso de búsqueda en vivo antes de generar respuestas garantiza que el bot responda con datos actuales de su propio sitio web. Este tutorial agrega bases de búsqueda a un robot de soporte existente que utiliza el punto final de Google de Scavio con consultas restringidas al sitio.
Requisitos previos
- Un bot de soporte o un marco de chatbot existente
- Python 3.8+ o Node.js 18+
- Una clave API de Scavio de scavio.dev
- El nombre de dominio de su empresa
Guia paso a paso
Paso 1: Definir la función de búsqueda restringida al sitio
Busque la respuesta en su propio sitio web antes de pedirle al LLM que genere una.
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
MY_SITE = 'yourcompany.com'
def search_own_site(question: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'site:{MY_SITE} {question}'}, timeout=10)
return [{'title': r['title'], 'snippet': r['snippet'], 'url': r['link']}
for r in resp.json().get('organic', [])[:3]]Paso 2: Agregar enrutamiento basado en la confianza
Si la búsqueda interna arroja buenos resultados, utilícelos. De lo contrario, busque en la web abierta.
def grounded_search(question: str) -> dict:
internal = search_own_site(question)
if internal:
return {'source': 'internal', 'results': internal}
# Fallback to open web search
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': question}, timeout=10)
web_results = [{'title': r['title'], 'snippet': r['snippet'], 'url': r['link']}
for r in resp.json().get('organic', [])[:3]]
return {'source': 'web', 'results': web_results}Paso 3: Inyecte contexto de búsqueda en el mensaje de soporte
Formatee los resultados de la búsqueda como contexto para que el LLM haga referencia al responder.
def build_support_prompt(question: str, context: dict) -> str:
source_type = 'our website' if context['source'] == 'internal' else 'the web'
ctx_text = '\n'.join(f"- {r['title']}: {r['snippet']}" for r in context['results'])
return f"""You are a customer support agent. Answer the question using ONLY the context below.
If the context does not contain the answer, say you need to transfer to a human agent.
Context (from {source_type}):
{ctx_text}
Customer question: {question}
Answer:"""Paso 4: Agregar activador de transferencia humana
Dirija a un humano cuando la búsqueda no arroje resultados o la pregunta sea delicada.
SENSITIVE_TOPICS = ['refund', 'cancel', 'lawsuit', 'legal', 'complaint']
def should_handoff(question: str, context: dict) -> bool:
if not context['results']:
return True
if any(topic in question.lower() for topic in SENSITIVE_TOPICS):
return True
return False
def handle_question(question: str) -> str:
context = grounded_search(question)
if should_handoff(question, context):
return 'Let me connect you with a team member who can help with this.'
prompt = build_support_prompt(question, context)
# Call your LLM here with the grounded prompt
return promptEjemplo en Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def ground_answer(question, site='yourcompany.com'):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'site:{site} {question}'}, timeout=10).json()
return [r['snippet'] for r in data.get('organic', [])[:3]]Ejemplo en JavaScript
async function groundAnswer(question, site = 'yourcompany.com') {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: `site:${site} ${question}`})
}).then(r => r.json());
return (data.organic || []).slice(0, 3).map(r => r.snippet);
}Salida esperada
A support bot with live search grounding that answers from your own website first, falls back to web search, and hands off to humans for sensitive or unanswerable questions.