Loading
Alireza Shokrani

Digital Architect

AI Solutions Engineer

Founder @ CoreBiz ERP

GenAI & RAG Specialist

Full-Stack Systems Developer

Alireza Shokrani

Digital Architect

AI Solutions Engineer

Founder @ CoreBiz ERP

GenAI & RAG Specialist

Full-Stack Systems Developer

Solution

تبدیل داده‌های سازمانی ایستا به موتورهای تصمیم: پیوند جریان‌های کاری ERP با کوپایلوت‌های هوش مصنوعی زمینه‌آگاه

تبدیل داده‌های سازمانی ایستا به موتورهای تصمیم: پیوند جریان‌های کاری ERP با کوپایلوت‌های هوش مصنوعی زمینه‌آگاه

سیستم‌های برنامه‌ریزی منابع سازمانی (ERP) ارزشمندترین داده‌های سازمان را نگه می‌دارند: دفاتر کل مالی، سوابق موجودی، تاریخچه تأمین، تراکنش‌های مشتری. با این حال این داده‌ها در فرم‌های ایستا به دام افتاده‌اند — از طریق صفحات UI صلب، گزارش‌های از پیش ساخته‌شده و پرس‌وجوهای SQL که فقط کارکنان آموزش‌دیده فنی می‌توانند بنویسند، قابل دسترسی هستند.

نتیجه یک ناکارآمدی ساختاری است:

  • تصمیم‌گیرندگان به پاسخ‌هایی نیاز دارند که مستلزم داده‌ای است که نمی‌توانند مستقیماً به آن دسترسی داشته باشند

  • تحلیلگران ساعت‌ها صرف نوشتن پرس‌وجو می‌کنند به جای تحلیل نتایج

  • داده‌ها وجود دارند — اما عمل نمی‌کنند. دراز می‌کشند، منتظر اینکه یک انسان یک سؤال کسب‌وکار را به یک پرس‌وجوی فنی ترجمه کند

این شکافی است که کوپایلوت‌های هوش مصنوعی برای ERP برای بستن آن طراحی شده‌اند.

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

این مقاله درباره معماری آن لایه است:

از داده ایستا به موتورهای تصمیم — چگونه کوپایلوت‌های هوش مصنوعی زمینه‌آگاه بسازیم که ورودی زبان طبیعی و جریان‌های کاری ERP را به صورت ایمن پل بزنند.

بخش ۱ — چرا «چت با داده‌هایت» در سازمان شکست می‌خورد

دمو فریبنده است: یک LLM را به پایگاه داده وصل می‌کنید، سؤالی می‌پرسید، پاسخی می‌گیرید. اما در بافت ERP، Text-to-SQL ساده به دلایل قابل پیش‌بینی و معماری شکست می‌خورد.

حالت‌های شکست

حالت شکستپیامد
توهم اسکیماLLM جدول/ستون‌هایی اختراع می‌کند که وجود ندارند → پرس‌وجو شکست می‌خورد
عملیات نوشتنLLM UPDATE/DELETE تولید می‌کند → فساد داده
دور زدن مجوزپرس‌وجو داده‌هایی را برمی‌گرداند که کاربر نباید ببیند
اجرای نامحدودپرس‌وجو کل جدول‌ها را اسکن می‌کند → قفل پایگاه داده → توقف تولید
بدون رد حسابرسینمی‌توان توضیح داد چه کسی چه چیزی پرسید یا به چه داده‌ای دسترسی داشت
تزریق پرامپتورودی مخرب، عامل را به اقدامات غیرمجاز دستکاری می‌کند

یک LLM بدون Guardrail یک کوپایلوت نیست. یک عامل کنترل‌نشده با اعتبارنامه‌های پایگاه داده است.

چارچوب OWASP: LLM03 — Excessive Agency

OWASP Top 10 برای برنامه‌های LLM در سال ۲۰۲۶ Excessive Agency (LLM03) را برای انعکاس ریسک فزاینده سیستم‌های هوش مصنوعی که می‌توانند به داده دسترسی داشته باشند و اقدامات انجام دهند، ارتقا داد. در بافت ERP، این نظری نیست — یک کوپایلوت با دسترسی نوشتن به سوابق مالی یک سیستم هوش مصنوعی پرخطر تحت قانون هوش مصنوعی اتحادیه اروپا است.

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

بخش ۲ — معماری ایمن: لایه‌های مهار

معماری تولیدی برای کوپایلوت‌های هوش مصنوعی ERP نیازمند دفاع در عمق است — چندین لایه اعتبارسنجی بین زبان طبیعی کاربر و پایگاه داده.

┌─────────────────────────────────────────────────────────────────────────────┐
│                         لایه رابط کاربری                                    │
│              (ویجت چت، ورودی زبان طبیعی)                                    │
├─────────────────────────────────────────────────────────────────────────────┤
│                         لایه Intent و مسیریابی                              │
│         (طبقه‌بندی پرس‌وجو: فقط-خواندن در برابر اقدام، ساده در برابر پیچیده)│
├─────────────────────────────────────────────────────────────────────────────┤
│                         لایه زمینه اسکیما                                   │
│         (بازیابی جدول/ستون‌های مرتبط — نه اسکیمای کامل)                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                         لایه تولید LLM                                      │
│              (تولید SQL/API از زمینه + سؤال)                                │
├─────────────────────────────────────────────────────────────────────────────┤
│                         لایه اعتبارسنجی ایمنی                               │
│    (SQL Guard: فقط-SELECT، بررسی اسکیما، تزریق LIMIT، Timeout)             │
├─────────────────────────────────────────────────────────────────────────────┤
│                         لایه اجرای مجوز                                     │
│              (نقش کاربر → جدول‌ها، سطرها، فیلدهای مجاز)                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                         Sandbox اجرا                                        │
│              (اتصال فقط-خواندن، محدودیت سطر، Timeout پرس‌وجو)               │
├─────────────────────────────────────────────────────────────────────────────┤
│                         حسابرسی و رصدپذیری                                  │
│         (هر پرس‌وجو، هر نتیجه، هر کاربر — ثبت‌شده، قابل ردیابی)             │
└─────────────────────────────────────────────────────────────────────────────┘

اصل معماری: LLM یک مؤلفه در این خط لوله است — نه تصمیم‌گیرنده. خروجی آن به عنوان ورودی غیرقابل اعتماد درمان می‌شود تا توسط لایه‌های قطعی اعتبارسنجی شود.

بخش ۳ — لایه ایمنی SQL: اعتبارسنجی فقط-SELECT

حیاتی‌ترین کنترل ایمنی اعتبارسنجی پرس‌وجوی SQL قبل از اجرا است.

محافظ فقط-SELECT

سیستم‌های Text-to-SQL تولیدی یک قانون سخت اعمال می‌کنند: فقط پرس‌وجوهای خواندن مجاز هستند.

مجاز:      SELECT ... FROM ...
مسدود:     INSERT، UPDATE، DELETE، DROP، ALTER، CREATE، TRUNCATE
مسدود:     GRANT، REVOKE، EXEC، CALL
مسدود:     دستورات چندگانه (تقسیم‌شده با Semikolon)

الگوی پیاده‌سازی:

import sqlglot

def validate_query(sql: str) -> tuple[bool, str]:
    """اعتبارسنجی SQL به عنوان یک دستور SELECT واحد."""
    try:
        parsed = sqlglot.parse_one(sql)
    except Exception as e:
        return False, f"خطای پارس SQL: {e}"
    
    # بررسی نوع دستور
    if not isinstance(parsed, sqlglot.exp.Select):
        return False, f"فقط دستورات SELECT مجاز هستند. دریافت‌شده: {type(parsed).__name__}"
    
    # بررسی کلیدواژه‌های ممنوع در SQL خام
    forbidden = ['INSERT', 'UPDATE', 'DELETE', 'DROP', 'ALTER', 
                 'CREATE', 'TRUNCATE', 'GRANT', 'REVOKE']
    upper_sql = sql.upper()
    for kw in forbidden:
        if kw in upper_sql:
            return False, f"کلیدواژه ممنوع تشخیص داده شد: {kw}"
    
    # اطمینان از وجود LIMIT (تزریق در صورت عدم وجود)
    if not parsed.args.get('limit'):
        parsed = parsed.limit(1000)  # محدودیت ایمنی پیش‌فرض
    
    return True, parsed.sql()

چرا sqlglot: پارس SQL به یک AST — به جای تطبیق رشته — حملات مبهم‌سازی‌شده (کامنت‌ها، دستکاری Whitespace، تغییر حروف بزرگ/کوچک) را می‌گیرد که فیلترهای مبتنی بر Regex از دست می‌دهند.

تزریق LIMIT

حتی پرس‌وجوهای SELECT می‌توانند آسیب برسانند اگر کل جدول‌ها را اسکن کنند:

-- کاربر می‌پرسد: "همه فاکتورها را نشانم بده"
-- LLM تولید می‌کند: SELECT * FROM invoices
-- Guard تبدیل می‌کند: SELECT * FROM invoices LIMIT 1000

منطق مهندسی: پرس‌وجویی که ۱۰ میلیون سطر برمی‌گرداند حافظه را تمام می‌کند، شبکه را اشباع می‌کند و پایگاه داده را مسدود می‌کند. تزریق LIMIT یک الزام ایمنی سخت است.

Sandbox اجرا

اتصال پایگاه داده‌ای که برای پرس‌وجوهای هوش مصنوعی استفاده می‌شود باید فقط-خواندن و ایزوله باشد:

کنترلپیاده‌سازی
نوع اتصالReplica فقط-خواندن یا نقش با امتیازات فقط-SELECT
Timeout دستورSET statement_timeout = '5s' — کشتن پرس‌وجوهای طولانی
محدودیت سطرحداکثر سطرهای برگشتی به ازای هر پرس‌وجو
جداسازی منابعاستخر اتصال جداگانه از ترافیک اپلیکیشن

بخش ۴ — زمینه اسکیما: مشکل بازیابی در Text-to-SQL

LLM نمی‌تواند SQL معتبر تولید کند بدون دانستن اسکیما. اما ارسال کل اسکیما به LLM دو مشکل ایجاد می‌کند:

  1. هزینه توکن — اسکیمای ERP سازمانی می‌تواند صدها جدول داشته باشد

  2. تخریب دقت — جدول‌های نامرتبط مدل را گیج می‌کنند

Schema Linking از طریق RAG

راه‌حل بازیابی اسکیما است — انتخاب پویا جدول‌ها و ستون‌های مرتبط برای هر پرس‌وجو:

سؤال کاربر: "سطح موجودی فعلی برای SKU ZX-447 چقدر است؟"

گام ۱: بازیابی اسکیمای مرتبط
  → جدول‌ها: inventory، products، warehouses
  → ستون‌ها: sku، quantity، warehouse_id، reorder_level

گام ۲: ساخت زمینه برای LLM
  → "جدول‌های موجود: inventory(sku, quantity, warehouse_id)، 
     products(sku, name, category)، ..."

گام ۳: LLM SQL با نام‌های صحیح جدول/ستون تولید می‌کند

پیاده‌سازی: توصیف جدول و ستون را به عنوان Embedding ایندکس کنید؛ Top-k عناصر اسکیمای مرتبط را برای هر پرس‌وجو بازیابی کنید.

الگوی Knowledge File

سیستم‌های تولیدی بازیابی اسکیما را با دانش دامنه تقویت می‌کنند — مترادف‌ها، اصطلاحات کسب‌وکار و پرس‌وجوهای نمونه:

# knowledge.yaml
synonyms:
  "سطح موجودی": "inventory.quantity"
  "نقطه سفارش مجدد": "inventory.reorder_level"
  "SKU": "products.sku"

example_queries:
  - question: "موجودی SKU X چقدر است؟"
    sql: "SELECT quantity FROM inventory WHERE sku = 'X'"

تأثیر مهندسی: فایل دانش، شکاف معنایی بین نحوه صحبت کاربران کسب‌وکار و ساختار پایگاه داده را پر می‌کند.

بخش ۵ — اجرای مجوز: Row-Level Security برای هوش مصنوعی

یک الزام حیاتی — و اغلب نادیده گرفته‌شده: کوپایلوت هوش مصنوعی باید همان مجوزهای کاربر را رعایت کند.

مشکل مجوز

کاربر A (مدیر فروش): می‌تواند همه داده‌های مشتری را ببیند
کاربر B (نماینده فروش): فقط می‌تواند مشتریان اختصاص‌یافته خود را ببیند
کاربر C (مالی): می‌تواند همه داده‌های مالی را ببیند، بدون PII مشتری

کوپایلوت ساده: همان پرس‌وجو را برای همه کاربران اجرا می‌کند
→ نشت داده

بازنویسی پرس‌وجو آگاه از نقش

لایه یکپارچگی باید فیلترهای مجوز را در هر پرس‌وجو تزریق کند:

-- کاربر می‌پرسد: "همه سفارش‌ها را نشانم بده"
-- LLM تولید می‌کند: SELECT * FROM orders
-- لایه مجوز بر اساس نقش کاربر بازنویسی می‌کند:

-- نماینده فروش (user_id=42):
SELECT * FROM orders WHERE sales_rep_id = 42

-- مدیر منطقه‌ای (region='EMEA'):
SELECT * FROM orders WHERE region = 'EMEA'

-- ادمین:
SELECT * FROM orders

الگوی پیاده‌سازی:
۱. تعریف نگاشت‌های مجوز (نقش → جدول‌های مجاز، فیلتر سطر، ماسک ستون)
۲. قبل از اجرا، SQL تولیدشده توسط LLM را پارس کنید و بندهای WHERE را تزریق کنید
۳. برای امنیت سطح ستون، ستون‌های حساس را با NULL یا مقادیر ماسک‌شده جایگزین کنید

Whitelisting فیلد

فراتر از فیلترهای سطر، کنترل دسترسی سطح ستون از افشای PII جلوگیری می‌کند:

ستون‌های مسدود (به ازای پیکربندی):
  - password، api_key، token
  - ssn، tax_id، bank_account
  - salary (مگر اینکه نقش HR باشد)

لایه مجوز تأیید می‌کند که هیچ ستون مسدودی در SQL تولیدشده ظاهر نمی‌شود.

بخش ۶ — لایه حسابرسی: انطباق به عنوان معماری

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

الزام حسابرسی

برای هر پرس‌وجوی تولیدشده توسط هوش مصنوعی، سیستم باید ثبت کند:

فیلدهدف
هویت کاربرچه کسی پرسید
پرامپت زبان طبیعیچه پرسید (خام)
SQL تولیدشدهچه اجرا شد
نتیجه اعتبارسنجیمسدود شد؟ چرا؟
زمینه مجوزچه فیلترهایی اعمال شد
نتیجه اجراسطرهای برگشتی، زمان اجرا
زمانچه زمانی اتفاق افتاد

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

ثبت‌سازی مقاوم به دستکاری

برای بافت‌های پرخطر (تصمیمات اعتباری، توصیه‌های استخدامی)، لاگ‌ها باید از نظر رمزنگاری امضا شده باشند:

import hmac
import hashlib

def sign_audit_record(record: dict, secret: bytes) -> str:
    """تولید امضای HMAC برای مقاومت حسابرسی به دستکاری."""
    canonical = json.dumps(record, sort_keys=True)
    return hmac.new(secret, canonical.encode(), hashlib.sha256).hexdigest()

چرا HMAC: تضمین می‌کند که سوابق حسابرسی نمی‌توانند به صورت پس‌نگر بدون تشخیص تغییر کنند — یک الزام برای انطباق قانونی.

بخش ۷ — ارکستراسیون عامل: وقتی پرس‌وجوها به اقدام تبدیل می‌شوند

هر سؤال یک عملیات خواندن ساده نیست. کوپایلوت‌های سازمانی به طور فزاینده نیازمند اجرای جریان‌های کاری چندمرحله‌ای هستند:

کاربر: "پیشنهادات RFQ 000012 را ارزیابی کن و یک تأمین‌کننده توصیه کن."

این نیازمند:
  ۱. خواندن داده RFQ (بازیابی)
  ۲. خواندن داده پیشنهاد تأمین‌کننده (بازیابی)
  ۳. خواندن معیارهای ارزیابی (بازیابی)
  ۴. امتیازدهی هر پیشنهاد (استدلال)
  ۵. تولید توصیه (استدلال)
  ۶. ارائه برای تأیید انسانی (دروازه HITL)
  ۷. ایجاد سفارش خرید (اقدام — نیازمند تأیید)

الگوی LangGraph برای عامل‌های ERP

LangGraph ارکستراسیون حالت‌دار مورد نیاز برای جریان‌های کاری چندمرحله‌ای ERP را فراهم می‌کند:

┌─────────────┐
│   Router    │ ← طبقه‌بندی نوع پرس‌وجو
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  Retriever  │ ← واکشی زمینه مرتبط
│  (اسکیما +  │
│   داده)     │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  Reasoner   │ ← تولید SQL / پلن
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  Validator  │ ← SQL Guard + بررسی مجوز
└──────┬──────┘
       │
       ├── مسدود → بازگشت خطا به کاربر
       │
       ▼ (معتبر)
┌─────────────┐
│  Executor   │ ← اجرای پرس‌وجو در Sandbox
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  Formatter  │ ← ارائه نتایج
└─────────────┘

Human-in-the-Loop برای عملیات نوشتن

برای اقداماتی که داده را تغییر می‌دهند (ایجاد فاکتور، به‌روزرسانی موجودی)، یک دروازه تأیید انسانی اجباری است:

عامل اقدام پیشنهاد می‌کند: "ایجاد سفارش خرید ۵۰۰ واحد از تأمین‌کننده X"
       │
       ▼
┌─────────────────┐
│  بررسی انسانی   │ ← کاربر باید صریحاً تأیید کند
│  (UI تأیید)     │
└────────┬────────┘
         │
    تأیید → اجرا از طریق API ERP
    رد → ثبت رد، بدون اقدام

منطق مهندسی: قانون هوش مصنوعی اتحادیه اروپا نظارت انسانی را برای سیستم‌های هوش مصنوعی پرخطر الزامی می‌کند. دروازه تأیید یک ویژگی UX نیست — یک الزام انطباق است.

بخش ۸ — معماری کامل یکپارچگی

┌─────────────────────────────────────────────────────────────────────────────┐
│                              سیستم ERP                                      │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────────────┐ │
│  │  DB مالی        │  │  DB موجودی      │  │  منطق کسب‌وکار (APIها)      │ │
│  └────────┬────────┘  └────────┬────────┘  └──────────────┬──────────────┘ │
└───────────┼────────────────────┼──────────────────────────┼────────────────┘
            │                    │                          │
            ▼                    ▼                          ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                         MIDDLEWARE یکپارچگی                                 │
│  ┌───────────────────────────────────────────────────────────────────────┐ │
│  │  لایه ایمنی: SQL Guard (فقط-SELECT) │ تزریق‌کننده مجوز │ حسابرسی      │ │
│  └───────────────────────────────────────────────────────────────────────┘ │
│  ┌───────────────────────────────────────────────────────────────────────┐ │
│  │  لایه هوشمندی: Schema Retriever │ LLM Orchestrator │ Validator       │ │
│  └───────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
            │
            ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                         رابط کوپایلوت هوش مصنوعی                            │
│              UI چت │ دروازه‌های تأیید │ ارائه نتایج                         │
└─────────────────────────────────────────────────────────────────────────────┘
            │
            ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                              کاربران                                        │
│         مالی │ عملیات │ مدیریت │ تأمین                                     │
└─────────────────────────────────────────────────────────────────────────────┘

استک فناوری (مرجع)

لایهگزینه‌های فناوری
ارکستراسیونLangGraph، LangChain
اعتبارسنجی SQLsqlglot (پارس AST)
بازیابی اسکیماpgvector، Elasticsearch
LLMOpenAI، Anthropic، محلی (vLLM)
حسابرسیPostgreSQL، امضای HMAC
یکپارچگی ERPREST APIها، سرورهای MCP

بخش ۹ — چه زمانی از این معماری استفاده کنیم (و چه زمانی نه)

کوپایلوت هوش مصنوعی ERP با این معماری بسازید وقتی:

  • ✅ کاربران به دسترسی زبان طبیعی به داده ERP نیاز دارند

  • ✅ ایمنی و قابلیت حسابرسی غیرقابل مذاکره هستند

  • ✅ ERP APIهای خوب‌تعریف‌شده یا دسترسی به پایگاه داده دارد

  • ✅ مجوزهای مبتنی بر نقش باید اعمال شوند

  • ✅ انطباق (قانون هوش مصنوعی اتحادیه اروپا، SOX، GDPR) اعمال می‌شود

  • ✅ سازمان ظرفیت مهندسی برای نگهداری Middleware دارد

آن را نسازید وقتی:

  • ❌ ERP از قبل گزارش‌دهی کافی برای نیازهای کاربر فراهم می‌کند

  • ❌ تیم مهندسی اختصاصی برای نگهداری لایه‌های ایمنی وجود ندارد

  • ❌ کاربرد شامل تصمیمات خودمختار پرخطر بدون نظارت انسانی است

  • ❌ الزامات تأخیر نمی‌تواند استنتاج LLM + اعتبارسنجی را در خود جای دهد

کوپایلوت بدون لایه‌های ایمنی یک دستیار نیست. یک مسئولیت با اعتبارنامه‌های پایگاه داده است.

نتیجه‌گیری — از ذخیره‌سازی داده به زیرساخت تصمیم

سیستم‌های ERP داده ذخیره می‌کنند. آن‌ها به خودی خود تصمیم تولید نمی‌کنند.

لایه یکپارچگی بین داده ایستا و استدلال پویای هوش مصنوعی جایی است که ارزش ایجاد می‌شود — یا ریسک معرفی می‌شود. تفاوت انضباط معماری است:

  • ایمنی SQL اختیاری نیست — مرز بین کوپایلوت و تهدید است

  • اجرای مجوز یک ویژگی نیست — یک الزام امنیتی است

  • ثبت حسابرسی سربار نیست — زیرساخت انطباق است

  • نظارت انسانی اصطکاک نیست — مبنای قانونی استقرار است

ERP از قبل پاسخ را می‌داند. کار کوپایلوت این است که سؤال درست را بپرسد — به صورت ایمن، قابل حسابرسی و در محدوده آنچه کاربر مجاز به دانستن است.

یادداشت نویسنده

این مقاله الگوهای معماری توسعه‌یافته در هنگام ساخت Binesh AI — یک چارچوب هوش مصنوعی سفارشی با خطوط لوله RAG، ارکستراسیون عامل و لایه‌های یکپارچگی سازمانی — را بازتاب می‌دهد. برای همکاری در معماری کوپایلوت هوش مصنوعی ERP، از طریق صفحه تماس با من در ارتباط باشید.

Tags:
Write a comment