> ## Documentation Index
> Fetch the complete documentation index at: https://novita.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Respostas Fundamentadas na Web

Um modelo sozinho não consegue responder a perguntas sobre eventos após o limite de seu treinamento, nem citar uma fonte. A solução é *grounding*: recuperar conteúdo relevante da web no momento da solicitação e passá-lo ao modelo como contexto. Este guia mostra o padrão usando o Novita [AI Search](/docs/pt-BR/guides/ai-search-quickstart) para recuperação e a [API de LLM](/docs/pt-BR/guides/llm-api) para síntese — tudo por trás de uma única chave de API.

## O que é RAG?

Geração aumentada por recuperação (RAG) é o padrão por trás de toda resposta fundamentada aqui: em vez de depender do que o modelo memorizou durante o treinamento, você *recupera* documentos relevantes no momento da solicitação e *aumenta* o prompt com eles, para que o modelo *gere* sua resposta a partir desse contexto novo e verificável.

Essa etapa de recuperação é exatamente o que o AI Search oferece. A web se torna sua base de conhecimento, e você não precisa criar nem manter um banco de dados vetorial para começar — uma chamada de busca retorna os trechos, e o LLM faz o restante. Quando, mais tarde, você quiser recuperação sobre seus *próprios* documentos privados, o mesmo formato em três etapas se aplica; você apenas troca a busca na web por um armazenamento vetorial.

RAG oferece três coisas que um modelo isolado não consegue oferecer:

* **Atualidade** — as respostas refletem conteúdo publicado após o limite de treinamento do modelo.
* **Atribuição** — toda afirmação pode apontar para uma URL de origem que o usuário pode verificar.
* **Alucinação reduzida** — fundamentar o modelo em texto recuperado impede que ele invente fatos.

## Como a fundamentação funciona

Uma única rodada de RAG segue três etapas:

1. **Buscar** (recuperar) na web páginas relevantes para a pergunta.
2. **Extrair** (aumentar) o conteúdo de que você precisa — snippets ou texto completo da página — para dentro do prompt.
3. **Sintetizar** (gerar) uma resposta passando esse conteúdo para um LLM, pedindo que ele cite fontes.

Você pode fazer isso com duas chamadas (busca + LLM) ou até mesmo uma, já que tanto Exa quanto Tavily podem sintetizar uma resposta para você. Escolha com base em quanto controle você precisa sobre a redação final e as citações.

## Deixe o provedor escrever a resposta

O caminho mais rápido. O Search da Tavily retorna uma resposta gerada por LLM quando você define `include_answer`, e a Exa oferece um [Answer](/docs/pt-BR/api-reference/model-apis-exa-answer) endpoint. Uma chamada, sem orquestração.

<CodeGroup>
  ```bash Tavily theme={"system"}
  curl -X POST 'https://api.novita.ai/v3/tavily/search' \
    -H "Authorization: Bearer ${NOVITA_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d '{
      "query": "What changed in the latest Python release?",
      "include_answer": "advanced",
      "max_results": 5
    }'
  ```

  ```bash Exa theme={"system"}
  curl -X POST 'https://api.novita.ai/v3/exa/answer' \
    -H "Authorization: Bearer ${NOVITA_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d '{
      "query": "What changed in the latest Python release?",
      "text": true
    }'
  ```
</CodeGroup>

Use isto quando quiser uma boa resposta com o mínimo de código. Use a abordagem de recuperar e depois sintetizar abaixo quando precisar de controle sobre o modelo, o tom, o formato de saída ou como as citações são apresentadas.

## Recupere e depois sintetize com um LLM

Isso oferece controle total. Busque fontes e depois entregue os resultados para a [LLM API](/docs/pt-BR/guides/llm-api) com instruções para responder usando apenas esse contexto e citar cada afirmação.

```python theme={"system"}
import os
import requests
from openai import OpenAI

NOVITA_KEY = os.environ["NOVITA_API_KEY"]
QUESTION = "What changed in the latest Python release?"

# 1. Retrieve relevant web content.
search = requests.post(
    "https://api.novita.ai/v3/tavily/search",
    headers={"Authorization": f"Bearer {NOVITA_KEY}"},
    json={
        "query": QUESTION,
        "max_results": 5,
        "include_raw_content": "text",
    },
).json()

# 2. Build a compact, numbered context block the model can cite.
sources = []
for i, r in enumerate(search["results"], start=1):
    body = (r.get("raw_content") or r.get("content") or "")[:1500]
    sources.append(f"[{i}] {r['title']} ({r['url']})\n{body}")
context = "\n\n".join(sources)

# 3. Synthesize a grounded, cited answer.
client = OpenAI(base_url="https://api.novita.ai/openai", api_key=NOVITA_KEY)
completion = client.chat.completions.create(
    model="deepseek/deepseek-v4-flash",
    messages=[
        {
            "role": "system",
            "content": (
                "Answer using ONLY the provided sources. "
                "Cite claims with [n] referring to the source number. "
                "If the sources don't contain the answer, say so."
            ),
        },
        {"role": "user", "content": f"Question: {QUESTION}\n\nSources:\n{context}"},
    ],
)
print(completion.choices[0].message.content)
```

O mesmo fluxo funciona com o Exa Search — troque a rota para `/v3/exa/search` e leia `text` de cada resultado em vez de `raw_content`.

## Ajustando a qualidade da recuperação

A qualidade de uma resposta fundamentada depende muito mais de *o que você recupera* do que do modelo. Alguns controles de alto impacto:

* **Atualidade.** Para perguntas sensíveis ao tempo, restrinja por data. Tavily expõe `time_range` e `start_date`/`end_date`; Exa expõe `startPublishedDate`/`endPublishedDate`. Isso mantém páginas desatualizadas fora do contexto.
* **Confiança na fonte.** Use `include_domains`/`excludeDomains` para restringir a recuperação a fontes em que você confia (documentação oficial, editoras respeitáveis) e excluir sites de baixa qualidade.
* **Dicas de tópico.** Da Tavily `topic` (`news`, `finance`, `general`) e da Exa `category` direcionar o mecanismo para o tipo certo de resultado.
* **Dimensionamento correto do contexto.** Limite o texto extraído (Tavily `chunks_per_source`, Exa `maxCharacters`) para que você passe sinal suficiente sem estourar a janela de contexto do modelo ou seu orçamento de tokens.

## Search vs. extract vs. crawl

Escolha a primitiva de recuperação que corresponde à sua necessidade:

* **Search** — você tem uma pergunta e precisa *descobrir* páginas relevantes. O ponto de partida padrão.
* **Extract / Contents** — você já conhece as URLs e quer texto limpo delas. Bom para fundamentação em um conjunto fixo de documentos. Veja [Tavily Extract](/docs/pt-BR/api-reference/model-apis-tavily-extract) e [Exa Contents](/docs/pt-BR/api-reference/model-apis-exa-contents).
* **Rastrear / Mapear** — você quer ingerir um site inteiro ou uma seção, seguindo links. Bom para criar uma base de conhecimento offline. Veja [Tavily Crawl](/docs/pt-BR/api-reference/model-apis-tavily-crawl) e [Tavily Map](/docs/pt-BR/api-reference/model-apis-tavily-map).

<Tip>
  Para um agente mais completo que pesquisa iterativamente e raciocina sobre muitas fontes, consulte a [integração DeepSearcher](/docs/pt-BR/guides/deepsearcher).
</Tip>

## Levando para produção

* **Lide com resultados vazios.** Se a busca não retornar nada relevante, faça com que o modelo diga que não pode responder, em vez de inventar uma resposta. O prompt de sistema acima faz isso.
* **Use cache quando puder.** Consultas idênticas retornam resultados semelhantes; armazenar a recuperação em cache reduz custo e latência.
* **Preste atenção aos limites de taxa.** A recuperação e as chamadas de LLM são limitadas separadamente — uma solicitação de busca não consome sua cota de LLM. Reduza o ritmo em `429` para qualquer um deles. Consulte [limites de taxa de LLM](/docs/pt-BR/guides/llm-rate-limits) para o lado do LLM.
* **Mantenha as chaves no lado do servidor.** Sua chave da Novita autentica todas as chamadas aqui — nunca a inclua em código do lado do cliente.
