Como montar um bot RAG numa T4 para livros de sociologia e política: Qwen em vez de busca na web

O autor montou um bot RAG para livros didáticos de ciências sociais do 9º e 10º ano que busca respostas não na internet, mas nos textos carregados. Em sala de aula, o que importa não é se a resposta está correta em termos gerais, mas se ela coincide com a formulação de um livro didático específico — por isso o bot limita o contexto em vez de ter acesso à web. O pipeline faz o parsing dos PDFs com pymupdf4llm, divide o texto com metadados (série, parágrafo, página) e codifica com embeddings do intfloat/multilingual-e5-large no FAISS. O usuário pergunta sobre um parágrafo, o bot busca nos metadados, passa os trechos encontrados para o Qwen2.5-3B-Instruct junto com um prompt de sistema e recebe uma resposta com referência à página. • **Stack**: Qwen2.5-3B-Instruct numa T4 (quantização de 4 bits NF4 via bitsandbytes), FAISS em memória, intfloat/multilingual-e5-large para embeddings, Google Colab. • **Limitações do modelo**: filtragem por metadados, contexto estreito no prompt, temperatura de geração baixa (0.1). • **Planos futuros**: validar as respostas em relação ao contexto, armazenar o estado da sessão, corrigir os números de página.

Processado por IA de Хабр: Машинное обучение; editado por Hamidun News
Como montar um bot RAG numa T4 para livros de sociologia e política: Qwen em vez de busca na web
Fonte: Хабр: Машинное обучение. Colagem: Hamidun News.
Ouvir artigo
Ficha técnica e números-chave
ParâmetroDados
Fonte originalХабр: Машинное обучение ↗
Editor-chefe
StackQwen2.5-3B-Instruct numa T4 (quantização de 4 bits NF4 via bitsandbytes), FAISS em memória, intfloat/multilingual-e5-large para embeddings, Google Colab.
Limitações do modelofiltragem por metadados, contexto estreito no prompt, temperatura de geração baixa (0.1).
Planos futurosvalidar as respostas em relação ao contexto, armazenar o estado da sessão, corrigir os números de página.

Um modelo pequeno com contexto vence um grande com internet

Com a introdução de livros didáticos estatais unificados na Rússia, um entusiasta decidiu montar um assistente para eles. O bot RAG busca respostas para perguntas de ciências sociais não na internet nem nos pesos gerais do modelo, mas em dois livros didáticos carregados, do 9º e do 10º ano.

Por que isso é necessário? Em sala de aula, uma resposta que coincida com um livro didático específico recebe nota; uma resposta filosoficamente correta baseada em conhecimento geral, não. Um modelo grande típico com acesso à internet dá uma explicação correta, mas que não coincide com o livro didático. É preciso outra arquitetura: um modelo pequeno que recebe um contexto curto e restrito e não se desvia para raciocínios gerais. Uma temperatura de geração baixa e um prompt de sistema ajudam a manter o modelo próximo do texto. Um contexto limitado não retira do modelo seu conhecimento básico, mas o coloca em modo de busca num material específico, em vez de divagar sobre um tema.

O pipeline: do PDF à resposta

A stack tecnológica é simples. O pymupdf4llm faz o parsing do PDF página por página, convertendo para Markdown e preservando tabelas e listas. O MarkdownHeaderTextSplitter trabalha com três níveis: Capítulo (#) → Parágrafo (##) → Subseção (###). Cada trecho mantém metadados: série, número do parágrafo e número da página.

Uma segunda passagem — RecursiveCharacterTextSplitter com chunk_size=1000 e chunk_overlap=150 — corta seções longas em pedaços gerenciáveis. Os embeddings do intfloat/multilingual-e5-large codificam o texto, e o banco FAISS (faiss-cpu) roda na memória do Colab.

Quando o usuário escreve "me dê as respostas das questões do parágrafo 13 do 10º ano", uma expressão regular extrai a série e o número do parágrafo. Uma função chamada smart_filter verifica se os metadados coincidem com a consulta. O FAISS retorna até quatro trechos relevantes. Se o filtro rígido não encontrar nada, o código repete a busca filtrando apenas pela série — nesse caso, o contexto pode vir de outro parágrafo.

Os trechos encontrados são reunidos num contexto com metadados como [10º ano | § 13 | Pág. 45] e enviados ao Qwen2.5-3B-Instruct junto com um prompt de sistema: responda estritamente com base no texto fornecido e, no final, indique o número da página. O modelo roda com temperatura 0.1. Depois de cada resposta, torch.cuda.empty_cache() é chamado, liberando a memória em cache.

Infraestrutura, problemas e planos

Modelo: Qwen2.5-3B-Instruct (3 bilhões de parâmetros). Quantização: 4 bits NF4 via bitsandbytes — é isso que permite que o modelo caiba na memória de vídeo da T4. Embeddings: intfloat/multilingual-e5-large. Banco vetorial: FAISS (faiss-cpu) em memória RAM. Infraestrutura: Google Colab com uma GPU T4 gratuita. Tudo roda numa única máquina.

A formatação das respostas aparece como Markdown bruto (os marcadores ** ficam visíveis). Os metadados de parágrafo se perdem em páginas sem cabeçalho: se um parágrafo começa na página 139 e continua na 140, os trechos da segunda página ficam sem metadados e não aparecem nas buscas daquele parágrafo específico. Não há verificação de fatos: o bot não checa se uma frase da resposta realmente corresponde ao contexto recuperado. A série do usuário não é lembrada entre mensagens. O número da página do arquivo pode diferir do impresso na edição em papel.

O autor planeja escalar o projeto para história e biologia. Para os próximos sprints: ajustar a formatação das respostas, implementar o armazenamento do estado da sessão, adicionar validação das respostas antes do envio e resolver o problema dos metadados perdidos em parágrafos que ocupam várias páginas.

História

Perguntas frequentes sobre a notícia

O que se sabe sobre Um modelo pequeno com contexto vence um grande com internet?

Com a introdução de livros didáticos estatais unificados na Rússia, um entusiasta decidiu montar um assistente para eles. O bot RAG busca respostas para perguntas de ciências sociais não na internet nem nos pesos gerais do modelo, mas em dois livros didáticos carregados, do 9º e do 10º ano. Por que isso é necessário? Em sala de aula, uma resposta que coincida com um livro didático específico recebe nota; uma resposta filosoficamente correta baseada em conhecimento geral, não. Um modelo grande típico com acesso à internet dá uma explicação correta, mas que não coincide com o

O que se sabe sobre O pipeline: do PDF à resposta?

A stack tecnológica é simples. O pymupdf4llm faz o parsing do PDF página por página, convertendo para Markdown e preservando tabelas e listas. O MarkdownHeaderTextSplitter trabalha com três níveis: Capítulo (#) → Parágrafo (##) → Subseção (###). Cada trecho mantém metadados: série, número do parágrafo e número da página. Uma segunda passagem — RecursiveCharacterTextSplitter com chunk_size=1000 e chunk_overlap=150 — corta seções longas em pedaços gerenciáveis. Os embeddings do intfloat/multilingual-e5-large codificam o texto, e o banco FAISS (faiss-cpu) roda na memória do Co

O que se sabe sobre Infraestrutura, problemas e planos?

Modelo: Qwen2.5-3B-Instruct (3 bilhões de parâmetros). Quantização: 4 bits NF4 via bitsandbytes — é isso que permite que o modelo caiba na memória de vídeo da T4. Embeddings: intfloat/multilingual-e5-large. Banco vetorial: FAISS (faiss-cpu) em memória RAM. Infraestrutura: Google Colab com uma GPU T4 gratuita. Tudo roda numa única máquina. A formatação das respostas aparece como Markdown bruto (os marcadores ficam visíveis). Os metadados de parágrafo se perdem em páginas sem cabeçalho: se um parágrafo começa na página 139 e continua na 140, os trechos da segunda página ficam

ZK
Zhemal Khamidun — CPO da Alpina Digital, gerente de produto do AlpinaGPT. Cria produtos de IA desde 2019. O Hamidun News é um projeto pessoal que virou um agregador em produção com mais de 6.000 leitores.
✦ Hands-On AI Engineering · Hamidun Academy

Build & Ship Production AI Agents Without Boilerplate Code

Start your free 72-hour trial at Hamidun Academy (academy.hamidun.com) — interactive lessons on Claude Code & Cursor, live Tech Radar, and production agent templates.

Start 72h Free Trial →Vibe-Coding Intensive
O que você acha?
Carregando comentários…