آموزش هوش مصنوعی

ایجنت تحلیل تصویر؛ ساخت ایجنت بینایی با smolagents

پیشرفته مطالعه در ۹ دقیقه
mahdyar

ایجنت تحلیل تصویر درِ کارهایی را باز می‌کند که با متن تنها ممکن نیستند. بسیاری از چالش‌های دنیای واقعی، مثل مرور وب یا فهم اسناد اسکن‌شده، به تحلیل محتوای تصویری نیاز دارند. ایجنتی که فقط متن می‌فهمد، در این کارها کور است.

در این قسمت از مجموعه‌ی «از پرامپت تا دستیار هوش مصنوعی» به ایجنت چشم می‌دهیم. smolagents از مدل‌های بینایی-زبانی (VLM) پشتیبانی می‌کند. با دو روش مختلف تصویر را به ایجنت می‌دهیم: یک بار در شروع کار و یک بار به‌صورت پویا هنگام مرور وب.

ایجنت تحلیل تصویر چیست؟

ایجنت تحلیل تصویر ایجنتی است که مغزش یک مدل بینایی-زبانی است. VLM مثل مدل زبانی بزرگ کار می‌کند، اما علاوه بر متن، تصویر را هم به‌عنوان ورودی می‌فهمد. در قسمت هشتم گفتیم ایجنت می‌تواند چنین مغزی داشته باشد؛ حالا وقت ساختنش است.

سناریو؛ بررسی هویت مهمان‌ها

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

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

یک هشدار درباره‌ی مدل

مثال‌های این درس به یک مدل بینایی قدرتمند نیاز دارند. دوره‌ی Hugging Face آن‌ها را با API مدل GPT-4o آزموده است. smolagents از گزینه‌های دیگری هم پشتیبانی می‌کند؛ از مدل‌های Hugging Face تا ارائه‌دهندگان دیگر.

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

روش اول؛ ارسال تصویر در شروع کار

در این روش تصاویر همراه درخواست در شروع کار به ایجنت داده می‌شوند و به‌عنوان task_images در کنار متن درخواست ذخیره می‌شوند. ایجنت در کل اجرا به این تصاویر دسترسی دارد. این روش وقتی مناسب است که تصاویر لازم را از قبل دارید.

بارگذاری تصاویر

آلفرد تصاویری از مهمان مشکوک دارد. در مثال درسنامه، برای سادگی از تصاویر ویکی‌پدیا استفاده شده است. تصاویر با requests دانلود و با کتابخانه‌ی Pillow باز می‌شوند:

python
from io import BytesIO
import requests
from PIL import Image

image_urls = [
    "https://upload.wikimedia.org/wikipedia/commons/e/e8/The_Joker_at_Wax_Museum_Plus.jpg",
    "https://upload.wikimedia.org/wikipedia/en/9/98/Joker_%28DC_Comics_character%29.jpg",
]
headers = {"User-Agent": "Mozilla/5.0"}
images = [Image.open(BytesIO(requests.get(u, headers=headers).content)).convert("RGB") for u in image_urls]

تبدیل به حالت RGB مهم است، چون برخی تصاویر کانال شفافیت دارند و مدل ممکن است با آن‌ها مشکل داشته باشد.

اجرای ایجنت با تصاویر

حالا ایجنت را می‌سازیم و تصاویر را با پارامتر images به متد run می‌دهیم:

python
from smolagents import CodeAgent, OpenAIServerModel

agent = CodeAgent(tools=[], model=OpenAIServerModel(model_id="gpt-4o"), max_steps=20)
response = agent.run(
    "Describe the costume and makeup of the character in these photos. Is the guest The Joker or Wonder Woman?",
    images=images,
)

ایجنت لباس و گریم هر تصویر را توصیف می‌کند: کت بنفش، صورت سفید، لب‌های قرمز با لبخند اغراق‌شده و موی سبز. نتیجه‌گیری‌اش روشن است؛ این شخصیت جوکر است، نه واندر وومن. آلفرد می‌تواند از ورود او جلوگیری کند.

روش دوم؛ دریافت پویای تصویر هنگام اجرا

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

تصویر در حافظه‌ی ایجنت

ایجنت‌های smolagents بر پایه‌ی کلاس MultiStepAgent ساخته شده‌اند. این کلاس اطلاعات را در سه نوع قدم ثبت می‌کند: SystemPromptStep برای پیام سیستمی، TaskStep برای درخواست کاربر و ورودی‌ها، و ActionStep برای اقدام‌ها و نتایجشان.

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

ابزارهای مرور وب

برای مرور وب از Selenium و Helium استفاده می‌کنیم که ابزارهای خودکارسازی مرورگرند. ابتدا بسته‌ها را نصب کنید:

bash
pip install "smolagents[all]" helium selenium python-dotenv

ایجنت به چند ابزار مخصوص مرور نیاز دارد تا مثل یک انسان در وب حرکت کند. search_item_ctrl_f متنی را در صفحه جستجو می‌کند و به آن می‌پرد. go_back به صفحه‌ی قبل برمی‌گردد و close_popups پنجره‌های مزاحم را می‌بندد. هر سه با دکوراتور @tool و docstring دقیق تعریف می‌شوند.

گرفتن اسکرین‌شات در هر قدم

حالا تابعی می‌نویسیم که در پایان هر قدم اسکرین‌شات بگیرد. این تابع به‌عنوان step_callback به ایجنت داده می‌شود. یک نکته‌ی مهم در آن، حذف اسکرین‌شات‌های قدیمی است:

python
def save_screenshot(step_log: ActionStep, agent: CodeAgent) -> None:
    sleep(1.0)  # let page animations finish
    driver = helium.get_driver()
    for old in agent.memory.steps:
        if isinstance(old, ActionStep) and old.step_number <= step_log.step_number - 2:
            old.observations_images = None
    image = Image.open(BytesIO(driver.get_screenshot_as_png()))
    step_log.observations_images = [image.copy()]
    step_log.observations = (step_log.observations or "") + f"\nCurrent url: {driver.current_url}"

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

ساخت و اجرای ایجنت مرورگر

حالا همه‌چیز را کنار هم می‌گذاریم. ایجنت ابزار جستجو، ابزارهای مرور و تابع اسکرین‌شات را می‌گیرد. helium هم به فهرست importهای مجاز اضافه می‌شود تا ایجنت بتواند با کد، مرورگر را کنترل کند:

python
agent = CodeAgent(
    tools=[DuckDuckGoSearchTool(), go_back, close_popups, search_item_ctrl_f],
    model=OpenAIServerModel(model_id="gpt-4o"),
    additional_authorized_imports=["helium"],
    step_callbacks=[save_screenshot],
    max_steps=20,
)

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

نکته‌های عملی و اخلاقی

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

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

تمرین عملی؛ ایجنت خواندن سرفصل دوره‌ها

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

  1. از صفحه‌ی سرفصل یک دوره یا یک پوستر آموزشی اسکرین‌شات بگیرید.
  2. تصویر را با پارامتر images به CodeAgent بدهید.
  3. بخواهید نام دوره، مدت، سطح و سرفصل‌ها را در قالب JSON استخراج کند.

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

سخن پایانی

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

در قسمت هفدهم یاد می‌گیریم کار را میان چند ایجنت تخصصی تقسیم کنیم.

این آموزش بر پایه‌ی بخش Vision Agents with smolagents از دوره‌ی آزاد Agents Course در Hugging Face (مجوز Apache-2.0) به فارسی بازنویسی و تکمیل شده است.

پرسش‌های پرتکرار

مدل بینایی-زبانی (VLM) چیست؟

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

دو روش دادن تصویر به ایجنت smolagents کدام‌اند؟

روش اول ارسال تصاویر در شروع کار با پارامتر images در متد run است. روش دوم افزودن پویای تصویر هنگام اجراست؛ مثلاً ایجنت هنگام مرور وب اسکرین‌شات می‌گیرد و آن را در observations_images همان قدم ذخیره می‌کند.

step_callbacks در smolagents چه کاربردی دارد؟

تابع‌هایی که در پایان هر قدم ایجنت اجرا می‌شوند. در ایجنت بینایی از آن برای گرفتن اسکرین‌شات مرورگر و افزودنش به حافظه‌ی ایجنت استفاده می‌شود.

چرا اسکرین‌شات‌های قدیمی از حافظه حذف می‌شوند؟

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

دیدگاه‌ها

هنوز دیدگاهی ثبت نشده است. شروع‌کننده باشید — پرسش و اصلاح را با آغوش باز می‌پذیریم.

دیدگاه بگذارید

برای **پررنگ**، *مورب*، `کد` و لینک از Markdown استفاده کنید. لینک‌ها nofollow هستند.

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

تصویر کد امنیتی پنج‌رقمی

در حال دریافت کد امنیتی…

مهلت کد تمام شد. روی «کد جدید» بزنید.