diff --git a/.env.example b/.env.example index 8b41182..7f65ff0 100644 --- a/.env.example +++ b/.env.example @@ -45,10 +45,9 @@ QDRANT_API_KEY= # «مطالعات اجتماعی ششم» ، «ریاضی سوم» ، «ریاضی ششم» ، «ریاضی هفتم». # یعنی جزءِ گرید فقط «سوم/چهارم/ششم/هفتم» است (بدونِ «دبستان»). # -# کلیدِ فیلترِ درس دیگر دستی تنظیم نمی‌شه — rag/services/known_collections.py -# خودش تشخیص می‌ده: ریاضی → `chapter` (و شماره‌ی فصل رو به رشته‌ی دقیق تبدیل -# می‌کنه)، بقیه → `lesson_number`. RAG_QDRANT_LESSON_FILTER_KEY فقط برای -# سازگاریِ عقب‌رو مونده و استفاده نمی‌شه. +# کلیدِ فیلترِ درس دستی تنظیم نمی‌شه — rag/services/known_collections.py خودش +# تشخیص می‌ده: ریاضی → `chapter` (و شماره‌ی فصل رو به رشته‌ی دقیق تبدیل می‌کنه)، +# بقیه → `lesson_number`. RAG_COLLECTION_NAME_TEMPLATE={subject} {grade} RAG_RETRIEVAL_TOP_K=4 # RAG_FORCE_MOCK=1 یعنی حتی با وجودِ کلیدها هم مسیرِ RAG خاموش بمونه. diff --git a/rag/services/config.py b/rag/services/config.py index 55f6f88..bbaa7d3 100644 --- a/rag/services/config.py +++ b/rag/services/config.py @@ -1,11 +1,11 @@ """ -هم‌خوانیِ نامِ collection و کلیدِ فیلترِ Qdrant با دادهٔ موجودِ تیمِ دیگر. +تنظیماتِ RAG و هم‌خوانیِ نامِ collection با دادهٔ موجودِ تیمِ دیگر. در Rag_backend نامِ collection این‌طور ساخته می‌شه: f"{subject.name} {subject.grade.title}".lower() -و فیلترِ درس با کلیدِ payloadِ "lesson_number" (برای درس‌های متنی) یا -"chapter" (برای ریاضی) انجام می‌شه. اینجا هر دو از settings قابلِ تنظیم‌ان -چون اسمِ دقیقِ گرید حساسه (کاربر قبلاً با اسمِ نادرست به مشکل خورده بود). +قالبِ نام و نگاشتِ گرید از settings قابلِ تنظیم‌ان چون اسمِ دقیقِ گرید حساسه +(کاربر قبلاً با اسمِ نادرست به مشکل خورده بود). کلیدِ فیلترِ درس/فصل خودکار +از روی subject انتخاب می‌شه — نگاه کنید به rag/services/known_collections.py. """ from django.conf import settings diff --git a/rag/services/tutor.py b/rag/services/tutor.py deleted file mode 100644 index 4b8c553..0000000 --- a/rag/services/tutor.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -نقطه‌ی ورودِ RAG برای ai_tutor. - -ai_tutor.views.generate_tutor_answer وقتی rag_is_configured() باشه این را -صدا می‌زنه؛ در غیرِ این‌صورت به همون پاسخِ stubِ قبلی برمی‌گرده. -""" -import logging - -from .config import rag_is_configured # noqa: F401 (re-export برای ai_tutor) -from .generation import generate_answer -from .retrieval import retrieve_context - -logger = logging.getLogger(__name__) - - -def answer_question(user_question: str, *, subject: str = '', grade_id=None, - lesson_number=None) -> tuple[str, list[str], list[dict]]: - """ - خروجی: (answer, follow_ups, used_chunks) - - used_chunks = [{title, summary, score}, ...] — ممکنه خالی باشه وقتی - subject/lesson_number ارسال نشده یا اون درس هنوز در Qdrant نیست؛ در این - حالت پاسخ به‌صورتِ «تدریسِ عمومی» تولید می‌شه (بدونِ استناد به کتاب). - - استثناهای شبکه/provider اینجا خفه نمی‌شن؛ لایه‌ی بالا (AskAIView) اون‌ها - رو به 503 AIProviderUnavailable تبدیل می‌کنه. - """ - context, _meta = retrieve_context( - user_question, - subject=subject, - grade_id=grade_id, - lesson_number=lesson_number, - ) - answer, follow_ups = generate_answer(user_question, context) - return answer, follow_ups, context