ساخت یک گردش کار Ollama LangChain شتاب‌یافته با GPU با عوامل RAG و نظارت بر عملکرد چت چند جلسه‌ای

در دنیای امروز هوش مصنوعی، ساخت و مدیریت مدل‌های زبان بزرگ (LLM) محلی که بتوانند به صورت کارآمد روی سخت‌افزار شخصی اجرا شوند، اهمیت فزاینده‌ای پیدا کرده است. این رویکرد...

فهرست مطالب

در دنیای امروز هوش مصنوعی، ساخت و مدیریت مدل‌های زبان بزرگ (LLM) محلی که بتوانند به صورت کارآمد روی سخت‌افزار شخصی اجرا شوند، اهمیت فزاینده‌ای پیدا کرده است. این رویکرد نه تنها حریم خصوصی داده‌ها را افزایش می‌دهد، بلکه نیاز به سرویس‌های ابری پرهزینه را نیز کاهش می‌دهد. در این آموزش جامع، به شما نشان خواهیم داد که چگونه یک پشته LLM محلی قدرتمند و شتاب‌یافته با GPU را با استفاده از Ollama و LangChain بسازید. این سیستم پیشرفته، قابلیت‌های پرسش و پاسخ تقویت‌شده بازیابی (RAG) و عامل‌های هوشمند را در خود جای می‌دهد و امکان نظارت بر عملکرد چت چند جلسه‌ای را فراهم می‌کند.

هدف اصلی ما در این پروژه، ادغام یکپارچه Ollama به عنوان بستر اجرای مدل‌های LLM محلی با فریم‌ورک قدرتمند LangChain است. این ترکیب به توسعه‌دهندگان و پژوهشگران این امکان را می‌دهد که با انعطاف‌پذیری بالا، مدل‌های LLM را آزمایش، سفارشی‌سازی و بهینه‌سازی کنند. با قابلیت پشتیبانی از GPU، سیستم ما قادر به انجام استنتاج‌های سریع‌تر و پردازش حجم بالاتری از داده‌ها خواهد بود که برای کاربردهای پیچیده هوش مصنوعی بسیار حیاتی است. علاوه بر این، پیاده‌سازی مکانیزم‌های RAG به مدل امکان می‌دهد تا پاسخ‌های خود را با اطلاعات دقیق و مرتبط از اسناد فراهم شده، تقویت کند و دقت و اعتبار خروجی‌ها را به شدت بالا ببرد. در کنار این‌ها، مدیریت حافظه چت برای حفظ زمینه گفتگو و پایش عملکرد برای بهینه‌سازی مداوم، از جنبه‌های کلیدی این سیستم هستند.

این مقاله به جزئیات فنی هر بخش می‌پردازد، از نصب کتابخانه‌های مورد نیاز و راه‌اندازی سرور Ollama گرفته تا پیاده‌سازی LLM سفارشی LangChain، ساخت سیستم RAG، مدیریت حافظه چت، ثبت ابزارها برای عامل‌ها و در نهایت، ایجاد یک رابط کاربری تعاملی با Gradio. با دنبال کردن این مراحل، یک الگوی قابل توسعه خواهید داشت که می‌توانید آن را برای نیازهای خاص پروژه‌های هوش مصنوعی خود تنظیم کنید و از قدرت LLM‌های محلی شتاب‌یافته بهره‌مند شوید.

Ollama LangChain Workflow

نصب و راه‌اندازی Ollama: سنگ بنای LLM محلی شما

اولین گام در ساخت این سیستم، آماده‌سازی محیط و نصب تمامی پکیج‌های پایتون مورد نیاز است. ما از ابزارهایی مانند LangChain برای فریم‌ورک LLM، ChromaDB و FAISS برای ذخیره‌سازی وکتورها، Sentence-Transformers برای جاسازی‌ها (embeddings)، PyPDF و python-docx برای بارگذاری اسناد، requests و psutil برای عملیات شبکه و نظارت بر سیستم، و Gradio برای ساخت رابط کاربری تعاملی استفاده خواهیم کرد. تابع install_packages() اطمینان حاصل می‌کند که تمامی این وابستگی‌ها در محیط Colab نصب شده‌اند، که یک پیش‌نیاز حیاتی برای اجرای موفقیت‌آمیز پروژه است.

در ادامه، ما کلاس OllamaConfig را تعریف می‌کنیم تا تمامی تنظیمات زمان اجرا (runtime) مربوط به Ollama را در یک مکان واحد و سازمان‌یافته نگه داریم. این تنظیمات شامل model_name (مثلاً “llama2”) و base_url برای نقطه پایانی API محلی Ollama می‌شوند. همچنین، رفتارهای تولید مدل مانند max_tokens (حداکثر تعداد توکن در پاسخ)، temperature (خلاقیت مدل) و context_window (حداکثر اندازه پنجره متن ورودی) را در این کلاس پیکربندی می‌کنیم. برای بهینه‌سازی عملکرد و بهره‌برداری حداکثری از قابلیت‌های GPU، پارامترهای gpu_layers (که مقدار -1 به معنای بارگذاری تمام لایه‌ها به GPU در صورت امکان است)، batch_size، و threads برای پردازش موازی تنظیم می‌شوند. این پیکربندی دقیق تضمین می‌کند که Ollama با بالاترین کارایی ممکن اجرا شود و از منابع سخت‌افزاری به نحو احسن استفاده کند.

پس از تعریف پیکربندی، به کلاس OllamaManager می‌رسیم که مسئولیت نصب، راه‌اندازی، نظارت و مدیریت سرور Ollama در محیط Colab را بر عهده دارد. این مدیر، متغیرهای محیطی لازم برای موازی‌سازی GPU را تنظیم می‌کند و سپس سرور Ollama را به صورت پس‌زمینه (background) راه‌اندازی می‌کند. پس از راه‌اندازی، از یک بررسی سلامت (health check) برای اطمینان از عملکرد صحیح سرور استفاده می‌شود. OllamaManager همچنین قابلیت دانلود مدل‌های جدید از رجیستری Ollama را بر اساس تقاضا فراهم می‌کند و مدل‌های دانلود شده را برای دسترسی سریع‌تر کش (cache) می‌کند. همچنین، می‌تواند لیست مدل‌های موجود به صورت محلی را نمایش دهد و در نهایت، سرور را به طور منظم خاموش کند. این طراحی ماژولار به ما امکان می‌دهد تا کنترل کاملی بر چرخه حیات سرور Ollama داشته باشیم و آن را با جریان کاری LangChain ادغام کنیم.

AMD برای مدتی به سلطه چند دهه‌ای اینتل بر بازار پردازنده‌های سرور پایان داد

به طور خلاصه، بخش نصب و راه‌اندازی Ollama پایه‌های قوی برای سیستم ما فراهم می‌کند. از مدیریت وابستگی‌ها و پیکربندی دقیق مدل گرفته تا کنترل جامع سرور Ollama، همه این مراحل به منظور اطمینان از یک پلتفرم LLM محلی پایدار، کارآمد و شتاب‌یافته طراحی شده‌اند که می‌تواند نیازهای پیشرفته هوش مصنوعی را برآورده سازد. این زیرساخت قوی به ما اجازه می‌دهد تا به مراحل بعدی توسعه سیستم، یعنی نظارت بر عملکرد و ادغام LangChain، بپردازیم.

نظارت بر عملکرد: بهینه‌سازی کارایی سیستم

یکی از جنبه‌های حیاتی در ساخت سیستم‌های LLM، بهینه‌سازی عملکرد و نظارت بر مصرف منابع است. کلاس PerformanceMonitor دقیقاً برای همین منظور طراحی شده است. این کلاس مسئولیت ردیابی و گزارش‌دهی معیارهای کلیدی عملکرد سیستم، از جمله میزان مصرف CPU، حافظه (RAM) و زمان استنتاج مدل (inference times) را در زمان واقعی بر عهده دارد. با فعال‌سازی مانیتورینگ، یک رشته (thread) پس‌زمینه راه‌اندازی می‌شود که هر چند ثانیه یک بار، این آمارها را جمع‌آوری می‌کند. داده‌های جمع‌آوری‌شده به‌صورت یک لیست ذخیره می‌شوند که برای جلوگیری از افزایش بی‌رویه حجم، تنها 100 مورد آخر را نگهداری می‌کند.

این نظارت مستمر به ما امکان می‌دهد تا به صورت لحظه‌ای از وضعیت بار سیستم آگاه شویم و گلوگاه‌های احتمالی را شناسایی کنیم. برای مثال، اگر مشاهده شود که مصرف CPU یا حافظه به طور غیرعادی بالا است، می‌توانیم تنظیمات Ollama یا LangChain را برای کاهش بار بهینه کنیم. این قابلیت نظارت بر عملکرد، به ویژه در محیط‌هایی مانند Google Colab که منابع محاسباتی ممکن است محدود باشند، بسیار ارزشمند است؛ چرا که به ما کمک می‌کند تا اطمینان حاصل کنیم که مدل‌ها در محدوده منابع موجود به طور کارآمد اجرا می‌شوند و از حداکثر توان سخت‌افزاری بهره می‌برند.

متدهای start() و stop() به ترتیب برای شروع و پایان دادن به فرآیند نظارت استفاده می‌شوند، که این امکان را می‌دهد تا مانیتورینگ تنها در مواقع نیاز فعال باشد. متد _monitor_loop()، قلب این کلاس، مسئولیت جمع‌آوری دوره‌ای آمارها و به‌روزرسانی لیست‌های مربوطه را بر عهده دارد. همچنین، متد get_stats() یک خلاصه از میانگین مصرف CPU، حافظه و زمان استنتاج را ارائه می‌دهد که ابزار قدرتمندی برای ارزیابی عملکرد کلی سیستم و تأثیر تغییرات پیکربندی بر کارایی است.

توانایی ما در پایش این معیارها، بهینه‌سازی مداوم مدل‌های LLM و اطمینان از عملکرد روان و پایدار سیستم را تضمین می‌کند، که در نهایت به بهبود تجربه کاربری و کارایی عملیاتی منجر می‌شود. این بخش از سیستم، ستون فقرات هر پیاده‌سازی جدی LLM است که نیاز به مدیریت منابع و عملکرد بهینه دارد.

ادغام LangChain و عوامل هوشمند RAG

برای اینکه Ollama بتواند به طور یکپارچه با LangChain کار کند، یک کلاس LLM سفارشی به نام OllamaLLM ایجاد کرده‌ایم. این کلاس، رابط استاندارد LLM در LangChain را پیاده‌سازی می‌کند و نحوه ارسال درخواست‌ها به API محلی Ollama را تعریف می‌کند. با استفاده از این پوشش (wrapper)، می‌توانیم پارامترهایی مانند نام مدل (model_name)، آدرس پایه (base_url)، دما (temperature) برای کنترل خلاقیت پاسخ‌ها، و حداکثر توکن‌ها (max_tokens) را به Ollama منتقل کنیم. یکی از ویژگی‌های مهم این کلاس، ثبت زمان استنتاج هر درخواست (inference_time) است که به طور مستقیم در PerformanceMonitor ما برای تحلیل‌های بعدی ثبت می‌شود. این ادغام، به LangChain اجازه می‌دهد تا Ollama را مانند هر مدل زبان دیگری در اکوسیستم خود، به کار بگیرد و از قابلیت‌های آن بهره‌مند شود.

در ادامه، سیستم پرسش و پاسخ تقویت‌شده با بازیابی (RAG) را از طریق کلاس RAGSystem پیاده‌سازی می‌کنیم. RAG یک رویکرد قدرتمند است که LLM را قادر می‌سازد تا دانش خود را از طریق بازیابی اطلاعات از مجموعه اسناد خارجی تقویت کند. این سیستم شامل مراحل زیر است: ابتدا، اسناد ورودی (اعم از PDF یا فایل‌های متنی) توسط یک TextLoader مناسب بارگذاری می‌شوند. سپس، RecursiveCharacterTextSplitter این اسناد را به قطعات (chunks) کوچک‌تر با اندازه و همپوشانی مشخص تقسیم می‌کند. این تقسیم‌بندی برای اطمینان از اینکه قطعات متناسب با پنجره متن LLM هستند و زمینه کافی را فراهم می‌کنند، حیاتی است.

پس از آن، HuggingFaceEmbeddings برای تبدیل این قطعات متنی به بردارهای عددی (embeddings) استفاده می‌شود. مدل “sentence-transformers/all-MiniLM-L6-v2” یک انتخاب رایج و کارآمد برای این منظور است. این بردارهای جاسازی‌شده سپس در یک پایگاه داده وکتوری، مانند FAISS یا Chroma، ذخیره می‌شوند. پایگاه داده وکتوری امکان جستجوی سریع و کارآمد برای یافتن مرتبط‌ترین قطعات متن بر اساس شباهت معنایی را فراهم می‌کند. در نهایت، RetrievalQA.from_chain_type یک زنجیره (chain) LangChain ایجاد می‌کند که LLM را با بازیابی‌کننده (retriever) متصل می‌کند. این زنجیره مسئول استنتاج پاسخ‌ها با استفاده از اطلاعات بازیابی‌شده از پایگاه داده وکتوری است که پاسخ‌های مدل را “زمینه‌ای” (grounded) و دقیق‌تر می‌کند.

AMD برای مدتی به سلطه چند دهه‌ای اینتل بر بازار پردازنده‌های سرور پایان داد

این ترکیب از OllamaLLM و RAGSystem، یک معماری قدرتمند را فراهم می‌کند که به مدل ما اجازه می‌دهد تا نه تنها به سوالات عمومی پاسخ دهد، بلکه با استفاده از اسناد فراهم شده، پاسخ‌های دقیق و تخصصی نیز ارائه دهد. این قابلیت، به ویژه برای کاربردهایی که نیاز به دسترسی به پایگاه‌های دانش اختصاصی یا داده‌های به‌روز دارند، بسیار مفید است و عملکرد مدل را به شدت بهبود می‌بخشد. این رویکرد به مدل اجازه می‌دهد تا با دانش خارج از داده‌های آموزشی خود، به تعامل بپردازد و پاسخ‌های جامع‌تری را ارائه دهد.

مدیریت گفتگو و عامل‌های ابزارمند

برای مدیریت پیچیدگی‌های تعاملات چت چند جلسه‌ای، کلاس ConversationManager را پیاده‌سازی کرده‌ایم. این کلاس، مسئول حفظ سابقه گفتگو و حافظه (memory) برای هر جلسه چت مجزا است. این امکان را فراهم می‌کند که بتوانیم بین انواع مختلف حافظه، مانند ConversationBufferWindowMemory (که تنها تعداد مشخصی از آخرین مکالمات را به خاطر می‌سپارد) و ConversationSummaryBufferMemory (که خلاصه‌ای از مکالمات طولانی‌تر را ایجاد می‌کند) سوئیچ کنیم. انتخاب نوع حافظه به نیازهای خاص هر کاربرد بستگی دارد؛ حافظه بافر برای گفتگوهای کوتاه و متمرکز مناسب است، در حالی که حافظه خلاصه‌ساز برای حفظ زمینه در مکالمات طولانی‌تر و پیچیده‌تر که نیاز به فهم کلی موضوع دارند، ایده‌آل است. این انعطاف‌پذیری در مدیریت حافظه، تجربه کاربری را بهبود می‌بخشد و مدل را قادر می‌سازد تا پاسخ‌های منسجم‌تری ارائه دهد.

ستون فقرات این سیستم یکپارچه، کلاس OllamaLangChainSystem است. این کلاس تمامی اجزای سیستم را در یک رابط واحد گرد هم می‌آورد. setup() در این کلاس ابتدا Ollama را نصب و سرور آن را راه‌اندازی می‌کند. سپس، مدل LLM پیش‌فرض را از رجیستری Ollama دانلود می‌کند و یک نمونه از OllamaLLM را با استفاده از پیکربندی تعیین‌شده، از جمله دما و حداکثر توکن‌ها، ایجاد می‌کند. پس از آن، RAGSystem را با LLM ایجاد شده مقداردهی اولیه (initialize) می‌کند تا قابلیت‌های بازیابی و تولید پاسخ از اسناد را فعال کند. ConversationManager نیز با LLM متصل شده، راه‌اندازی می‌شود تا مکالمات را مدیریت کند.

یکی از پیشرفته‌ترین قابلیت‌های این سیستم، توانایی عامل‌ها (agents) در استفاده از ابزارهای خارجی است. متد _setup_tools() ابزارهای لازم را برای عامل تعریف و رجیستر می‌کند. در این پیاده‌سازی، دو ابزار اصلی داریم: ابزار “Search” که از DuckDuckGoSearchRun برای جستجو در اینترنت و یافتن اطلاعات به‌روز استفاده می‌کند، و ابزار “RAG_Query” که به عامل اجازه می‌دهد تا اسناد بارگذاری شده در RAGSystem را برای پاسخگویی به سوالات خاص، پرس و جو کند. این ابزارها به عامل قدرت می‌دهند تا فراتر از دانش داخلی LLM عمل کند و به اطلاعات دنیای واقعی یا اطلاعات موجود در اسناد خصوصی دسترسی پیدا کند. سپس، با استفاده از initialize_agent، یک عامل LangChain با AgentType.ZERO_SHOT_REACT_DESCRIPTION پیکربندی می‌شود. این نوع عامل قادر است بر اساس ابزارهای موجود و ورودی کاربر، استدلال کند و تصمیم بگیرد که کدام ابزار را برای رسیدن به بهترین پاسخ فراخوانی کند. این قابلیت به سیستم انعطاف‌پذیری و هوشمندی بی‌نظیری می‌دهد، به طوری که می‌تواند به طیف گسترده‌ای از سوالات پاسخ دهد.

OllamaLangChainSystem همچنین متدهایی را برای تعامل با سیستم ارائه می‌دهد: chat() برای چت عمومی با حافظه جلسه، rag_chat() برای پرسش و پاسخ مبتنی بر RAG، و agent_chat() برای فعال‌سازی عامل هوشمند. قابلیت switch_model() به کاربر امکان می‌دهد تا به راحتی بین مدل‌های مختلف Ollama سوئیچ کند و load_documents() امکان بارگذاری اسناد جدید به سیستم RAG را فراهم می‌کند. در نهایت، get_performance_stats() آمار عملکرد سیستم را نمایش می‌دهد و cleanup() تمامی منابع و سرور Ollama را به طور منظم خاموش می‌کند. این معماری جامع، یک پلتفرم کامل برای آزمایش و پیاده‌سازی LLM‌های هوشمند و محلی فراهم می‌آورد.

رابط کاربری تعاملی Gradio و نتیجه‌گیری

برای ارائه یک روش آسان و بصری برای تعامل با سیستم پیشرفته Ollama و LangChain، یک رابط کاربری وب با استفاده از کتابخانه Gradio ایجاد کرده‌ایم. تابع create_gradio_interface() مسئول ساخت این برنامه کاربردی Gradio است که چندین قابلیت کلیدی سیستم را در یک محیط کاربرپسند نمایش می‌دهد. این رابط کاربری شامل تب‌های مجزا برای انواع مختلف تعامل است: “Basic Chat” برای گفتگوهای معمولی با LLM و حافظه جلسه، “RAG Chat” برای پرسش و پاسخ تقویت‌شده با بازیابی از اسناد، و “Agent Chat” که عامل هوشمند را با قابلیت استفاده از ابزارها فعال می‌کند.

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

تب “Document Upload” به کاربران اجازه می‌دهد تا به راحتی فایل‌های PDF یا متنی خود را آپلود کنند. پس از آپلود، این اسناد به صورت خودکار به سیستم RAG اضافه می‌شوند و برای پرسش‌های بعدی در دسترس قرار می‌گیرند. این قابلیت برای سناریوهایی که نیاز به افزودن دانش جدید و خاص به مدل وجود دارد، بسیار مهم است. تب “Performance” نیز امکان مشاهده آمار عملکرد سیستم در زمان واقعی را فراهم می‌کند، از جمله میانگین مصرف CPU، حافظه و زمان‌های استنتاج. این داشبورد عملکرد بهینه‌سازی و عیب‌یابی سیستم را برای کاربران ساده می‌کند و دید کاملی از نحوه استفاده منابع به آن‌ها می‌دهد.

تابع main()، نقطه ورود اصلی اجرای سیستم است. این تابع یک نمونه از OllamaConfig را با پارامترهای پیش‌فرض یا سفارشی ایجاد می‌کند و سپس OllamaLangChainSystem را با این پیکربندی راه‌اندازی می‌کند. این راه‌اندازی شامل نصب Ollama، شروع سرور، و دانلود مدل LLM است. پس از آماده‌سازی سیستم، تابع main() یک دموی جامع از قابلیت‌ها را اجرا می‌کند: تست چت پایه، نمایش قابلیت سوئیچ بین مدل‌ها (با لیست کردن مدل‌های موجود و تلاش برای دانلود یک مدل جدید)، و تست عامل هوشمند با یک پرسش که نیاز به جستجوی وب دارد. در نهایت، آمار عملکرد جمع‌آوری‌شده را نمایش می‌دهد.

اگر Gradio نصب شده باشد، create_gradio_interface() یک شیء Gradio demo را برمی‌گرداند که می‌توان آن را با demo.launch(share=True) اجرا کرد. گزینه share=True یک لینک عمومی برای دسترسی به رابط کاربری Gradio ایجاد می‌کند، که این امر همکاری و اشتراک‌گذاری پروژه را با دیگران بسیار آسان می‌کند. این رابط کاربری تعاملی Gradio یک راه عالی برای آزمایش سریع و بصری سیستم و نمایش قابلیت‌های آن است، بدون نیاز به تعامل مستقیم با کد.

نتیجه‌گیری:

در این آموزش، ما یک چارچوب کامل و قدرتمند برای کار با مدل‌های زبان بزرگ محلی ایجاد کردیم. با ادغام Ollama برای شتاب‌دهی GPU، LangChain برای ارکستراسیون پیشرفته، سیستم RAG برای پاسخ‌های زمینه‌ای، و عامل‌های هوشمند برای تصمیم‌گیری‌های ابزارمحور، یک اکوسیستم جامع و قابل تنظیم به دست آوردیم. قابلیت‌های مدیریت حافظه چت چند جلسه‌ای و نظارت بر عملکرد، این سیستم را به ابزاری بی‌نظیر برای توسعه‌دهندگان و پژوهشگران در زمینه هوش مصنوعی تبدیل می‌کند. ما یک بستر انعطاف‌پذیر برای آزمایش LLM‌های محلی در اختیار داریم که به ما اجازه می‌دهد مدل‌های Ollama را تغییر دهیم، با حافظه‌های بافر یا خلاصه‌ساز گفتگو کنیم، اسناد خود را پرس و جو کنیم، و در صورت نیاز از ابزارهای جستجو استفاده کنیم.

این کد ماژولار است و می‌توان لیست ابزارها را گسترش داد، گزینه‌های استنتاج (مانند دما، حداکثر توکن‌ها، و موازی‌سازی) را در OllamaConfig تنظیم کرد، یا پایپ‌لاین RAG را برای مجموعه‌های داده بزرگتر یا مدل‌های جاسازی (embedding) متفاوت تطبیق داد. با اجرای برنامه Gradio با share=True، می‌توانیم به راحتی با دیگران همکاری کنیم یا این اجزا را در پروژه‌های خود تعبیه کنیم. این یک الگوی توسعه‌پذیر برای آزمایش سریع LLM‌های محلی است که امکان کاوش و نوآوری در این حوزه را فراهم می‌سازد و به ما کمک می‌کند تا از قدرت کامل هوش مصنوعی محلی بهره‌مند شویم و محدودیت‌های رایج LLM را پشت سر بگذاریم.

برای مشاهده کد کامل و نوت‌بوک، به این لینک مراجعه کنید. تمامی اعتبار این پژوهش به محققین این پروژه تعلق دارد. برای دریافت خبرنامه هوش مصنوعی ما، همین حالا عضو شوید.

دیگر هیچ مقاله‌ای را از دست ندهید

محتوای کاملاً انتخاب شده، مطالعات موردی، به‌روزرسانی‌های بیشتر.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

مدیریت حرفه‌ای شبکه‌های اجتماعی با رسا وب آفرین

  • افزایش تعامل و دنبال‌کننده در اینستاگرام و تلگرام

  • تولید محتوا بر اساس الگوریتم‌های روز شبکه‌های اجتماعی

  • طراحی پست و استوری اختصاصی با برندینگ شما

  • تحلیل و گزارش‌گیری ماهانه از عملکرد پیج

  • اجرای کمپین تبلیغاتی با بازده بالا

محبوب ترین مقالات

آماده‌اید کسب‌وکارتان را دیجیتالی رشد دهید؟

از طراحی سایت حرفه‌ای گرفته تا کمپین‌های هدفمند گوگل ادز و ارسال نوتیفیکیشن هوشمند؛ ما اینجاییم تا در مسیر رشد دیجیتال، همراه شما باشیم. همین حالا با ما تماس بگیرید یا یک مشاوره رایگان رزرو کنید.