خانه / هوش مصنوعی (AI) / ساخت اپلیکیشن هوش مصنوعی RAG با استفاده از SDK

ساخت اپلیکیشن هوش مصنوعی RAG با استفاده از SDK

ساخت اپلیکیشن هوش مصنوعی RAG با استفاده از SDK

نویسنده:

انتشار:

به‌روزرسانی:

تعداد نظرات: 0

زمان مطالعه: 11 دقیقه

در دنیای امروز، مدل‌های زبان بزرگ مانند ChatGPT توانسته‌اند با تولید متونی شبیه به نوشته‌های انسانی، جایگاه ویژه‌ای در ذهن عموم پیدا کنند. این مدل‌ها بر اساس داده‌های اینترنت تا یک تاریخ مشخص آموزش دیده‌اند؛ به همین دلیل، در مواردی که نیاز به اطلاعات به‌روز یا داده‌های شخصی داریم، قادر به پاسخگویی نیستند. اگر مثلا از یک LLM بپرسید که امروز چه تاریخی است یا هوای شهر خاصی چگونه است، یا حتی اگر پایگاه داده‌ای از نظرات مشتریان داشته باشید و بخواهید در مورد آن سوال کنید، مدل نمی‌تواند به آن دسترسی پیدا کند و از لحاظ استدلال محدود می‌شود.

این مقاله به‌جای این محدودیت‌ها، به بررسی روش افزوده‌ی بازیابی (RAG) می‌پردازد؛ روش که امکان بازیابی داده‌های خاص از منابع داخلی را فراهم کرده و به مدل اجازه می‌دهد بر اساس آن‌ها استدلال کند. در این آموزش، شما خواهید آموخت چگونه یک اپلیکیشن هوش مصنوعی بر پایه SDKهای liblab بسازید که با استفاده از Microsoft Semantic Kernel وChatGPT، قابلیت‌های RAG را برای یک LLM فعال می‌سازد.

پیش‌نیازها

TypeScript /
Javascript
Java /
Kotlin
Python C# Go PHP

برای اجرای برنامه‌های RAG با ChatGPT لازم است موارد زیر را از قبل داشته باشید:

۱. CLI liblab: نصب و ورود موفق به خط فرمان liblab

۲. حساب OpenAI: وجود کلید API معتبر

۳. .NET 8.0 یا بالاتر: نسخه جدید یا بالاتر از .NET بر روی سیستم نصب باشد

۴. بودجه کافی

۵. مخزن قالب: در صورت تمایل بدون نصب.NET، می‌توانید از مخزن قالب استفاده کنید؛ فقط نیاز به Docker دارید

۶. آشنایی اولیه باLLM: دانش پایه‌ای از مدل‌های زبانی بزرگ و تجربه کار با ChatGPT

این پیش‌نیازها امکان پیاده‌سازی و اجرای موفق پروژه RAG را فراهم می‌کنند.

مروری بر برخی مفاهیم مرتبط

قبل از شروع، بیایید به بررسی برخی مفاهیم مفید بپردازیم. اگر این مفاهیم را از قبل می‌دانید، می‌توانید به سراغ ساخت برنامه بروید.

RAG چیست؟

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

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

2

برنامه شما چگونه RAG را پیاده‌سازی می‌کند؟

اگر برنامه‌ای دارید که با استفاده از اعلان‌های متنی ساده، امکان تعامل مستقیم با کاربر را می‌دهد، در اینجا نحوه‌ی کار آن توضیح می‌دهم. فرض کنید کاربر می‌گوید: «میانگین احساسات اسباب‌بازی لاما چیست؟»؛ برنامه‌تان از همین اعلان به‌عنوان نقطه شروع بهره می‌گیرد. سپس از چارچوبی مبتنی بر LLM استفاده می‌کند که افزونه‌هایی (plugins) در بر دارد. این افزونه‌ها قابلیت بازیابی داده را دارند. چارچوب به‌صورت خودکار بر اساس متن اعلان، تصمیم می‌گیرد کدام افزونه‌ها باید فراخوانی شوند، داده‌های مورد نیاز را بازیابی می‌کند و سپس آن‌ها را به LLM می‌فرستد. LLM با استفاده از این داده‌ها، اعلان را به‌روز می‌کند و پاسخ نهایی را تولید می‌کند.

1

ساخت برنامه RAG

این آموزش شما را گام به گام در ساخت اولین برنامه‌ی RAG با استفاده از SDK liblab راهنمایی می‌کند. برنامه‌ ما بر اساس ترکیب زیر ساخته خواهد شد:

  •  Microsoft Semantic Kernel به عنوان چارچوب برنامه هوش مصنوعی
  •  ChatGPT از OpenAI به عنوان LLM
  •  Cat Facts API

مراحل انجام کار عبارتند از:

  •  ایجاد پروژه جدید: از یک الگوی (template) آماده‌ی ارائه شده برای ایجاد یک برنامه‌ی هوش مصنوعی استفاده کنید؛ این الگو پیش‌تنظیمات لازم را برای Semantic Kernel در بر دارد.
  •  تولید SDK با liblab: با liblab SDK برای Cat Facts، API بسازید. این ابزار به‌صورت خودکار کدهای لازم برای ارتباط با API را ایجاد می‌کند.
  •  ایجاد افزونه: افزونه‌ای بسازید که بتواند Cat Facts را دریافت کند و سپس آن را به LLM (ChatGPT) پاس بدهد. افزونه در چارچوب Semantic Kernel به‌عنوان یک ماژول مستقل عمل می‌کند و می‌تواند به‌صورت دینامیک توسط مدل فراخوانی شود.

با پایان این مراحل، برنامه‌ی شما قادر خواهد بود تا با استفاده از RAG، داده‌های جدید (Cat Facts) را در پاسخ‌دهی ChatGPT ادغام کرده و خروجی‌های دقیق‌تر و کاربردی‌تری ارائه دهد.

۱. ایجاد یک برنامه جدید مبتنی بر هوش مصنوعی

برای شروع، یک پروژه نمونه اولیه آماده کرده‌ایم که در آن Microsoft Semantic Kernel به‌عنوان چارچوب برنامه هوش مصنوعی نصب و پیکربندی شده و به‌صورت پیش‌فرض با حساب OpenAI شما متصل است. علاوه بر این، یک قالب تعامل کاربر (مثلا اعلان‌های متنی ساده) در این پروژه در نظر گرفته شده است. با این پروژه شروع کنید و افزونه‌هایی که با استفاده از SDKهای تولیدشده توسط liblab ساخته می‌شود را به آن اضافه ‌کنید.

ایجاد برنامه

این پروژه بر پایه‌ی یک مخزن الگوی موجود در GitHub ساخته شده است.

‍۱. روی لینک زیر کلیک کنید تا یک مخزن کنترل جدید مطابق با این الگو ایجاد شود.

RAG with SDKs template Repo

نام مخزن را هر چه که دوست دارید بگذارید، مثلا cat-facts-app، سپس دکمه Create repo را انتخاب کنید.

۲. مخزن ایجاد شده را باز کنید. می‌توانید آن را بر روی دستگاه محلی‌تان کپی کنید یا مستقیماً در یک فضای کد (GitHub Codespaces) باز کنید. اگر از محیط محلی یا فضای کد استفاده می‌کنید، پیشنهاد می‌شود از کانتینر توسعه (Dev Container) موجود بهره ببرید؛ این کانتینر پیش‌تنظیم‌شده‌ی .NET 8.0 و رابط خط فرمان liblab را در بر دارد.

۳. قبل از اجرای برنامه، لازم است کلید OpenAI API ‌تان را در فایل appsettings.json تنظیم کنید:

  • در پوشه‌ی src، فایلی به نام appsettings.json.example وجود دارد؛ آن را به appsettings.json تغییر نام دهید.
  • فایل appsettings.json را باز کنید و مقدار OpenAI:ApiKey را با کلید API خود جایگزین کنید.

  • اگر می‌خواهید مدل دیگری به‌جای ChatGPT پیش‌فرض استفاده کنید، در همان فایل مقدار OpenAI:ChatModel را به نام مدلی که می‌خواهید (مثلا gpt-4o-mini) تغییر دهید.

۴. با اجرای دستور dotnet run از پوشه src، برنامه را بسازید و اجرا کنید. این کار برنامه را اجرا می‌کند و می‌توانید از طریق ترمینال با آن تعامل داشته باشید.

۵. سوالی بپرسید و برای دیدن پاسخ، اینتر را بزنید.

نمای کلی برنامه

این برنامه یک کنسول کوچک است که بر پایه Microsoft Semantic Kernel ساخته شده و با LLM OpenAI ChatGPT ارتباط برقرار می‌کند. ساختار پروژه، در زیر به فایلی که در آن نقش دارد، اشاره می‌کند:

  • appsettings.json – تنظیمات پایه‌ی برنامه – همانند کلید OpenAI:ApiKey و نام مدل چت (مثلا gpt‑4o-mini) را در این فایل ذخیره می‌کنیم.
  • AppSettingsReader.cs – کلاسی است که فایل appsettings.json را خوانده و یک شی OpenAISettings برمی‌گرداند؛ در این طریق، بخش تنظیمات مرتبط با OpenAI به‌راحتی در دسترس باقی می‌ماند.
  • OpenAISettings.cs – فقط مسئول نگهداری مقادیر مربوط به OpenAI است؛ در واقع اطلاعات مربوط به API را در یک شی جداگانه جمع‌آوری می‌کند.
  • Program.cs – نقطه‌ی ورود (Main) برنامه. این فایل وظایف زیر را انجام می‌دهد:
  • تنظیمات OpenAI را از فایل appsettings.json می‌خواند.
  • یک شی جدید Semantic Kernel KernelBuilder ایجاد می‌کند که نحوه تعامل برنامه شما با مدل‌های هوش مصنوعی را پیکربندی می‌کند، در این مورد با استفاده از تکمیل چت OpenAI – اساسا ChatGPT.
  • یک شی تاریخچه چت ایجاد می‌کند. نحوه تعامل شما با LLM در کد، ارسال تاریخچه کاملی از مکالمه تاکنون، شامل آخرین درخواست از کاربر است. به این ترتیب، LLM می‌تواند از سوالات و پاسخ‌های قبلی برای کمک به ایجاد پاسخ بعدی استفاده کند. به عنوان مثال، می‌توانید بپرسید «پایتخت انگلستان کجاست؟»، سپس بپرسید «چند نفر در آنجا زندگی می‌کنند؟» و LLM هنگام پاسخ دادن به سوال دوم، متوجه می‌شود که شما به لندن، پاسخ سوال اول، اشاره می‌کنید.

به‌طور خلاصه، این فایل‌ها با هم در کنار Semantic Kernel و OpenAI، یک کنسول ساده ولی قدرتمند می‌سازند که می‌تواند داده‌های بیرونی (از طریق افزونه‌ها) را در پاسخ‌های خود ادغام کند.

این تاریخچه شامل موارد زیر است:

  • یک اعلان سیستم: در ابتدای مکالمه یک پیام ثابت (System) اضافه می‌شود که زمینه‌ها و قوانین اساسی برای هوش مصنوعی را تعیین می‌کند. در این نمونه ما چت‌بات را Liblab Llama می‌نامیم. تنظیم دقیق این اعلان یکی از مهم‌ترین مراحل مهندسی پرامپت (prompt‑engineering) است و می‌تواند تاثیر بسزایی بر کیفیت پاسخ‌ها داشته باشد.
  • سوالات کاربر: هر بار که کاربر چیزی می‌پرسد، یک پیام User وارد می‌شود و در تاریخچه ذخیره می‌شود.
  • پاسخ‌های هوش مصنوعی: پاسخ‌های مدل (Assistant) به همان ترتیب در تاریخچه ثبت می‌شوند؛ یعنی پس از هر سوال کاربر، پاسخ مربوطه به‌صورت یک پیام Assistant افزوده می‌شود.

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

  • با ارسال یک تاریخچه به این سرویس، یک تکمیل چت انجام می‌شود؛ یعنی دریافت پاسخ مدل بر اساس تمام پیام‌های گذشته.
  • این حلقه امکان مکالمه پیوسته را فراهم می‌کند و به صورت زیر کار می‌کند:
  • پیام کاربر را از خط فرمان می‌گیرد؛
  • آن را به تاریخچه اضافه می‌کند؛
  • سرویس تکمیل چت را با تاریخچه فراخوانی می‌کند؛
  • پاسخ مدل را به تاریخچه اضافه می‌کند؛
  • پاسخ را در خروجی چاپ می‌کند؛
  • حلقه تا زمان وارد کردن اعلان خالی توسط کاربر خاتمه می‌یابد.
  • RagWithSDKs.csproj – برای ایجاد و کامپایل این برنامه، فایل RagWithSDKs.csproj (به‌عنوان فایل پروژه‌ی کنسول) تنظیمات و بسته‌های مورد نیاز (Semantic‑Kernel، OpenAI، Liblab) را در بر می‌گیرد.

۲. استفاده از liblab برای تولید SDK برای API Cat Facts

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

قبل از این‌که به بررسی چگونگی پیاده‌سازی روش RAG در برنامه‌مان برای محدود کردن «Cat Facts» به این منبع بپردازیم، لازم است یک روش برای فراخوانی این API داشته باشیم. همان کار را با ایجاد یک SDK سی‌شارپ انجام می‌دهیم که این API را به‌وسیله‌ی liblab در برگیرد.

فایل پیکربندی cat facts liblab

برای آسان‌تر کردن تولید SDK مربوط به cat facts، مخزنی که ایجاد کرده‌اید از قبل حاوی یک فایل پیکربندی liblab پیکربندی شده است.

می‌توانید این فایل پیکربندی را در sdks/cat-facts/liblab.config.json پیدا کنید. این فایل شامل پیکربندی زیر است:

این پیکربندی به liblab می‌گوید:

  • نام SDK را CatFacts بگذارید
  • از مشخصات API مربوط به cat facts از https://catfact.ninja/docs/api-docs.json استفاده کنید
  • فقط یک SDK سی‌شارپ ایجاد کنید
  • آدرس پایه برای API، https://catfact.ninja است. آدرس سرور API معمولا در مشخصات API تعریف شده است، اما در این مورد اینطور نیست، بنابراین باید آن را ارائه دهیم.
  • PackageId کتابخانه سی‌شارپ تولیدشده را روی liblab.Examples.CatFacts تنظیم کنید
  • نسخه را در کتابخانه سی‌شارپ تولید شده روی 0.0.1 تنظیم کنید

SDK cat facts را تولید کنید

برای تولید SDK مربوط به cat facts:

۱. دستور زیر را از پوشه sdks/cat-facts اجرا کنید:

۲. این دستور یک SDK سی‌شارپ در پوشه sdks/cat-facts/output/csharp ایجاد می‌کند. در این پوشه دو پروژه وجود خواهد داشت: CatFacts، خود SDK و Example، یک پروژه نمونه ساده برای SDK.

۳. ایجاد یک افزونه برای دریافت cat facts

ما یک افزونه‌ی هسته‌ی معنایی می‌سازیم؛ در آن یک کلاس تعریف می‌کنیم که حاوی یک یا چند متد است و با دکوراتور KernelFunction علامت‌گذاری می‌شوند. این دکوراتورها برای مدل زبان توضیح می‌دهند که هر متد چه کاری می‌تواند انجام دهد و چه نوع پاسخی برمی‌گرداند؛ پاسخ‌های این متدها به‌عنوان اطلاعاتی قابل استفاده برای استدلال مدل تبدیل می‌شوند.

در اینجا، افزونه‌ی ما یک تابع هسته دارد که از API Cat‑Facts فراخوانی می‌کند و یک Cat‑Facts برمی‌گرداند، تا در چارچوب RAG، مدل تنها از این منبع معتبر برای پاسخ به Cat‑Facts استفاده کند.

ایجاد افزونه

۱. برای استفاده از SDK جدید، ابتدا باید یک ارجاع به آن اضافه کنید. این کار را با اجرای دستور زیر از پوشه src انجام دهید:

. یک پوشه جدید در پوشه src با نام Plugins ایجاد کنید. این جایی است که افزونه در آن قرار خواهد گرفت.

۳. در داخل پوشه src/Plugins، یک فایل جدید با نام CatFactPlugin.cs ایجاد کنید:

۴. کلاس CatFactPlugin را به این فایل اضافه کنید و آن را در فضای نام RagWithSDKs.Plugins تعریف کنید:

۵. به این کلاس یک فیلد فقط‑خواندنی (Read‑Only) اضافه کنید تا نمایانگر کلاینت SDK مربوط به cat facts باشد، و در زمان ساخت (تعیین سازنده) این فیلد را مقداردهی کنید.

۶. یک متد در کلاس CatFactPlugin تعریف کنید تا یک cat facts را از SDK دریافت کرده و آن را برگرداند:

این متد قبل و بعد از فراخوانی SDK، لاگ‌هایی را در کنسول ثبت می‌کند تا بتوانید هنگام اجرای آن، مشاهده کنید که برنامه از این افزونه استفاده می‌کند.

۷. برای استفاده از این متد به‌عنوان یک تابع هسته، باید دو ویژگی اضافه کنید:

Microsoft.SemanticKernel.KernelFunctionAttribute برای علامت‌گذاری آن به عنوان یک تابع هسته

System.ComponentModel.DescriptionAttribute برای ارائه توضیحی به زبان طبیعی به LLM از عملکرد واقعی این تابع، تا چارچوب برنامه هوش مصنوعی بتواند در صورت لزوم از آن استفاده کند.

این ویژگی‌ها را به متد GetCatFact، همراه با عبارات using مربوطه اضافه کنید:

افزونه را به هسته اضافه کنید

پس از ایجاد افزونه، باید آن را به هسته اضافه کنید تا چارچوب برنامه هوش مصنوعی بتواند از آن استفاده کند. این کار در فایل Program.cs با اضافه کردن آن به سازنده هسته قبل از ساخت هسته انجام می‌شود.

۱. در فایل Program.cs، یک عبارت using برای فضای نام RagWithSDKs.Plugins اضافه کنید:

۲. پس از ایجاد سازنده، CatFactPlugin را به آن اضافه کنید:

به‌صورت طبیعی به Builder بر اساس نوع افزوده می‌شود و می‌داند چگونه یک نمونه جدید از کلاس CatFactPlugin را ساخته و برگرداند.

افزونه cat facts را امتحان کنید

حالا که افزونه به هسته اضافه شده است، می‌توانید با اجرای برنامه و درخواست cat fact آن را امتحان کنید.

۱. برنامه را با اجرای dotnet run از پوشه src بسازید و اجرا کنید.

۲. درخواست cat fact:

در خروجی کنسول، می‌توانید ببینید که افزونه برای دریافت cat fact از API cat fact استفاده می‌شود.

۳. LLM می‌تواند کاری بیش از بازگرداندن cat fact به همان شکل انجام دهد، شما می‌توانید از این اطلاعات برای تولید پاسخی بر اساس بخش دیگری از پاسخ استفاده کنید. به عنوان مثال، درخواست cat fact به سبک یک دزد دریایی:

در پاسخ خواهید دید که LLM یک cat fact درخواست کرده، آن را از افزونه cat fact بازیابی کرده، سپس از این حقیقت برای تولید پاسخی به سبک یک دزد دریایی استفاده کرده است.

همچنین ممکن است متوجه شوید که مثال‌های درخواست در اینجا به روش‌های مختلفی cat fact را درخواست می‌کنند – «یک cat fact به من بگو» و «یک حقیقت در مورد گربه‌ها به من بده». LLM قادر است این درخواست‌ها و توضیحات افزونه «یک cat fact دریافت می‌کند» را بررسی کند تا تصمیم به استفاده از افزونه بگیرد.

تبریک می‌گویم، شما یک برنامه RAG AI با استفاده از SDK تولید شده ساخته‌اید!

نتیجه‌گیری

در این آموزش، شما یک برنامه مبتنی بر هوش مصنوعی ایجاد کرده‌اید که از SDK های تولیدشده توسط liblab برای ارائه قابلیت‌های RAG به یک LLM استفاده می‌کند. این یکی از ویژگی‌های قدرتمند liblab است – توانایی تولید سریع SDK به زبان دلخواه شما، که ادغام آن API را در برنامه هوش مصنوعی شما آسان‌تر می‌کند.

 

منابع

liblab.com

سوالات متداول

SDK  مثلاً CatFacts.SDK یا سایر SDKهای فنی معمولا شامل:
• یک کلاینت HttpClient یا GrpcClient برای فراخوانی سرویس‌های بیرونی،
• کلاس‌های سرویس (ICatFactsService، IMyRagService و …) که می‌توانند در DI یا Builder ثبت شوند،
• دکوراتورهای KernelFunction که توابعی را به‌عنوان توابع هسته در Kernel شناسایی می‌کنند.
با این امکانات می‌توانید مستقیماً درون Kernel یک تابع تعریف کنید که داده‌های خارجی را بگیرد، آن‌ها را پردازش کند و به مدل برای استدلال (RAG) ارائه دهد.

کلاینت Read‑Only: فیلد readonly HttpClient را در سرویس خود نگه دارید تا از تغییر ناخواسته جلوگیری شود.
خطایابی و مدیریت خطا: در تابع فراخوانی، زمان‌های شکست اتصال را بگیرید و پیام خطا مناسب برگردانید.
پیکربندی Builder: با استفاده از AddSingleton<ICatFactsService, CatFactsService>() یا AddScoped در DI، مطمئن شوید که یک نمونه واحد از SDK در تمام Kernel‌ها استفاده می‌شود. این کار تضمین می‌کند مدل فقط از نسخه به‌روز و معتبر API استفاده می‌کند.

دکوراتور KernelFunction: هر متد افزونه را با [KernelFunction] علامت‌گذاری کنید تا توسط Kernel شناسایی شود.
استفاده از Kernel Builder: با kernel.ImportPluginFromObject(new CatFactPlugin(catFactsService)) یا kernel.ImportPluginFromAssembly<CatFactPlugin>()، SDK به‌طور خودکار نمونه جدیدی از افزونه را ایجاد می‌کند.
تعریف Builder بر اساس نوع: در ساخت KernelBuilder، با اضافه کردن WithPlugin<CatFactPlugin>() یا WithPlugin(typeof(CatFactPlugin))، سیستم می‌داند چطور یک نمونه‌ی جدید را از کلاس CatFactPlugin بسازد و به Kernel اضافه کند.

فرصت‌های شغلی

ایجاد محیطی با ارزش های انسانی، توسعه محصولات مالی کارامد برای میلیون ها کاربر و استفاده از فناوری های به روز از مواردی هستند که در آسا به آن ها می بالیم. اگر هم مسیرمان هستید، رزومه تان را برایمان ارسال کنید.

دیدگاه‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *