Published on

Spring AI (قسمت پنجم): تقویت برنامه‌های هوش مصنوعی با قدرت مشاورها (Advisors)

نویسندگان

Spring AI (قسمت پنجم): تقویت برنامه‌های هوش مصنوعی با قدرت مشاورها (Advisors)

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

همچنین، یکی از الگوهای مهم در بهبود کارایی مدل‌های هوش مصنوعی، الگوی "تولید مبتنی بر بازیابی" (Retrieval-Augmented Generation یا RAG) است. در این الگو، اطلاعات مرتبط از یک پایگاه داده یا منبع اطلاعاتی بازیابی می‌شود و به متن ورودی کاربر اضافه می‌شود. این کار باعث می‌شود که مدل هوش مصنوعی بتواند پاسخ‌های بهتری ارائه دهد، زیرا اطلاعات بیشتری برای پردازش و تولید پاسخ دارد.

در دنیای پرشتاب هوش مصنوعی، توسعه‌دهندگان همواره به دنبال راه‌هایی برای بهبود و افزایش کارایی برنامه‌های خود هستند. Spring AI به عنوان یک فریم‌ورک جاوا برای ساخت برنامه‌های مبتنی بر هوش مصنوعی، ویژگی قدرتمندی به نام مشاورها (Advisors) را معرفی کرده است که امکان مدیریت بهتر تعاملات و جریان‌های داده را فراهم می‌کند.

مشاورهای Spring AI چیستند؟

مشاورهای Spring AI کامپوننت‌هایی هستند که درخواست‌ها و پاسخ‌های مدل‌های هوش مصنوعی را در جریان پردازش رهگیری و تغییر می‌دهند. این مشاورها می‌توانند داده‌های ارسالی به مدل‌های زبان بزرگ (LLMs) را بهبود بخشیده و پاسخ‌ها را به فرمت دلخواه تنظیم کنند. یکی از مشاورهای کلیدی "AroundAdvisor" است که به توسعه‌دهندگان امکان می‌دهد اطلاعات را به طور پویا در جریان تعاملات تغییر داده یا از آن استفاده کنند.

مزایای استفاده از مشاورها (Advisors)

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

چگونه مشاورها (Advisors) کار می‌کنند؟

شکل زیر نشان‌دهنده جریان پردازش درخواست‌ها و پاسخ‌ها توسط مشاورها در Spring AI است. در این فرآیند:

  1. AdvisedRequest از پیام کاربر ایجاد می‌شود و یک فضای خالی به نام advisor-context نیز با آن همراه است.
  2. هر مشاور در زنجیره، درخواست را پردازش کرده و ممکن است آن را تغییر دهد، سپس اجرای زنجیره را به مشاور بعدی می‌سپارد. همچنین، مشاور می‌تواند تصمیم بگیرد که درخواست را متوقف کرده و از ادامه اجرای زنجیره جلوگیری کند.
  3. Advisor نهایی، درخواست را به مدل چت ارسال می‌کند.
  4. پاسخ مدل چت از طریق زنجیره مشاورها به صورت AdvisedResponse (ترکیبی از پاسخ اصلی مدل و تغییرات اعمال‌شده در زنجیره مشاورها) به سمت کاربر بازگردانده می‌شود.
  5. هر مشاور می‌تواند پاسخ را پردازش یا تغییر دهد.
  6. در نهایت، ChatResponse تقویت‌شده به کاربر بازگردانده می‌شود.

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

Spring AI Advisors Flow

انواع مشاورهای Spring AI

Spring AI با چندین مشاور از پیش آماده ارائه می‌شود که به توسعه‌دهندگان کمک می‌کنند سناریوهای رایج را پیاده‌سازی کنند:

  • MessageChatMemoryAdvisor، PromptChatMemoryAdvisor، و VectorStoreChatMemoryAdvisor: این مشاورها به روش‌های مختلف تاریخچه مکالمات را مدیریت می‌کنند.
  • QuestionAnswerAdvisor: این مشاور از الگوی "تولید مبتنی بر بازیابی" (RAG) استفاده می‌کند تا بتواند سوالات کاربر را به شکل بهتری پاسخ دهد.
  • SafeGuardAdvisor: این مشاور از تولید محتوای نامناسب توسط مدل جلوگیری می‌کند و می‌تواند درخواست‌ها را مسدود کند.

پیکربندی مشاورها (Advisors) در ChatClient

در این بخش، کدی که به منظور پیکربندی و استفاده از مشاورها در Spring AI به کار می‌رود را به طور کامل توضیح می‌دهیم.

API "ChatClient" به شما اجازه می‌دهد مشاورهای مورد نیاز خود را به زنجیره اضافه کنید و به این ترتیب پیکربندی بسیار منعطفی برای تعاملات هوش مصنوعی داشته باشید.

var chatClient = ChatClient.builder(chatModel)
    .defaultAdvisors(
        new MessageChatMemoryAdvisor(chatMemory), // مشاور حافظه چت
        new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()) // مشاور RAG
    )
    .build();

این کد ChatClient را با استفاده از مشاورهای پیش‌فرض (defaultAdvisors) پیکربندی می‌کند که شامل MessageChatMemoryAdvisor برای مدیریت حافظه مکالمات و QuestionAnswerAdvisor برای استفاده از الگوی RAG است. مشاور حافظه چت به مدل امکان می‌دهد تا تاریخچه مکالمات را به یاد داشته باشد و در پاسخ‌های بعدی استفاده کند، در حالی که مشاور RAG از اطلاعات ذخیره‌شده برای بهبود پاسخ‌ها استفاده می‌کند.

تحلیل کد

  • MessageChatMemoryAdvisor: این مشاور وظیفه مدیریت حافظه چت را بر عهده دارد. با استفاده از این مشاور، پیام‌های قبلی در مکالمات ذخیره شده و برای ارائه پاسخ‌های بهتر به مدل اضافه می‌شوند.
  • QuestionAnswerAdvisor: این مشاور از داده‌های ذخیره‌شده در پایگاه داده برداری (VectorStore) برای بازیابی اطلاعات مرتبط و تقویت پاسخ‌ها استفاده می‌کند. این الگو به عنوان تولید مبتنی بر بازیابی (RAG) شناخته می‌شود و به مدل کمک می‌کند تا اطلاعات بیشتری برای پاسخ‌گویی داشته باشد.

فراخوانی درخواست کاربر

String response = chatClient.prompt()
    .advisors(advisor -> advisor.param("chat_memory_conversation_id", "678")
            .param("chat_memory_response_size", 100))
    .user(userText)
    .call()
    .content();

در این قطعه کد، ChatClient یک درخواست (prompt) را از کاربر دریافت می‌کند و سپس پارامترهای مربوط به حافظه مکالمه را تنظیم می‌کند:

  • chat_memory_conversation_id: شناسه مکالمه را تنظیم می‌کند تا مدل بداند که به کدام مکالمه باید ادامه دهد.
  • chat_memory_response_size: اندازه پاسخ‌های حافظه را مشخص می‌کند تا اطلاعات مربوطه به مدل ارائه شود.

مثال‌های دیگر از مشاورها (Advisors)

  1. اضافه کردن مشاور سفارشی برای تغییر متن درخواست

فرض کنید می‌خواهید قبل از ارسال درخواست به مدل، متنی به آن اضافه کنید. می‌توانید از یک مشاور سفارشی برای این کار استفاده کنید:

public class AppendTextAdvisor implements CallAroundAdvisor {
    @Override
    public String getName() {
        return "AppendTextAdvisor";
    }

    @Override
    public int getOrder() {
        return 1;
    }

    @Override
    public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {
        String modifiedText = advisedRequest.userText() + " - Please provide a detailed explanation.";
        AdvisedRequest modifiedRequest = AdvisedRequest.from(advisedRequest).withUserText(modifiedText).build();
        return chain.nextAroundCall(modifiedRequest);
    }

}

این مشاور متن کاربر را تغییر می‌دهد تا مدل بتواند پاسخ‌های دقیق‌تری ارائه دهد.

  1. مشاور جلوگیری از درخواست‌های نامناسب

برای جلوگیری از ارسال محتوای نامناسب به مدل، می‌توانید مشاوری بنویسید که چنین درخواست‌هایی را مسدود کند:

public class SafeGuardAdvisor implements CallAroundAdvisor {
    @Override
    public String getName() {
        return "SafeGuardAdvisor";
    }

    @Override
    public int getOrder() {
        return 2;
    }

    @Override
    public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {
        if (advisedRequest.userText().contains("inappropriate_word")) {
            throw new IllegalArgumentException("Request contains inappropriate content.");
        }
        return chain.nextAroundCall(advisedRequest);
    }
}

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

مدیریت ترتیب اجرای مشاورها (Advisors)

ترتیب اجرای مشاورها در زنجیره بسیار مهم است و توسط متد getOrder() تعیین می‌شود. مشاورهایی که مقدار کمتر دارند زودتر اجرا می‌شوند. این ترتیب اجرا می‌تواند بر نحوه جریان داده‌ها و تغییرات اعمال شده تاثیر بگذارد.

بهترین شیوه‌ها

  • تمرکز بر وظایف خاص: هر مشاور باید وظایف مشخص و خاصی را انجام دهد تا برنامه شما ماژولارتر شود.
  • استفاده از advise-context: برای اشتراک‌گذاری حالت بین مشاورها از این شیء استفاده کنید.
  • ایجاد نسخه‌های جریانی و غیرجریانی: برای حداکثر انعطاف‌پذیری، هر دو نوع مشاور را پیاده‌سازی کنید.

نتیجه‌گیری

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

آماده‌اید تا مشاورهای Spring AI را در پروژه‌های خود آزمایش کنید؟ امکانات بی‌پایانی در انتظار شماست و نوآوری‌های شما می‌تواند به شکل‌گیری آینده توسعه برنامه‌های هوش مصنوعی کمک کند!

کدنویسی خوش و امیدواریم برنامه‌های هوش مصنوعی شما هرچه بیشتر هوشمند و پاسخگو شوند!

برای مشاهده یک مثال عملی استفاده از Advisor ها، می‌توانید به مخزن زیر مراجعه کنید:

LLM Applications with Java and Spring AI

این مخزن نمونه‌هایی از نحوه ساخت چت بات با استفاده از Spring AI و مدل‌های زبان بزرگ (LLMs) را نشان می‌دهد که به کمک هوش مصنوعی مولد قدرت می‌گیرند.

https://github.com/aminsource/gap