
علي بابا's تتمتع أحدث طرازات Qwen3 بقوة كبيرة مع 256 كيلو بايت من نوافذ السياق ودعم متعدد اللغات لأكثر من ١١٩ لغة. يوضح لك هذا الدليل التفصيلي كيفية بناء نظام RAG جاهز للإنتاج باستخدام Qwen119-3B-Instruct-4 وQwen2507-Embedding-3B وQwen0.6-Reranker-3B، والذي يعمل بكفاءة على Google Colab أو الأجهزة المحلية.
سنُنشئ مساعدًا للأبحاث المالية قادرًا على الإجابة على أسئلة استثمارية مُعقدة باستخدام مجموعة من الوثائق المالية. يتضمن المسار الكامل تقسيم الوثائق، والبحث الدلالي باستخدام FAISS، وإعادة التصنيف لضمان الدقة، وتوليد الإجابات مع الاستشهادات المناسبة.
لماذا يعمل Qwen3 RAG بشكل أفضل

يتعامل Qwen3-4B-Instruct-2507 مع 262,144 رمزًا بشكل أصلي، مما يُلغي مشاكل اقتطاع السياق التي تُصيب النماذج الأصغر. مُدمجًا مع Qwen3-Embedding-0.6B تضمينات متعددة اللغات و Qwen3-Reranker-4B's باستخدام نظام تسجيل ثنائي، توفر هذه المجموعة دقة على مستوى المؤسسة أثناء التشغيل على أجهزة متواضعة.
تستخدم الهندسة المعمارية ثلاثة نماذج متخصصة: نموذج التضمين يشفر المستندات والاستعلامات في متجهات ذات 1024 بُعدًا، فايس يُجري بحثًا تقريبيًا عن أقرب جار، ويقوم مُعيد الترتيب بتقييم الصلة باستخدام احتمالات نعم/لا، ويقوم نموذج التعليمات بتجميع الإجابات من السياقات الأعلى تصنيفًا.
متطلبات الإعداد
ثبّت التبعيات الأساسية لهذا البرنامج التعليمي. تأكد من تثبيت إصدار Transformers 4.51.0 أو أحدث لتجنب مشكلة "KeyError: 'qwen3'":
الثعبان
pip install transformers>=4.51.0 torch faiss-cpu numpy tqdm
ستحتاج إلى وحدة معالجة رسوميات T4 أو أفضل للحصول على أداء مثالي. يعمل نموذج التضمين بسلاسة على وحدة المعالجة المركزية، لكن نماذج 4B instruct وreranker تستفيد من تسريع وحدة معالجة الرسوميات.
الخطوة 1 :
تهيئة Qwen3-4B-Instruct-2507
حمّل نموذج التعليمات الذي سيُولّد إجاباتنا النهائية. يدعم هذا النموذج طول سياق أصلي يبلغ 262 كيلو بايت، ويتفوق في: مهام التفكير المالي:
الثعبان
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)
الإخراج:
نص
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.
الخطوة 2 :
إعداد تضمينات المستندات باستخدام Qwen3-Embedding-0.6B
يُحوّل نموذج التضمين النص إلى متجهات كثيفة لمطابقة التشابه الدلالي. يدعم هذا النموذج ما يصل إلى 32 ألف سياق، ويعمل بأكثر من 100 لغة.
الثعبان
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())
الإخراج:
نص
Similarity scores (first two documents):
[[1.0000001192092896, 0.4892156124114990], [0.4892156124114990, 1.0000001192092896]]
الخطوة 3 :
إنشاء متجر FAISS Vector للاسترجاع السريع
يتيح FAISS البحث الفعال عن التشابه عبر مجموعات المستندات الكبيرة باستخدام خوارزميات أقرب جار تقريبية:
الثعبان
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}")
الإخراج:
نص
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.
الخطوة 4 :
تنفيذ Qwen3-Reranker-4B للتسجيل الدقيق
استخدم نموذج إعادة التصنيف يقوم بتقييم أزواج الاستعلام-المستند باستخدام تنسيق ثنائي نعم/لا، مما يوفر تصنيفًا أكثر دقة للأهمية من تشابه جيب التمام وحده:
الثعبان
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}")
الإخراج:
نص
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.
الخطوة 5 :
خط أنابيب RAG الكامل مع إنشاء الإجابة
دمج جميع المكونات في وظيفة واحدة تتعامل مع المهمة الكاملة سير عمل التوليد المعزز بالاسترجاع:
الثعبان
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}")
الإخراج:
نص
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.
💡 نصائح لتحسين الأداء
لنشر البيانات في بيئة الإنتاج، يُرجى مراعاة هذه التحسينات لتحسين السرعة والدقة. استخدم المعالجة الدفعية للاستعلامات المتعددة، ونفّذ التخزين المؤقت للتضمينات التي يتم الوصول إليها بشكل متكرر، واضبط حجم الكتلة بين 400 و800 رمز لتحقيق دقة استرجاع مثالية.
تتيح لك نافذة السياق 262 كيلو بايت في Qwen3-4B-Instruct-2507 تضمين المزيد من المستندات المسترجعة دون اقتطاع، عادةً 8-12 فقرة مقابل 3-5 للنماذج الأصغر. مراقبة استخدام ذاكرة وحدة معالجة الرسومات وتقليل max_length إذا واجهت أخطاء نفاد الذاكرة.
📋 التقييم ومراقبة الجودة
اختبر ملفات نظام راج استخدام مقاييس الدقة لضمان انسجام الإجابات مع المصادر الأصلية. قارن النتائج مع إعادة الترتيب وبدونها لقياس مدى التحسن في ملاءمة الإجابات.

في التطبيقات المالية، يجب التحقق من دقة الأرقام وضمان الاستشهاد بالمعلومات التنظيمية بشكل صحيح. عادةً ما تُحسّن خطوة إعادة الترتيب جودة الإجابات بنسبة 15-25% مقارنةً بالاسترجاع القائم على التضمين فقط.
يوفر تطبيق Qwen3 RAG هذا أداءً مؤسسيًا عالي الجودة مع دعم متعدد اللغات ومعالجة طويلة السياق. ويجمع هذا المزيج بين التضمين المتخصص وإعادة الترتيب و نماذج الجيل إنشاء نظام قوي يتوسع بكفاءة عبر المجالات مع الحفاظ على الدقة والسرعة.

