Start Debugging

EF Core 11 добавляет нативный векторный поиск SQL Server с индексами DiskANN

EF Core 11 Preview 2 поддерживает VECTOR_SEARCH() из SQL Server 2025 и векторные индексы DiskANN прямо из LINQ. Вот как настроить индекс, выполнять приближённые запросы, и что меняется по сравнению с подходом VectorDistance из EF Core 10.

EF Core 10 представил EF.Functions.VectorDistance() для вычисления точных расстояний между эмбеддингами в LINQ-запросах. Это работает, но точный поиск по миллионам строк дорог. EF Core 11 Preview 2 закрывает этот пробел, поддерживая приближённый векторный поиск SQL Server 2025: индексы DiskANN и табличную функцию VECTOR_SEARCH(), всё подключённое через ваш DbContext.

Настройка векторного индекса

Объявите индекс в OnModelCreating с нужной метрикой расстояния (косинусная, скалярное произведение или евклидова):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasVectorIndex(b => b.Embedding, "cosine");
}

Когда вы добавляете миграцию, EF генерирует DDL CREATE VECTOR INDEX, нацеленный на движок DiskANN из SQL Server 2025. Индекс живёт рядом с вашими обычными B-tree и полнотекстовыми индексами, управляемый через тот же конвейер миграций.

Запросы через VectorSearch()

Когда индекс существует, используйте новый метод-расширение VectorSearch() на вашем DbSet:

float[] queryEmbedding = GetEmbeddingForQuery("distributed caching");

var results = await context.Blogs
    .VectorSearch(b => b.Embedding, "cosine", queryEmbedding, topN: 5)
    .ToListAsync();

Это транслируется в табличную функцию VECTOR_SEARCH() SQL Server, которая выполняет приближённый поиск ближайших соседей по индексу DiskANN. Параметр topN ограничивает, сколько результатов возвращается.

Тип возврата — VectorSearchResult<TEntity>, который раскрывает как сущность, так и вычисленное расстояние:

var results = await context.Blogs
    .VectorSearch(b => b.Embedding, "cosine", queryEmbedding, topN: 10)
    .Select(r => new { r.Value.Name, r.Distance })
    .ToListAsync();

Точный против приближённого: когда что использовать

VectorDistance() из EF Core 10 по-прежнему работает и даёт точные результаты. Используйте его, когда набор данных мал или точность важнее задержки. VectorSearch() с индексом DiskANN обменивает небольшое количество точности recall на значительно лучшую пропускную способность на больших таблицах.

На практике большинство RAG-нагрузок и нагрузок рекомендаций хотят приближённый путь. Если ранее вы выгружали векторный поиск в выделенную базу данных (Qdrant, Pinecone, pgvector), это возвращает его в SQL Server, который вы уже запускаете, с EF Core, управляющим схемой.

Требования

Эта функциональность нацелена на SQL Server 2025, где были введены векторные индексы DiskANN. Функция VECTOR_SEARCH() и связанный с ней синтаксис CREATE VECTOR INDEX экспериментальны в SQL Server на момент написания, поэтому ожидайте изменений. API EF Core отражают этот экспериментальный статус.

Для полных деталей настройки см. документацию по векторному поиску EF Core.

< Назад