Tavily y SerpAPI para búsquedas de agentes
Configuración de la API, construcción de consultas y análisis de resultados para herramientas de búsqueda web.
Tavily y SerpAPI para búsquedas de agentes es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
Por qué los agentes necesitan búsquedas web
Los LLM tienen una fecha límite de conocimiento. Para preguntas sobre acontecimientos actuales, precios en tiempo real, noticias recientes o temas que cambian rápidamente, los datos de entrenamiento del modelo están desactualizados.
Las herramientas de búsqueda web como Tavily y SerpApi proporcionan a los agentes acceso a Internet en tiempo real y reducen la distancia entre los datos de entrenamiento estáticos y la realidad actual.
Tavily: diseñado específicamente para agentes de IA
Tavily es una API de búsqueda diseñada específicamente para agentes de IA. A diferencia del scraping web general, devuelve resultados limpios y estructurados con el contenido extraído de antemano, sin necesidad de analizar HTML.
Instálelo con pip install tavily-python. Obtenga una clave de API en tavily.com.
from tavily import TavilyClient
import os
client = TavilyClient(api_key=os.getenv('TAVILY_API_KEY'))
results = client.search(
query='latest OpenAI GPT-5 release date',
max_results=5
)
for r in results['results']:
print(r['title'])
print(r['url'])
print(r['content'][:200])
print('---')Parámetros de búsqueda de Tavily
Tavily ofrece varios parámetros para controlar el comportamiento de la búsqueda. Los más útiles para los agentes son max_results, search_depth e include_domains / exclude_domains.
# Basic search
results = client.search(
query='Python async best practices 2024',
max_results=5,
search_depth='basic' # 'basic' (fast) or 'advanced' (slower, deeper)
)
# Domain-filtered search
results = client.search(
query='machine learning papers',
max_results=5,
include_domains=['arxiv.org', 'papers.nips.cc', 'openreview.net']
)
# Exclude low-quality domains
results = client.search(
query='stock market today',
max_results=5,
exclude_domains=['pinterest.com', 'quora.com']
)Estructura de los resultados de Tavily
Cada resultado de Tavily contiene: title, url, content (texto extraído), score (relevancia) y, opcionalmente, published_date. El campo content es texto limpio, sin etiquetas HTML.
results = client.search('Claude AI pricing 2024', max_results=3)
for r in results['results']:
print(f"Title: {r['title']}")
print(f"URL: {r['url']}")
print(f"Score: {r.get('score', 'N/A')}")
print(f"Date: {r.get('published_date', 'unknown')}")
print(f"Content: {r['content'][:300]}")
print()
# Tavily also returns 'answer' — a direct answer synthesized from results
if results.get('answer'):
print('Direct answer:', results['answer'])SerpApi: acceso programático a la búsqueda de Google
SerpApi proporciona acceso estructurado a Google, Bing, YouTube y otros motores de búsqueda. Devuelve datos detallados, incluidos resultados orgánicos, paneles de información, fragmentos destacados y resultados de compras.
Instálelo con pip install google-search-results.
from serpapi import GoogleSearch
import os
params = {
'q': 'best Python web frameworks 2024',
'api_key': os.getenv('SERPAPI_KEY'),
'num': 5, # number of results
'hl': 'en', # language
'gl': 'us', # country
'safe': 'active' # safe search
}
search = GoogleSearch(params)
results = search.get_dict()
for r in results.get('organic_results', []):
print(r['title'])
print(r['link'])
print(r.get('snippet', ''))
print()Estructura de los resultados de SerpApi
SerpApi devuelve datos estructurados más detallados que Tavily. Los campos principales de organic_results son: title, link, snippet y position. Los fragmentos destacados aparecen por separado en answer_box.
def extract_serp_results(serp_data, max_results=5):
results = []
# Featured snippet / answer box (highest priority)
if 'answer_box' in serp_data:
box = serp_data['answer_box']
results.append({
'title': box.get('title', 'Featured Snippet'),
'url': box.get('link', ''),
'snippet': box.get('answer') or box.get('snippet', ''),
'is_featured': True
})
# Organic results
for r in serp_data.get('organic_results', [])[:max_results]:
results.append({
'title': r.get('title', ''),
'url': r.get('link', ''),
'snippet': r.get('snippet', ''),
'position': r.get('position', 0),
'is_featured': False
})
return results
if __name__ == '__main__':
demo_serp = {
'answer_box': {'title': 'Python version', 'link': 'https://python.org', 'answer': '3.13'},
'organic_results': [
{'title': 'Python Docs', 'link': 'https://docs.python.org', 'snippet': 'Official docs', 'position': 1},
],
}
for r in extract_serp_results(demo_serp):
print(f"{'[FEATURED] ' if r['is_featured'] else ''}{r['title']} - {r['url']}")
Opciones de actualidad y filtrado por fecha
Para consultas sensibles al tiempo, filtre los resultados por fecha de publicación. Tavily admite el parámetro days; SerpApi admite el parámetro tbs (búsqueda basada en el tiempo).
# Tavily: results from last 7 days
recent_results = client.search(
query='AI news',
max_results=5,
days=7 # only results published in last 7 days
)
# SerpApi: results from last month
params = {
'q': 'AI news',
'api_key': os.getenv('SERPAPI_KEY'),
'tbs': 'qdr:m', # qdr:d=day, qdr:w=week, qdr:m=month, qdr:y=year
'num': 5
}
search = GoogleSearch(params)
results = search.get_dict()Creación de una herramienta de búsqueda para LangChain
Para utilizar Tavily o SerpApi dentro de un agente de LangChain, encapsule la función de búsqueda como una Tool. De este modo, el agente podrá invocarla como cualquier otra herramienta según la descripción que proporcione.
from langchain.tools import Tool
from tavily import TavilyClient
import os
tavily = TavilyClient(api_key=os.getenv('TAVILY_API_KEY'))
def tavily_search(query: str) -> str:
results = tavily.search(query=query, max_results=3, search_depth='basic')
output = []
for r in results['results']:
output.append(f"Title: {r['title']}\nURL: {r['url']}\nContent: {r['content'][:500]}")
return '\n\n'.join(output)
web_search_tool = Tool(
name='web_search',
func=tavily_search,
description='Search the web for current information. Input: a search query string. Returns top results with title, URL, and content.'
)Filtrado por dominio para el control de calidad
No todos los resultados de búsqueda son fiables. El filtrado por dominio permite restringir las búsquedas a fuentes de confianza —para investigación— o excluir dominios con mucho spam —para consultas generales—.
TRUSTED_DOMAINS = {
'medical': ['nih.gov', 'who.int', 'mayoclinic.org', 'pubmed.ncbi.nlm.nih.gov'],
'legal': ['law.cornell.edu', 'supreme.justia.com', 'congress.gov'],
'tech': ['docs.python.org', 'developer.mozilla.org', 'stackoverflow.com'],
'finance': ['sec.gov', 'federalreserve.gov', 'bloomberg.com']
}
SPAM_DOMAINS = ['pinterest.com', 'quora.com', 'answers.yahoo.com', 'wikihow.com']
def domain_aware_search(query, domain_category=None):
kwargs = {'query': query, 'max_results': 5, 'exclude_domains': SPAM_DOMAINS}
if domain_category and domain_category in TRUSTED_DOMAINS:
kwargs['include_domains'] = TRUSTED_DOMAINS[domain_category]
return client.search(**kwargs)Gestión de errores de búsqueda y límites de frecuencia
Tanto Tavily como SerpApi tienen límites de frecuencia. Implemente una lógica de reintento con espera exponencial y gestione correctamente el caso en que la búsqueda no devuelva resultados.
import time
def robust_search(query, max_retries=3):
for attempt in range(max_retries):
try:
results = client.search(query=query, max_results=5)
if results and results.get('results'):
return results['results']
print(f'No results for: {query}')
return []
except Exception as e:
if '429' in str(e) or 'rate' in str(e).lower():
wait = 2 ** attempt # 1s, 2s, 4s
print(f'Rate limited. Waiting {wait}s...')
time.sleep(wait)
else:
print(f'Search error: {e}')
return []
return []Normalización de la longitud de los fragmentos
La longitud de los fragmentos de resultados varía enormemente: algunos tienen 50 caracteres y otros, 2000. Normalizar la longitud de los fragmentos garantiza que cada fuente tenga una representación equivalente en el contexto del LLM.
MAX_SNIPPET_CHARS = 600
MIN_SNIPPET_CHARS = 100
def normalize_snippets(results):
normalized = []
for r in results:
content = r.get('content') or r.get('snippet', '')
# Truncate long snippets at sentence boundary
if len(content) > MAX_SNIPPET_CHARS:
# Find last sentence end before limit
cutoff = content.rfind('. ', 0, MAX_SNIPPET_CHARS)
content = content[:cutoff + 1] if cutoff > 0 else content[:MAX_SNIPPET_CHARS]
# Skip very short snippets
if len(content) < MIN_SNIPPET_CHARS:
continue
normalized.append({**r, 'content': content})
return normalized
if __name__ == '__main__':
demo_results = [
{'content': 'Short.'},
{'content': 'A' * 200 + '. ' + 'B' * 500},
]
for r in normalize_snippets(demo_results):
print(f"Length {len(r['content'])}: {r['content'][:60]}...")
Comprobación de conocimientos
¿Cuál es la principal ventaja de Tavily frente a un enfoque general de scraping web para agentes de IA?
Resumen: Tavily y SerpApi para búsquedas de agentes
Las API de búsqueda web proporcionan a los agentes acceso a información actual más allá de su fecha límite de entrenamiento. Tavily está diseñado específicamente para agentes de IA y ofrece una extracción de contenido limpia; SerpApi proporciona datos estructurados más completos de Google, incluidos fragmentos destacados y paneles de información.
Prácticas clave: utilice el filtrado por dominio para controlar la calidad, aplique filtros de actualidad a las consultas sensibles al tiempo, normalice la longitud de los fragmentos e implemente una lógica de reintento con espera incremental para gestionar los límites de frecuencia.
Preguntas frecuentes
¿La lección «Tavily y SerpAPI para búsquedas de agentes» es gratis?
Sí — el texto completo de «Tavily y SerpAPI para búsquedas de agentes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Tavily y SerpAPI para búsquedas de agentes»?
Configuración de la API, construcción de consultas y análisis de resultados para herramientas de búsqueda web. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Agents?
No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Tavily y SerpAPI para búsquedas de agentes»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Agents?
Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Tavily y SerpAPI para búsquedas de agentes
- Clasificación y filtrado de resultados de búsqueda
- Patrón de ciclo de investigación profunda
- Combinación de búsqueda web con RAG