Sobes.tech
Middle+
20

Как отсортировать 20 чанков и выбрать топ-5 наиболее релевантных для передачи в LLM?

Компании, где спрашивали
Сбербанк

Ответ от нейросети

sobes.tech AI

Чтобы отсортировать 20 чанков и выбрать топ-5 наиболее релевантных для передачи в LLM, обычно используют метрику релевантности — например, косинусное сходство между вектором запроса и векторами чанков.

Примерный алгоритм:

  1. Для каждого чанка получить векторное представление (эмбеддинг).
  2. Получить эмбеддинг запроса.
  3. Вычислить косинусное сходство между запросом и каждым чанком.
  4. Отсортировать чанки по убыванию сходства.
  5. Выбрать первые 5 чанков.

Пример на Go с использованием срезов и сортировки:

import (
    "sort"
    "math"
)

type Chunk struct {
    Text string
    Embedding []float64
}

type ScoredChunk struct {
    Chunk Chunk
    Score float64
}

func cosineSimilarity(a, b []float64) float64 {
    var dot, normA, normB float64
    for i := range a {
        dot += a[i] * b[i]
        normA += a[i] * a[i]
        normB += b[i] * b[i]
    }
    if normA == 0 || normB == 0 {
        return 0
    }
    return dot / (math.Sqrt(normA) * math.Sqrt(normB))
}

func topKRelevantChunks(chunks []Chunk, queryEmbedding []float64, k int) []Chunk {
    scored := make([]ScoredChunk, len(chunks))
    for i, chunk := range chunks {
        scored[i] = ScoredChunk{
            Chunk: chunk,
            Score: cosineSimilarity(chunk.Embedding, queryEmbedding),
        }
    }
    sort.Slice(scored, func(i, j int) bool {
        return scored[i].Score > scored[j].Score
    })
    result := make([]Chunk, 0, k)
    for i := 0; i < k && i < len(scored); i++ {
        result = append(result, scored[i].Chunk)
    }
    return result
}

Таким образом, вы выбираете наиболее релевантные чанки для передачи в LLM, что повышает качество ответа и экономит ресурсы.