Tavily e SerpAPI para pesquisa com agentes
Configuração da API, construção de consultas e análise de resultados para ferramentas de pesquisa na web.
Tavily e SerpAPI para pesquisa com agentes é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.
Por que os agentes precisam de pesquisa na web
Os LLMs têm uma data-limite de conhecimento. Para perguntas sobre acontecimentos atuais, preços em tempo real, notícias recentes ou assuntos que mudam rapidamente, os dados de treinamento do modelo estão desatualizados.
Ferramentas de pesquisa na web, como Tavily e SerpApi, dão aos agentes acesso à internet em tempo real, preenchendo a lacuna entre os dados estáticos de treinamento e a realidade atual.
Tavily: desenvolvido especificamente para agentes de IA
Tavily é uma API de pesquisa criada especificamente para agentes de IA. Diferentemente da extração geral de dados da web, ela retorna resultados limpos e estruturados com conteúdo previamente extraído — sem necessidade de analisar HTML.
Instale com pip install tavily-python. Obtenha uma chave de API em 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 pesquisa do Tavily
O Tavily oferece vários parâmetros para controlar o comportamento da pesquisa. Os mais úteis para agentes são 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']
)Estrutura dos resultados do Tavily
Cada resultado do Tavily contém: title, url, content (texto extraído), score (relevância) e, opcionalmente, published_date. O campo content é texto limpo — sem tags 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: acesso programático à pesquisa do Google
SerpApi fornece acesso estruturado ao Google, Bing, YouTube e outros mecanismos de pesquisa. Ela retorna dados abrangentes, incluindo resultados orgânicos, painéis de conhecimento, trechos em destaque e resultados de compras.
Instale com 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()Estrutura dos resultados do SerpApi
O SerpApi retorna dados estruturados mais abrangentes que o Tavily. Os principais campos em organic_results são: title, link, snippet e position. Os trechos em destaque aparecem separadamente em 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']}")
Opções de atualização e filtragem por data
Para consultas sensíveis ao tempo, filtre os resultados pela data de publicação. O Tavily oferece suporte ao parâmetro days; o SerpApi oferece suporte ao parâmetro tbs (pesquisa baseada em tempo).
# 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()Criando uma ferramenta de pesquisa para LangChain
Para usar o Tavily ou o SerpApi dentro de um agente LangChain, envolva a função de pesquisa como uma Tool. Assim, o agente poderá chamá-la como qualquer outra ferramenta, com base na descrição fornecida.
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.'
)Filtragem por domínio para controle de qualidade
Nem todos os resultados de pesquisa são confiáveis. A filtragem por domínio permite restringir as pesquisas a fontes confiáveis (para pesquisas) ou excluir domínios com muito spam (para consultas gerais).
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)Lidando com erros de pesquisa e limites de requisições
O Tavily e o SerpApi têm limites de requisições. Implemente uma lógica de novas tentativas com espera exponencial e trate adequadamente o caso em que a pesquisa não retorna 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 []Normalização do tamanho dos trechos
O tamanho dos trechos dos resultados varia muito: alguns têm 50 caracteres, enquanto outros têm 2.000. Normalizar o tamanho dos trechos garante que cada fonte receba uma representação equivalente no contexto do 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]}...")
Verificação de conhecimento
Qual é a principal vantagem do Tavily em relação a uma abordagem geral de extração de dados da web para agentes de IA?
Recapitulação: Tavily e SerpApi para pesquisa de agentes
As APIs de pesquisa na web dão aos agentes acesso a informações atuais além da data-limite de treinamento. O Tavily foi desenvolvido especificamente para agentes de IA e oferece extração de conteúdo limpo; o SerpApi fornece dados estruturados mais abrangentes do Google, incluindo trechos em destaque e painéis de conhecimento.
Práticas essenciais: use a filtragem por domínio para controle de qualidade, aplique filtros de atualização para consultas sensíveis ao tempo, normalize o tamanho dos trechos e implemente uma lógica de novas tentativas com espera progressiva para lidar com limites de requisições.
Perguntas Frequentes
A aula “Tavily e SerpAPI para pesquisa com agentes” é grátis?
Sim — o texto completo de “Tavily e SerpAPI para pesquisa com agentes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.
O que vou aprender em “Tavily e SerpAPI para pesquisa com agentes”?
Configuração da API, construção de consultas e análise de resultados para ferramentas de pesquisa na web. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Agents?
Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Tavily e SerpAPI para pesquisa com agentes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Agents?
Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Tavily e SerpAPI para pesquisa com agentes
- Classificando e filtrando resultados de pesquisa
- Padrão de ciclo de pesquisa aprofundada
- Combinando pesquisa na web com RAG