Almacenes de memoria del kernel semántico heredados
Sugerencia
Se recomienda usar las abstracciones del almacén de vectores en lugar de los almacenes de memoria heredados. Para obtener más información sobre cómo usar las abstracciones del almacén de vectores, empiece aquí.
El kernel semántico proporciona un conjunto de abstracciones del almacén de memoria donde la interfaz principal es Microsoft.SemanticKernel.Memory.IMemoryStore
.
Abstracciones de almacén de memoria frente a almacén de vectores
Como parte de un esfuerzo por evolucionar y expandir el almacenamiento de vectores y las capbilidades de búsqueda del kernel semántico, hemos lanzado un nuevo conjunto de abstracciones para reemplazar las abstracciones del almacén de memoria. Estamos llamando a las abstracciones de vector store de reemplazo. El propósito de ambos son similares, pero sus interfaces difieren y las abstracciones del almacén de vectores proporcionan funcionalidad expandida.
Característica | Almacenes de memoria heredados | Almacenes de vectores |
---|---|---|
Interfaz principal | IMemoryStore | IVectorStore |
Abstracciones del paquete nuget | Microsoft.SemanticKernel.Abstractions | Microsoft.Extensions.VectorData.Abstractions |
Convención de nomenclatura | {Provider}MemoryStore, por ejemplo, RedisMemoryStore | {Provider}VectorStore, por ejemplo, RedisVectorStore |
Admite el registro upsert, get y delete | Sí | Sí |
Admite la creación y eliminación de colecciones | Sí | Sí |
Admite la búsqueda de vectores | Sí | Sí |
Admite la elección del índice de búsqueda vectorial preferido y la función de distancia. | No | Sí |
Admite varios vectores por registro | No | Sí |
Admite esquemas personalizados | No | Sí |
Admite el filtrado previo de metadatos para la búsqueda de vectores | No | Sí |
Admite la búsqueda de vectores en bases de datos no vectoriales descargando todo el conjunto de datos en el cliente y realizando una búsqueda de vectores local. | Sí | No |
Conectores de almacenamiento de memoria disponibles
El kernel semántico ofrece varios conectores de almacenamiento de memoria a bases de datos vectoriales que puede usar para almacenar y recuperar información. Entre ellas se incluyen las siguientes:
Service | C# | Python |
---|---|---|
Base de datos vectorial en Azure Cosmos DB for noSQL | C# | Python |
Base de datos vectorial basada en núcleo virtual de Azure Cosmos DB for MongoDB | C# | Python |
Azure AI Search | C# | Python |
Azure PostgreSQL Server | C# | |
Azure SQL Database | C# | |
Chroma | C# | Python |
DuckDB | C# | |
Milvus | C# | Python |
Vector de búsqueda de MongoDB Atlas | C# | Python |
Pinecone | C# | Python |
Postgres | C# | Python |
Qdrant | C# | |
Redis | C# | |
Sqlite | C# | |
Weaviate | C# | Python |
Migración de almacenes de memoria a almacenes de vectores
Si desea migrar desde el uso de las abstracciones del almacén de memoria a las abtracciones del almacén de vectores, hay varias maneras en las que puede hacerlo.
Uso de la colección existente con las abstracciones del almacén de vectores
La manera más sencilla en muchos casos podría ser simplemente usar las abstracciones del almacén de vectores para acceder a una colección que se creó mediante las abstracciones del almacén de memoria. En muchos casos esto es posible, ya que la abstracción del almacén de vectores permite elegir el esquema que le gustaría usar. El requisito principal es crear un modelo de datos que coincida con el esquema que usó la implementación del almacén de memoria heredada.
Por ejemplo, para acceder a una colección creada por el almacén de memoria de Azure AI Search, puede usar el siguiente modelo de datos del almacén de vectores.
using Microsoft.Extensions.VectorData;
class VectorStoreRecord
{
[VectorStoreRecordKey]
public string Id { get; set; }
[VectorStoreRecordData]
public string Description { get; set; }
[VectorStoreRecordData]
public string Text { get; set; }
[VectorStoreRecordData]
public bool IsReference { get; set; }
[VectorStoreRecordData]
public string ExternalSourceName { get; set; }
[VectorStoreRecordData]
public string AdditionalMetadata { get; set; }
[VectorStoreRecordVector(VectorSize)]
public ReadOnlyMemory<float> Embedding { get; set; }
}
Sugerencia
Para obtener ejemplos más detallados sobre cómo usar las abstracciones del almacén de vectores para acceder a las colecciones creadas mediante un almacén de memoria, consulte aquí.
Crear una nueva colección
En algunos casos, la migración a una nueva colección puede ser preferible que usar directamente la colección existente. Es posible que el esquema elegido por el almacén de memoria no coincida con sus requisitos, especialmente en lo que respecta al filtrado.
Por ejemplo, el almacén de memoria de Redis usa un esquema con tres campos:
- metadatos de cadena
- marca de tiempo larga
- float[] inserción
Todos los datos que no sean la inserción o la marca de tiempo se almacenan como una cadena json serializada en el campo Metadatos. Esto significa que no es posible indexar los valores individuales y filtrarlos. Por ejemplo, quizás quiera filtrar mediante ExternalSourceName, pero esto no es posible mientras está dentro de una cadena json.
En este caso, puede ser mejor migrar los datos a una nueva colección con un esquema plano. Hay dos opciones aquí. Puede crear una nueva colección a partir de los datos de origen o simplemente asignar y copiar los datos del antiguo al nuevo. La primera opción puede ser más costosa, ya que tendrá que volver a generar las inserciones a partir de los datos de origen.
Sugerencia
Para obtener un ejemplo con Redis en el que se muestra cómo copiar datos de una colección creada mediante las abstracciones del almacén de memoria en una creada mediante las abstracciones del almacén de vectores, consulte aquí.