forked from hesabix/arc
6.9 KiB
6.9 KiB
سناریوی جستوجوی پیشرفته (QueryInfo) برای AI
مشکل
در API حسابیکس، لیستهای اصلی (اشخاص، فاکتور، کالا، چک، …) از QueryInfo پشتیبانی میکنند:
| قابلیت | OpenAPI (schemas.py) |
Backend (query_service.py / سرویسها) |
AI امروز |
|---|---|---|---|
search + search_fields |
✅ | ✅ (در بسیاری سرویسها) | 🟡 فقط search ساده؛ search_fields گاهی پیشفرض داخلی |
filters[] با property, operator, value |
✅ | ✅ (ناهمگون بین entityها) | 🔴 تقریباً استفاده نمیشود |
عملگرهای =, >, <, *, in, … |
✅ مستند | ✅ در QueryBuilder و سرویسهای اختصاصی |
🔴 مدل از وجودشان بیخبر است |
sort / sort_by |
✅ | ✅ | 🟡 محدود |
علت: توضیحات toolهای AI (search_invoices, query_business_data, …) فقط فیلدهای تخت (from_date, person_id) دارند و filters بهعنوان آرایهٔ FilterItem در schema/tool prompt نیامده. علاوه بر این، _build_list_query در ai_query_service.py کلید filters را به query سرویس forward نمیکرد (رفع شد در فاز ۱۰).
مدل دادهٔ استاندارد (مرجع OpenAPI)
{
"take": 20,
"skip": 0,
"search": "علی",
"search_fields": ["alias_name", "mobile", "code"],
"sort_by": "created_at",
"sort_desc": true,
"filters": [
{"property": "total_amount", "operator": ">=", "value": 1000000},
{"property": "document_date", "operator": ">=", "value": "2024-01-01"},
{"property": "description", "operator": "*", "value": "خرید"}
]
}
عملگرها (همان FilterOperator / QueryBuilder)
| عملگر | معنی |
|---|---|
= |
برابر |
!= |
نابرابر |
>, >=, <, <= |
مقایسه عددی/تاریخ |
* |
شامل (LIKE %value%) |
*? |
شروع با |
?* |
پایان با |
in |
عضو مجموعه (value آرایه) |
is_null / is_not_null |
خالی / غیرخالی (در برخی سرویسها) |
همهٔ filters با AND ترکیب میشوند.
فازهای اجرایی پیشنهادی
فاز ۱۰ — زیرساخت AI + query_business_data (اولویت بالا) ✅ شروع شده
| # | تحویل | توضیح |
|---|---|---|
| ۱۰.۱ | ai_query_filter_catalog.py |
برای هر entity: ستونهای قابل فیلتر + عملگرهای مجاز + فیلدهای جستجو |
| ۱۰.۲ | list_queryable_fields |
tool: «برای invoice چه فیلترهایی دارم؟» |
| ۱۰.۳ | ai_query_filter_service.normalize_query_filters |
اعتبارسنجی و نرمالسازی filters قبل از سرویس |
| ۱۰.۴ | اصلاح _build_list_query |
پاسدادن filters, search_fields, sort |
| ۱۰.۵ | ADVANCED_QUERY_PROMPT_BLOCK در prompt سیستم |
آموزش مدل برای ساخت filters |
| ۱۰.۶ | گسترش schemaی query_business_data.filters |
توضیح ساختار FilterItem + مثال |
فاز ۱۱ — toolهای اختصاصی ✅ (پیادهسازی شده)
| entity | tool | کار |
|---|---|---|
| invoice/document | search_invoices |
پارامتر filters + search_fields |
| person | search_persons |
مهاجرت به get_persons_by_business + QueryInfo کامل |
| product | search_products |
filters برای item_type, قیمت، … |
| check, transfer, expense_income | همان الگو |
الگوی واحد: هر tool لیست، پارامترهای مشترک:
{
"search": "string?",
"search_fields": ["string"]?,
"filters": [{"property","operator","value"}]?,
"take", "skip", "sort_by", "sort_desc"
}
فاز ۱۲ — OpenAPI و UI (همراستاسازی) ✅
| # | کار | وضعیت |
|---|---|---|
| ۱۲.۱ | کامپوننت مشترک QueryInfo / DocumentListQuery در POST list |
✅ |
| ۱۲.۲ | مثالهای فارسی در Swagger (json_schema_extra + Components) |
✅ |
| ۱۲.۳ | GET /api/v1/query-schema/{entity} برای کلاینت و AI |
✅ |
فاز ۱۳ — کاتالوگ پویا (بلندمدت)
- استخراج خودکار فیلدهای مجاز از metadata مدل/SQLAlchemy یا registry UI
- تست قراردادی: «هر فیلد UI در گرید → در catalog AI»
جریان پیشنهادی برای مدل (بعد از فاز ۱۰)
کاربر: «فاکتورهای فروش بالای ۵ میلیون از تهران»
↓
۱. list_queryable_fields(entity=invoice) [اختیاری اگر مطمئن نیست]
↓
۲. query_business_data(
entity=invoice,
filters=[
{"property":"document_type","operator":"=","value":"invoice_sales"},
{"property":"total_amount","operator":">=","value":5000000}
],
search="تهران",
search_fields=["description","extra_info"]
)
یا برای اشخاص:
filters=[
{"property":"person_types","operator":"*","value":"customer"},
{"property":"balance","operator":">","value":0}
]
محدودیتها و نکات
- ناهمگونی سرویسها: همه entityها از
QueryBuilderیکسان استفاده نمیکنند؛person_serviceمنطق اختصاصی دارد؛document_repositoryفقط برخیpropertyها را درfiltersمیشناسد. کاتالوگ AI باید فقط فیلدهای تأییدشده را نشان دهد. - فیلدهای مجازی: مثل
project_nameروی سند — در DBproject_idاست؛ catalog باید alias را مستند کند. - امنیت: اعتبارسنجی
propertyدر برابر whitelist (جلوگیری از فیلتر روی ستونهای حساس). - حجم: سقف تعداد
filters(مثلاً ۱۰) وtake(۲۰۰ در AI).
معیار پذیرش
- مدل بتواند با
query_business_dataفاکتوری باtotal_amount >= Xپیدا کند (در entityهای پشتیبانیشده). list_queryable_fieldsبرای حداقل ۶ entity پرکاربرد فیلد برگرداند.- Prompt سیستم به صراحت به
filtersو عملگرها اشاره کند. - مستندات اجرایی در
AI_EXECUTION_PHASES.mdبهروز شود.
فایلهای مرتبط
| موضوع | مسیر |
|---|---|
| Schema | adapters/api/v1/schemas.py → FilterItem, QueryInfo |
| Query builder | app/services/query_service.py |
| AI query | app/services/ai/ai_query_service.py |
| کاتالوگ فاز ۱۰ | app/services/ai/ai_query_filter_catalog.py |
| نرمالساز | app/services/ai/ai_query_filter_service.py |