مقدمه
در چشمانداز در حال تحول سریع تولید تقویتشده با بازیابی (RAG)، جستجوی شباهت برداری به ستون فقرات بازیابی دانش تبدیل شده است. با این حال، اتکای صرف به شباهت معنایی میتواند منجر به نتایج پر از نویز، بافت نامرتبط و حتی آسیبپذیریهای امنیتی شود. اینجاست که فیلترگذاری متادیتا به عنوان یک جزء حیاتی برای دقت وارد میشود. با ترکیب فیلترهای داده ساختاریافته با جاسازیهای برداری بدون ساختار، توسعهدهندگان میتوانند اطمینان حاصل کنند که مدلهای زبانی بزرگ (LLMs) دقیقاً آنچه را که نیاز است، در زمانی که نیاز است، بازیابی کنند.
چرا فیلترگذاری متادیتا ضروری است
جاسازیهای برداری معنای معنایی را درک میکنند اما فاقد بافت ساختاری هستند. بدون فیلترگذاری متادیتا، یک پرسش برای «مزایای شرکت» ممکن است مستندات مزایا از بخشهای مختلف متعدد یا حتی تحلیلهای رقبا را برگرداند، اگر وزن معنایی مشابهی داشته باشند. متادیتا به شما امکان میدهد فضای جستجو را بر اساس موارد زیر محدود کنید:
- کنترل دسترسی: اطمینان از اینکه کاربران فقط دادههایی را میبینند که مجاز به دسترسی به آنها هستند.
- تازگی: اولویت دادن به آخرین نسخههای اسناد.
- طبقهبندی: محدود کردن نتایج به انواع فایلها، نویسندگان یا برچسبهای خاص.
- دقت: کاهش توهمسازی (Hallucination) با مجبور کردن مدل به استفاده فقط از منابع خاص و تأیید شده.
پیادهسازی فیلترها در LangChain
LangChain از طریق رابطهای بازیابنده خود، پشتیبانی قوی برای فیلترگذاری متادیتا ارائه میدهد. هنگام استفاده از انبارهای برداری مانند FAISS یا Pinecone، میتوانید فیلترهای متادیتا را مستقیماً در طول فرآیند جستجوی شباهت ارسال کنید.
from langchain.vectorstores import Pinecone
# فرض کنید `pinecone_index` نمای Pinecone شماست که مقداردهی اولیه شده است
# و `pca` تکنیک کاهش ابعاد شماست
def retrieve_with_filter(query, department, doc_id):
# تعریف فیلترهای متادیتا
filters = {
"department": department, # تطبیق دقیق
"doc_id": doc_id # محدودیت سند خاص
}
# انجام جستجوی شباهت با فیلترها
# k: تعداد نتایج، filter: دیکشنری متادیتا
results = pinecone_index.similarity_search_with_relevance_scores(
query, k=3, filter=filters
)
return results
# استفاده
# results = retrieve_with_filter("How do I request PTO?", "HR", "doc_123")
فیلترگذاری پیشرفته در LlamaIndex
LlamaIndex از طریق API `MetadataFilters` خود، کنترل دقیقتری ارائه میدهد و امکان ترکیبهای منطقی پیچیده مانند AND، OR و عملگرهای مقایسه (بزرگتر از، کوچکتر از، در لیست) را فراهم میکند.
from llama_index.vector_stores.pinecone import PineconeVectorStore
from llama_index import VectorStoreIndex, SimpleDirectoryReader
from llama_index.filters import MetadataFilters, FilterCondition, FilterOperator
# بارگذاری اسناد
documents = SimpleDirectoryReader("data_dir").load_data()
# ساخت نمای
index = VectorStoreIndex.from_documents(documents, vector_store=vector_store)
# تعریف فیلترهای پیچیده
filters = MetadataFilters(
filters=[
{
"key": "author",
"value": ["John Doe", "Jane Smith"],
"operator": FilterOperator.IN
},
{
"key": "date_published",
"value": "2023-01-01",
"operator": FilterOperator.GTE # بزرگتر یا مساوی
}
],
condition=FilterCondition.AND
)
# پرسش با فیلترها
retriever = index.as_retriever(similarity_top_k=5)
query_engine = index.as_query_engine()
response = query_engine.query("Summarize recent policy updates", filters=filters)
نمونههای عملی: امنیت SaaS چند مستأجر
یک پلتفرم SaaS چند مستأجر را در نظر بگیرید که در آن کاربران به سازمانهای مختلف تعلق دارند. اگر از یک انبار برداری مشترک برای همه مستأجران استفاده کنید، فیلترگذاری متادیتا برای امنیت غیرقابل مذاکره است. باید هر تکه سند را با یک `tenant_id` برچسب بزنید. در طول بازیابی، لایه برنامه باید `tenant_id` کاربر فعلی را در آبجکت فیلتر تزریق کند. این کار اطمینان حاصل میکند که دادههای محرمانه مستأجر A هرگز برای مستأجر B بازیابی نمیشود، حتی اگر پرسش معنایی به طور کامل مطابقت داشته باشد.
نتیجهگیری
فیلترگذاری متادیتا سیستمهای RAG را از موتورهای جستجوی معنایی ساده به پلتفرمهای بازیابی اطلاعات دقیق، امن و آگاه از بافت تبدیل میکند. با تسلط بر یکپارچهسازی فیلترهای ساختاریافته با شباهت برداری، توسعهدهندگان میتوانند دقت پاسخهای LLM را به طور قابل توجهی افزایش دهند، هزینههای توکن را با محدود کردن پنجره بافت کاهش دهند و سیاستهای سختگیرانه حاکمیت داده را اجرا کنند. با پیچیدهتر شدن معماریهای RAG، در نظر گرفتن متادیتا به عنوان یک شهروند درجه یک در خط لوله بازیابی شما دیگر اختیاری نیست—بلکه ضروری است.