در دنیای امروز هوش مصنوعی، ساخت و مدیریت مدلهای زبان بزرگ (LLM) محلی که بتوانند به صورت کارآمد روی سختافزار شخصی اجرا شوند، اهمیت فزایندهای پیدا کرده است. این رویکرد نه تنها حریم خصوصی دادهها را افزایش میدهد، بلکه نیاز به سرویسهای ابری پرهزینه را نیز کاهش میدهد. در این آموزش جامع، به شما نشان خواهیم داد که چگونه یک پشته LLM محلی قدرتمند و شتابیافته با GPU را با استفاده از Ollama و LangChain بسازید. این سیستم پیشرفته، قابلیتهای پرسش و پاسخ تقویتشده بازیابی (RAG) و عاملهای هوشمند را در خود جای میدهد و امکان نظارت بر عملکرد چت چند جلسهای را فراهم میکند.
هدف اصلی ما در این پروژه، ادغام یکپارچه Ollama به عنوان بستر اجرای مدلهای LLM محلی با فریمورک قدرتمند LangChain است. این ترکیب به توسعهدهندگان و پژوهشگران این امکان را میدهد که با انعطافپذیری بالا، مدلهای LLM را آزمایش، سفارشیسازی و بهینهسازی کنند. با قابلیت پشتیبانی از GPU، سیستم ما قادر به انجام استنتاجهای سریعتر و پردازش حجم بالاتری از دادهها خواهد بود که برای کاربردهای پیچیده هوش مصنوعی بسیار حیاتی است. علاوه بر این، پیادهسازی مکانیزمهای RAG به مدل امکان میدهد تا پاسخهای خود را با اطلاعات دقیق و مرتبط از اسناد فراهم شده، تقویت کند و دقت و اعتبار خروجیها را به شدت بالا ببرد. در کنار اینها، مدیریت حافظه چت برای حفظ زمینه گفتگو و پایش عملکرد برای بهینهسازی مداوم، از جنبههای کلیدی این سیستم هستند.
این مقاله به جزئیات فنی هر بخش میپردازد، از نصب کتابخانههای مورد نیاز و راهاندازی سرور Ollama گرفته تا پیادهسازی LLM سفارشی LangChain، ساخت سیستم RAG، مدیریت حافظه چت، ثبت ابزارها برای عاملها و در نهایت، ایجاد یک رابط کاربری تعاملی با Gradio. با دنبال کردن این مراحل، یک الگوی قابل توسعه خواهید داشت که میتوانید آن را برای نیازهای خاص پروژههای هوش مصنوعی خود تنظیم کنید و از قدرت LLMهای محلی شتابیافته بهرهمند شوید.
نصب و راهاندازی 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 ادغام کنیم.
به طور خلاصه، بخش نصب و راهاندازی 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) و دقیقتر میکند.
این ترکیب از 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 را پشت سر بگذاریم.
برای مشاهده کد کامل و نوتبوک، به این لینک مراجعه کنید. تمامی اعتبار این پژوهش به محققین این پروژه تعلق دارد. برای دریافت خبرنامه هوش مصنوعی ما، همین حالا عضو شوید.