Sistema de chat com PDFs usando LangChain + Ollama. Basicamente você faz upload de um PDF e pode conversar com ele usando IA local.
- Upload de PDFs
- Busca semântica com embeddings
- Memória da conversa
- Tudo roda local (sem mandar dados pra cloud)
curl -fsSL https://ollama.ai/install.sh | sh
# baixar os modelos
ollama pull gpt-oss:20b
ollama pull mxbai-embed-largepip install -r requirements.txtstreamlit run run.pyAbre no navegador automaticamente na porta 8501.
- Verifica se o Ollama ta rodando (tem um status na sidebar)
- Upload do PDF
- Processa o PDF
- Começa a perguntar
langchain/
├── run.py
├── app/
│ └── main.py # streamlit UI
├── core/
│ ├── pdf_processor.py # processa PDFs
│ └── rag_engine.py # RAG engine
├── config/
│ └── settings.py # configs
└── utils/
└── helpers.py
- Streamlit - interface web
- LangChain - framework RAG
- Ollama - modelos locais (gpt-oss:20b + mxbai-embed-large)
- FAISS - vectorstore
- PyPDF - ler PDFs
Usei langchain-ollama ao invés do langchain-community porque tem melhor integração e performance com Ollama.
Para trocar os modelos, edita o config/settings.py:
OLLAMA_LLM_MODEL = "gpt-oss:20b" # ou llama3.2, mistral, etc
OLLAMA_EMBEDDINGS_MODEL = "mxbai-embed-large"Parâmetros:
- chunk_size: 1000
- chunk_overlap: 200
- search_k: 3
Ollama não conecta
- Roda
ollama serveantes - Testa:
curl http://localhost:11434/api/tags
PDF não processa
- PDF pode estar corrompido
- PDFs muito grandes demoram
ImportError
pip install --upgrade langchain-ollama- Tudo roda local, não precisa de API keys
- PDFs grandes vão demorar pra processar (normal)
- Se der erro de memória, diminui o CHUNK_SIZE no settings.py
- Usei FAISS ao invés de Chroma pq é mais rápido pra datasets pequenos
- ConversationBufferMemory não escala bem, mas funciona pra demos
O agente usa um prompt system customizado em config/prompts.py. Para ajustar o comportamento:
# config/prompts.py
SYSTEM_PROMPT = """Seu prompt personalizado aqui..."""Ou ao instanciar:
rag = RAGEngine(
temperature=0.7, # controla criatividade
system_prompt="Seu prompt customizado"
)- Add support for multiple PDFs
- Implement proper logging (not just print/errors)
- Consider switching to ConversationBufferWindowMemory for longer sessions
- Add streaming responses
- Cache embeddings between sessions
- Add support for different prompt templates per use case
MIT License