Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Azure DocumentDB ahora admite una potente funcionalidad de búsqueda híbrida que combina la búsqueda vectorial con la puntuación de búsqueda de texto completo mediante la función Reciprocal Rank Fusion (RRF).
¿Qué es la búsqueda híbrida?
La búsqueda híbrida aprovecha los puntos fuertes de los métodos de búsqueda basados en vectores y tradicionales basados en palabras clave para ofrecer resultados de búsqueda más relevantes y precisos. Esto se logra mediante la combinación de incrustaciones vectoriales y datos de texto dentro de los mismos documentos:
-
Búsqueda vectorial: utiliza modelos de aprendizaje automático para comprender el significado semántico de las consultas y documentos. Esto permite obtener resultados de búsqueda más conscientes del contexto, especialmente útiles para consultas complejas en las que la búsqueda de palabras clave tradicional podría no ser suficiente. Para una búsqueda eficaz de similitud vectorial, Azure DocumentDB ofrece tres
cosmosSearchíndices vectoriales compatibles: HNSW, OBJECT y DiskANN. -
Búsqueda de texto completo: Azure DocumentDB usa
$textel operador para la búsqueda de texto completo.
Los resultados de la búsqueda vectorial y la búsqueda de texto completo se combinan para devolver los resultados finales de búsqueda que se benefician de los puntos fuertes de ambos enfoques de búsqueda:
- Relevancia mejorada: al combinar la comprensión semántica con la coincidencia de palabras clave, la búsqueda híbrida puede proporcionar resultados más relevantes para una amplia gama de consultas.
- Precisión mejorada: la función RRF garantiza que se priorizan los resultados más pertinentes de ambos métodos de búsqueda.
- Versatilidad: adecuado para varios casos de uso, incluidos los sistemas de recomendación, la búsqueda semántica y la detección de contenido personalizado.
Uso de la búsqueda híbrida
- Cree una colección para almacenar los datos, incluido el contenido de texto y las inserciones vectoriales.
- Cree un índice vectorial en el campo de inserción de vectores mediante el
cosmosSearchoperador . - Cree un índice de texto completo en el campo de texto mediante los comandos de creación de índices estándar con el
$texttipo . - Utilice la canalización de agregación con el operador
$search(para la búsqueda de vectores) y el operador$text(para la búsqueda de texto completo), seguido de los pasos para implementar la fusión de rango recíproco para combinar las puntuaciones mediante el operador$unionWith.
Configuración de índices para la búsqueda híbrida
Crear un índice vectorial
db.runCommand({
"createIndexes": "yourCollectionName",
"indexes": [
{
"key": {
"vectorField": "cosmosSearch"
},
"name": "vectorIndex",
"cosmosSearchOptions": {
"kind": "vector-diskann", // "vector-ivf" , "vector-hnsw"
"similarity": "cosine", // "l2"
"dimensions": 3072 // Max 16,000
}
}
]
});
Creación de un índice de texto completo
db.runCommand({
"createIndexes": "yourCollectionName",
"indexes": [
{
"key": {
"textField": "text"
},
"name": "fullTextIndex"
}
]
});
Realización de búsquedas híbridas
db.hybrid_col.aggregate([
{ $search: { cosmosSearch: { path: "vector", vector: [0.1, 0.2, 0.3], k: 5 } } }, // Vector search
{ $group: { _id: null, vectorResults: { $push: "$$ROOT" } } },
{ $unwind: { path: "$vectorResults", includeArrayIndex: "vectorRank" } },
{ $addFields: { vs_score: { $divide: [1, { $add: ["$vectorRank", 1, 1] }] } } },
{ $project: { _id: "$vectorResults._id", title: "$vectorResults.text", vs_score: 1 } },
{ $unionWith: {
coll: "hybrid_col",
pipeline: [
{ $match: { $text: { $search: "cat" } } },
{ $addFields: { textScore: { $meta: "textScore" } } },
{ $group: { _id: null, textResults: { $push: "$$ROOT" } } },
{ $unwind: { path: "$textResults", includeArrayIndex: "textRank" } },
{ $addFields: { fts_score: { $divide: [1, { $add: ["$textRank", 10, 1] }] } } },
{ $project: { _id: "$_id", title: "$text", fts_score: 1 } }
]
}},
{ $group: {
_id: "$title",
finalScore: { $max: { $add: [{ $ifNull: ["$vs_score", 0] }, { $ifNull: ["$fts_score", 0] }] } }
}},
{ $sort: { finalScore: -1 } }
])
En este ejemplo, la primera $search fase realiza una búsqueda de similitud vectorial en el campo vectorial para el vector de consulta [0.1, 0.2, 0.3], devolviendo los cinco documentos más similares (k: 5). A continuación, la $group fase agrupa todos los resultados de búsqueda vectorial en un único documento con una matriz denominada vectorResults. Después de esto, la $unwind fase deconstruye la vectorResults matriz, creando un documento independiente para cada resultado y agregando su clasificación (vectorRank). La fase $addFields posterior calcula la puntuación de Fusión de clasificación recíproca (RRF) para cada resultado de vector de búsqueda en función de su clasificación. Después, la fase $project selecciona _id, titley el valor vs_score calculado de los resultados de vector de búsqueda.
Al pasar a la fase de búsqueda de texto, la $unionWith fase combina los resultados de la canalización de búsqueda vectorial con los de una canalización de búsqueda de texto completo independiente. En la fase de búsqueda de texto completo, la etapa $match con el operador $text realiza una búsqueda de texto completo para el término «cat» en el campo de texto. La $addFields etapa recupera la puntuación de relevancia (textScore) asignada por el operador $text. De forma similar a los resultados de la búsqueda vectorial, la $group fase agrupa todos los resultados de búsqueda de texto completo y la $unwind fase deconstruye la textResults matriz, agregando el rango (textRank). En este caso se usa una penalización diferente (10), que se puede ajustar. La fase $project selecciona los valores _id, title y fts_score en los resultados de la búsqueda de texto completo. Después de combinar los resultados, la fase $group agrupa los documentos por su valor title.
Por último, la $project fase calcula el finalScore de cada documento tomando el máximo de su puntuación de RRF vectorial (vs_score) y su puntuación de RRF de texto completo (fts_score).
$ifNull controla los casos en los que un documento solo puede estar presente en uno de los resultados de búsqueda.
Limitaciones
- La búsqueda de texto completo de Azure DocumentDB actualmente solo admite la clasificación BM25 en versión preliminar controlada.
- Actualmente, no hay ningún comando único dedicado para realizar una búsqueda híbrida directamente. Debe construir la consulta de búsqueda híbrida mediante la canalización de agregación, como se muestra en los ejemplos anteriores.