Golem Course – Telegram
Golem Course
2.93K subscribers
47 photos
43 videos
40 files
144 links
Alireza Aghamohammadi, Ph.D.

https://youtube.com/@GolemCourse
Download Telegram
الگوی Prompt Chaining
👍85
کتاب Agentic Design Patterns در فصل اول با الگویی به نام Prompt Chaining (که به آن Pipeline هم گفته می‌شود) آغاز می‌کند. مدل‌های زبان بزرگ یا به طور کلی‌تر ایجنت‌ها، معمولاً برای انجام کارهای کوچک و خوش‌تعریف مناسب هستند. به محض این‌که پرامپت پیچیده شود یا چند کار مختلف از آن‌ها بخواهیم، کارایی و کیفیت خروجی کاهش پیدا می‌کند.

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

برای مثال، فرض کنید می‌خواهیم در یک بلاگ، پستی درباره‌ی موضوع دلخواه بنویسیم. می‌توانیم سه ایجنت تعریف کنیم:

- ایجنت اول ساختار پست شامل تیتر و بخش‌ها (Outline) را تولید کند.
- ایجنت دوم با دریافت این ساختار، متن اصلی پست را بنویسد.
- ایجنت سوم متن نوشته‌شده را ویرایش و روان‌سازی کند.

اما این الگو در کد چطور پیاده‌سازی می‌شود؟ فریمورک Google ADK یک ورک‌فلو به نام SequentialAgent دارد که ایجنت‌ها را به ترتیب اجرا می‌کند. مثلاً قطعه‌کد زیر سه ایجنت کدنویس، بازبین کد و ریفکتور‌کننده کد را پشت سر هم فراخوانی می‌کند:

SequentialAgent(
sub_agents=[CodeWriterAgent, CodeReviewerAgent, CodeRefactorerAgent]
)


#همخوانی_کتاب


@golemcourse
👍256🐳2
الگوی Routing
👍10
فصل دوم کتاب Agentic Design Patterns به معرفی الگوی Routing می‌پردازد. این الگو امکان اضافه کردن رفتار انتخابی (Condition) به سیستم را فراهم می‌کند.


برای مثال، فرض کنید کاربر در یک چت‌بات پیامی به ایجنت ارسال می‌کند. بر اساس محتوای پیام، ایجنت تصمیم می‌گیرد چه واکنشی نشان دهد:


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


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


به طور خلاصه، یک ایجنت هماهنگ‌کننده وجود دارد که تشخیص می‌دهد کار باید به کدام ایجنت یا ابزار سپرده شود. به همین دلیل این الگو را Routing می‌نامند.


مزیت این روش چیست؟ به جای آن‌که یک مسیر از پیش‌تعیین‌شده وجود داشته باشد، مسیر پاسخ‌دهی به کاربر به صورت پویا و بر اساس محتوای ورودی انتخاب می‌شود.


#همخوانی_کتاب

@golemcourse
👍108
الگوی Parallelization
👍9
فصل سوم کتاب Agentic Design Patterns به الگوی Parallelization می‌پردازد. در این الگو، درخواست‌ها به‌طور همزمان و موازی به چند ایجنت ارسال می‌شوند، زیرا تسکی که قرار است انجام شود، قابلیت شکسته‌شدن به بخش‌های کوچک‌تر و مستقل را دارد. وظیفه‌ی ایجنت اصلی در اینجا تجمیع نتایج است.


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


یک ایجنت صورت‌حساب‌های مالی شرکت را تحلیل می‌کند.


ایجنت دیگر خبرهای مرتبط با شرکت در یک ماه گذشته را مرور می‌کند.


ایجنت سوم شاخص‌های سهام آن شرکت در بورس را بررسی می‌کند.


در نهایت، هر یک از این ایجنت‌ها نتایج خود را برای ایجنت اصلی ارسال می‌کنند و ایجنت اصلی وظیفه‌ی ترکیب و ارائه‌ی خروجی نهایی را بر عهده دارد.


نکته‌ای که باید به آن توجه داشت این است که هرچند نام این الگو «موازی‌سازی» است، در عمل (به‌ویژه به دلیل استفاده از زبان پایتون در اکثر کتابخانه‌ها) این فراخوانی‌ها معمولاً به‌صورت async در یک event loop اجرا می‌شوند. این موضوع از لحاظ کارایی مشکلی ایجاد نمی‌کند، زیرا بیشتر این فراخوانی‌ها از نوع IO-bound هستند.


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

 parallel_research_agent = ParallelAgent(
name="ParallelWebResearchAgent",
sub_agents=[researcher_agent_1, researcher_agent_2, researcher_agent_3],
denoscription="Runs multiple research agents in parallel to gather information."
)


#همخوانی_کتاب
@golemcourse
👍151
الگوی Reflection
3👍1
در فصل چهارم کتاب Agentic Design Patterns با الگوی Reflection آشنا می‌شویم. ایده‌ی اصلی این الگو ارزیابی خروجی یک ایجنت توسط ایجنتی دیگر است. یعنی از یک ایجنت برای بررسی، نقد و بهبود خروجی ایجنت دیگر استفاده می‌کنیم. به همین دلیل در اینجا با یک حلقه روبه‌رو هستیم.


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


در Google ADK معمولاً این الگو به شکل زیر پیاده‌سازی می‌شود:


content_creation_workflow = LoopAgent(
name="CCWorkflow",
denoscription="Iterates between Content Creator and Critic agents until the results are approved.",
sub_agents=[cc_agent, critic_agent, CheckApprovalStatus(name="ApprovalChecker")],
max_iterations=3,
)


این یکی از الگوهایی است که شخصاً خیلی دوستش دارم. بارها در کار از آن استفاده کرده‌ام و تأثیرش را در خروجی به‌خوبی دیده‌ام.


#همخوانی_کتاب

@golemcourse
👍133
Forwarded from MetaPage
این کانال با هدف هم‌خوانی کتاب‌های حوزه فناوری، به‌ویژه کتاب‌های مرتبط با هوش مصنوعی ایجاد شده است. گاهی یک کتاب را به‌طور کامل و فصل‌به‌فصل مطالعه می‌کنیم و نکات مهم و ارزشمند آن را در اینجا منتشر می‌کنیم. گاهی هم ممکن است تنها یک فصل از یک کتاب به دلیل اهمیتش بررسی و هم‌خوانی شود.


مدیریت کانال در حال حاضر بر عهده دو نفر است و احتمال دارد در آینده افراد دیگری نیز به این مجموعه بپیوندند:

۱. محمد طلایی
۲. علیرضا آقامحمدی

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


NNN_AA_CH_XXX

در این الگو:

بخش NNN شامل حروف اختصاری نام کتاب است (برای مثال Agentic Design Patterns به شکل ADP نوشته می‌شود).
بخش AA حروف ابتدایی نام و نام خانوادگی نویسنده کتاب
بخش CH مخفف کلمه فصل.
بخش XXX شماره فصلی است که هم‌خوانی شده است.

@metapageai
15👍3
Forwarded from MetaPage
یکی از مسائلی که اگر با مدل‌های زبانی بزرگ (LLMها) یا ایجنت‌ها کار کرده باشید حتماً با آن روبه‌رو شده‌اید و احتمالاً گاهی هم آزارتان داده این است که وقتی از مدل خروجی را در قالب JSON می‌خواهید، همیشه دقیقاً همان‌طور تحویلتان نمی‌دهد.

گاهی ابتدای خروجی یا انتهای آن ``` یا ```json می‌گذارد، گاهی هم ساختار JSON را درست رعایت نمی‌کند و چیزی کم یا زیاد دارد که رفع کردن آن آزاردهنده است.


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

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

ممکن است بپرسید خودمان نمی‌توانیم چنین کدی بنویسیم؟


چرا، می‌شود. اما نکته‌ی جالب در مورد این کتابخانه این است که از دید نظری به مسئله نگاه کرده است. اگر درس نظریه‌ی زبان‌ها و ماشین‌ها را گذرانده باشید، می‌دانید که هر زبانی از جمله ساختار JSON را می‌توان با یک گرامر (Grammar) توصیف کرد.


این کتابخانه هم دقیقاً از همین ایده استفاده کرده: سعی می‌کند خروجی مدل را طوری اصلاح کند که با گرامر JSON سازگار شود.


در پست قبلی درباره‌ی Guardrails و به‌ویژه قابلیت Callback‌ها صحبت کردیم. یکی از بهترین جاها برای فراخوانی این کتابخانه، همین Callbackها هستند.


راستی، این پست آخرین مطلب از بررسی
کتاب Agentic Design Patterns است. باقی فصل‌های کتاب مذکور به نظرم چندان ارزش بررسی بیشتر ندارد و کتاب‌های موجود دیگر بهتر آن مطالب را بیان می‌کنند.

ادامه پست‌های این کانال بررسی کتاب‌های دیگر خواهد بود.


#ADP_AG_CH_18

@metapageai
9👍7