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.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.