Telegram Group Search
چرا به جای تگ از SHA برای اجرای برنامه‌های داکری استفاده کنیم؟


حتماً شنیده‌اید که می‌گویند به جای استفاده از تگ latest، از تگ‌های مشخص (مثلاً nginx:1.27.4) در محیط داکر استفاده کنید. اما استفاده از تگ تمام مشکلات را حل نمی‌کند. بگذارید یک تجربه را بازگو کنم:


در پروژه‌ای که قرار بود پیاده‌سازی یکپارچه‌سازی مستمر/تحویل مستمر (CI/CD) داشته باشیم، در انتهای خط لوله CI از ابزار Sonar برای بررسی و تضمین کیفیت کد استفاده می‌کردیم. در ابتدا همه چیز به نظر درست می‌آمد و ابزار کار می‌کرد؛ اما گاهی، هرچند نادر، خط لوله دچار ارور می‌شد زیرا ابزار Sonar به درستی عمل نمی‌کرد. بررسی‌های بعدی نشان داد که نسخه Sonar که استفاده می‌کردیم، علی‌رغم اینکه تگ image تغییر نکرده بود، اما رفتار کانتینر تغییر کرده بود.


شاید بپرسید چرا؟ دلیل این است که توسعه‌دهندگان Sonar برخی patchها (مانند patchهای امنیتی) را روی یک نسخه خاص اعمال می‌کردند بدون اینکه تگ نسخه تغییر کند. در ظاهر، همان نسخه Sonar با همان قابلیت‌ها باقی می‌ماند، اما image تغییر کرده بود و این موضوع مشکلات ناسازگاری (compatibility) ناخواسته در محیط عملیاتی (production) ایجاد کرد.

راه‌حل چیست؟ استفاده از SHA است. برخلاف تگ‌ها که قابل تغییر (mutable) هستند، SHA یک عنصر تغییرناپذیر (immutable) است؛ یعنی اگر image تغییر کند حتی در حالی که تگ ثابت بماند، SHA نیز تغییر خواهد کرد.


برای روشن شدن موضوع، نگاهی به مثال زیر بیندازید.


استفاده از تگ mutable:

version: '3.8'

services:
webserver:
image: nginx:1.27.4
ports:
- "8080:80"
volumes:
- ./nginx-config:/etc/nginx/conf.d:ro
- ./website:/usr/share/nginx/html:ro
restart: unless-stopped


استفاده از SHA immutable:

version: '3.8'

services:
webserver:
image: nginx@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19
ports:
- "8080:80"
volumes:
- ./nginx-config:/etc/nginx/conf.d:ro
- ./website:/usr/share/nginx/html:ro
restart: unless-stopped



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

@golemcourse
👍26🤔4🐳1
آموزش پروژه محور یادگیری ماشین در محیط عملیاتی

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

این پروژه با رویکرد عملیاتی پیاده‌سازی شده و در دوره از ابزارهای متعددی مانند:

- Object Storage
- MLflow
- FastAPI
- Github Actions
- Docker
- Kubernetes


استفاده شده است. سورس کد پروژه نیز از طریق این لینک در دسترس علاقه‌مندان قرار دارد.

@golemcourse
66👍10
تقریباً همه‌ی تیم‌های ML این مشکل رو دارن:
۱- مدلی واسه خودت آموزش بدی/ (fine tune کنی) یا ۲- از API یه مدل بزرگ استفاده کنی؟
و خوب خیلی ها هم نه داده دارن، نه وقت، نه بودجه!
اما یک راه حل سومی هم هست: می‌تونی یه مدل دقیق در حد GPT بسازی — با کمتر از ۳ دلار هزینه.
این راه جدید بهترین‌های هر دو رو با هم ترکیب می‌کنه: از یه مدل اپن سورس برای تولید داده‌ی مصنوعی (synthetic) استفاده کن، بعد یه مدل کوچیک، سریع و ارزون‌تر رو با اون آموزش بده. چون:
- اکثر پروژه‌های واقعی داده‌ی آماده ندارن.
- مدل‌هایی مثل GPT-4 خیلی خوبن ولی هزینه‌بر، کند و نیاز به فرستادن اطلاعات حساس به یه شرکت دیگه دارن.
- حالا با داده‌ی مصنوعی باکیفیت از مدل‌های اوپن‌سورس (مثل Mixtral)، دیگه لازم نیست بری سراغ لیبل زدن دستی.
مدل بزرگ ("معلم") داده‌ها رو برات برچسب می‌زنه، بعدش یه مدل کوچیک‌تر ("دانش‌آموز") رو باهاش آموزش می‌دی.

مثال: مطالعه‌ی موردی: تحلیل احساسات (sentiment analysis) اخبار مالی

- دقت: GPT-4 و RoBERTa هر دو ۹۴٪

هزینه:
- GPT-4: $3061
- RoBERTa: $2.70

زمان پاسخ:
- GPT-4 چند ثانیه
- RoBERTa = ۰.۱۳ ثانیه

مصرف کربن:
- GPT-4 = ~۱۰۰۰ kg
- RoBERTa = ۰.۱۲ kg

اگه میخواهید کامل بدونید این بلاگ را حتما بخونید.
Blog: https://huggingface.co/blog/synthetic-data-save-costs

@DevTwitter | <Mehdi Allahyari/>
👍154🤔2🐳2
سلام بچه‌ها،

🔹 موقعیت شغلی (ریموت): Founding Engineer
🔹 حقوق پایه: ۲۰ هزار دلار در سال

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

او در توضیحاتش اشاره کرده که این موقعیت شغلی برای همه مناسب نیست و ساعات کاری، بیش‌تر از میزان معمول در بازار کار است.

اگر از دانشجویان سابق من بوده‌اید (چه در دانشگاه و چه در یوتیوب) و فکر می‌کنید برای این موقعیت مناسب هستید و علاقه دارید، می‌توانید در ایمیل خود من را به عنوان معرف ذکر کنید.
👍20🤔4🐳32
Forwarded from سحر نوشت
نسیم طالب یکجا می‌گه بعضی از خطاهایی که یک سیستم رو نابود نمی‌کنه کمک می‌کنه جلوی یکسری بلاهای بزرگ‌تر رو بگیره. از هنری پتروسکی نقل قول میکنه که اگر تایتانیک اون تصادف رو نمی‌کرد و اونقدر مصیبت‌بار نبود ما هنوز داشتیم اقیانوس‌پیماهای بزرگ‌تر می‌ساختیم و فاجعه بعدی خیلی بدتر می‌شد، برای همین افرادی که تلف شدن قربانی خیر بزرگ‌تری شدن. میگه که هم شکست هم موفقیت‌هاتون اطلاعاتی به شما میده، می‌تونید دوستاتون رو بشناسید، وقتی یه اشتباه کوچیکی کردین که فقط خودتون مقصرش بودین می‌تونید شخصیت یه فرد رو بشناسید. شما هم از اشتباه‌های بقیه یاد می‌گیرین شاید هیچ‌وقت جنس بعضی آدم‌ها رو نشناسید مگه اینکه بهشون فرصت نقض اصول یا موازین اخلاقی بدین.

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

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

کسی که هرگز مرتکب گناهی نشده است از کسی که فقط یک‌بار مرتکب گناه شده است کمتر قابل اطمینان است. و کسی که خطاهای بسیاری کرده- تا جایی که یک خطا را بیش‌ از یک بار مرتکب نشده باشد- قابل اطمینان‌تر از کسی است که هرگز هیچ خطایی نکرده باشد.»
45👍17🐳2
Forwarded from Dataphile
یه برنامه وجود داره به نام Everything که احتمالا باهاش آشنا باشید. کل فایل های سیستم رو index میکنه و میتونید با سرعت خیلی بالایی بین فایل هاتون جستجو انجام بدید. من خیلی ساله میشناسمش و از زمانی که باهاش آشنا شدم، دیگه نتونستم بدون این با سیستم کار کنم. از لینک زیر می‌تونید دانلودش کنید :
https://www.voidtools.com/downloads/

یه بار خیلی سال پیش (شاید ۸-۹ سال پیش) یه نفر برای یه پروژه اومد بهم پیام داد و گفت یه برنامه میخواد که یه فیلتری رو توی تعداد زیادی فایل متنی سرچ کنه. بعد بهش گفتم خب با برنامه everything که میتونی چنین کار هایی انجام بدی. اصلا زندگیش عوض شد. ظاهرا روزانه خیلی از این مدل سرچ ها نیاز داشت انجام بده.

اگر داکیومنت هاش رو بخونید، کلی فیچر برای جستجو داره :
https://www.voidtools.com/support/everything/using_everything/

قشنگ میتونید انواع و اقسام فیلتر ها رو بذارید که توی محتوای متنی فایل ها هم جستجو انجام بده. چند بار من رو از گشتن بیش شونصد تا فولدر نجات داده. مثلا میدونستم یه اسکریپری رو نوشتم ولی اصلا یادم نمیومد کجا گذاشتمش. فیلتر رو گذاشتم روی پوشه پروژه ها، محدودش کردم به فایل های .py و آدرس سایت رو به عنوان content دادم و سریع پیدا کردم!
👍2210
به‌تازگی دکتر Antonio Gulli، مدیر ارشد دفتر CTO گوگل در زوریخ، پیش‌نویس کتاب خود را به‌صورت رایگان در دسترس عموم قرار داده است:

لینک کتاب


نام کتاب Agentic Design Patterns است. هدف آن آموزش الگوهای طراحی متداول در سیستم‌های مبتنی بر ایجنت است. من به‌طور گذرا نگاهی به محتوای آن انداختم. هر فصل علاوه بر بخش‌های نظری، یک مثال عملی با LangChain و یک مثال با Google ADK (فریم‌ورک گوگل برای توسعه ایجنت‌ها) هم ارائه می‌دهد.


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

#همخوانی_کتاب
@golemcourse
44👍11🤔1
الگوی 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],
description="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",
description="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
14👍2
2025/10/25 16:24:59
Back to Top
HTML Embed Code: