از دستیاری که روی سندهای شرکتت ساختهای چیزی بپرس که مطمئنی در هیچ سندی نیست؛ مثلا دربارهی موضوعی کاملا بیربط به کارت. اگر با لحن مطمئن جواب داد، مشکل از مدل نیست. مشکل از قدمی است که ساخته نشده.
بیشتر توضیحهایی که به پرسش «RAG چیست» جواب میدهند همانجا تمام میشوند که سیستم یک جواب درست از روی سند میدهد. این نوشته از همان نقطه شروع میکند، چون دردسر واقعی بعد از آن است: وقتی جواب در سندها نیست و سیستم باز هم چیزی میسازد.
چهار قدم آشنا و یک قدم که معمولا نیست
ساختار پایه چهار قدم دارد:
- تکهبندی: سند به قطعههایی شکسته میشود که هر کدام یک ایده داشته باشد.
- امبدینگ: هر تکه به یک بردار عددی تبدیل میشود.
- بازیابی: سوال هم بردار میشود و نزدیکترین تکهها به آن پیدا میشوند.
- تولید: تکههای پیداشده بهعنوان زمینه به مدل داده میشوند تا جواب را از روی آنها بنویسد.
میان قدم سوم و چهارم یک قدم پنهان هست که بیشتر پیادهسازیها ندارند: پالایش. یعنی تصمیم دربارهی اینکه آنچه پیدا شده ارزش فرستادن برای مدل را دارد، یا باید همینجا گفت «نمیدانم». سیستمی که این قدم را ندارد هیچوقت نمیگوید نمیدانم و همیشه چیزی میسازد.
یخچالی که هیچوقت خالی نیست
ریشهی ماجرا در رفتار جستوجوی برداری است. این جستوجو همیشه چیزی برمیگرداند. «نزدیکترین تکه» یعنی نزدیکترین در همان مجموعه، نه لزوما مرتبط. اگر هشت نتیجه بخواهی، هشت نتیجه میگیری؛ چه جواب در سندها باشد و چه نباشد. خطایی هم در کار نیست، پیام «پیدا نشد» هم نمیآید.
بازیابی مثل برداشتن مواد از یخچال است، و یخچال همیشه چیزی دارد، حتی وقتی مادهی این غذا را ندارد. پالایش یعنی نگاه کردن به آنچه برداشتهای و گفتن «این به این غذا نمیخورد». آشپز خوب همانجا دست نگه میدارد. آشپز بد هر چه هست را در قابلمه میریزد. مدل زبانی هم با تکههای بیربط همین کار را میکند: مودبانه از رویشان چیزی مینویسد که شبیه جواب است.
هشت تکه و یک برچسب دستی
اولین راهی که به ذهن میرسد یک آستانه است: هر تکهای که امتیاز شباهتش از عددی پایینتر بود دور ریخته شود. برای اینکه ببینی این راه کجا میشکند، یک مثال را دنبال میکنیم. عددهایش از یک اندازهگیری روی یک مجموعهی فارسی و یک مدل مشخص آمدهاند؛ برای کار خودت آنها را فرضی حساب کن، چون مجموعه و مدل تو عدد دیگری میدهد.
یک سوال پرسیده شد و هشت تکهی اول با امتیازشان برگشت. بعد یک نفر هر تکه را خواند و دستی برچسب زد:
| رتبه | امتیاز شباهت | برچسب دستی |
|---|---|---|
| ۱ | ۰٫۸۴۱ | مرتبط |
| ۲ | ۰٫۸۳۶ | مرتبط |
| ۳ | ۰٫۸۲۹ | مرتبط |
| ۴ | ۰٫۸۲۱ | نامرتبط |
| ۵ | ۰٫۸۱۸ | نامرتبط |
| ۶ | ۰٫۸۱۴ | نامرتبط |
| ۷ | ۰٫۸۰۹ | نامرتبط |
| ۸ | ۰٫۸۰۳ | نامرتبط |
فاصلهی بدترین تکهی مرتبط از بهترین تکهی نامرتبط هشت هزارم است. کل هشت نتیجه، از خوب تا بد، در نواری به پهنای کمتر از چهار صدم نشستهاند. امتیازها در بعضی مدلها، بهویژه مدلهای چندزبانه، همینقدر فشردهاند.
آستانهای که روی سوال اول جواب داد و روی دو سوال بعدی نه
فرض کن آستانه را ۰٫۸۲۵ بگذاریم، درست وسط همان شکاف باریک. روی این سوال عالی کار میکند: سه تکهی مرتبط میمانند و پنج تکهی نامرتبط میروند. حالا همان آستانه روی دو سوال دیگر:
| سوال | بهترین امتیاز | بدترین مرتبط | نتیجه با آستانهی ۰٫۸۲۵ |
|---|---|---|---|
| سوال اصلی | ۰٫۸۴۱ | ۰٫۸۲۹ | درست کار کرد |
| سوالی با کلمههای نزدیک به متن سندها | ۰٫۸۷۶ | ۰٫۸۶۱ | هر هشت تکه رد شدند، نامرتبطها هم |
| سوالی با زبان محاوره | ۰٫۸۱۹ | ۰٫۸۱۱ | هیچ تکهای رد نشد، حتی مرتبطها |
امتیاز به سوال بسته است. سوالی که کلمههایش به سبک سندها نزدیکتر باشد کل نوارش بالاتر میرود. سوال محاورهای کل نوار را پایین میکشد. پس ایراد از انتخاب عدد نبود؛ هیچ عدد ثابتی وجود ندارد که برای هر سه سوال درست باشد. اگر فقط عدد را جابهجا میکردیم، هر بار یک سوال درست میشد و یکی دیگر خراب.
چیزی که در هر سه سوال ثابت ماند
بهجای امتیاز خام، به فاصلهی هر تکه از بهترین نتیجهی همان سوال نگاه کن:
| سوال | فاصلهی بدترین مرتبط از بهترین | فاصلهی بهترین نامرتبط از بهترین |
|---|---|---|
| سوال اصلی | ۰٫۰۱۲ | ۰٫۰۲۰ |
| نزدیک به متن | ۰٫۰۱۵ | ۰٫۰۲۴ |
| محاورهای | ۰٫۰۰۸ | ۰٫۰۲۲ |
اینجا الگو پیدا میشود. تکههای مرتبط در هر سه سوال کمتر از دو صدم با بهترین نتیجه فاصله دارند و نامرتبطها دو صدم یا بیشتر. پس معیار باید نسبی باشد، نه مطلق: هر تکهای که از بهترین نتیجهی همان سوال بیش از یک حاشیه دور است کنار گذاشته شود.
در این مثال حاشیه سه صدم انتخاب شد، نه دو صدم؛ کمی دستودلبازتر از آنچه اندازهگیری نشان میداد. دلیلش یک انتخاب آگاهانه است: حذف شدن یک تکهی مرتبط بدتر از ماندن یک تکهی اضافه است.
از این مثال نکتهای میماند که از بازیابی فراتر میرود. وقتی اندازهگیری نشان داد یک روش روی یک نمونه کار میکند و روی نمونهی بعدی نه، تنظیم کردن عدد فقط جای مشکل را عوض میکند. باید خود روش عوض شود.
دو نگهبان برای دو پرسش متفاوت
معیار نسبی یک ضعف دارد. اگر هیچ تکهی مرتبطی در مجموعه نباشد، باز هم یکی از بیربطها «بهترین» میشود و بقیه دور همان جمع میشوند. همان پرسش اول این نوشته دقیقا همین حالت است. برای همین یک نگهبان دوم لازم است، و هر کدام فقط یک کار میکند:
- حاشیهی نسبی جواب میدهد: از میان آنچه پیدا شده، کدامها واقعا نزدیکترند؟
- کف مطلق جواب میدهد: اصلا چیزی داریم؟ اگر بهترین امتیاز از این کف پایینتر بود، فهرست خالی برمیگردد.
کف مطلق برای جدا کردن مرتبط از نامرتبط نیست؛ دیدی که از پس آن برنمیآید. فقط حالت «هیچچیز نداریم» را میگیرد. یکی جای دیگری را نمیگیرد و هیچکدام بدون دیگری کافی نیست.
عدد کف را هم از دادهی خودت دربیاور: سوالی بپرس که جوابش قطعا در سندها نیست و ببین بهترین امتیازش چقدر میشود. کف باید کمی بالاتر از آن بنشیند. اگر با این کف، پرسش بیربط هنوز فهرست خالی نمیدهد، کف برای سندهای تو پایین است.
وقتی فهرست خالی شد، مدل را صدا نزن
بعد از پالایش، ممکن است هیچ تکهای نمانده باشد. در این حالت گرهای که جواب را مینویسد نباید با زمینهی خالی سراغ مدل برود و نباید نزدیکترین تکه را با هر امتیازی بفرستد. باید یک جملهی ثابت برگرداند: این را در سندهای موجود پیدا نکردم.
صدا نزدن مدل ارزانتر هم هست، ولی دلیل اصلی هزینه نیست. مدلی که زمینه ندارد از دانش عمومی خودش جواب میسازد، و آن جواب مطمئن به نظر میرسد و ممکن است غلط باشد. همین چند خط تفاوت یک دستیار سنددار با یک چتبات عمومی است. «وقتی نمیداند، میگوید نمیدانم» محدودیت نیست؛ ویژگیای است که باعث میشود بقیهی جوابهایش قابل اعتماد باشد.
بیست سوال واقعی و چهار عدد
برای اینکه بفهمی سیستمت در عمل چه میکند، بیست سوال واقعی مشتری جمع کن و برای هر کدام خودت بنویس جوابش در کدام سند است، یا اینکه اصلا نیست. دستکم پنج سوال باید از نوع دوم باشد؛ بدون آنها نمیفهمی «نمیدانم» کار میکند یا نه. بعد هر بیست سوال را از سیستم رد کن و چهار عدد بشمار:
| عدد | یعنی چه |
|---|---|
| درست پیدا شد | جواب در سندها بود و پیدا شد |
| اشتباه پیدا نشد | جواب در سندها بود ولی سیستم گفت نمیدانم |
| درست «نمیدانم» | جواب در سندها نبود و سیستم همین را گفت |
| ساختگی | جواب نبود ولی سیستم چیزی ساخت |
عدد چهارم را همیشه اول درست کن. جواب غلط مطمئن از «نمیدانم» خیلی گرانتر است، چون کاربر بر اساسش تصمیم میگیرد. اگر این عدد صفر نیست، پالایش هنوز شل است و کف مطلق باید بالاتر برود.
این کار عوارض دارد: با بالا رفتن کف، عدد «اشتباه پیدا نشد» هم بالا میرود. این معامله را باید آگاهانه انتخاب کنی. برای مشاورهی فنی یا مالی محتاط باش؛ برای راهنمایی عمومی میشود شلتر گرفت.
تکهبندی بیشتر از آستانه اثر دارد
آدمها ساعتها روی عدد آستانه وقت میگذارند و چند دقیقه روی تکهبندی، در حالی که اثر تکهبندی بزرگتر است. سه خطای رایج:
- تکهی خیلی بزرگ. چند موضوع دارد، پس به همهچیز کمی شبیه است و امتیازها فشرده میشوند؛ همان مشکلی که در جدول اول دیدی.
- تکهی خیلی کوچک. زمینه را از دست میدهد. «قیمتش دو میلیون است» بدون اینکه معلوم باشد قیمت چه چیزی.
- مرز بد. شکستن وسط یک جدول یا یک فهرست هر دو نیمه را بیمعنا میکند.
اگر میتوانی، سند را روی مرزهای طبیعیاش بشکن: سرفصل، پاراگراف، ردیف جدول. شکستن بر اساس تعداد کاراکتر سادهترین راه است و بدترین نتیجه را میدهد. اگر هم ناچار به آن شدی، تکهها را با همپوشانی ببر تا جملهای که روی مرز افتاده نصف نشود.
یک آزمون ساده برای کیفیت تکهبندی: ده تکه را تصادفی بردار و بخوان. اگر خودت بدون زمینهی اضافه نفهمیدی هر کدام دربارهی چیست، مدل هم نمیفهمد.
و اگر عدد «ساختگی» صفر شد ولی سیستم جوابهایی را که در سندها هست زیاد پیدا نمیکند، مشکل به احتمال زیاد همینجاست، نه در آستانه: یا تکهها بزرگاند، یا سندهایت آن جواب را واقعا ندارند.
روش را بردار، عدد را نه
سه صدم و کفی که در این مثال انتخاب شد برای همان مجموعه و همان مدل اندازهگیری شدهاند. اگر بدون اندازهگیری در کد خودت بگذاریشان، همان اشتباهی را تکرار کردهای که این نوشته دربارهی آن است. کاری که باید تکرار کنی خود اندازهگیری است: پنج سوال متنوع (دو تا نزدیک به زبان سندها، دو تا محاورهای، یکی که جوابش قطعا نیست)، هشت نتیجه برای هر کدام، و برچسب دستی برای هر تکه. این برچسبزدن حوصله میخواهد و جایگزین خودکار ندارد.
گاهی هم جدولت الگویی نشان نمیدهد و در بعضی سوالها تکهی نامرتبط از مرتبط نزدیکتر است. سه علت محتمل دارد: تکهها بزرگاند، چند سند تقریبا یک چیز میگویند و رتبهبندی بیمعنا شده، یا خود سوال مبهم است. در حالت سوم هیچ آستانهای کمک نمیکند و راه درست پرسیدن یک سوال روشنکننده از کاربر است. اگر میخواهی این مسیر را از ساخت جدول برداری تا دستیاری که مرز دانستههایش را میشناسد قدمبهقدم بسازی، جزئیات این دوره را ببین.