Evaluation

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

تولید تقویت‌شده با بازیابی (RAG) به استاندارد صنعتی برای اتصال مدل‌های زبانی بزرگ (LLMs) به داده‌های خصوصی یا اختصاصی تبدیل شده است. با این حال، شایع‌ترین نقطه شکست در پایپ‌لاین‌های RAG، فاز تولید نیست، بلکه فاز بازیابی است. اگر زمینه بازیابی‌شده نامرتبط، پر نویز یا تکه‌تکه باشد، مدل LLM به طور اجتناب‌ناپذیری دچار توهم خواهد شد یا پاسخ‌های بهینه‌ای ارائه نخواهد داد، صرف‌نظر از اینکه مدل پایه چقدر قدرتمند باشد.

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

مشکل تولید کورکورانه

معیارهای ارزیابی سنتی مانند ROUGE یا BLEU برای سیستم‌های RAG مدرن کافی نیستند، زیرا آن‌ها متن تولیدشده را با پاسخ‌های مرجع واقعی مقایسه می‌کنند و کیفیت زمینه پشتیبان را نادیده می‌گیرند. ممکن است یک مدل پاسخی منسجم اما از نظر واقعی نادرست بر اساس «نویز» بازیابی‌شده تولید کند.

ارزیابی مؤثر نیازمند تمرکز بر دو معیار کلیدی است:

  1. دقت زمینه (Context Precision): آیا قطعه بازیابی‌شده واقعاً حاوی پاسخ است؟
  2. یادآوری زمینه (Context Recall): آیا ما تمام اطلاعات لازم برای پاسخ به پرسش را بازیابی کرده‌ایم؟

پیاده‌سازی امتیازدهی ارتباط زمینه

یکی از مؤثرترین روش‌ها برای سنجش ارتباط زمینه، استفاده از خود LLM به عنوان داور است. این تکنیک که اغلب «LLM به عنوان داور» نامیده می‌شود، شامل هدایت یک مدل ارزیابی برای تعیین این موضوع است که آیا یک قطعه خاص از متن بازیابی‌شده، پرسش داده‌شده را پشتیبانی می‌کند یا خیر. در اینجا یک پیاده‌سازی عملی با استفاده از Python و LangChain آورده شده است:

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# Initialize the judge LLM
judge_llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# Define the prompt for evaluating relevance
relevance_prompt = ChatPromptTemplate.from_template("""
You are an expert evaluator for a RAG system. 
Given a query and a retrieved context chunk, determine if the context is relevant.
Answer with ONLY "Yes" or "No".

Query: {query}
Context: {context}
""")

def evaluate_relevance(query, context):
    chain = relevance_prompt | judge_llm
    response = chain.invoke({"query": query, "context": context})
    return "Yes" in response.content

# Example usage
query = "What is the return policy for item XYZ?"
context_chunk = "XYZ is a premium product model..."

is_relevant = evaluate_relevance(query, context_chunk)
print(f"Is context relevant? {is_relevant}")

این رویکرد به شما امکان می‌دهد تا یک امتیاز دقت زمینه را محاسبه کنید که نسبت قطعات مرتبط به کل قطعات بازیابی‌شده است. یک امتیاز دقت پایین نشان می‌دهد که استراتژی بازیابی شما نویز زیادی را وارد می‌کند.

سنجش کاهش نویز و یادآوری زمینه

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

برای کاهش نویز، در نظر بگیرید که یک مرحله بازمرتب‌سازی با استفاده از کراس-اینکودر (Cross-Encoder) را پیاده‌سازی کنید. اگرچه جستجوی برداری (بازیابی متراکم) سریع است، اما ممکن است دقیق نباشد. یک مدل کراس-اینکودر می‌تواند اسناد برتر-K را که توسط فروشگاه برداری بازگردانده شده‌اند، با محاسبه یک امتیاز شباهت برای هر جفت (پرسش، سند) بازمرتب‌سازی کند. این کار با پایین کشیدن نتایج با شباهت بالا اما نامرتبط در لیست، به طور قابل توجهی نویز را کاهش می‌دهد.

from sentence_transformers import CrossEncoder

# Load a pre-trained cross-encoder model
model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')

# Query and list of candidate documents from vector search
query = "How to reset password?"
candidates = ["Click here...", "Password reset instructions...", "Welcome to the site..."]

# Compute relevance scores
scores = model.predict([(query, doc) for doc in candidates])

# Re-rank documents based on scores
ranked_docs = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
print(ranked_docs)

نتیجه‌گیری

ارزیابی کیفیت بازیابی RAG یک وظیفه یک‌باره نیست، بلکه فرآیندی مستمر از نظارت بر ارتباط زمینه و نویز است. با پیاده‌سازی داوران خودکار برای امتیازدهی ارتباط و استفاده از بازمرتب‌سازی کراس-اینکودر برای کاهش نویز، توسعه‌دهندگان می‌توانند اطمینان حاصل کنند که LLMهای آن‌ها توسط اطلاعات با کیفیت بالا و دقیق تغذیه می‌شوند. این امر منجر به ایجاد برنامه‌های کاربردی هوش مصنوعی قابل اعتمادتر، دقیق‌تر و کاربرپسندتر می‌شود. از امروز کیفیت بازیابی خود را اندازه‌گیری کنید تا پتانسیل کامل معماری RAG خود را آزاد کنید.

Share: