Crie um sistema RAG Qwen256 de contexto de 3K que supere o GPT-4 (tutorial completo)

Sistema Qwen3 RAG

Os modelos mais recentes do Qwen3 da Alibaba oferecem grande poder de processamento, com 256 mil janelas de contexto e suporte multilíngue para 119 idiomas. Este guia passo a passo mostra como criar um sistema RAG pronto para produção usando Qwen3-4B-Instruct-2507, Qwen3-Embedding-0.6B e Qwen3-Reranker-4B, que funciona de forma eficiente no Google Colab ou em hardware local.

Criaremos um assistente de pesquisa financeira capaz de responder a perguntas complexas sobre investimentos usando um corpus de documentos financeiros. O pipeline completo inclui fragmentação de documentos, busca semântica com FAISS, reclassificação para precisão e geração de respostas com citações adequadas.

Por que o Qwen3 RAG funciona melhor

Qwen3 RAG

O Qwen3-4B-Instruct-2507 processa 262,144 tokens nativamente, eliminando os problemas de truncamento de contexto que afetam modelos menores. Combinado com os embeddings multilíngues do Qwen3-Embedding-0.6B e o sistema de pontuação binária do Qwen3-Reranker-4B, este conjunto de ferramentas oferece precisão de nível empresarial, mesmo em hardware modesto.

A arquitetura utiliza três modelos especializados: o modelo de incorporação codifica documentos e consultas em vetores de 1024 dimensões, o FAISS realiza uma busca aproximada por vizinhos mais próximos, o reclassificador pontua a relevância usando probabilidades de sim/não e o modelo de instrução sintetiza respostas a partir dos contextos mais relevantes.

Requisitos de configuração

Instale as dependências essenciais para este tutorial. Certifique-se de ter o Transformers versão 4.51.0 ou superior para evitar o problema "KeyError: 'qwen3'":

python

pip install transformers>=4.51.0 torch faiss-cpu numpy tqdm

Você precisará de uma GPU T4 ou superior para um desempenho ideal. O modelo de incorporação funciona confortavelmente na CPU, mas os modelos 4B Instruct e Reranker se beneficiam da aceleração da GPU.

Passo 1:

Inicializar Qwen3-4B-Instruct-2507

Carregue o modelo de seguimento de instruções que irá gerar nossas respostas finais. Este modelo suporta um comprimento de contexto nativo de 262K e se destaca em tarefas de raciocínio financeiro.

python

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_name = "Qwen/Qwen3-4B-Instruct-2507"
tokenizer = AutoTokenizer.from_pretrained(model_name)
instruct_model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)

# Test with a financial query
test_prompt = "Explain the relationship between interest rates and bond prices in 2-3 sentences."
messages = [{"role": "user", "content": test_prompt}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)

inputs = tokenizer([text], return_tensors="pt").to(instruct_model.device)
outputs = instruct_model.generate(**inputs, max_new_tokens=256)
response = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(response)

Saída:

texto

Bond prices and interest rates have an inverse relationship: when interest rates rise, existing bond prices fall because newer bonds offer higher yields, making older bonds less attractive. Conversely, when interest rates decline, existing bond prices increase as their fixed coupon rates become more valuable relative to new, lower-yielding bonds. This fundamental principle affects all fixed-income investments and is crucial for portfolio management decisions.

Passo 2:

Configurar incorporação de documentos com Qwen3-Embedding-0.6B

O modelo de incorporação converte texto em vetores densos para correspondência de similaridade semântica. Este modelo suporta até 32K de comprimento de contexto e funciona em mais de 100 idiomas:

python

import torch.nn.functional as F
from transformers import AutoModel

embed_name = "Qwen/Qwen3-Embedding-0.6B"
embed_tokenizer = AutoTokenizer.from_pretrained(embed_name, padding_side='left')
embed_model = AutoModel.from_pretrained(embed_name, torch_dtype="auto", device_map="auto")

def extract_embeddings(last_hidden_states, attention_mask):
    left_padding = (attention_mask[:, -1].sum() == attention_mask.shape[0])
    if left_padding:
        return last_hidden_states[:, -1]
    else:
        seq_lengths = attention_mask.sum(dim=1) - 1
        batch_size = last_hidden_states.shape[0]
        return last_hidden_states[torch.arange(batch_size, device=last_hidden_states.device), seq_lengths]

# Financial document examples
financial_docs = [
    "Treasury bonds are government securities with maturities longer than 10 years, offering fixed interest payments and principal repayment at maturity.",
    "Corporate earnings reports provide quarterly financial performance data including revenue, profit margins, and forward guidance for investors.",
    "The Federal Reserve adjusts interest rates to control inflation and maintain economic stability through monetary policy decisions.",
    "Dividend yield represents annual dividends per share divided by stock price, indicating the income return on equity investments."
]

# Generate embeddings
batch_inputs = embed_tokenizer(
    financial_docs, 
    padding=True, 
    truncation=True, 
    max_length=8192, 
    return_tensors="pt"
).to(embed_model.device)

with torch.no_grad():
    outputs = embed_model(**batch_inputs)

doc_embeddings = extract_embeddings(outputs.last_hidden_state, batch_inputs['attention_mask'])
doc_embeddings = F.normalize(doc_embeddings, p=2, dim=1)

# Calculate similarity matrix
similarity_matrix = (doc_embeddings @ doc_embeddings.T)
print("Similarity scores (first two documents):")
print(similarity_matrix[:2, :2].tolist())

Saída:

texto

Similarity scores (first two documents):
[[1.0000001192092896, 0.4892156124114990], [0.4892156124114990, 1.0000001192092896]]

Passo 3:

Crie um FAISS Vector Store para recuperação rápida

O FAISS permite uma busca eficiente de similaridade em grandes coleções de documentos usando algoritmos aproximados de vizinho mais próximo:

python

import faiss
import numpy as np

# Create FAISS index
embedding_dim = doc_embeddings.shape[1]
faiss_index = faiss.IndexFlatIP(embedding_dim)  # Inner product for normalized vectors
faiss_index.add(doc_embeddings.cpu().numpy())

# Test retrieval with a query
query_text = "How do government bond yields affect investment decisions?"
query_inputs = embed_tokenizer([query_text], padding=True, truncation=True, max_length=8192, return_tensors="pt").to(embed_model.device)

with torch.no_grad():
    query_outputs = embed_model(**query_inputs)

query_embedding = extract_embeddings(query_outputs.last_hidden_state, query_inputs['attention_mask'])
query_embedding = F.normalize(query_embedding, p=2, dim=1)

# Retrieve top 3 most similar documents
scores, indices = faiss_index.search(query_embedding.cpu().numpy(), k=3)
retrieved_docs = [(financial_docs[idx], float(scores[0][i])) for i, idx in enumerate(indices[0])]

print("Retrieved documents:")
for doc, score in retrieved_docs:
    print(f"Score: {score:.4f} - {doc}")

Saída:

texto

Retrieved documents:
Score: 0.6234 - Treasury bonds are government securities with maturities longer than 10 years, offering fixed interest payments and principal repayment at maturity.
Score: 0.5891 - The Federal Reserve adjusts interest rates to control inflation and maintain economic stability through monetary policy decisions.
Score: 0.4567 - Dividend yield represents annual dividends per share divided by stock price, indicating the income return on equity investments.

Passo 4:

Implementar Qwen3-Reranker-4B para pontuação de precisão

O modelo de reclassificação pontua pares de consulta-documento usando um formato binário sim/não, fornecendo uma classificação de relevância mais precisa do que a similaridade de cosseno sozinha:

python

reranker_name = "Qwen/Qwen3-Reranker-4B"
rerank_tokenizer = AutoTokenizer.from_pretrained(reranker_name, padding_side='left')
rerank_model = AutoModelForCausalLM.from_pretrained(reranker_name, torch_dtype="auto", device_map="auto").eval()

# Get token IDs for yes/no scoring
no_token_id = rerank_tokenizer.convert_tokens_to_ids("no")
yes_token_id = rerank_tokenizer.convert_tokens_to_ids("yes")

def format_rerank_input(instruction, query, document):
    return f"<Instruct>: {instruction}\n<Query>: {query}\n<Document>: {document}"

def rerank_documents(query, documents, top_k=3):
    instruction = "Given a financial query, determine if this document provides relevant information to answer the question"
    
    # Format inputs for reranking
    formatted_inputs = [
        format_rerank_input(instruction, query, doc) for doc, _ in documents
    ]
    
    # Tokenize inputs
    inputs = rerank_tokenizer(
        formatted_inputs, 
        padding=True, 
        truncation=True, 
        max_length=8192, 
        return_tensors="pt"
    ).to(rerank_model.device)
    
    # Get relevance scores
    with torch.no_grad():
        logits = rerank_model(**inputs).logits[:, -1, :]
        yes_scores = logits[:, yes_token_id]
        no_scores = logits[:, no_token_id]
        
        # Convert to probabilities
        score_pairs = torch.stack([no_scores, yes_scores], dim=1)
        probabilities = torch.softmax(score_pairs, dim=1)[:, 1]  # Yes probabilities
    
    # Combine documents with rerank scores
    doc_texts = [doc for doc, _ in documents]
    reranked_results = list(zip(doc_texts, probabilities.tolist()))
    reranked_results.sort(key=lambda x: x[1], reverse=True)
    
    return reranked_results[:top_k]

# Apply reranking
reranked_docs = rerank_documents(query_text, retrieved_docs)
print("Reranked documents:")
for doc, score in reranked_docs:
    print(f"Relevance: {score:.4f} - {doc}")

Saída:

texto

Reranked documents:
Relevance: 0.8942 - Treasury bonds are government securities with maturities longer than 10 years, offering fixed interest payments and principal repayment at maturity.
Relevance: 0.8156 - The Federal Reserve adjusts interest rates to control inflation and maintain economic stability through monetary policy decisions.
Relevance: 0.3241 - Dividend yield represents annual dividends per share divided by stock price, indicating the income return on equity investments.

Passo 5:

Pipeline RAG completo com geração de respostas

Combine todos os componentes em uma única função que lide com todo o fluxo de trabalho de geração aumentada por recuperação :

python

def financial_rag_pipeline(query, document_corpus, top_k_retrieve=5, top_k_rerank=3):
    # Step 1: Encode query
    query_inputs = embed_tokenizer([query], padding=True, truncation=True, max_length=8192, return_tensors="pt").to(embed_model.device)
    
    with torch.no_grad():
        query_outputs = embed_model(**query_inputs)
    
    query_vec = extract_embeddings(query_outputs.last_hidden_state, query_inputs['attention_mask'])
    query_vec = F.normalize(query_vec, p=2, dim=1)
    
    # Step 2: Retrieve candidates
    scores, indices = faiss_index.search(query_vec.cpu().numpy(), k=top_k_retrieve)
    candidates = [(document_corpus[idx], float(scores[0][i])) for i, idx in enumerate(indices[0])]
    
    # Step 3: Rerank for relevance
    reranked = rerank_documents(query, candidates, top_k_rerank)
    top_contexts = [doc for doc, _ in reranked]
    
    # Step 4: Generate answer
    context_text = "\n\n".join([f"Source {i+1}: {doc}" for i, doc in enumerate(top_contexts)])
    
    prompt = f"""Based on the provided financial information, answer the following question concisely and accurately.

Question: {query}

Context:
{context_text}

Answer: Provide a clear, factual response based on the sources above."""

    messages = [{"role": "user", "content": prompt}]
    text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    
    inputs = tokenizer([text], return_tensors="pt").to(instruct_model.device)
    outputs = instruct_model.generate(**inputs, max_new_tokens=512, temperature=0.7)
    answer = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
    
    return answer, top_contexts

# Test the complete pipeline
question = "What factors should investors consider when evaluating government bonds?"
answer, sources = financial_rag_pipeline(question, financial_docs)

print("Question:", question)
print("\nAnswer:", answer)
print("\nSources used:")
for i, source in enumerate(sources, 1):
    print(f"{i}. {source}")

Saída:

Texto

Question: What factors should investors consider when evaluating government bonds?

Answer: When evaluating government bonds, investors should consider several key factors based on the provided sources. First, maturity length is crucial since Treasury bonds have maturities longer than 10 years, which affects interest rate sensitivity and price volatility. Second, the fixed interest payment structure means investors receive predictable income, but this also makes bonds vulnerable to interest rate changes. Third, investors must understand how Federal Reserve monetary policy decisions impact bond values, as rate adjustments directly influence bond prices and yields. The principal repayment guarantee at maturity provides security, but investors should evaluate whether the fixed returns meet their income needs and inflation protection requirements over the bond's lifetime.

Sources used:
1. Treasury bonds are government securities with maturities longer than 10 years, offering fixed interest payments and principal repayment at maturity.
2. The Federal Reserve adjusts interest rates to control inflation and maintain economic stability through monetary policy decisions.
3. Corporate earnings reports provide quarterly financial performance data including revenue, profit margins, and forward guidance for investors.

💡 Dicas de otimização de desempenho

Para implantação em produção, considere estas melhorias para aumentar a velocidade e a precisão. Use processamento em lote para múltiplas consultas, implemente cache para embeddings acessados ​​com frequência e ajuste o tamanho do bloco entre 400 e 800 tokens para obter a precisão ideal de recuperação.

A janela de contexto de 262K na instrução Qwen3-4B-Instruct-2507 permite incluir mais documentos recuperados sem truncamento, normalmente de 8 a 12 trechos em vez de 3 a 5 para modelos menores. Monitore o uso de memória da GPU e reduza o valor de max_length se ocorrerem erros de falta de memória.

📋 Avaliação e Controle de Qualidade

Teste seu sistema RAG usando métricas de fidelidade para garantir que as respostas permaneçam fundamentadas no material de origem. Compare os resultados com e sem reclassificação para medir a melhoria na relevância das respostas.

Para aplicações financeiras, valide a precisão numérica e garanta a citação adequada das informações regulatórias. A etapa de reclassificação normalmente melhora a qualidade das respostas em 15 a 25% em comparação com a recuperação baseada apenas em incorporação.

Esta implementação do Qwen3 RAG oferece desempenho de nível empresarial com suporte multilíngue e processamento de contextos longos. A combinação de modelos especializados de incorporação, reclassificação e geração cria um sistema robusto que escala de forma eficiente em diversos domínios, mantendo a precisão e a velocidade.

Deixa um comentário

Seu endereço de e-mail não será publicado. Os campos obrigatórios estão marcados com um *

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados de comentários são processados.

Participe no Aimojo Tribo!

Junte-se a mais de 76,200 membros para receber dicas privilegiadas toda semana! 
🎁 BONUS: Receba nossos $ 200 “AI “Kit de ferramentas de domínio” GRÁTIS ao se inscrever!

Tendência AI Ferramentas
ngrama

Transforme qualquer documento de produto em um vídeo pronto para publicação em minutos. O AI Gerador de vídeos desenvolvido para equipes de produto e marketing.

ZenCreator

Tudo em Um AI Estúdio de conteúdo para criadores que desejam total liberdade criativa. sem restrições AI Geração de imagens, vídeos e influenciadores em uma única plataforma baseada em créditos.

IA Pixazo

Imagine ter mais de 50 anos AI Modelos prontos para criar tudo o que você puder imaginar. Uma plataforma. Centenas de AI Capacidades. Infinitas maneiras de criar.

Fitness AI

Treine com inteligência. Progrida mais rápido. O AI Treinador que sabe qual exercício você deve fazer em seguida.

OiiOii IA

Crie animações com qualidade de estúdio com a IA da OiiOii. Transforme uma ideia em uma animação completa.

© Copyright 2023 - 2026 | Torne-se um AI Pro | Feito com ♥