با گذر مدلهای زبانی بزرگ (LLMs) از مرحله نوآوری به زیرساخت اصلی در برنامههای سازمانی، مسئله «جعبه سیاه» به یک چالش اعتماد حیاتی تبدیل شده است. بارزترین نشانه این ابهام، توهم است؛ یعنی تولید اطمینانآمیز اطلاعات نادرست یا ساختگی توسط مدل. برای توسعهدهندگانی که خطوط لوله تولید تقویتشده با بازیابی (RAG) یا جریانهای کاری عاملمحور (agentic workflows) را میسازند، تشخیص این خطاها نه تنها یک ویژگی، بلکه یک الزام ایمنی است. این پست به بررسی استراتژیهای فنی برای تشخیص، اندازهگیری و کاهش توهمها میپردازد و از بررسیهای ساده مبتنی بر عبارات باقاعده (regex) فراتر رفته و به تأیید معنایی پیچیدهتر میپردازد.
درک انواع توهمها
قبل از پیادهسازی مکانیسمهای تشخیص، باید حالتهای شکست را دستهبندی کنیم. بر اساس تحقیقات مؤسسه استنفورد برای هوش مصنوعی متمرکز بر انسان، توهمها معمولاً در دو دسته قرار میگیرند:
- توهمهای واقعیتمحور: مدل اطلاعاتی را تولید میکند که با واقعیتهای اثباتشده یا زمینه ارائهشده در تضاد است.
- توهمهای انتساب: مدل به منابعی که وجود ندارند ارجاع میدهد یا اطلاعات را به اشتباه به اسناد نادرست نسبت میدهد.
استراتژیهای تشخیص بسته به نوع هدفگیری، تفاوت چشمگیری دارند. تشخیص واقعیتمحور به حقیقت زمینی (ground truth) یا امتیازات شباهت معنایی نیاز دارد، در حالی که تشخیص انتساب به ردیابی دقیق منبع نیاز دارد.
استراتژی ۱: شباهت معنایی با استفاده از امبدینگها
دسترسیپذیرترین روش برای تشخیص توهمهای واقعیتمحور در سیستمهای RAG، اندازهگیری شباهت معنایی بین خروجی مدل و زمینه بازیابیشده است. اگر مدل ادعا کند $X$ اما زمینه از $Y$ پشتیبانی کند، فاصله امبدینگ بین ادعا و قطعه زمینه مرتبط بزرگ خواهد بود.
در اینجا یک پیادهسازی عملی با استفاده از langchain و sentence-transformers آورده شده است:
from langchain.embeddings import SentenceTransformerEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from sklearn.metrics.pairwise import cosine_similarity
def check_hallucination(context_chunk, generated_answer, model_name="all-MiniLM-L6-v2"):
# Initialize embeddings
embeddings = SentenceTransformerEmbeddings(model_name=model_name)
# Generate embeddings
context_embedding = embeddings.embed_documents([context_chunk])[0]
answer_embedding = embeddings.embed_documents([generated_answer])[0]
# Calculate cosine similarity
similarity = cosine_similarity([context_embedding], [answer_embedding])[0][0]
# Threshold logic
return similarity > 0.85 # Returns True if plausible, False if likely hallucination
این روش از نظر محاسباتی ارزان و برای پاسخهای کوتاهمدت مؤثر است. با این حال، در استدلالهای ظریفی که پاسخ از چندین قطعه زمینه استخراج میشود، با مشکل مواجه میشود.
استراتژی ۲: LLM به عنوان داور
برای وظایف استدلالی پیچیده، شباهت امبدینگ اغلب ناکافی است. رویکرد قویتر این است که از یک LLM ثانویه و قویتر برای ارزیابی وفاداری پاسخ مدل اصلی نسبت به زمینه استفاده شود. این تکنیک که «LLM به عنوان داور» نامیده میشود، از قابلیتهای استدلالی مدلهای جدیدتر برای تشخیص ناهماهنگیهای ظریف بهره میبرد.
def verify_with_llm(context, claim, judge_model):
prompt = f"""
Analyze the following claim based strictly on the provided context.
Context: {context}
Claim: {claim}
Determine if the claim is fully supported by the context.
Return only 'SUPPORTED' or 'NOT_SUPPORTED'.
"""
response = judge_model.invoke(prompt)
return response.content == 'SUPPORTED'
این روش امکان ارزیابی با جزئیات دقیق را فراهم میکند و بین توهمهای جزئی و ساختگیهای کامل تمایز قائل میشود. این روش گرانتر و کندتر از بررسیهای امبدینگ است و برای ارزیابیهای با ریسک بالا یا بررسیهای کیفیت پسپردازش ایدهآل است.
استراتژی ۳: سازگاری درونی و رأیگیری
تکنیک قدرتمند دیگری سازگاری درونی (Self-Consistency) است. با درخواست مکرر از مدل برای تولید پاسخ به یک سوال یکسان، میتوانید تنوع خروجیها را تحلیل کنید. اگر مدل پاسخهای کاملاً متفاوتی در بذرهای مختلف (seeds) تولید کند، این نشاندهنده اعتماد به نفس پایین و احتمال بیشتر توهم است.
نتیجهگیری
راهحل جادویی واحدی برای تشخیص توهم وجود ندارد. مؤثرترین سیستمها از رویکردی چندلایه استفاده میکنند: استفاده از شباهت امبدینگ برای فیلتر سریع و بلادرنگ، و استفاده از LLM به عنوان داور برای ارزیابی دقیق و آفلاین. با یکپارچهسازی این لایههای تشخیص، توسعهدهندگان میتوانند برنامههای هوش مصنوعی بسازند که نه تنها هوشمند، بلکه قابل اعتماد و قابل اطمینان باشند.