
Alibaba's de nyeste Qwen3-modeller har seriøs kraft med 256K kontekstvinduer og flersproget support på tværs af 119 sprog. Denne trinvise guide viser dig, hvordan du opbygger et produktionsklart RAG-system ved hjælp af Qwen3-4B-Instruct-2507, Qwen3-Embedding-0.6B og Qwen3-Reranker-4B, der kører effektivt på Google Colab eller lokal hardware.
Vi vil oprette en finansiel forskningsassistent, der kan besvare komplekse investeringsspørgsmål ved hjælp af et korpus af finansielle dokumenter. Den komplette pipeline inkluderer dokumentchunking, semantisk søgning med FAISS, genrangering for præcision og svargenerering med korrekte citater.
Hvorfor Qwen3 RAG fungerer bedre

Qwen3-4B-Instruct-2507 håndterer 262,144 tokens native, hvilket eliminerer problemer med kontekstafkortning, der plager mindre modeller. Kombineret med Qwen3-Embedding-0.6B'er flersprogede indlejringer og Qwen3-Reranker-4B's binært scoringssystem, denne stak giver nøjagtighed i virksomhedsklassen, mens den kører på beskeden hardware.
Arkitekturen bruger tre specialiserede modeller: indlejringsmodellen koder dokumenter og forespørgsler i 1024-dimensionelle vektorer, FAISS udfører en omtrentlig søgning efter nærmeste nabo, rerangereren scorer relevans ved hjælp af ja/nej-sandsynligheder, og instruct-modellen syntetiserer svar fra toprangerede kontekster.
Opsætningskrav
Installer de nødvendige afhængigheder til denne vejledning. Sørg for, at du har transformers version 4.51.0 eller nyere for at undgå problemet “KeyError: 'qwen3′”:
python
pip install transformers>=4.51.0 torch faiss-cpu numpy tqdm
Du skal bruge en T4 GPU eller bedre for optimal ydeevne. Embedding-modellen kører problemfrit på CPU, men 4B instruct- og reranker-modellerne drager fordel af GPU-acceleration.
Trin 1:
Initialiser Qwen3-4B-Instruct-2507
Indlæs den instruktionsfølgende model, der vil generere vores endelige svar. Denne model understøtter en native kontekstlængde på 262K og udmærker sig ved økonomiske ræsonnementopgaver:
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)
Output:
tekst
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.
Trin 2:
Opsæt dokumentindlejringer med Qwen3-Embedding-0.6B
Indlejringsmodellen konverterer tekst til tætte vektorer for semantisk lighedsmatchning. Denne model understøtter op til 32K kontekstlængde og fungerer på tværs af mere end 100 sprog:
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())
Output:
tekst
Similarity scores (first two documents):
[[1.0000001192092896, 0.4892156124114990], [0.4892156124114990, 1.0000001192092896]]
Trin 3:
Byg FAISS Vector Store til hurtig hentning
FAISS muliggør effektiv søgning efter ligheder på tværs af store dokumentsamlinger ved hjælp af algoritmer til omtrentlig nærmeste nabo:
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}")
Output:
tekst
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.
Trin 4:
Implementer Qwen3-Reranker-4B til præcisionsscoring
reranker model scorer forespørgsel-dokument-par ved hjælp af et binært ja/nej-format, hvilket giver en mere præcis relevansrangering end cosinus-lighed alene:
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}")
Output:
tekst
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.
Trin 5:
Komplet RAG-pipeline med svargenerering
Kombinér alle komponenter i én funktion, der håndterer det fulde hentningsudvidet genereringsworkflow:
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}")
Output:
tekst
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.
💡 Tips til optimering af ydeevne
Overvej disse forbedringer for at forbedre hastighed og nøjagtighed i forbindelse med produktionsimplementering. Brug batchbehandling til flere forespørgsler, implementer caching til ofte tilgåede indlejringer, og juster chunkstørrelsen mellem 400-800 tokens for optimal hentningspræcision.
Kontekstvinduet på 262K i Qwen3-4B-Instruct-2507 giver dig mulighed for at inkludere flere hentede dokumenter uden afkortning, typisk 8-12 passager mod 3-5 for mindre modeller. Overvåg GPU-hukommelsesforbrug og reducer max_length, hvis du støder på fejl på grund af manglende hukommelse.
📋 Evaluering og kvalitetskontrol
Test din RAG system Brug af troværdighedsmålinger for at sikre, at svarene forbliver baseret på kildematerialet. Sammenlign output med og uden omrangering for at måle forbedringen i svarrelevans.

For finansielle applikationer skal den numeriske nøjagtighed valideres, og der skal sikres korrekt citering af lovgivningsmæssige oplysninger. Omrangeringstrinnet forbedrer typisk svarkvaliteten med 15-25 % sammenlignet med ren indlejringsbaseret hentning.
Denne Qwen3 RAG-implementering leverer ydeevne i virksomhedsklassen med flersproget understøttelse og håndtering af lang kontekst. Kombinationen af specialiseret indlejring, rerangering og generationsmodeller skaber et robust system, der skalerer effektivt på tværs af domæner, samtidig med at det opretholder nøjagtighed og hastighed.

