بعد از اینکه هر تکه از دادهٔ شما به یک بردار عددی (embedding) تبدیل شد، سیستم باید راهی داشته باشد تا بگوید کدام بردارها به بردار سؤال کاربر «نزدیکتر»اند. یکی از رایجترین و پرکاربردترین معیارها برای این مقایسه، شباهت کسینوسی یا Cosine Similarity است. فهم اینکه این معیار دقیقاً چه چیزی را اندازه میگیرد — و چه چیزی را اندازه نمیگیرد — کمک میکند بفهمید چرا گاهی جستوجوی معنایی نتیجهٔ عجیب برمیگرداند.
لیست مطالب
شباهت کسینوسی چه چیزی را میسنجد؟
هر بردار embedding را میتوان مثل یک پیکان در یک فضای چندبعدی تصور کرد که از مبدأ شروع میشود و به یک نقطه ختم میشود. شباهت کسینوسی بهجای اینکه فاصلهٔ خطی بین دو نقطه را اندازه بگیرد، زاویهٔ بین دو پیکان را میسنجد. اگر دو پیکان دقیقاً همجهت باشند، زاویه صفر است و شباهت کسینوسی به بیشترین مقدار ممکن میرسد؛ اگر عمود بر هم باشند، شباهت در نقطهٔ خنثی قرار میگیرد؛ و هرچه دو پیکان مخالفتر باشند، شباهت به کمترین مقدار میرسد. نکتهٔ مهم این است که طول پیکان (اندازهٔ بردار) اهمیتی ندارد؛ فقط جهت آن مهم است.
cosine_similarity(A, B) = dot(A, B) / (norm(A) * norm(B))
dot(A, B) = حاصلضرب داخلی دو بردار
norm(A), norm(B) = طول (نُرم) هر بردار
همین بیاعتنایی به طول بردار، دلیل اصلی محبوبیت شباهت کسینوسی در جستوجوی معنایی متن است: یک جملهٔ کوتاه و یک پاراگراف بلند دربارهٔ همان موضوع ممکن است بردارهایی با طولهای متفاوت داشته باشند، اما اگر جهتشان مشابه باشد (یعنی معنای مشابهی داشته باشند)، شباهت کسینوسی همچنان آنها را نزدیک به هم تشخیص میدهد.

شباهت کسینوسی در برابر معیارهای دیگر
شباهت کسینوسی تنها معیار موجود نیست. فاصلهٔ اقلیدسی (Euclidean Distance) فاصلهٔ خطی واقعی بین دو نقطه را اندازه میگیرد و هم به جهت و هم به طول بردار حساس است. حاصلضرب داخلی خام (Dot Product) شبیه شباهت کسینوسی است اما نُرمالسازی نمیشود، یعنی بردارهای بلندتر میتوانند امتیاز بالاتری بگیرند صرفاً بهخاطر بزرگتر بودن، نه لزوماً بهخاطر شباهت معنایی بیشتر.
| معیار | به چه چیزی حساس است | کاربرد رایج |
|---|---|---|
| Cosine Similarity | فقط جهت بردار | مقایسهٔ معنایی متنها با طول متفاوت |
| Euclidean Distance | جهت و طول بردار هر دو | دادههای عددی که مقیاسشان معنادار است |
| Dot Product | جهت و طول، بدون نُرمالسازی | وقتی مدل embedding از قبل بردارها را نُرمال کرده باشد |
چرا این انتخاب روی نتیجهٔ چتبات شما اثر میگذارد؟
وکتور دیتابیسهایی مثل Qdrant، Pinecone یا pgvector معمولاً به شما اجازه میدهند معیار شباهت را هنگام ساخت ایندکس مشخص کنید. اگر مدل embedding شما بردارهای نُرمالشده تولید میکند (که در بیشتر مدلهای امروزی رایج است)، شباهت کسینوسی و حاصلضرب داخلی عملاً نتیجهٔ یکسانی میدهند، ولی اگر این هماهنگی رعایت نشود، رتبهبندی نتایج بازیابیشده میتواند بهشکل نامحسوسی اشتباه شود؛ یعنی تکهای که واقعاً به سؤال کاربر مرتبط است، در رتبهٔ پایینتری قرار بگیرد و مدل زبانی context درستی برای پاسخدادن دریافت نکند.
یک قاعدهٔ عملی: معیار شباهتی که برای ساخت ایندکس انتخاب میکنید باید همان معیاری باشد که مستندات مدل embeddingتان برای ارزیابی کیفیت توصیه کرده است، نه یک انتخاب دلبخواهی.
آستانهٔ شباهت (Threshold) و نقش آن
در پیادهسازی واقعی، معمولاً کافی نیست فقط چند نتیجهٔ برتر بازیابی شوند؛ باید یک آستانهٔ حداقلی برای شباهت هم تعریف کرد. اگر بالاترین شباهت بازیابیشده از این آستانه پایینتر باشد، به این معناست که هیچ chunk واقعاً مرتبطی در دادهٔ شما پیدا نشده، و بهتر است سیستم صادقانه اعلام کند اطلاعات کافی ندارد، تا اینکه مدل زبانی را مجبور کند از روی نتایجی که اصلاً ربط قوی به سؤال ندارند، پاسخی سرهم کند. تعیین این آستانه معمولاً کار یک عدد جادویی و ثابت نیست؛ باید با آزمایش روی سؤالهای واقعی کاربران و بررسی chunkهای بازیابیشده، بهتدریج تنظیم شود.
یک مثال ساده برای درک شهودی
فرض کنید دو جملهٔ «قیمت اشتراک ماهانه چقدر است» و «هزینهٔ عضویت یکماهه چند است» را در نظر بگیرید. از نظر واژگان تفاوت زیادی دارند، اما هر دو دربارهٔ یک موضوعاند. اگر بردارهای این دو جمله را روی یک محور فرضی رسم کنیم، زاویهٔ بین دو پیکان بسیار کوچک خواهد بود، در حالی که جملهای مثل «ساعات کاری پشتیبانی چیست» پیکانی با زاویهٔ بسیار بزرگتر نسبت به آن دو خواهد داشت. سیستم بازیابی دقیقاً بر همین اساس تصمیم میگیرد کدام تکه از سند را به مدل زبانی برساند.
چرا نُرمالسازی از قبل، جستوجو را سریعتر میکند؟
محاسبهٔ شباهت کسینوسی شامل یک تقسیم بر طول هر دو بردار است، و این تقسیم برای هر مقایسه یک هزینهٔ محاسباتی اضافه دارد. بسیاری از پیادهسازیها برای دورزدن این هزینه، بردارها را همان لحظهٔ ذخیرهسازی نُرمال میکنند، یعنی طول هر بردار را از قبل به یک واحد ثابت تبدیل میکنند. وقتی همهٔ بردارهای ذخیرهشده از قبل نُرمالشده باشند، محاسبهٔ حاصلضرب داخلی ساده (Dot Product) دقیقاً همان نتیجهٔ شباهت کسینوسی را میدهد، بدون نیاز به تقسیم مجدد در هر جستوجو. به همین دلیل در تنظیمات بسیاری از وکتور دیتابیسها، انتخاب «Dot Product» روی بردارهای ازپیشنُرمالشده و انتخاب «Cosine» روی بردارهای خام، عملاً به یک نتیجه میرسند؛ نکته این است که این هماهنگی باید آگاهانه و طبق مستندات مدل embedding انتخاب شود، نه حدسی.
جمعبندی
- شباهت کسینوسی زاویهٔ بین دو بردار را میسنجد، نه فاصلهٔ خطی یا طول آنها را.
- همین ویژگی باعث میشود متنهای کوتاه و بلند دربارهٔ یک موضوع، همچنان نزدیک به هم تشخیص داده شوند.
- Dot Product بدون نُرمالسازی میتواند به بردارهای بلندتر امتیاز کاذب بدهد.
- معیار شباهت باید با توصیهٔ مدل embedding مورد استفاده هماهنگ باشد، نه انتخابی تصادفی.
- انتخاب اشتباه معیار شباهت، مستقیماً روی کیفیت context تزریقشده به مدل زبانی و در نتیجه کیفیت پاسخ نهایی اثر میگذارد.
