Поделиться через


Векторный поиск

Предупреждение

В настоящее время поиск вектора Azure Cosmos DB находится в предварительной версии. В результате при использовании API векторного поиска EF будет создано предупреждение "экспериментального API",EF9103 которое должно быть отложено. API и возможности могут измениться в критическом смысле в будущем.

Azure Cosmos DB теперь предлагает предварительную версию поддержки поиска сходства векторов. Векторный поиск является основной частью некоторых типов приложений, включая ИИ, семантический поиск и другие. Azure Cosmos DB позволяет хранить векторы непосредственно в документах вместе с остальными данными, что означает, что вы можете выполнять все запросы к одной базе данных. Это может значительно упростить архитектуру и удалить необходимость дополнительного выделенного решения векторной базы данных в стеке. Дополнительные сведения о поиске векторов Azure Cosmos DB см. в документации.

Чтобы использовать векторный поиск, необходимо сначала зарегистрировать в функции предварительной версии. Затем определите политики векторов в контейнере, чтобы определить, какие свойства JSON в документах содержат векторы и векторные сведения для этих свойств (измерения, тип данных, функция расстояния).

После правильной настройки контейнера добавьте свойство vector в модель в путь, определенный в политике контейнеров, и настройте его в EF в качестве вектора:

public class Blog
{
    ...

    public float[] Vector { get; set; }
}

public class BloggingContext
{
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Embeddings)
            .IsVector(DistanceFunction.Cosine, dimensions: 1536);
    }
}

На этом этапе модель настроена. Вставка векторных данных выполняется так же, как и любой другой тип данных с EF:

float[] vector = /* generate vector data from text, image, etc. */
context.Add(new Blog { Vector = vector });
await context.SaveChangesAsync();

Наконец, используйте функцию EF.Functions.VectorDistance() в запросах LINQ для выполнения поиска сходства векторов:

float[] anotherVector = /* generate vector data from text, image, etc. */
var blogs = await context.Blogs
    .OrderBy(s => EF.Functions.VectorDistance(s.Vector, anotherVector))
    .Take(5)
    .ToListAsync();

Это возвращает первые пять блогов на основе сходства их Vector свойства и внешних предоставленных anotherVector данных.