Reranking dokumen dengan Ollama dan model Qwen3 Reranker - dalam bahasa Go

Menerapkan RAG? Berikut beberapa potongan kode Go - 2...

Konten Halaman

Karena Ollama standar tidak memiliki API rerank langsung, Anda perlu menerapkan reranking menggunakan Qwen3 Reranker dalam GO dengan menghasilkan embedding untuk pasangan query-dokumen dan memberi skor mereka.

Minggu lalu saya melakukan sedikit Reranking dokumen teks dengan Ollama dan Qwen3 Embedding model - dalam Go.

Hari ini akan mencoba beberapa model Qwen3 Reranker. Ada cukup banyak model baru Qwen3 Embedding & Reranker Models di Ollama yang tersedia, saya menggunakan medium - dengcao/Qwen3-Reranker-4B:Q5_K_M

reranking dogs

Jalur Uji: TL;DR

Ini berfungsi, dan cukup cepat, bukan cara standar, tetapi tetap:

$ ./rnk ./example_query.txt ./example_docs

Menggunakan model embedding: dengcao/Qwen3-Embedding-4B:Q5_K_M
URL dasar Ollama: http://localhost:11434
Memproses file query: ./example_query.txt, direktori target: ./example_docs
Query: Apa itu kecerdasan buatan dan bagaimana mesin belajar bekerja?
Ditemukan 7 dokumen
Mengekstrak embedding query...
Memproses dokumen...

=== PEMBAGIAN BERDASARKAN KEMIRIPAN ===
1. example_docs/ai_introduction.txt (Skor: 0.451)
2. example_docs/machine_learning.md (Skor: 0.388)
3. example_docs/qwen3-reranking-models.md (Skor: 0.354)
4. example_docs/ollama-parallelism.md (Skor: 0.338)
5. example_docs/ollama-reranking-models.md (Skor: 0.318)
6. example_docs/programming_basics.txt (Skor: 0.296)
7. example_docs/setup.log (Skor: 0.282)

Telah memproses 7 dokumen dalam 2.023s (rata-rata: 0.289s per dokumen)
Melakukan reranking dokumen dengan model reranker...
Menerapkan reranking menggunakan pendekatan cross-encoder dengan dengcao/Qwen3-Reranker-4B:Q5_K_M

=== PEMBAGIAN DENGAN RERANKER ===
1. example_docs/ai_introduction.txt (Skor: 0.343)
2. example_docs/machine_learning.md (Skor: 0.340)
3. example_docs/programming_basics.txt (Skor: 0.320)
4. example_docs/setup.log (Skor: 0.313)
5. example_docs/ollama-parallelism.md (Skor: 0.313)
6. example_docs/qwen3-reranking-models.md (Skor: 0.312)
7. example_docs/ollama-reranking-models.md (Skor: 0.306)

Telah memproses 7 dokumen dalam 1.984s (rata-rata: 0.283s per dokumen)

Kode Reranker dalam Go untuk memanggil Ollama

Ambil sebagian besar kode dari posting Reranking dokumen teks dengan Ollama menggunakan Embedding... dan tambahkan bagian-bagian berikut:

Di akhir fungsi runRnk():

  startTime = time.Now()
	// rerank menggunakan model reranker
	fmt.Println("Melakukan reranking dokumen dengan model 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("Kesalahan reranking dokumen: %v", err)
	}

	fmt.Println("\n=== PEMBAGIAN DENGAN RERANKER ===")
	for i, doc := range rerankedDocs {
		fmt.Printf("%d. %s (Skor: %.3f)\n", i+1, doc.Path, doc.Score)
	}

	totalTime = time.Since(startTime)
	avgTimePerDoc = totalTime / time.Duration(len(rerankedDocs))

	fmt.Printf("\nTelah memproses %d dokumen dalam %.3fs (rata-rata: %.3fs per dokumen)\n",
		len(rerankedDocs), totalTime.Seconds(), avgTimePerDoc.Seconds())

Kemudian tambahkan beberapa fungsi lagi:

func rerankDocuments(validDocs []Document, query, rerankingModel, ollamaBaseURL string) ([]Document, error) {
	// Karena Ollama standar tidak memiliki API rerank langsung, kita akan menerapkan
	// reranking dengan menghasilkan embedding untuk pasangan query-dokumen dan memberi skor mereka

	fmt.Println("Menerapkan reranking menggunakan pendekatan cross-encoder dengan", rerankingModel)

	rerankedDocs := make([]Document, len(validDocs))
	copy(rerankedDocs, validDocs)

	for i, doc := range validDocs {
		// Membuat prompt untuk reranking dengan menggabungkan query dan dokumen
		rerankPrompt := fmt.Sprintf("Query: %s\n\nDokumen: %s\n\nRelevansi:", query, doc.Content)

		// Mendapatkan embedding untuk prompt yang digabungkan
		embedding, err := getEmbedding(rerankPrompt, rerankingModel, ollamaBaseURL)
		if err != nil {
			fmt.Printf("Peringatan: Gagal mendapatkan embedding rerank untuk dokumen %d: %v\n", i, err)
			// Jatuh kembali ke skor netral
			rerankedDocs[i].Score = 0.5
			continue
		}

		// Gunakan magnitudo dari embedding sebagai skor relevansi
		// (Ini adalah pendekatan sederhana - dalam praktiknya, Anda akan menggunakan reranker yang dilatih)
		score := calculateRelevanceScore(embedding)
		rerankedDocs[i].Score = score
		// fmt.Printf("Dokumen %d reranked dengan skor: %.4f\n", i, score)
	}

	// Urutkan dokumen berdasarkan skor reranking (menurun)
	sort.Slice(rerankedDocs, func(i, j int) bool {
		return rerankedDocs[i].Score > rerankedDocs[j].Score
	})

	return rerankedDocs, nil
}

func calculateRelevanceScore(embedding []float64) float64 {
	// Penilaian sederhana berdasarkan magnitudo embedding dan nilai positif
	var sumPositive, sumTotal float64
	for _, val := range embedding {
		sumTotal += val * val
		if val > 0 {
			sumPositive += val
		}
	}

	if sumTotal == 0 {
		return 0
	}

	// Normalisasi dan gabungkan magnitudo dengan bias positif
	magnitude := math.Sqrt(sumTotal) / float64(len(embedding))
	positiveRatio := sumPositive / float64(len(embedding))

	return (magnitude + positiveRatio) / 2
}

Jangan lupa untuk mengimpor sedikit math

import (
	"math"
)

Sekarang mari kita kompilasi

go build -o rnk

dan sekarang jalankan prototipe sederhana RAG reranker ini

./rnk ./example_query.txt ./example_docs

Tautan yang Berguna