Como criar um chatbot com PDFs e RAG em Python

Publicado em: 23/07/2026
Tempo de leitura: 6 minutos
Pesquisa em documentos PDF com Python e RAG

Imagine poder enviar manuais, contratos, apostilas, relatórios ou documentos internos para uma inteligência artificial e fazer perguntas usando linguagem natural. Em vez de procurar página por página, o sistema encontra os trechos mais relevantes e produz uma resposta baseada no conteúdo dos arquivos. Neste tutorial, você aprenderá como criar um chatbot com PDFs e RAG em Python usando a API da OpenAI e o recurso de busca em arquivos.

O projeto será executado no terminal e terá duas etapas. Primeiro, enviaremos o PDF para uma base vetorial. Depois, construiremos um chatbot que pesquisa essa base antes de responder. Assim, o modelo não depende apenas do conhecimento adquirido durante o treinamento: ele consulta os documentos fornecidos por você.

O que é RAG e por que usar com PDFs?

RAG é a sigla de Retrieval-Augmented Generation, ou geração aumentada por recuperação. A ideia é combinar um modelo de linguagem com um mecanismo de busca. Quando o usuário faz uma pergunta, o sistema realiza quatro operações principais:

  1. transforma o conteúdo dos documentos em partes menores;
  2. representa essas partes por meio de embeddings;
  3. recupera os trechos semanticamente mais próximos da pergunta;
  4. envia os trechos encontrados ao modelo para gerar a resposta.

Esse processo reduz respostas genéricas e permite criar assistentes especializados sem treinar um novo modelo. O chatbot pode consultar um único PDF ou uma coleção inteira de documentos. A documentação oficial de Retrieval da OpenAI explica que a busca semântica consegue encontrar conteúdo relevante mesmo quando a pergunta e o documento não utilizam exatamente as mesmas palavras.

Como funcionará nosso chatbot com PDFs

Neste projeto, usaremos um vector store, que funciona como um índice pesquisável dos arquivos. Ao enviar o PDF, a plataforma processa o documento, divide seu conteúdo e cria as representações vetoriais necessárias para a pesquisa. Depois, a ferramenta file_search busca os trechos relacionados à pergunta e os disponibiliza ao modelo.

Essa abordagem deixa o código mais simples, porque não precisaremos implementar manualmente o particionamento do texto, o cálculo de similaridade ou um banco vetorial local. Segundo a documentação oficial do File Search, arquivos PDF estão entre os formatos aceitos pelo recurso.

Caso você queira controlar completamente a extração do conteúdo antes da indexação, consulte também nosso tutorial sobre como extrair texto de PDFs com Python. A biblioteca pypdf possui ainda uma documentação específica sobre extração de texto, incluindo limitações de PDFs digitalizados e documentos complexos.

Pré-requisitos do projeto

Você precisará de Python instalado, uma chave da API da OpenAI e pelo menos um arquivo PDF com texto pesquisável. Crie uma nova pasta para o projeto e abra o terminal dentro dela:

mkdir chatbot-pdf-rag
cd chatbot-pdf-rag
python -m venv .venv

Ative o ambiente virtual. No Windows, use:

.venv\Scripts\activate

No Linux ou macOS:

source .venv/bin/activate

Agora instale as dependências:

pip install openai python-dotenv

Crie um arquivo chamado .env e armazene sua chave:

OPENAI_API_KEY=sua_chave_aqui

Nunca publique esse arquivo no GitHub. Para aprofundar a configuração, veja como ler variáveis de ambiente em Python sem expor dados sensíveis.

Etapa 1: enviar e indexar o PDF

Coloque um arquivo chamado documento.pdf na pasta do projeto. Em seguida, crie o arquivo indexar_pdf.py:

from pathlib import Path
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI()
caminho_pdf = Path("documento.pdf")
if not caminho_pdf.exists():
    raise FileNotFoundError(
        f"O arquivo {caminho_pdf} não foi encontrado."
    )
vector_store = client.vector_stores.create(
    name="Base de conhecimento dos PDFs"
)
with caminho_pdf.open("rb") as arquivo:
    resultado = client.vector_stores.files.upload_and_poll(
        vector_store_id=vector_store.id,
        file=arquivo,
    )
print("PDF indexado com sucesso!")
print(f"Vector Store ID: {vector_store.id}")
print(f"Status: {resultado.status}")

Execute o script:

python indexar_pdf.py

O programa criará a base vetorial, enviará o documento e aguardará o término do processamento. Copie o valor exibido em Vector Store ID. Ele começará normalmente com vs_. Adicione esse identificador ao arquivo .env:

OPENAI_API_KEY=sua_chave_aqui
VECTOR_STORE_ID=vs_seu_identificador

Etapa 2: criar o chatbot que consulta o PDF

Crie agora o arquivo chatbot.py. Ele receberá perguntas no terminal e disponibilizará a busca nos documentos como uma ferramenta do modelo:

import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI()
vector_store_id = os.getenv("VECTOR_STORE_ID")
if not vector_store_id:
    raise ValueError(
        "Defina VECTOR_STORE_ID no arquivo .env."
    )
def perguntar_ao_pdf(pergunta: str) -> str:
    if not pergunta.strip():
        return "Digite uma pergunta válida."
    resposta = client.responses.create(
        model="gpt-5.6",
        instructions=(
            "Você é um assistente que responde em português. "
            "Use os PDFs pesquisados como fonte principal. "
            "Se a resposta não estiver nos documentos, diga "
            "claramente que a informação não foi encontrada. "
            "Não invente dados."
        ),
        input=pergunta,
        tools=[
            {
                "type": "file_search",
                "vector_store_ids": [vector_store_id],
                "max_num_results": 5,
            }
        ],
    )
    return resposta.output_text
print("Chatbot iniciado. Digite 'sair' para encerrar.")
while True:
    pergunta = input("\nVocê: ").strip()
    if pergunta.lower() in {"sair", "exit", "quit"}:
        print("Chatbot encerrado.")
        break
    try:
        resposta = perguntar_ao_pdf(pergunta)
        print(f"\nAssistente: {resposta}")
    except Exception as erro:
        print(f"\nNão foi possível gerar a resposta: {erro}")

Execute o chatbot:

python chatbot.py

Faça perguntas relacionadas ao conteúdo do documento, como “Qual é o objetivo principal do relatório?”, “Quais prazos são mencionados?” ou “Resuma as conclusões em cinco tópicos”. Você pode trocar o modelo no código por outro compatível e disponível em sua conta.

Por que o prompt limita as respostas?

A instrução enviada ao modelo é uma parte importante do projeto. Sem uma regra clara, o chatbot pode complementar a resposta com conhecimento geral, mesmo quando a informação não aparece no PDF. Ao solicitar que o assistente admita quando não encontrar um dado, tornamos o comportamento mais previsível.

Isso não elimina completamente respostas incorretas. Sistemas RAG ainda precisam ser testados com perguntas reais, documentos diferentes e casos nos quais a informação não existe. Para projetos profissionais, registre as perguntas, avalie os trechos recuperados e permita que o usuário consulte a fonte original.

Como adicionar vários PDFs

Você não precisa criar uma base diferente para cada arquivo. É possível enviar vários PDFs ao mesmo vector_store_id. Uma maneira simples é percorrer uma pasta:

from pathlib import Path
pasta = Path("pdfs")
for caminho_pdf in pasta.glob("*.pdf"):
    with caminho_pdf.open("rb") as arquivo:
        client.vector_stores.files.upload_and_poll(
            vector_store_id=vector_store.id,
            file=arquivo,
        )
    print(f"Indexado: {caminho_pdf.name}")

Essa modificação permite montar uma base com manuais, normas, apostilas ou relatórios relacionados. Em coleções grandes, organize os documentos por assunto e considere usar metadados e filtros para evitar que o sistema procure em arquivos irrelevantes.

Limitações importantes dos PDFs

Nem todo PDF contém texto real. Documentos digitalizados podem ser apenas imagens das páginas e exigir OCR antes da indexação. Tabelas complexas, colunas, notas de rodapé e gráficos também podem prejudicar a ordem do conteúdo extraído. Sempre teste algumas perguntas cujas respostas você já conhece.

Outro cuidado envolve documentos confidenciais. Antes de enviar contratos, dados pessoais ou informações internas, revise as políticas do serviço utilizado, controle quem pode acessar o sistema e remova dados desnecessários. Em uma aplicação pública, também é importante validar arquivos, limitar tamanho e extensão e impedir uploads maliciosos.

Como transformar o projeto em uma aplicação real

O chatbot do terminal é uma base funcional, mas pode evoluir bastante. Você pode criar uma interface com Streamlit, desenvolver uma API com FastAPI, armazenar o histórico de conversas e mostrar referências para os trechos utilizados. Também é possível permitir que cada usuário tenha uma base de documentos separada.

Se você ainda não trabalhou com modelos pela API, leia nosso guia sobre como integrar o ChatGPT ao código Python. Para transformar o chatbot em um serviço acessível por outros sistemas, o artigo sobre como consumir APIs REST com Python ajuda a entender requisições, autenticação e tratamento de erros.

Conclusão

Criar um chatbot com PDFs e RAG em Python é uma forma prática de transformar documentos estáticos em uma base de conhecimento pesquisável. O PDF é indexado em uma base vetorial, a pergunta recupera os trechos mais relevantes e o modelo utiliza esse contexto para produzir uma resposta.

Com poucas linhas de código, você já consegue consultar relatórios, apostilas e manuais usando linguagem natural. O próximo passo é adaptar a solução ao seu caso de uso, testar a qualidade das respostas e adicionar uma interface para facilitar o acesso dos usuários.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Landing page simples criada com Python e Tailwind CSS
    Projetos
    Foto de perfil de Leandro Hirt da Academify

    Como criar uma landing page simples com Python e Tailwind CSS

    Você já sentiu a necessidade de colocar uma ideia no ar rapidamente, mas se viu travado na complexidade do desenvolvimento

    Ler mais

    Tempo de leitura: 11 minutos
    19/04/2026
    Sistema de tradução automática desenvolvido com Python
    Projetos
    Foto de perfil de Leandro Hirt da Academify

    Como criar um sistema de tradução automática com Python

    Criar um sistema de tradução automática com Python é uma das formas mais fascinantes de entrar no mundo da Inteligência

    Ler mais

    Tempo de leitura: 10 minutos
    17/04/2026
    Sistema de lembretes e alarmes desenvolvido com Python
    Projetos
    Foto de perfil de Leandro Hirt da Academify

    Como criar um sistema de lembretes com alarme em Python

    Criar um sistema de lembretes com alarme em Python é um dos projetos mais gratificantes para quem está dando os

    Ler mais

    Tempo de leitura: 10 minutos
    10/04/2026
    Extração de dados de tabelas de sites usando Python e pandas
    Projetos
    Foto de perfil de Leandro Hirt da Academify

    Como extrair dados de tabelas em sites com Python e Pandas

    Você já se deparou com um site repleto de informações úteis organizadas em tabelas, mas sentiu que copiar e colar

    Ler mais

    Tempo de leitura: 10 minutos
    09/04/2026
    Conversão de áudio para texto usando Python gratuitamente
    Projetos
    Foto de perfil de Leandro Hirt da Academify

    Como converter áudio em texto com Python de forma gratuita

    Transformar arquivos de áudio em texto é uma das tarefas mais úteis e requisitadas na era da inteligência artificial e

    Ler mais

    Tempo de leitura: 10 minutos
    08/04/2026
    Sistema de login simples desenvolvido com Python
    Projetos
    Foto de perfil de Leandro Hirt da Academify

    Como criar um sistema de login simples com Python e TXT

    Aprender a manipular informações externas é um dos grandes marcos na jornada de qualquer programador. Se você está dando seus

    Ler mais

    Tempo de leitura: 10 minutos
    07/04/2026