Embeddings & Vector Store
Come vengono generati e utilizzati gli embeddings, e come interagiamo con Qdrant.
Generazione embeddings (via Worker)
/main/src/agentTools/qdrantService.ts
export async function generateEmbeddings(text: string): Promise<number[]> {
const response = await addToQueue({ taskType: 'query:embedding', payload: { query: text } })
return response.data.taskResult
}
Client Qdrant
/main/src/index.ts
export const qdrantClient = new QdrantClient({ url: process.env.QDRANT_URL, apiKey: process.env.QDRANT_API_KEY, port: 6333 })
Ricerca vettoriale (dense)
/main/src/agentTools/qdrantService.ts
const searchResult = await qdrantClient.search(collectionName, { vector: queryEmbedding.flat(), limit, filter })
Ricerca Hybrid (dense + BM25 + RRF)
Da giugno 2026 le collection Qdrant supportano ricerca ibrida:
| Modalità | Descrizione |
|---|---|
dense | Solo embedding vettoriale (default legacy) |
bm25 | Solo sparse vector (testo keyword) |
hybrid | Fusione dense + BM25 con Reciprocal Rank Fusion (RRF) |
Configurazione via variabili d'ambiente (QDRANT_SEARCH_MODE, QDRANT_BM25_ENABLED). Il fallback automatico a dense avviene se la collection non ha sparse vectors configurati.
/hatchet/src/utilities/qdrantHybrid.ts
export function resolveCollectionSearchMode(collectionInfo): 'dense' | 'bm25' | 'hybrid' {
const supportsBm25 = collectionSupportsBm25(collectionInfo)
const requested = getQdrantSearchMode()
if (!supportsBm25) return 'dense'
if (requested === 'bm25' || requested === 'hybrid') return requested
return 'dense'
}
Il productRagSearchService usa hybrid/BM25 per la ricerca prodotti con reranking (RERANK_MIN_SCORE).