Passa al contenuto principale

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
denseSolo embedding vettoriale (default legacy)
bm25Solo sparse vector (testo keyword)
hybridFusione 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).