مقدمه
در دنیای امروز، با گسترش هوش مصنوعی و نیاز به پردازش دادههای پیچیده، روشهای سنتی جستجو در پایگاههای داده دیگر به تنهایی کافی نیستند. جستجوی برداری (Vector Search) به عنوان یک رویکرد نوین، امکان یافتن شباهتهای معنایی بین دادهها را فراهم میکند. این روش با تبدیل دادهها به بردارهای عددی (Vectors) و استفاده از الگوریتمهای خاص، میتواند نتایج دقیقتری نسبت به جستجوی مبتنی بر کلمات کلیدی ارائه دهد. در این مقاله، به بررسی چگونگی پیادهسازی جستجوی برداری در پایگاه داده Azure SQL با استفاده از ابزارهای Semantic Kernel و Entity Framework Core میپردازیم. این آموزش برای توسعهدهندگان داتنت (Microsoft .NET Framework) طراحی شده است که به دنبال راهحلی کارآمد برای ادغام هوش مصنوعی در برنامههای خود هستند. هدف ما این است که با ارائه مفاهیم اصلی، ابزارها و مثالهای عملی، شما را در این مسیر همراهی کنیم.
جستجوی برداری چیست؟
جستجوی برداری روشی است که دادهها را به صورت بردارهای عددی در یک فضای چندبعدی نمایش میدهد. این بردارها معمولاً از مدلهای یادگیری ماشینی مانند مدلهای تعبیه (Embedding Models) تولید میشوند که معانی نهفته در متن، تصاویر یا سایر دادهها را استخراج میکنند. برخلاف جستجوی سنتی که بر تطابق دقیق کلمات تمرکز دارد، جستجوی برداری شباهت معنایی را اندازهگیری میکند. برای مثال، در یک برنامه که اسناد متنی را جستجو میکند، این روش میتواند اسنادی را پیدا کند که از نظر مفهومی مشابه هستند، حتی اگر کلمات یکسانی نداشته باشند.
چرا Azure SQL؟
پایگاه داده Azure SQL، یک پایگاه داده رابطهای قدرتمند است که اخیراً قابلیت پشتیبانی از نوع داده برداری (Vector Data Type) را به صورت پیشنمایش عمومی (Public Preview) اضافه کرده است. این امکان به توسعهدهندگان اجازه میدهد بدون نیاز به پایگاه دادههای برداری جداگانه مانند Qdrant یا Milvus، از قابلیتهای جستجوی برداری در کنار ویژگیهای رابطهای استفاده کنند. این رویکرد نه تنها هزینهها را کاهش میدهد، بلکه پیچیدگی مدیریت سیستم را نیز کمتر میکند. برای برنامههای داتنت که از Entity Framework Core استفاده میکنند، این ویژگی به راحتی قابل ادغام است.
ابزارهای مورد استفاده
- Azure SQL: پایگاه دادهای که نوع داده برداری را پشتیبانی میکند و امکان ذخیره و جستجوی بردارها را فراهم میآورد.
- Semantic Kernel: یک کتابخانه متنباز از مایکروسافت که توسعه برنامههای مبتنی بر هوش مصنوعی را ساده میکند. این ابزار برای تولید تعبیهها (Embeddings) و مدیریت تعاملات با مدلهای هوش مصنوعی استفاده میشود.
- Entity Framework Core: ابزاری برای دسترسی به دادهها در داتنت که با افزونه EFCore.SqlServer.VectorSearch، عملیات برداری را پشتیبانی میکند.
مراحل پیادهسازی
1. آمادهسازی محیط
ابتدا باید یک پایگاه داده Azure SQL ایجاد کنید و مطمئن شوید که نسخه آن از نوع داده برداری پشتیبانی میکند. سپس، پروژه داتنت خود را با نصب بستههای مورد نیاز آماده کنید:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package EFCore.SqlServer.VectorSearch --prerelease
dotnet add package Microsoft.SemanticKernel
2. تعریف مدل داده
برای ذخیره اسناد و بردارهای مرتبط، یک کلاس مدل تعریف میکنیم. فرض کنید میخواهیم اسناد PDF را ذخیره و جستجو کنیم:
public class Document
{
public int Id { get; set; }
public string FileName { get; set; }
public string Content { get; set; }
public float[] Embedding { get; set; }
}در اینجا، ویژگی Embedding از نوع آرایه اعداد اعشاری است که بردار تعبیه را ذخیره میکند.
3. پیکربندی Entity Framework Core
برای استفاده از نوع داده برداری در Azure SQL، باید مدل را در DbContext پیکربندی کنیم:
public class DocumentContext : DbContext
{
public DbSet<Document> Documents { get; set; }
public DocumentContext(DbContextOptions<DocumentContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Document>()
.Property(d => d.Embedding)
.HasColumnType("vector(1536)");
}
}عدد 1536 نشاندهنده اندازه پیشفرض بردار است که باید با مدل تعبیه شما مطابقت داشته باشد.
4. تولید تعبیهها با Semantic Kernel
Semantic Kernel به ما امکان میدهد از سرویس Azure OpenAI برای تولید تعبیهها استفاده کنیم. ابتدا سرویس را پیکربندی میکنیم:
var builder = Kernel.CreateBuilder();
builder.Services.AddAzureOpenAITextEmbeddingGeneration(
"text-embedding-ada-002",
"https://your-openai-endpoint",
"your-api-key"
);
var kernel = builder.Build();
var embeddingService = kernel.GetRequiredService<ITextEmbeddingGenerationService>();سپس، محتوای سند را به بردار تبدیل میکنیم:
async Task<float[]> GenerateEmbedding(string content)
{
var embeddings = await embeddingService.GenerateEmbeddingAsync(content);
return embeddings.ToArray();
}
5. ذخیره دادهها
برای ذخیره سند و بردار آن در پایگاه داده:
using var context = new DocumentContext(options);
var document = new Document
{
FileName = "sample.pdf",
Content = "متن نمونه از سند PDF",
Embedding = await GenerateEmbedding("متن نمونه از سند PDF")
};
context.Documents.Add(document);
await context.SaveChangesAsync();
6. اجرای جستجوی برداری
برای جستجو، از تابع VectorDistance در Entity Framework Core استفاده میکنیم تا شباهتها را محاسبه کنیم:
async Task<List<Document>> SearchDocuments(string query, int limit)
{
var queryEmbedding = await GenerateEmbedding(query);
using var context = new DocumentContext(options);
return await context.Documents
.OrderBy(d => EF.Functions.VectorDistance("cosine", d.Embedding, queryEmbedding))
.Take(limit)
.ToListAsync();
}این کد، اسنادی را که بیشترین شباهت معنایی با پرسوجوی ورودی دارند، برمیگرداند.
7. ادغام در برنامه
میتوانید این قابلیت را در یک برنامه Blazor یا API حداقلی (Minimal API) ادغام کنید. برای مثال، یک endpoint در Minimal API:
app.MapPost("/api/search", async (string query, DocumentContext context) =>
{
var results = await SearchDocuments(query, 5);
return Results.Ok(results);
});
مزایا و محدودیتها
استفاده از Azure SQL برای جستجوی برداری مزایایی مانند یکپارچگی با ابزارهای موجود داتنت، کاهش هزینهها و سادگی مدیریت را به همراه دارد. با این حال، محدودیتهایی مانند حداکثر اندازه بردار (1998 بعد در حال حاضر) و نیاز به بهروزرسانیهای مکرر در صورت تغییر دادهها نیز وجود دارد.
نتیجهگیری
جستجوی برداری با Azure SQL، Semantic Kernel و Entity Framework Core، راهحلی قدرتمند برای توسعهدهندگانی است که میخواهند قابلیتهای هوش مصنوعی را به برنامههای داتنت خود اضافه کنند. این روش، امکان جستجوی معنایی را بدون نیاز به زیرساختهای اضافی فراهم میکند و با ابزارهای آشنا مانند EF Core ادغام میشود. با دنبال کردن مراحل این آموزش، میتوانید اسناد را به بردار تبدیل کرده، در پایگاه داده ذخیره کنید و جستجوهای پیشرفته انجام دهید. این رویکرد نه تنها کارایی برنامههای شما را افزایش میدهد، بلکه تجربه کاربری بهتری نیز ارائه میکند. برای شروع، پیشنهاد میکنیم پروژه نمونه را آزمایش کنید و آن را با نیازهای خود سازگار کنید.