پرش به محتویات

بازنویسی پرسش

در فارسی بسیاری از واژه ها چند املای پذیرفته دارند و کاربران گاهی حروف عربی، املای قدیمی یا فاصله گذاری متفاوت به کار می برند. از نسخه 0.3.0 بازنویس پرسش از هر پرسش چند گونه می سازد و نتیجه آنها را با هم ترکیب می کند.

from persian_rag import QueryRewriter, RAGPipeline, RewritingRetriever

rewriter = QueryRewriter()
rewriter.variants("اطاق های هتل طهران")

pipeline = RAGPipeline(retriever, llm=llm, query_rewriter=rewriter)
expanded = RewritingRetriever(retriever, rewriter)

قاعده ها

قاعده نمونه
گروه های املایی اتاق و اطاق، تهران و طهران، هیئت و هیات و هیأت، مسئله و مساله، رئیس و رییس، بلیت و بلیط، باتری و باطری، پاییز و پائیز، آیین و آئین
املای همزه و مد شکل های أ، ؤ، ئی، آ، ۀ و ة
فاصله پیشوند و پسوند می و نمی و ها و های و تر و ترین به شکل چسبیده، با فاصله یا با نیم فاصله
حروف عربی ي و ك، به طور پیش فرض خاموش (arabic_variants=True)

تنظیمات با RewriteConfig(max_variants=6, spelling=True, orthography=True, affix_spacing=True, arabic_variants=False, llm_variants=3) انجام می شود. گروه های خودتان را با QueryRewriter(extra_groups=[("ایمیل", "رایانامه")]) یا persian_rag.rewrite.spelling_groups_from_mapping({...}) اضافه کنید.

بازنویسی با مدل زبانی

rewriter = QueryRewriter(llm=my_llm)  # هر تابع str -> str، مثلا OllamaLLM()

از مدل خواسته می شود چند صورت دیگر از پرسش را هر کدام در یک خط بنویسد. پاسخ پاک سازی و پس از گونه های قاعده محور اضافه می شود. اگر فراخوانی مدل خطا بدهد نادیده گرفته می شود و بازیابی ادامه پیدا می کند.

ترکیب نتیجه ها

RewritingRetriever هر گونه را جداگانه جست و جو می کند و رتبه ها را با روش RRF (rrf_k=60) ترکیب می کند. وزن پرسش اصلی دو برابر است (original_weight=2.0)، پس گسترش پرسش پوشش را بیشتر می کند بدون اینکه تطابق های دقیق پایین بروند. گونه هایی که هر نتیجه را پیدا کرده اند در metadata["matched_queries"] ثبت می شوند. اثر آن روی پرسش های با املای دیگر در صفحه محک ها آمده است.

خط فرمان

persian-rag query "اطاق پنج دری" --expand rules
persian-rag query "اطاق پنج دری" --expand llm --llm ollama