Jangada AIJangada AI

Tutorial: RAG do zero

Objetivo: responder perguntas com base nos seus textos. A jangada faz embeddings + busca híbrida (BM25 lexical + vetorial, fundidos por RRF) + geração da resposta. Comece em memória (sem banco) e troque por um vector store real depois — sem mudar o resto.

Instale o extra:

pip install "jangada-ai[openai,rag]"
export OPENAI_API_KEY=sk-...

1. Montar o RAG

Você precisa de um embedder (gera vetores), um store (guarda) e um chat (responde):

from jangada_ai import LLM
from jangada_ai.rag import RAG, InMemoryVectorStore

embedder = LLM("openai", "text-embedding-3-small")
chat     = LLM("openai", "gpt-4o-mini")

rag = RAG(embedder, InMemoryVectorStore(), chat=chat, k=3, alpha=0.5)
  • k — quantos trechos recuperar.
  • alpha — balanço da busca: 0 = só BM25 (palavras), 1 = só vetorial (semântica), 0.5 = equilíbrio.

2. Indexar conteúdo

rag.add_texts([
    "A jangada troca de provider mudando só LLM('provider', 'modelo').",
    "O fallback é acionado em rate limit, 5xx ou timeout.",
])

# ou a partir de arquivos (docx/pdf/csv/xlsx/txt):
rag.add_document("manual.pdf")

3. Perguntar

resp = rag.ask("Como troco de provider?")
print(resp.text)                 # resposta com base no contexto recuperado
print(len(resp.sources), "trechos usados")

ask() recupera os trechos mais relevantes, monta o contexto e gera a resposta. resp.sources traz os trechos (com score) que embasaram.

4. Indo para produção: vector store real

Troque só o store — pgvector ou Mongo, detectado pela string de conexão:

from jangada_ai.rag import vector_store

store = vector_store("postgresql://user:pass@host/db")   # ou "mongodb+srv://..."
rag = RAG(embedder, store, chat=chat)

O resto do código continua igual. Ajustes finos (min_score, filter, weights, max_context_chars) estão em RAG.

Versão assíncrona (1.9.0+)

Todo o fluxo tem par async — útil em APIs (FastAPI) e para indexar muitos documentos sem bloquear o event loop:

await rag.aadd_document("politica.pdf")
resp = await rag.aask("Posso devolver depois de 30 dias?")

No modo híbrido (padrão), min_score é comparado com a similaridade de cosseno da busca vetorial — valores como 0.3–0.5 fazem sentido.

Próximos passos

  • Receita completa: examples/cookbook/03_chatbot_rag.py.
  • Referência detalhada: RAG.

On this page