Créez un système RAG Qwen256 de 3 Ko qui surpasse GPT-4 (tutoriel complet)

Système Qwen3 RAG

Les derniers modèles Qwen3 d'Alibaba offrent une puissance considérable avec 256 000 fenêtres de contexte et une prise en charge multilingue de 119 langues. Ce guide pas à pas vous montre comment créer un système RAG prêt pour la production à l'aide de Qwen3-4B-Instruct-2507, Qwen3-Embedding-0.6B et Qwen3-Reranker-4B, fonctionnant efficacement sur Google Colab ou sur un matériel local.

Nous créerons un assistant de recherche financière capable de répondre à des questions d'investissement complexes à partir d'un corpus de documents financiers. Le processus complet comprend le découpage des documents, la recherche sémantique avec FAISS, le reclassement pour plus de précision et la génération de réponses avec des citations appropriées.

Pourquoi Qwen3 RAG fonctionne mieux

Qwen3 RAG

Qwen3-4B-Instruct-2507 gère nativement 262 144 jetons, éliminant ainsi les problèmes de troncature de contexte qui affectent les modèles plus petits. Associé aux plongements multilingues de Qwen3-Embedding-0.6B et au système de score binaire de Qwen3-Reranker-4B, cet ensemble offre une précision de niveau professionnel tout en fonctionnant sur du matériel modeste.

L'architecture utilise trois modèles spécialisés : le modèle d'intégration encode les documents et les requêtes en vecteurs de 1024 dimensions, FAISS effectue une recherche approximative du plus proche voisin, le réorganisateur évalue la pertinence à l'aide de probabilités oui/non et le modèle d'instruction synthétise les réponses à partir des contextes les mieux classés.

Configuration requise

Installez les dépendances essentielles pour ce tutoriel. Assurez-vous d'avoir la version 4.51.0 ou supérieure de Transformers pour éviter le problème « KeyError: 'qwen3' » :

python

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

Pour des performances optimales, vous aurez besoin d'un GPU T4 ou supérieur. Le modèle d'intégration fonctionne confortablement sur le CPU, mais les modèles d'instructions et de reranking 4B bénéficient de l'accélération GPU.

Étape 1 :

Initialiser Qwen3-4B-Instruct-2507

Chargez le modèle de suivi d'instructions qui générera nos réponses finales. Ce modèle prend en charge une longueur de contexte native de 262 Ko et excelle dans les tâches de raisonnement financier.

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)

Sortie :

texte

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.

Étape 2 :

Configurer l'intégration de documents avec Qwen3-Embedding-0.6B

Le modèle d'intégration convertit le texte en vecteurs denses pour la recherche de similarité sémantique. Ce modèle prend en charge des contextes jusqu'à 32 Ko et fonctionne dans plus de 100 langues :

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())

Sortie :

texte

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

Étape 3 :

Créer un magasin vectoriel FAISS pour une récupération rapide

FAISS permet une recherche de similarité efficace dans de grandes collections de documents à l'aide d'algorithmes de voisinage approximatif les plus proches :

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}")

Sortie :

texte

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.

Étape 4 :

Implémenter Qwen3-Reranker-4B pour une notation précise

Le modèle de reclassement évalue les paires requête-document à l'aide d'un format binaire oui/non, fournissant un classement de pertinence plus précis que la similarité cosinus seule :

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}")

Sortie :

texte

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.

Étape 5 :

Pipeline RAG complet avec génération de réponses

Combiner tous les composants en une seule fonction qui gère l'intégralité du flux de travail de génération augmentée par la récupération :

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}")

Sortie :

Texte

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.

💡 Conseils d'optimisation des performances

Pour un déploiement en production, envisagez ces améliorations pour gagner en rapidité et en précision. Utilisez le traitement par lots pour les requêtes multiples, implémentez la mise en cache pour les intégrations fréquemment consultées et ajustez la taille des blocs entre 400 et 800 jetons pour une précision de récupération optimale.

La fenêtre de contexte de 262 Ko de Qwen3-4B-Instruct-2507 permet d'inclure davantage de documents récupérés sans troncature, généralement 8 à 12 passages au lieu de 3 à 5 pour les modèles plus petits. Surveillez l'utilisation de la mémoire GPU et réduisez la valeur de max_length en cas d'erreurs de mémoire insuffisante.

📋 Évaluation et contrôle qualité

Testez votre système RAG à l'aide de métriques de fidélité pour vous assurer que les réponses restent ancrées dans les sources. Comparez les résultats avec et sans réévaluation du classement pour mesurer l'amélioration de la pertinence des réponses.

Pour les applications financières, validez l'exactitude numérique et assurez-vous de citer correctement les informations réglementaires. L'étape de reclassement améliore généralement la qualité des réponses de 15 à 25 % par rapport à une recherche par intégration pure.

Cette implémentation Qwen3 RAG offre des performances de niveau entreprise avec prise en charge multilingue et gestion des contextes longs. La combinaison de modèles spécialisés d'intégration, de réordonnancement et de génération crée un système robuste qui s'adapte efficacement à différents domaines tout en conservant précision et rapidité.

Laissez un commentaire

Votre adresse courriel n'apparaitra pas. Les champs obligatoires sont marqués *

Ce site utilise Akismet pour réduire les spams. Découvrez comment vos données de commentaires sont traitées.

Inscrivez-vous à la Aimojo Tribu!

Rejoignez plus de 76,000 XNUMX membres pour des conseils d'initiés chaque semaine ! 
🎁 BONUS: Obtenez notre 200 $ «AI « Boîte à outils de maîtrise » GRATUITE lors de votre inscription !

Tendances AI Outils
accéder

AI Conformité simplifiée aux normes ADA et EAA grâce à l'énergie Solutions automatisées de mise en conformité avec les WCAG et assistance juridique pour toutes les entreprises

Parler au

Transformez instantanément chaque pensée exprimée en un texte soigné et prêt à être envoyé. Première mondiale AI matériel de communication pour iPhone

IA perverse

Vos fantasmes, vos règles : Explorez Kink AI. Explorez les jeux de rôle BDSM et discutez de vos fantasmes avec Kink AI.

 

Aifetchly

L'Open Source AI Agent qui remet l'automatisation des processus métier sur votre machine Une première locale AI Espace de travail pour la recherche, les documents et les flux de travail planifiés.

Bulin AI

Transformez n'importe quelle photo en une performance freestyle virale de Bulin 47 en quelques secondes. Le AI Générateur vidéo conçu pour une scène de rue emblématique.

© Copyright 2023 - 2026 | Devenez un AI Pro | Fait avec ♥