Reranking dokumen dengan Ollama dan model Qwen3 Reranker - dalam bahasa Go
Menerapkan RAG? Berikut beberapa potongan kode Go - 2...
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
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
- Reranking dokumen teks dengan Ollama dan Qwen3 Embedding model - dalam Go
- Qwen3 Embedding & Reranker Models di Ollama: Kinerja Terbaik
- Ollama cheatsheet
- Pasang dan Konfigurasi Lokasi Model Ollama
- Bagaimana Ollama Mengelola Permintaan Paralel
- Uji: Bagaimana Ollama Menggunakan Kinerja CPU Intel dan Core Efisien