هیچ محصولی در سبد خرید وجود ندارد.

چالش اصلی یکپارچهسازی ایجنتها با پایگاههای داده، معماریهای متفاوت است. راهکارهای عملی برای اتصال n8n به SQL و NoSQL در این گزارش بررسی میشود.
چند روز پیش، یک تیم توسعه نرمافزار که روی یک ایجنت هوشمند پشتیبانی مشتری کار میکرد، با صحنهای آشنا مواجه شد: عامل هوشمندشان پاسخهای سریع و ظاهراً دقیق میداد، اما مدام اطلاعات منسوخ و ناهماهنگ را به کاربران ارائه میکرد. ریشه این مشکل در نگاه اول به مدل زبانی یا منطق تصمیمگیری برمیگشت، اما بررسی عمیقتر نشان داد که گسل اصلی جایی در لایه اتصال به دیتابیس نهفته است. این ایجنت دادهها را از یک مخزن قدیمی و بدون هماهنگی با تغییرات لحظهای میخواند. چنین سناریویی بیش از آنکه یک اشتباه فنی باشد، نشانهٔ یک ناهماهنگی ساختاری است که بسیاری از پروژههای هوش مصنوعی را از رسیدن به کارایی واقعی بازمیدارد.
پیشنهاد مطالعه : آیا ایجنتهای هوش مصنوعی مدیریت سفارش را متحول میکنند؟
جدول محتوا [نمایش]
ایجنتهای هوش مصنوعی امروزی تنها با تکیه بر دانش ذخیرهشده در وزنهای شبکه عصبی نمیتوانند نیازهای پویای کاربران را پاسخ دهند. آنها برای تصمیمگیری در لحظه، نیازمند دسترسی به دادههای زنده، ساختاریافته و بهروز هستند. دیتابیسهای مدرن با قابلیت ذخیرهسازی رابطهای، گرافی یا اسنادی، بستری را فراهم میکنند که ایجنت بتواند فراتر از حافظهٔ محدود خود، از اطلاعات جاری کسب و کار، رفتار کاربران و رویدادهای لحظهای استفاده کند. بدون این یکپارچهسازی، هر عامل هوشمند در مقابل دادههای پویا ناتوان خواهد بود و خروجی آن به سرعت از واقعیت فاصله میگیرد.
زمانی که یک ایجنت صرفاً بر اساس وزنهای ثابت و دادههای آموزشی خود عمل میکند، قادر به انعکاس تغییرات سریع محیط نیست. تصور کنید یک دستیار خرید آنلاین، قیمتها و موجودی را از یک پایگاه دادهٔ کش شده میخواند که هر شب بهروز میشود. در طول روز، تخفیفهای موقت یا اتمام موجودی برخی کالاها اتفاق میافتد و ایجنت همچنان اطلاعات قدیمی را بازمیگرداند. این شکاف میان مغز تصمیمگیرنده و حافظهٔ دادهای، اعتبار سیستم را خدشهدار میکند و کاربر را سردرگم میسازد. ریشهٔ این ناهماهنگی، طراحی معماری جداگانهٔ ماژول استدلال و ماژول ذخیرهسازی است که در بسیاری از پروژهها بهعنوان یک مسئلهٔ درجه دوم نادیده گرفته میشود.
یکپارچهسازی مؤثر نیازمند لایهای واسط است که ایجنت بتواند با آن پرسوجوهای طبیعی یا ساختاریافته را به دستورات دیتابیس تبدیل کند. برای مثال، یک عامل هوشمند مدیریت پروژه میتواند با خواندن وضعیت واقعی تسکها از دیتابیس، اولویتبندی خود را تنظیم کند. این ارتباط باید دوطرفه باشد: ایجنت نه تنها داده میخواند، بلکه نتایج تعاملات خود را نیز ذخیره میکند تا حافظهٔ بلندمدت خود را تقویت کند. در این میان، استفاده از ابزارهای مدرن مانند ORMهای تطبیقی یا APIهای ساختهشده برای ایجنتها، اجازه میدهد تا بدون نگرانی از جزئیات فنی، به دادهها دسترسی داشته باشند. برای نمونه، پلتفرمهایی که امکان «خرید ایجنت هوش مصنوعی» با اتصال آماده به دیتابیس را فراهم میکنند، مسیر پیادهسازی را هموارتر ساختهاند.
یکی از اشتباهات متداول، طراحی یک اتصال همیشهفعال بدون مدیریت تراکنشها و قفلهای داده است. ایجنتها معمولاً پرسوجوهای همزمان زیادی ارسال میکنند و اگر دیتابیس برای بارهای سنگین بهینه نشده باشد، کندی و خطاهای رقابتی پدیدار میشود. مثال ملموس: یک ایجنت پشتیبانی که همزمان تاریخچهٔ مکالمات مشتری را میخواند و هم پاسخ جدیدی ثبت میکند، ممکن است به دلیل عدم مدیریت صحیح تراکنش، اطلاعات را ناهماهنگ ذخیره کند. این مسئله در نهایت به تجربهٔ کاربری لطمه میزند و اعتماد به سیستم را کاهش میدهد. باید توجه داشت که یکپارچهسازی بدون رعایت اصول امنیتی و انسجام داده، میتواند آسیبپذیریهای جدی ایجاد کند. مثلاً اگر ایجنت اجازهٔ نوشتن مستقیم روی دیتابیس را داشته باشد و ورودیهای خود را به درستی پالایش نکند، خطر نشت داده یا خرابکاری در پایگاه اطلاعاتی وجود خواهد داشت.
تصور کنید یک ایجنت پزشکی که سوابق بیمار را از دیتابیس بیمارستان میخواند و توصیههای درمانی ارائه میدهد. اگر اتصال آن به دیتابیس با تأخیر یا نادرست باشد، ممکن است دارویی را پیشنهاد کند که با شرایط فعلی بیمار در تضاد است. در چنین مواردی، یکپارچهسازی دقیق نهتنها کارایی سیستم، بلکه جان افراد را تحت تأثیر قرار میدهد. از سوی دیگر، وقتی ایجنت بتواند به سرعت و با اطمینان از صحت دادهها استفاده کند، کاربران حس میکنند با یک دستیار آگاه و مسئول روبهرو هستند. این اعتماد، مهمترین سرمایهای است که در بلندمدت باعث ماندگاری راهحلهای هوش مصنوعی میشود. بنابراین، طراحی اتصال ایجنت به دیتابیس باید به اندازهٔ خود الگوریتم هوشمندی، جدی گرفته شود.
نکته جالب اینجاست که بسیاری از تیمها، معماری تعامل ایجنت با داده را مشابه یک پرسشوپاسخ ساده SQL تصور میکنند، در حالی که جریان تصمیمگیری ایجنت کاملاً غیرخطی است. یک ایجنت برای تکمیل یک وظیفه، ممکن است دهها پرسش متوالی و وابسته به هم را تولید کند و گاه مسیر خود را بر اساس پاسخ دریافتی تغییر دهد. این الگو با یک کوئری ثابت یا یک stored procedure کلاسیک تفاوت بنیادین دارد. دیتابیسهای رابطهای که بر پایه اتمیک بودن تراکنشها و یکپارچگی ارجاعی ساخته شدهاند، برای بار کاری ایجنت که گاه غیرقابل پیشبینی است، چالشهای جدیدی ایجاد میکنند. در نقطه مقابل، دیتابیسهای NoSQL با انعطافپذیری اسنادی و مقیاسپذیری افقی، گزینه جذابی به نظر میرسند، اما هزینه آن را با کاهش تضمینهای سازگاری و پیچیدگیِ پرسوجوهای چندمرحلهای پرداخت میکنند.
یکی از رایجترین راهها برای ارتباط ایجنت با پایگاه داده، تولید داینامیک دستورات SQL بر اساس ورودی کاربر است. این روش در نگاه اول قدرتمند به نظر میرسد، اما لایه جدیدی از آسیبپذیری را به سیستم تزریق میکند. ایجنت ممکن است عبارتی مانند «آخرین سفارشهای مشتری را نشان بده» را به یک کوئری Join سنگین تبدیل کند. اگر منطق تولید کوئری به درستی ورودی را پالایش نکند، خطر تزریق SQL نه از سمت کاربر مستقیم، بلکه از طریق مدل زبانی به وجود میآید. این مسئله فراتر از یک باگ امنیتی ساده است؛ معماری ایجنت را در موقعیتی قرار میدهد که ابزار اتصال به داده خود به یک نقطه نشت اطلاعات یا دستکاری دیتابیس تبدیل میشود. برای مطالعه عمیقتر این مفاهیم میتوانید به مقالات هوش مصنوعی و ایجنت ها مراجعه کنید که سناریوهای امنیتی مشابه را تحلیل کردهاند.
هنگام استفاده از دیتابیسهای NoSQL مانند MongoDB یا Cassandra، ایجنت با پدیده «سازگاری نهایی» روبهروست. در یک سناریوی لجستیک، دستیار هوشمند ممکن است موجودی انبار را در لحظه t از یک نود بخواند و موجودی کاهشیافته را نبیند، زیرا تغییر ثبتشده هنوز به آن نود نرسیده است. این تأخیر باعث میشود ایجنت سفارشی را تأیید کند که موجودی آن در عمل تمام شده است. مکانیسم تصحیح این خطا بسیار پیچیدهتر از دیتابیسهای رابطهای است و نیازمند پیادهسازی الگوریتمهای تطبیقی در لایه میانی است. ایجنت باید یاد بگیرد که به برخی دادهها با درجه اطمینان پایینتر اعتماد کند و گاه برای صحتسنجی، کوئریهای تکراری روی نودهای متفاوت بزند.
تلاش برای ترجمه مستقیم زبان طبیعی ایجنت به SQL یا دستورات NoSQL، معمولاً به یک خروجی ناقص میانجامد. مدل زبانی پیچیدگیهای یک کوئری aggregate در MongoDB یا یک subquery همبسته در SQL را درک میکند، اما نمیتواند بار هزینه اجرایی آن را روی پلن اجرایی دیتابیس پیشبینی کند. یک ایجنت ممکن است کوئریای بنویسد که برای یک دیتابیس با ده میلیون رکورد طراحی شده، و آن را روی یک خوشه کوچک اجرا کند. اینجاست که نه SQL با power query خود و نه NoSQL با قابلیت sharding، نمیتوانند این ناهماهنگی را جبران کنند. راهکار در یک لایه میانی هوشمند نهفته است که کوئری تحلیلی را فیلتر و سادهسازی کند، اما پیادهسازی این لایه معمولاً در معماری بسیاری از پروژهها به فراموشی سپرده میشود.
با درک این نکته که ترجمه مستقیم زبان طبیعی به کوئری، در هر دو دنیای SQL و NoSQL با نقصان همراه است، مسئله اصلی به معماری لایه میانی بازمیگردد. معماری بهینه نه باید انعطاف ایجنت را محدود کند و نه امنیت و سرعت را فدای قدرت expression کند. راه حل در طراحی یک لایه تطبیقگر است که نه صرفاً یک مترجم ساده، بلکه یک مدیر هوشمند پرسوجو عمل کند. این لایه باید بتواند کوئریهای تولیدی ایجنت را پیش از ارسال به دیتابیس، تحلیل، بهینهسازی و از نظر امنیتی اعتبارسنجی کند. تجربه نشان داده پروژههایی که این لایه را به عنوان یک ماژول جداگانه پیاده میکنند، بسیار پایدارتر از آنهایی هستند که ایجنت را مستقیماً به درایور دیتابیس متصل میکنند.
یک الگوی اثباتشده، تفکیک وظایف به سه لایه مجزا است: لایه درک زبان طبیعی ایجنت، لایه نگاشت معنایی به عملیات دیتابیس، و لایه اجرای امن. لایه اول صرفاً وظیفه دارد قصد ایجنت را به شکلی انتزاعی و بدون جزئیات فنی دریافت کند. لایه دوم این درخواست انتزاعی را با توجه به اسکیما و محدودیتهای دیتابیس هدف، به یک یا چند عملیات مشخص تبدیل میکند. لایه سوم که حیاتیترین بخش است، عملیات را با استفاده از کوئریهای پارامتریشده و در بستر یک تراکنش امن اجرا میکند. این ساختار باعث میشود اگر ایجنت یک درخواست مبهم یا حتی مخرب بدهد، آسیبی به دیتابیس نرسد، زیرا لایه دوم آن را فیلتر و لایه سوم آن را در یک جعبه امن اجرا میکند.
کند بودن پاسخ دیتابیس یکی از بزرگترین موانع در تجربه کاربری ایجنتهای مکالمهای است. یک ایجنت پشتیبانی که مجبور است برای هر جمله کاربر به دیتابیس اصلی مراجعه کند، با تأخیر غیرقابل قبولی مواجه میشود. راهکار فنی اینجا استفاده از یک لایه کش هوشمند است که بر اساس بافت مکالمه و پیشبینی نیازهای ایجنت عمل میکند. به عنوان مثال، اگر ایجنت در حال بررسی سفارش یک مشتری خاص است، لایه میانی میتواند تمام اطلاعات مرتبط با آن مشتری را پیشاپیش از دیتابیس اصلی واکشی کرده و در یک کش موقت با زمان انقضای کوتاه ذخیره کند. این کش نهتنها سرعت پاسخدهی را چندین برابر میکند، بلکه بار سنگین کوئریهای تکراری را از روی دیتابیس اصلی برمیدارد. طراحی نادرست کش اما میتواند به دادههای کهنه منجر شود، بنابراین الگوریتم بهروزرسانی آن باید با دقت بسیار بالایی تنظیم شود.
یکی از خطرات پنهان در این معماری، اعطای دسترسیهای بیش از حد به ایجنت است. یک ایجنت برای انجام وظیفه خود نیاز به خواندن و نوشتن دارد، اما این دسترسی نباید نامحدود باشد. معماری بهینه باید یک سیستم سطوح دسترسی پویا را پیادهسازی کند. برای مثال، ایجنت میتواند در یک مکالمه خاص، فقط به رکوردهای مربوط به همان کاربر دسترسی داشته باشد و نتواند کل جدول مشتریان را یکباره بخواند. پیادهسازی این محدودیتها در سطح لایه میانی و با استفاده از توکنهای دسترسی موقت که به هر وظیفه اختصاص مییابند، امکانپذیر است. این کار از وقوع سناریوهای ناخواسته مانند جستجوی گسترده و نشت اطلاعات جلوگیری میکند و به طور کلی امنیت کل سیستم را افزایش میدهد. مفاهیم عمیقتری از این دست را میتوانید در مقالات هوش مصنوعی و ایجنت ها دنبال کنید که به جزئیات فنی امنیت در این سیستمها پرداختهاند.
ایجنتها ذاتاً چندوظیفهای عمل میکنند و ممکن است یک نمونه از ایجنت، همزمان چندین درخواست به دیتابیس ارسال کند. در معماری بهینه، این همروندی باید با دقت مدیریت شود تا از بروز بنبست یا ناهماهنگی داده جلوگیری گردد. استفاده از صف پیام و مدیریت تراکنشهای کوتاهمدت، راهکاری مؤثر است. لایه میانی میتواند درخواستهای همزمان ایجنت را در یک صف قرار دهد و آنها را به ترتیب اولویت و با در نظر گرفتن وابستگیهایشان به دیتابیس ارسال کند. برای عملیاتهای نوشتاری، ثبت لاگ تغییرات و استفاده از الگوی اپند-بیشتر به جای آپدیت مستقیم، میتواند یکپارچگی داده را در شرایط بار بالا تضمین کند. این رویکرد باعث میشود ایجنت هرگز با خطای «deadlock» مواجه نشود و پاسخگویی آن پیوسته باقی بماند.
زمانی که معماری لایه میانی به درستی طراحی نشود، خطاهایی که در سطح اتصال رخ میدهند، به سرعت به کل سیستم سرایت میکنند. یکی از شایعترین این خطاها، عدم تطابق میان اسکیماهای ایجنت و دیتابیس است. ایجنت ممکن است ساختار دادهای را که از مدل زبانی استخراج کرده، مستقیماً به دیتابیس تحمیل کند، در حالی که دیتابیس انتظار یک فرمت مشخص با محدودیتهای نوع داده و کلیدهای خارجی را دارد. این تضاد نه تنها باعث شکست کوئری میشود، بلکه ایجنت را با خطاهای غیرقابل پیشبینی مواجه میکند. رفع این مشکل نیازمند پیادهسازی یک نگاشت تطبیقی در لایه میانی است که پیش از ارسال درخواست، ساختار داده را با اسکیما تطبیق دهد و در صورت نیاز، خطا را به صورت readable به ایجنت برگرداند تا مسیر تصمیمگیری خود را اصلاح کند.
یکی از خطاهایی که کمتر به آن توجه میشود، تنظیم نادرست زمان انتظار (timeout) برای کوئریهای ایجنت است. ایجنتها معمولاً در چرخه تصمیمگیری خود نیازمند پاسخهای سریع هستند، اما دیتابیس ممکن است برای یک کوئری تحلیلی پیچیده، به زمان بیشتری نیاز داشته باشد. اگر timeout خیلی کوتاه تنظیم شود، ایجنت دائم با خطای «انقضای زمان» مواجه میشود و مجبور به تکرار پرسوجو میگردد که این خود بار مضاعفی بر دیتابیس وارد میکند. راهکار در اینجا پویا کردن timeout بر اساس نوع کوئری و حجم دادههای مورد انتظار است. برای مثال، کوئریهای ساده مانند خواندن یک رکورد خاص باید timeout کوتاهی داشته باشند، در حالی که کوئریهای گزارشگیری یا aggregation میتوانند با timeout طولانیتری اجرا شوند. این تنوع در تنظیم زمان، از سردرگمی ایجنت جلوگیری میکند و تجربه کاربری را روانتر میسازد.
یک اشتباه رایج دیگر، عدم استفاده از مکانیزم کش در لایه میانی برای کوئریهای تکراری است. ایجنت در یک مکالمه ممکن است چندین بار به دادههای ثابت مانند پروفایل کاربر یا لیست محصولات نیاز داشته باشد. اگر هر بار به دیتابیس اصلی مراجعه کند، نه تنها پاسخدهی کند میشود، بلکه دیتابیس را تحت بار کوئریهای بیفایده قرار میدهد. روش رفع این خطا، استفاده از یک کش هوشمند با سیاست اعتبارسنجی مبتنی بر زمان یا رویداد است. به عنوان مثال، کش کردن پروفایل کاربر تا زمانی که کاربر تغییری در حساب خود ایجاد کند، میتواند بار دیتابیس را تا ۷۰ درصد کاهش دهد. اما باید مراقب بود که کش به دادههای کهنه منجر نشود؛ بنابراین لایه میانی باید یک مکانیزم invalidate کردن خودکار بر اساس رویدادهای بهروزرسانی داده پیادهسازی کند. برای مطالعه عمیقتر این الگوها و پیادهسازیهای عملی، میتوانید به مقالات هوش مصنوعی و ایجنت ها مراجعه کنید که سناریوهای واقعی و کدنمونههای مرتبط را ارائه دادهاند.
یکی از ملاحظاتی که اغلب نادیده گرفته میشود، ثبت جزئیات خطاهای اتصال در لاگهای ایجنت است. بسیاری از پیادهسازیها خطاهای دیتابیس را به صورت عمومی و سطحی به ایجنت برمیگردانند، در حالی که این خطاها میتوانند حاوی اطلاعات مهمی برای تحلیل ریشه مشکلات باشند. اگر ایجنت نتواند خطا را تشخیص دهد، ممکن است همان مسیر اشتباه را بارها تکرار کند و سیستم را در یک حلقه بیپایان گرفتار سازد. راهکار این است که لایه میانی همه خطاها را با جزئیات کامل لاگ کند و همزمان یک نسخه سادهشده و قابل فهم برای ایجنت ارسال نماید. این کار به تیم توسعه اجازه میدهد تا الگوهای خطا را شناسایی کرده و پیش از تبدیل شدن به بحران، آنها را رفع کنند. همچنین ایجنت میتواند از این خطاها برای تغییر استراتژی خود استفاده کند، مثلاً در صورت خطای مکرر timeout، به سراغ منبع داده جایگزین برود.
پس از مرور چالشهای فنی و معماریهای پیشنهادی، پرسش اصلی که پیش روی تیمهای توسعه قرار میگیرد، به سادگی «چگونه متصل کنیم» نیست، بلکه «آیا زیرساخت موجود اصلاً ظرفیت این اتصال را دارد؟» بسیاری از پروژهها با تصور اینکه صرفاً افزودن یک لایه میانی یا تغییر نوع دیتابیس کافی است، وارد میدان میشوند، اما در عمل با محدودیتهایی مواجه میشوند که ریشه در طراحی اولیه زیرساخت دارد. اینجا دیگر بحث انتخاب بین SQL و NoSQL نیست، بلکه ارزیابی میزان بلوغ فنی سازمان برای میزبانی از یک عامل تصمیمگیرنده هوشمند است که هر ثانیه دهها کوئری پویا تولید میکند.
اولین معیار، توانایی دیتابیس در مدیریت بار کاری غیرخطی و ناگهانی است. یک ایجنت برخلاف کاربر انسانی، میتواند در کمتر از یک ثانیه چندین پرسوجوی سنگین و بههموابسته صادر کند. اگر زیرساخت شما برای burstهای ناگهانی طراحی نشده باشد، حتی بهترین لایه میانی هم نمیتواند از افت عملکرد جلوگیری کند. معیار دوم، درجه آمادگی برای جداسازی محیطهای خواندن و نوشتن است. در معماریهای سنتی، یک دیتابیس واحد همزمان درخواستهای read و write را پاسخ میدهد. اما ایجنتها معمولاً حجم بالایی از خواندنهای سریع و همزمان نیاز دارند که میتواند با عملیاتهای نوشتاری تداخل ایجاد کند. زیرساخت آماده، از replicaهای خواندنی یا caching لایهبندی شده بهره میبرد تا این ترافیک را تفکیک کند.
تصور کنید یک پلتفرم مدیریت ناوگان حملونقل، ایجنت هوشمندی را برای بهینهسازی مسیرها به کار گرفته است. این ایجنت باید هر لحظه موقعیت خودروها، وضعیت ترافیک و سفارشهای جدید را از دیتابیس بخواند. زیرساخت این پلتفرم از یک کلاستر سهگرهای دیتابیس رابطهای استفاده میکند که برای بار تراکنشی کاربران انسانی طراحی شده. در لحظهای که پنج خودرو همزمان مسیر جدید درخواست میکنند، ایجنت ده کوئری Join سنگین با subqueryهای تو در تو تولید میکند. دیتابیس که برای چنین هجومی آماده نیست، timeout میزند و ایجنت مجبور میشود با دادههای کششدهای کار کند که ده دقیقه قبل بهروز شدهاند. نتیجه: مسیریابی نادرست و افزایش هزینه سوخت. این سناریو نشان میدهد که بدون تست بار واقعی و تنظیم pool connection و query timeout پویا، حتی پیشرفتهترین ایجنتها هم ناکارآمد میشوند.
یکی از ملاحظاتی که کمتر به آن پرداخته میشود، افزایش هزینه نگهداری پس از اتصال ایجنت به دیتابیس است. لایه میانی هوشمند و کش وابسته به بافت، خود نیازمند مانیتورینگ مداوم، بهروزرسانی و اشکالزدایی است. بسیاری از تیمها پس از چند ماه با انبوهی از لاگهای خطا و هشدارهای timeout مواجه میشوند که رفع آنها تخصص جداگانهای میطلبد. اگر سازمان شما تیم اختصاصی برای مدیریت دیتابیسهای توزیعشده و بهینهسازی کوئری ندارد، شاید بهتر باشد ابتدا با یک دیتابیس سادهتر و کوئریهای محدودتر شروع کنید. همچنین باید به این نکته توجه کرد که اتصال ایجنت به دیتابیس، ریسک امنیتی جدیدی ایجاد میکند: اگر ایجنت به درستی آموزش ندیده باشد، ممکن است با یک پرسش ساده کاربر، دستور DROP TABLE صادر کند. بنابراین وجود یک فایروال کوئری در لایه میانی که دستورات مخرب را شناسایی و مسدود کند، یک ضرورت انکارناپذیر است.
آمادگی زیرساخت برای اتصال ایجنتهای هوش مصنوعی، فراتر از انتخاب نوع دیتابیس یا افزودن لایه میانی است. این آمادگی به توانایی سیستم در مدیریت بار ناگهانی، تفکیک محیط read/write، و وجود مکانیزمهای امنیتی و مانیتورینگ پیشرفته وابسته است. تیمها باید پیش از هر اقدامی، زیرساخت خود را با شبیهسازی سناریوهای واقعی و بار کاری ایجنت محک بزنند و هزینه نگهداری بلندمدت را محاسبه کنند. بدون این آمادگی، اتصال نه تنها به بهبود عملکرد نمیانجامد، بلکه به منبع جدیدی از خطاها و ناکارآمدی تبدیل میشود.