RAG Local: Contexto Privado, Sem Concessões

Um LLM sem contexto específico é como um consultor brilhante que nunca leu nenhum documento da sua empresa. RAG resolve isso — e quando implementado localmente, resolve sem abrir mão de privacidade.

O que é RAG

Retrieval-Augmented Generation é um padrão onde, antes de chamar o LLM, você:

  1. Converte sua pergunta em um vetor de embedding
  2. Busca chunks de documentos semanticamente similares no seu vector store
  3. Injeta esses chunks como contexto no prompt
  4. O LLM responde baseado tanto no seu conhecimento pré-treinado quanto no contexto recuperado

Stack local completa

Documentos → Chunking → Embeddings locais → ChromaDB (local)
                                                    ↓
Pergunta → Embedding → Busca vetorial → Contexto relevante
                                                    ↓
                                         Ollama (LLM local) → Resposta

Ferramentas

  • Embeddings: nomic-embed-text via Ollama, sem API externa
  • Vector store: ChromaDB ou Qdrant, self-hosted
  • Orquestração: LangChain ou LlamaIndex, ambos suportam Ollama nativamente
  • Interface: Open WebUI com RAG embutido (opção zero-código)

Exemplo mínimo com LangChain

from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain_chroma import Chroma
from langchain.chains import RetrievalQA

embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma(persist_directory="./db", embedding_function=embeddings)
llm = OllamaLLM(model="llama3.1")

qa = RetrievalQA.from_chain_type(llm=llm, retriever=vectorstore.as_retriever())
resposta = qa.invoke("Qual é a política de segurança de dados?")

Quando usar RAG vs fine-tuning

Use RAG quando os dados mudam com frequência ou quando você precisa de rastreabilidade (citar a fonte). Use fine-tuning quando você quer mudar o comportamento base do modelo. Para a maioria dos casos de uso corporativo, RAG é a escolha certa.