AI Agents · Lezione

Tavily e SerpAPI per la ricerca degli agenti

Configurazione delle API, costruzione delle query e parsing dei risultati per gli strumenti di ricerca web

Lezione 1 di 413 passaggi

Tavily e SerpAPI per la ricerca degli agenti è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.

Perché gli agenti hanno bisogno della ricerca web

Gli LLM hanno una data limite di conoscenza. Per domande su eventi attuali, prezzi in tempo reale, notizie recenti o argomenti in rapida evoluzione, i dati di addestramento del modello non sono aggiornati.

Gli strumenti di ricerca web come Tavily e SerpApi offrono agli agenti accesso a Internet in tempo reale, colmando il divario tra i dati di addestramento statici e la realtà attuale.

Tavily: progettato appositamente per gli agenti AI

Tavily è un'API di ricerca progettata specificamente per gli agenti AI. A differenza dello scraping web generico, restituisce risultati puliti e strutturati con contenuti pre-estratti: non è necessario analizzare l'HTML.

Installi con pip install tavily-python. Ottenga una chiave API all'indirizzo 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('---')

Parametri di ricerca di Tavily

Tavily offre diversi parametri per controllare il comportamento della ricerca. I più utili per gli agenti sono 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']
)

Struttura dei risultati di Tavily

Ogni risultato di Tavily contiene: title, url, content (testo estratto), score (rilevanza) e, facoltativamente, published_date. Il campo content contiene testo pulito, senza tag 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: accesso programmatico a Google

SerpApi fornisce accesso strutturato a Google, Bing, YouTube e altri motori di ricerca. Restituisce dati dettagliati, tra cui risultati organici, riquadri informativi, snippet in evidenza e risultati di shopping.

Installi 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()

Struttura dei risultati di SerpApi

SerpApi restituisce dati strutturati più ricchi di Tavily. I campi principali di organic_results sono: title, link, snippet e position. Gli snippet in evidenza compaiono separatamente in 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']}")

Opzioni di aggiornamento e filtraggio per data

Per le query sensibili al fattore tempo, filtri i risultati in base alla data di pubblicazione. Tavily supporta il parametro days; SerpApi supporta il parametro tbs (ricerca basata sul 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()

Creazione di uno strumento di ricerca per LangChain

Per utilizzare Tavily o SerpApi all'interno di un agente LangChain, incapsuli la funzione di ricerca in un Tool. L'agente potrà quindi chiamarlo come qualsiasi altro strumento, in base alla descrizione fornita.

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.'
)

Filtraggio dei domini per il controllo della qualità

Non tutti i risultati di ricerca sono affidabili. Il filtraggio dei domini consente di limitare le ricerche a fonti attendibili (per la ricerca) o di escludere domini ricchi di spam (per le query generiche).

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)

Gestione degli errori di ricerca e dei limiti di frequenza

Sia Tavily sia SerpApi hanno limiti di frequenza. Implementi la logica di retry con backoff esponenziale e gestisca correttamente il caso in cui la ricerca non restituisca risultati.

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 []

Normalizzazione della lunghezza degli snippet

La lunghezza degli snippet dei risultati varia enormemente: alcuni contengono 50 caratteri, altri 2000 caratteri. Normalizzare la lunghezza degli snippet garantisce a ogni fonte una rappresentazione equivalente nel contesto dell'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 delle conoscenze

Qual è il principale vantaggio di Tavily rispetto a un approccio di scraping web generico per gli agenti AI?

Riepilogo: Tavily e SerpApi per la ricerca degli agenti

Le API di ricerca web consentono agli agenti di accedere a informazioni aggiornate oltre la data limite dei loro dati di addestramento. Tavily è progettato appositamente per gli agenti AI e offre un'estrazione pulita dei contenuti; SerpApi fornisce dati Google strutturati più ricchi, inclusi snippet in evidenza e riquadri informativi.

Pratiche fondamentali: utilizzi il filtraggio dei domini per il controllo della qualità, applichi filtri di aggiornamento per le query sensibili al fattore tempo, normalizzi la lunghezza degli snippet e implementi la logica di retry con backoff per gestire i limiti di frequenza.

Gratis per iniziare

Impara AI Agents con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
60
Lezioni
239

Domande Frequenti

La lezione «Tavily e SerpAPI per la ricerca degli agenti» è gratuita?

Sì — il testo completo di «Tavily e SerpAPI per la ricerca degli agenti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.

Cosa imparerò in «Tavily e SerpAPI per la ricerca degli agenti»?

Configurazione delle API, costruzione delle query e parsing dei risultati per gli strumenti di ricerca web Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Agents?

Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Tavily e SerpAPI per la ricerca degli agenti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Agents?

Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Tavily e SerpAPI per la ricerca degli agenti
  2. Classificazione e filtraggio dei risultati di ricerca
  3. Pattern del ciclo di ricerca approfondita
  4. Combinazione della ricerca web con RAG
← Torna a AI Agents