آموزشمدل‌های زبانی بزرگ (LLM)

درس ۶۴ از ۸۵، هوش مصنوعی، حدود ۱۲ دقیقه خواندن

جستجوی برداری

جواب کوتاه

جستجوی برداری یعنی گشتن با معنی، نه با کلمه. هر تکه‌ی سند و هر سوال به یه بردار، یعنی یه فهرست عدد، تبدیل می‌شه، طوری که چیزهای هم‌معنی بردارهای نزدیک داشته باشن؛ بعد نزدیک‌ترین بردارها به سوال پیدا می‌شن. این‌طوری «جمعه باز هستید؟» جمله‌ی «روز تعطیل ما جمعه‌ست» رو پیدا می‌کنه، با اینکه هیچ کلمه‌ی مشترکی ندارن. برای میلیون‌ها بردار، مقایسه با تک‌تکشون کنده؛ برای همین از روش‌های تقریبی مثل گراف لایه‌ای استفاده می‌شه که با کمی دقت کمتر، خیلی سریع‌تر پیدا می‌کنن.

مشکل کلمه

«جمعه باز هستید؟» و «روز تعطیل ما جمعه‌ست» یه معنی دارن، ولی یه کلمه‌ی مشترک هم ندارن.

توی درس RAG بازیاب ساده‌مون کلمه‌های مشترک رو می‌شمرد. همون‌جا دیدیم «بربری از ساعت ۴ عصر داریم» فقط به‌خاطر «ساعت» و «داریم» امتیاز گرفت. حالا مشکل برعکس رو ببینید: حتی «جمعه» با «جمعه‌ست» از نظر شمردن کلمه یکی نیست. کسی که می‌پرسه «جمعه باز هستید؟»، با شمردن کلمه، جواب درست رو پیدا نمی‌کنه.

نقشه‌ی معنی

توی درس امبدینگ دیدیم مدل می‌تونه هر متن رو به یه بردار تبدیل کنه، طوری که متن‌های هم‌معنی بردارهای نزدیک داشته باشن. یه بردار رو مثل یه نقطه روی یه نقشه ببینید.

برای اینکه بشه کشیدش، یه نقشه‌ی ساختگی با فقط دو جهت ساختیم: چقدر درباره‌ی ساعته، و چقدر درباره‌ی تعطیلیه. یادداشت «روز تعطیل ما جمعه‌ست» بالا افتاده، چون درباره‌ی تعطیلیه؛ دو تا یادداشت ساعت سمت راستن. سوال «جمعه باز هستید؟» هم درباره‌ی تعطیلیه، پس کنار همون می‌افته. جستجوی برداری فقط یه کار می‌کنه: نزدیک‌ترین نقطه‌ها به سوال رو پیدا می‌کنه. اسم ریاضیش «جست‌وجوی نزدیک‌ترین همسایه»ست؛ شبیه همون فکری که توی درس نزدیک‌ترین همسایه‌ها داشتیم.

بردارهای واقعی به‌جای دو عدد، از چند صد تا ده‌ها هزار عدد دارن؛ پس نقشه‌شون صدها جهت داره که نمی‌شه کشید. ولی فکر همینه.

عدد شباهت

«نزدیک» رو با یه عدد اندازه می‌گیرن. توی درس شباهت معنایی دیدیم یکی از رایج‌ترین‌ها شباهت کسینوسیه: هر چی جهت دو بردار شبیه‌تر، عدد به ۱ نزدیک‌تر. برای آزمایشمون یه بردار سه‌عددی ساختگی برای هر یادداشت و سوال ساختیم و حساب کردیم.

«روز تعطیل ما جمعه‌ست» شباهت ۰٫۹۹۷ گرفت و با فاصله اول شد. ستون آخر رو هم ببینید: تعداد کلمه‌ی مشترک برای هر چهار تا صفره. یعنی اگه با کلمه می‌گشتیم، هیچ‌کدوم پیدا نمی‌شد. یادتون باشه این عددها از بردارهای ساختگی ما اومدن؛ کیفیت جستجوی واقعی به اینکه مدل برداری چقدر خوب معنی رو بگیره بستگی داره.

دو مرحله

یه سامانه‌ی جستجوی برداری دو تا کار جدا داره که وقتشون فرق می‌کنه.

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

یه نکته‌ی مهم: سوال و تکه‌ها باید با همون مدل برداری بردار بشن. هر مدل برداری نقشه‌ی معنی خودش رو داره؛ جهت‌های یه مدل با یه مدل دیگه جور نیست، مثل اینکه آدرس رو روی نقشه‌ی یه شهر دیگه پیدا کنید. برای همین اگه مدل برداری رو عوض کنید، باید همه‌ی تکه‌ها رو دوباره بردار کنید.

میلیون‌ها بردار

با چهار یادداشت، می‌شه سوال رو با تک‌تکشون مقایسه کرد. ولی اگه یه شرکت میلیون‌ها تکه داشته باشه چی؟ ویکی‌پدیا می‌گه جست‌وجوی مستقیم، که سوال رو با همه مقایسه می‌کنه، با داده‌ی بزرگ کند می‌شه. هر سوال یعنی میلیون‌ها حساب شباهت. و روش‌های دقیق قدیمی‌تر هم برای بردارهایی با این همه عدد خوب کار نمی‌کنن.

چاره‌ی رایج یه معامله‌ست: جست‌وجوی تقریبی. همیشه تضمین نمی‌کنه دقیقا نزدیک‌ترین رو پیدا کنه، ولی چیزهای نزدیک رو خیلی سریع پیدا می‌کنه. پایگاه‌هایی که بردار نگه می‌دارن، معمولا از همین روش‌ها استفاده می‌کنن.

گراف لایه‌ای

یکی از معروف‌ترین روش‌های تقریبی یه گراف لایه‌ایه که ویکی‌پدیا می‌گه توی آزمون‌های اخیر جزو بهترین‌ها بوده.

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

راه‌های دیگه

گراف لایه‌ای تنها راه نیست. ویکی‌پدیا چند خانواده‌ی دیگه هم میاره، و فکر هر کدوم ساده‌ست.

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

یکی دیگه سطل‌بندیه، به انگلیسی Locality-Sensitive Hashing: بردارها طوری توی سطل‌ها ریخته می‌شن که چیزهای نزدیک معمولا توی یه سطل بیفتن، و سوال فقط با سطل خودش مقایسه می‌شه. و سومی فشرده کردنه: یه نسخه‌ی کوچیک و تقریبی از همه‌ی بردارها توی حافظه نگه می‌دارن، با همون چند تا نامزد خوب پیدا می‌کنن، و فقط همونا رو با بردار کامل دقیق می‌سنجن. ویکی‌پدیا می‌گه این روش‌ها کمی از درستی رو می‌دن تا سرعت یا حافظه بگیرن، و اینکه چقدر خوب جواب بدن خیلی به خود داده بستگی داره.

چقدر درست پیدا کرد

وقتی روش تقریبیه، باید بدونیم چقدر تقریبیه. اندازه‌ش ساده‌ست.

برای چند تا سوال، یه بار با مقایسه‌ی همه، ده نزدیک‌ترین واقعی رو پیدا می‌کنن، و یه بار با روش تقریبی. اگه روش تقریبی ۹ تا از اون ده تا رو پیدا کرده باشه، می‌گن بازیابیش ۹۰ درصده؛ به انگلیسی Recall. تقریبا همه‌ی این روش‌ها یه پیچ دارن: اگه بیشتر بگردن، مثلا دسته‌های بیشتر یا همسایه‌های بیشتر توی گراف، بازیابی بالا می‌ره ولی کندتر می‌شن. یه آزمون معروف ۲۰۱۸ که این روش‌ها رو کنار هم سنجید دید روش‌های خیلی متفاوت، به معامله‌های تقریبا شبیهی بین سرعت و درستی می‌رسن. پس پیچ رو با سوال‌های واقعی خودتون تنظیم کنید، نه با عدد کس دیگه.

هر دو با هم

پس شمردن کلمه رو کنار بذاریم؟ نه. جستجوی کلمه‌ای هم یه جا خیلی خوبه: وقتی یه کلمه‌ی خاص و دقیق مهمه، مثل یه کد کالا یا یه اسم. ویکی‌پدیا می‌گه جستجوی برداری رو معمولا با جستجوی کلمه‌ای و فیلترهای دیگه ترکیب می‌کنن. توی درس تکه کردن سند دیدیم پژوهش ۲۰۲۴ ترکیب بردار و تطبیق کلمه رو آزمایش کرد و، همراه توضیح زمینه برای هر تکه، بازیابی ناموفق رو ۴۹ درصد کم کرد.

دو فهرست، یه فهرست

وقتی جستجوی برداری و کلمه‌ای رو با هم می‌کنید، دو تا فهرست دارید با دو جور امتیاز که با هم جمع نمی‌شن؛ یکی شباهت کسینوسیه و یکی شمردن کلمه. چطور یه فهرست کنیم؟

یه روش ساده و معروف از ۲۰۰۹ به اسم ترکیب رتبه‌ی معکوس، به انگلیسی Reciprocal Rank Fusion، اصلا به امتیازها نگاه نمی‌کنه، فقط به رتبه‌ها. به هر سند توی هر فهرست، یک تقسیم بر ۶۰ به‌علاوه‌ی رتبه‌ش می‌ده و اینا رو جمع می‌کنه. سندی که توی فهرست برداری دوم و توی کلمه‌ای اول شده، از سندی که اولی و سومی شده کمی جلو می‌زنه، و هر دو خیلی جلوتر از سندهایی‌ان که فقط توی یه فهرست بودن. عدد ۶۰ رو نویسنده‌ها توی یه آزمایش اولیه انتخاب کردن و بعد دست نزدن؛ کارش اینه که رتبه‌ی اول یه فهرست بی‌کیفیت همه‌چیز رو به هم نریزه. توی پژوهش خودشون این روش از هر کدوم از سیستم‌ها تنهایی بهتر شد.

چند نکته

  • بردار، معنی رو می‌گیره. کلمه‌ی مشترک لازم نیست.
  • نزدیک‌ترین، برنده. با یه عدد شباهت.
  • برای میلیون‌ها، تقریبی. کمی دقت، خیلی سرعت.
  • کلمه‌ی دقیق مهمه؟ ترکیب کنید. کد، اسم، عدد.

ایستگاه بعد سراغ کاری می‌ره که مدل‌ها رو از «حرف زدن» به «کار کردن» می‌بره: استفاده از ابزار.

جمع‌بندی. آنچه از این درس با خودتان می‌برید.

  • معنی، نه کلمه.
  • هر جمله یه نقطه؛ نزدیک‌ترین برنده.
  • شباهت با یه عدد اندازه گرفته می‌شه.
  • برای میلیون‌ها: جست‌وجوی تقریبی.
  • بردار و کلمه با هم، بهتر.

خودتون رو بسنجید

۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو می‌بینید: چند تا درست، چند تا نادرست.

خودتون رو بسنجید

۱۵ پرسش

  • هر بار پرسش‌ها و ترتیب گزینه‌ها عوض می‌شه.
  • تا آخر نمی‌گیم کدوم جواب درست بوده؛ می‌تونید برگردید و جوابتون رو عوض کنید.
  • آخرش کارنامه می‌گیرید: چند تا درست، چند تا نادرست.
  • اگه وسطش بستید، دوباره که باز کنید از همون‌جا ادامه می‌دید.

فصل‌های این درس

درس بعد