إعادة ترتيب الوثائق باستخدام Ollama ونموذج Qwen3 Reranker - بلغة Go
هل تطبق RAG؟ إليك بعض أجزاء من كود Go - 2...
بما أن Ollama القياسي لا يحتوي على واجهة برمجة تطبيقات (API) لترتيب النتائج (Rerank) مباشرة، فإنك ستحتاج إلى تنفيذ ترتيب النتائج باستخدام نموذج Qwen3 Reranker في GO من خلال إنشاء تمثيلات (embeddings) للزوجات (query-document) وتصنيفها.
في الأسبوع الماضي، قمت ببعض ترتيب النتائج النصية باستخدام Ollama ونموذج Qwen3 Embedding - في Go.
اليوم سأجرب بعض نماذج Qwen3 Reranker.
هناك مجموعة كبيرة من النماذج الجديدة Qwen3 Embedding & Reranker Models على Ollama متاحة، أستخدم المتوسط - dengcao/Qwen3-Reranker-4B:Q5_K_M
تشغيل الاختبار: TL;DR
يعمل، وهو سريع نسبيًا، وليس طريقة قياسية تمامًا، لكنه لا يزال:
$ ./rnk ./example_query.txt ./example_docs
استخدام نموذج التمثيل: dengcao/Qwen3-Embedding-4B:Q5_K_M
عنوان URL الأساسي لـ Ollama: http://localhost:11434
معالجة ملف الاستعلام: ./example_query.txt، المجلد المستهدف: ./example_docs
الاستعلام: ما هو الذكاء الاصطناعي وكيف تعمل التعلم الآلي؟
تم العثور على 7 وثائق
استخراج تمثيل الاستعلام...
معالجة الوثائق...
=== ترتيب حسب التشابه ===
1. example_docs/ai_introduction.txt (الدرجة: 0.451)
2. example_docs/machine_learning.md (الدرجة: 0.388)
3. example_docs/qwen3-reranking-models.md (الدرجة: 0.354)
4. example_docs/ollama-parallelism.md (الدرجة: 0.338)
5. example_docs/ollama-reranking-models.md (الدرجة: 0.318)
6. example_docs/programming_basics.txt (الدرجة: 0.296)
7. example_docs/setup.log (الدرجة: 0.282)
تم معالجة 7 وثائق في 2.023 ثانية (متوسط: 0.289 ثانية لكل وثيقة)
ترتيب الوثائق باستخدام نموذج Reranker...
تنفيذ ترتيب النتائج باستخدام نهج المُدمج عبر النموذج مع dengcao/Qwen3-Reranker-4B:Q5_K_M
=== ترتيب باستخدام Reranker ===
1. example_docs/ai_introduction.txt (الدرجة: 0.343)
2. example_docs/machine_learning.md (الدرجة: 0.340)
3. example_docs/programming_basics.txt (الدرجة: 0.320)
4. example_docs/setup.log (الدرجة: 0.313)
5. example_docs/ollama-parallelism.md (الدرجة: 0.313)
6. example_docs/qwen3-reranking-models.md (الدرجة: 0.312)
7. example_docs/ollama-reranking-models.md (الدرجة: 0.306)
تم معالجة 7 وثائق في 1.984 ثانية (متوسط: 0.283 ثانية لكل وثيقة)
كود Reranker في Go لاستدعاء Ollama
استخدم معظم الكود من المنشور Reranking text documents with Ollama using Embedding...
وأضف هذه الأجزاء:
في نهاية دالة runRnk():
startTime = time.Now()
// ترتيب الوثائق باستخدام نموذج Reranker
fmt.Println("ترتيب الوثائق باستخدام نموذج Reranker...")
// rerankingModel := "dengcao/Qwen3-Reranker-0.6B:F16"
rerankingModel := "dengcao/Qwen3-Reranker-4B:Q5_K_M"
rerankedDocs, err := rerankDocuments(validDocs, query, rerankingModel, ollamaBaseURL)
if err != nil {
log.Fatalf("خطأ في ترتيب الوثائق: %v", err)
}
fmt.Println("\n=== ترتيب باستخدام Reranker ===")
for i, doc := range rerankedDocs {
fmt.Printf("%d. %s (الدرجة: %.3f)\n", i+1, doc.Path, doc.Score)
}
totalTime = time.Since(startTime)
avgTimePerDoc = totalTime / time.Duration(len(rerankedDocs))
fmt.Printf("\nتم معالجة %d وثائق في %.3fs (متوسط: %.3fs لكل وثيقة)\n",
len(rerankedDocs), totalTime.Seconds(), avgTimePerDoc.Seconds())
ثم أضف دالتين إضافيتين:
func rerankDocuments(validDocs []Document, query, rerankingModel, ollamaBaseURL string) ([]Document, error) {
// بما أن Ollama القياسي لا يحتوي على واجهة برمجة تطبيقات (API) مباشرة لترتيب النتائج، فسنتبع
// طريقة تنفيذ ترتيب النتائج من خلال إنشاء تمثيلات (embeddings) للزوجات (query-document) وتصنيفها
fmt.Println("تنفيذ ترتيب النتائج باستخدام نهج المُدمج عبر النموذج مع", rerankingModel)
rerankedDocs := make([]Document, len(validDocs))
copy(rerankedDocs, validDocs)
for i, doc := range validDocs {
// إنشاء محفز (prompt) لترتيب النتائج من خلال دمج الاستعلام والوثيقة
rerankPrompt := fmt.Sprintf("الاستعلام: %s\n\nالوثيقة: %s\n\nالصلة:", query, doc.Content)
// الحصول على تمثيل (embedding) للمحفز المدمج
embedding, err := getEmbedding(rerankPrompt, rerankingModel, ollamaBaseURL)
if err != nil {
fmt.Printf("تحذير: فشل في الحصول على تمثيل ترتيب النتائج للوثيقة %d: %v\n", i, err)
// الانتقال إلى درجة محايدة
rerankedDocs[i].Score = 0.5
continue
}
// استخدام مقدار التمثيل كدرجة ارتباط
// (هذا نهج مبسط - في الممارسة العملية، ستستخدم نموذجًا مُدربًا لترتيب النتائج)
score := calculateRelevanceScore(embedding)
rerankedDocs[i].Score = score
// fmt.Printf("تم ترتيب الوثيقة %d مع درجة: %.4f\n", i, score)
}
// ترتيب الوثائق حسب درجة الترتيب (من الأعلى إلى الأدنى)
sort.Slice(rerankedDocs, func(i, j int) bool {
return rerankedDocs[i].Score > rerankedDocs[j].Score
})
return rerankedDocs, nil
}
func calculateRelevanceScore(embedding []float64) float64 {
// تقييم بسيط بناءً على مقدار التمثيل والقيم الإيجابية
var sumPositive, sumTotal float64
for _, val := range embedding {
sumTotal += val * val
if val > 0 {
sumPositive += val
}
}
if sumTotal == 0 {
return 0
}
// تطبيع ودمج مقدار التمثيل مع التحيز الإيجابي
magnitude := math.Sqrt(sumTotal) / float64(len(embedding))
positiveRatio := sumPositive / float64(len(embedding))
return (magnitude + positiveRatio) / 2
}
لا تنسَ استيراد بعض الوظائف الرياضية
import (
"math"
)
الآن دعنا ن complied
go build -o rnk
و الآن دعنا نشغل هذا النموذج الأولي لتقنية RAG Reranker البسيطة
./rnk ./example_query.txt ./example_docs
روابط مفيدة
- ترتيب النتائج النصية باستخدام Ollama ونموذج Qwen3 Embedding - في Go
- Qwen3 Embedding & Reranker Models على Ollama: الأداء الأحدث
- قائمة مصطلحات Ollama
- تثبيت وتكوين موقع نماذج Ollama
- كيف يتعامل Ollama مع الطلبات المتزامنة
- اختبار: كيف يستخدم Ollama أداء وحدات المعالجة المركزية (CPU) من إنتل والوحدات الفعالة