اخبار تکنولوژی

ساخت و درک یک پایگاه داده برداری از ابتدا در 10 مرحله آسان

در این مقاله، نحوه عملکرد یک پایگاه داده برداری را با ساختن یک پایگاه داده از ابتدا در ده مرحله گام به گام با استفاده از Python و NumPy خواهید آموخت.

موضوعاتی که به آنها خواهیم پرداخت عبارتند از:

  • چگونه اسناد در بردارهایی با اندازه ثابت کدگذاری می شوند و به جای کلمه کلیدی بر اساس معنی جستجو می شوند.
  • چگونه می توان فیلتر ابرداده، اعتبار سنجی ورودی و ماندگاری را به یک پایگاه داده حداقل بردار اضافه کرد.
  • چگونه تشابه کسینوس خشن با اندازه جسم مقیاس می شود و چه زمانی باید نمایه سازی تقریبی را در نظر گرفت.

یک پایگاه داده برداری از ابتدا در 10 مرحله آسان بسازید

ارائه پایگاه های داده برداری

پایگاه داده برداری به سؤالات با معنی پاسخ می دهد، نه با کلمه کلیدی. با تبدیل هر سند به بردار اعداد و سپس یافتن اعدادی که در جهتی شبیه به درخواست شما هستند (که به بردار اعداد نیز تبدیل می شود) کار می کند. این آموزش نحوه ایجاد پایگاه داده برداری کار خود را از طریق ده مرحله نشان می دهد که هر کدام یک ایده اتمی را نشان می دهد. برای دنبال کردن، یک اسکریپت خالی ایجاد کنید و نام آن را با چیزی هوشمندانه انجام دهید tutorial.py. در حین حرکت، کد هر مرحله را به اسکریپت اضافه کنید و بعد از اینکه نظر را معنی کردید دوباره آن را اجرا کنید. خروجی باید در این مرحله منطقی باشد. هیچ چیز در اینجا به GPU یا کلید API نیاز ندارد. یک مدل کوچک در اولین راه اندازی دانلود می شود و همه چیز پس از آن NumPy ساده است.

نقطه 1: Настройка

شما به سه فایل از این مخزن در فهرست کاری خود نیاز دارید: vector_db.py پایگاه داده واقعی است که، بله، قبلاً برای شما ساخته شده است… اما جادوی واقعی درک کد و تعامل با آن با استفاده از کد اینجاست. خبر خوب این است که وقتی این آموزش را طی کردید و کد را درک کردید، ایجاد مجدد پایگاه داده برداری خودتان تقریباً بی اهمیت است. corpus.py شامل 25 سند نمونه شبیه سازی شده و برچسب های موضوعی آنها می باشد. test.py مجموعه آزمایشی است، فقط در اینجا برای ایجاد احساس امنیت و اطمینان از اینکه پایگاه داده برداری به درستی کار می کند، که می توانید با اجرای آن در هر نقطه با python test.py.

دو وابستگی را نصب کنید:

حالا مال خودت رو شروع کن tutorial.py فایل با import و دو کمک کننده کوچک نمایشگر. show() فهرستی از نتایج جستجو را به عنوان نتیجه، موضوع، سند چاپ می کند (که بعداً به آنها تکیه خواهد شد). header() به سادگی هر بخش را برچسب گذاری می کند تا خروجی اسکریپت در حال رشد قابل خواندن باقی بماند.

اکنون اجرای اسکریپت هیچ نتیجه ای بر نمی گرداند. این چیزی است که ما می خواهیم؛ هنوز چیزی فراخوانی نشده است

مرحله 2: نمایه را بسازید

ایجاد یک VectorDB مدل تعبیه را بارگذاری می کند و add() هر سند را در یک برداری رمزگذاری می کند و آن را ذخیره می کند.

خروجی:

توجه داشته باشید که اندازه شاخص به طول مدارک بستگی ندارد. هر سند، چه یک جمله شش کلمه ای یا یک مقاله شش صفحه ای، به همان 384 عدد 4 بایتی تبدیل می شود: 1536 بایت، مسطح. این ثابت است و چیزی است که شاخص برداری را از نظر اندازه قابل پیش بینی و اسکن ارزان می کند.

مرحله 3: ابتدا جستجو کنید

خروجی:

ضربه بالا دقیقاً یک کلمه را با پرس و جو به اشتراک می گذارد (“سلول”)، و رتبه دوم هیچ کلمه ای را به اشتراک نمی گذارد. ایندکس کلمات کلیدی اگر اصلاً آنها را پیدا کند، آنها را بسیار متفاوت رتبه بندی می کند.

مرحله 4: بدون اشتراک گذاری یک کلمه جستجو کنید

خروجی:

تمام هدف تمرین همین است. هیچ یک از این دو پرس و جو یک کلمه را با اسنادی که بازیابی می کند به اشتراک نمی گذارد. هیچ نمونه ای از «نان»، «ترش» یا «ابر قهرمان» در هیچ کجای مجموعه ظاهر نمی شود. مسابقه در جریان است. معنی.

مرحله 5: خواندن نتایج

خروجی:

جستجوی برداری همیشه برمی گردد k نتایج حتی زمانی که بدنه حاوی هیچ چیز مرتبط نیست. فقط رتبه بندی می کند چه خبرنتیجه تنها سیگنال خوب بودن پاسخ است: مقایسه کنید +0.111 اینجا در مقابل +0.630 در مرحله 4. در مرحله تولید، شما یک طبقه را تعیین می کنید و چیزی زیر آن را برنمی گردانید.

مرحله 6: نتایج را با ابرداده محدود کنید

هر سند با یک ضمیمه شد {"topic": ...} دیکته این where آرگومان فقط اسنادی را نگه می دارد که ابرداده آنها با هر کلیدی مطابقت دارد.

خروجی:

این مجموعه حاوی یک تله عمدی است: یک سند کتاب کمیک در مورد “فیبرهای عضلانی غنی از میتوکندری” ثور، که تطبیق برداری واقعا خوبی برای یک سوال زیست‌شناسی است. فیلتر کردن نحوه تعریف یک تطابق است – شباهت به تنهایی نمی تواند، زیرا از نظر معنایی واقعاً مشابه است.

مرحله 7: فیلتر باریکتر از ک

خروجی:

فقط یک سند علامت گذاری شده است musicبنابراین درخواست 5 برگرداندن 1. نتایج قبل از رتبه بندی فیلتر می شوند، به این معنی که یک سند غیر منطبق هرگز نمی تواند فقط برای رسیدن به لیست در لیست قرار گیرد. k.

مرحله 8: نرده های محافظ

خروجی:

add() اسناد، ابرداده ها و بردارها را به روز نگه می دارد. هر دو اشتباه بالا به راحتی انجام می شوند و در صورت عدم شناسایی، بی سر و صدا یک شاخص را خراب می کنند. رشته خالی تکرارپذیر است، بنابراین docs.extend("hi") “h” و “i” را به عنوان دو سند جداگانه اضافه می کند و مدل یک بردار واحد را برمی گرداند.

مرحله 9: ذخیره و بارگذاری

خروجی:

بردارها به .npy زیرا فشرده است و بدون تجزیه بارگیری می شود. متن و ابرداده به .json تا بتوانید فایل را باز کرده و بخوانید. load() شاخصی را که از مدل دیگری ساخته شده است رد می کند. این مهم است زیرا تعبیه‌ها فقط به معنای چیزی نسبت به مدلی است که آنها را تولید کرده است. اختلاط آنها کمی “اشتباه” نخواهد بود، این امر مزخرف مطمئنی خواهد بود.

مرحله 10: این مقیاس چگونه است

بیست و پنج سند برای اندازه گیری بسیار کم هستند، بنابراین این مرحله همچنین مجموعه ترکیبی از بردارهای تصادفی را چند برابر می کند. آنها به نتایج بی معنی می رسند، اما هزینه محاسباتی با سناریوی دنیای واقعی مطابقت دارد.

خروجی:

در 25 سند، جاسازی پرس و جو اساساً کل محاسبات است، زیرا جستجو به خودی خود بسیار سریع برای اندازه گیری است.به این توجه کنید milliseconds() یک بار گرم کردن را انجام می دهد.اولین فراخوانی به یک روال ماتریس NumPy، استخر نخ داخلی آن را می چرخاند، که می تواند بیشتر از خود کار واقعی طول بکشد و در نتیجه یک پیکره کوچک کندتر از یک بزرگ ظاهر می شود.

دو نکته در جدول نتایج بالا قابل ذکر است:

  1. هر دو ستون به صورت خطی رشد می کنند.هیچ چیز اینجا هوشمندانه نیست، فقط تمام خطوط را لمس می کند.
  2. پس از 100000 ردیف، مرتب‌سازی شروع به پیشی گرفتن از اسکن می‌کند.با یک میلیون سند، اسکن حدود 25 میلی ثانیه طول می کشد و مرتب سازی کامل حدود 90 میلی ثانیه طول می کشد.این همان لحظه ای است که باید مرتب کردن همه چیز را متوقف کرد (np.argpartition بالا را پیدا می کند k برای حدود 10 میلی ثانیه).نه چندان دور پس از آن نقطه ای را پیدا می کنید که به یک شاخص تقریبی واقعی (HNSW، IVF) می رسید و کمی دقت را با سرعت معاوضه می کنید.

تکمیل

هر مرحله در اینجا بر اساس یک ایده است: هر جاسازی را به طول 1 مقیاس کنید و یک محصول نقطه ساده به شکل کسینوس تبدیل شود. سپس رتبه بندی کل پیکره ضرب در یک ماتریس است. هر چیز دیگری که در طول مسیر اضافه کرده اید – از فیلترهای ابرداده، ذخیره و بارگیری، نرده های محافظ add() – حسابداری است که اسناد، ابرداده ها و بردارها را در یک راستا نگه می دارد تا ضرب معنادار باقی بماند.

نکته مهم – فراتر از سادگی و ظرافت پشت اجرای عملکرد پایه پایگاه داده برداری – این است که طراحی بین 25 سند و 25 میلیون تغییر نمی کند. فقط ساختار شاخص زیر آن انجام می شود. جای تعجب نیست که این دقیقا همان چیزی است که پایگاه داده های برداری مدیریت شده می فروشند.

برای اطلاعات بیشتر در مورد پایگاه های داده برداری از دیدگاه های مختلف، به این منابع برای تسلط بر یادگیری ماشین مراجعه کنید:

لینک منبع

نوشته های مشابه

دکمه بازگشت به بالا