جستجوی شباهت برداری با پایگاه داده Azure SQL و OpenAI

پایگاه داده های برداری اخیراً به دلیل این واقعیت است که با استفاده از جاسازی متن و عملیات برداری، یافتن “چیزهای” مشابه بسیار آسان است. چیزها می توانند مقالات، عکس ها، محصولات … همه چیز باشند. همانطور که به راحتی می توان تصور کرد، این توانایی برای پیاده سازی آسان پیشنهادات در برنامه ها عالی است. از ارائه پیشنهادات در مورد مقالات مشابه یا سایر محصولاتی که ممکن است مورد علاقه باشند، تا یافتن سریع و گروه بندی موارد مشابه، برنامه های کاربردی بسیار زیاد است.
یک مقاله عالی برای درک نحوه کار جاسازی ها، موارد زیر است: معرفی جاسازی متن و کد.
با خواندن مقالات ذکر شده، می توانید یاد بگیرید که “جاسازی ها نمایش عددی مفاهیم تبدیل شده به دنباله اعداد هستند که درک روابط بین آن مفاهیم را برای رایانه ها آسان می کند.”
به طور خاص تر، جاسازی ها بردار هستند … از این رو علاقه زیادی به پایگاه های داده برداری دارد.
اما آیا پایگاه داده های برداری واقعا مورد نیاز است؟ در پایان روز، یک بردار فقط فهرستی از اعداد است و یافتن اینکه آیا دو بردار یک شی مشابه را نشان میدهند، به آسانی محاسبه فاصله بین بردارها است. یکی از رایج ترین و مفیدترین معیارهای فاصله، فاصله کسینوس و حتی بهتر از آن شباهت کسینوس مربوطه است.
بخش پیچیده واقعی محاسبه جاسازی ها است، اما به لطف Azure OpenAI، همه یک سرویس REST به راحتی در دسترس دارند که می توانند با استفاده از مدل های ML از قبل آموزش دیده، جاسازی ها را دریافت کنند. در این مقاله از OpenAI برای تولید بردارهایی برای انجام جستجوی شباهت استفاده می کنیم و سپس از پایگاه داده Azure SQL برای ذخیره و جستجوی بردارهای مشابه استفاده می کنیم.
در این مقاله ما یک راه حل نمونه برای یافتن مقالات ویکی پدیا که به هر موضوعی که ممکن است به آن علاقه مندیم مرتبط باشند، می سازیم. طبق معمول همه کدها در GitHub موجود است:
https://github.com/Azure-Samples/azure-sql-db-openai
تعبیههای از پیش محاسبهشده، هم برای عنوان و هم برای متن، مجموعهای از مقالات ویکیپدیا، توسط OpenAI در اینجا در دسترس است:
https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip
وکتورها در پایگاه داده Azure SQL
بردارها را می توان به طور موثر در پایگاه داده Azure SQL توسط فهرست های ستونی ذخیره کرد. هیچ نوع داده خاصی برای ذخیره یک بردار در پایگاه داده Azure SQL وجود ندارد، اما میتوانیم از ذکاوت انسانی استفاده کنیم تا متوجه شویم که یک بردار فقط فهرستی از اعداد است. در نتیجه، میتوانیم با ایجاد ستونی حاوی دادههای برداری، بردار را به راحتی در جدول ذخیره کنیم. یک ردیف در هر عنصر برداری سپس میتوانیم از یک فهرست ستون برای ذخیره و جستجوی مؤثر بردارها استفاده کنیم.
با استفاده از این مقاله ویکی پدیا به عنوان نقطه شروع، می توانید ببینید که دو بردار وجود دارد، یکی برای ذخیره جاسازی عنوان و دیگری برای ذخیره جاسازی مقاله:
بردارها را می توان با کارایی بیشتری در جدولی مانند زیر ذخیره کرد:
CREATE TABLE [dbo].[wikipedia_articles_embeddings_titles_vector]
(
[article_id] [int] NOT NULL,
[vector_value_id] [int] NOT NULL,
[vector_value] [float] NOT NULL
)
در آن جدول میتوانیم یک فهرست ذخیره ستونی برای ذخیره و جستجوی مؤثر بردارها ایجاد کنیم. سپس فقط باید فاصله بین بردارها را محاسبه کنیم تا نزدیکترین آنها را پیدا کنیم. به لطف بهینه سازی داخلی ستون استور (که از دستورالعمل های SIMD AVX-512 برای سرعت بخشیدن به عملیات برداری استفاده می کند) محاسبه فاصله بسیار سریع است.
متداول ترین فاصله شباهت کسینوس است که به راحتی در SQL قابل محاسبه است.
محاسبه شباهت کسینوس
شباهت کسینوس را می توان در SQL با استفاده از فرمول زیر با توجه به دو بردار a و b محاسبه کرد:
SELECT
SUM(a.value * b.value) / (
SQRT(SUM(a.value * a.value)) * SQRT(SUM(b.value * b.value))
) AS cosine_similarity
FROM
vectors_values
واقعا راحته کاری که اکنون باید انجام شود این است که از سرویس Azure OpenAI REST پرس و جو کنید تا با توجه به هر متنی، بتوانیم نمایش برداری آن متن را دریافت کنیم. سپس میتوانیم از آن بردار برای محاسبه فاصله کسینوس در برابر همه مقالههای ویکیپدیا ذخیره شده در پایگاه داده استفاده کنیم و فقط نزدیکترین آنها را انتخاب کنیم که به احتمال زیاد مقاله را به موضوع مورد نظر ما متصل میکند.
درخواست OpenAI
یک منبع Azure OpenAI از طریق پورتال Azure ایجاد کنید. برای این نمونه خاص باید یک مدل Embedding را با استفاده از text-embedding-ada-002
مدلی که برای منبع مقالات ویکیپدیا که در این نمونه استفاده میکنیم، استفاده میشود. پس از انجام این کار، باید API KEY و URL مدل مستقر شده را دریافت کنید (مستندات Embeddings REST API را بخوانید) و سپس می توانید از sp_invoke_external_rest_endpoint برای فراخوانی REST API از پایگاه داده Azure SQL استفاده کنید.
declare @retval int, @response nvarchar(max);
declare @payload nvarchar(max) = json_object('input': 'Isaac Asimov');
exec @retval = sp_invoke_external_rest_endpoint
@url = 'https://<your-app-name>.openai.azure.com/openai/deployments/<deployment-id>/embeddings?api-version=2023-03-15-preview',
@method = 'POST',
@headers = '{"api-key":"<your api key>"}',
@payload = @payload,
@response = @response output;
The response is a vector of 1536 elements in JSON format. Vector values can be easily extracted using the following T-SQL code:
select [key] as value_id, [value] from openjson(@response, '$.result.data[0].embedding')
کد منبع
اگر علاقه مند هستید که این قابلیت شگفت انگیز را خودتان امتحان کنید، می توانید کد منبع را در اینجا بیابید:
https://github.com/Azure-Samples/azure-sql-db-openai
نتیجه
نمونه ارائه شده بهینه نیست. به عنوان مثال، مربع بردارها: SUM(a.value * a.value)
می تواند از قبل محاسبه شده و در یک جدول برای کارایی و عملکرد بهتر ذخیره شود. نمونه به طور هدفمند ساده است تا درک مفهوم را آسان تر کند. نمونه همچنین برای عملکرد بهینه نشده است، اما هنوز هم بسیار سریع است. در هشت پایگاه داده vCore Azure SQL، نیم ثانیه برای بازگشت پنجاه مقاله مشابه مورد نیاز است. فاصله کسینوس بر روی 25000 مقاله برای مجموع 38 میلیون مقدار برداری محاسبه شده است. خیلی جالب، سریع و مفید!