• בלוג
  • שלושה דברים שאהבתי בספריית RubyLLM

שלושה דברים שאהבתי בספריית RubyLLM

02/08/2025

רובי היא תמיד השפה האחרונה במסיבה. כש OpenAI הוציאו Agents SDK הם שחררו גירסה לפייתון ואחרת לטייפסקריפט. גם לנגגרף זמין לפייתון וטייפסקריפט וכך רוב מוחלט של הספריות בתחום. ספריות רובי לעבודה עם AI לא היו מספיק מתוחזקות, אמינות או גמישות. לפחות עד לאחרונה.

ספריית RubyLLM בולטת מיד עם תיעוד מצוין ומפורט, ריפו מתוחזק ותמיכה רחבה באקוסיסטם. אלה שלושה דברים שאהבתי במיוחד בספרייה:

1. התחלה קלה

זה כל מה שהייתי צריך בשביל לשלוח שאלה ל AI:

chat = RubyLLM.chat
response = chat.ask "What is Ruby on Rails?"
puts response.content

כמו שכבר מקובל בעולם הזה, מפתח ה API נלקח אוטומטית דרך משתנה סביבה.

בשביל לקבל תמונה מספיק לכתוב:

image = RubyLLM.paint("A photorealistic red panda coding Ruby")

2. תמיכה מובנית ב Async

זה היה Deal Breaker מבחינתי בכל ספריית רובי שבדקתי עד עכשיו. הבעיה עם תקשורת עם AI היא שרוב הזמן אתה מחכה לטוקנים של ה AI אבל עדיין צריך להחזיק את כל החיבורים פתוחים בשביל שהסטרימינג יעבוד. מבנה קלאסי של Threads לא יכול לעמוד בעומס מהסוג הזה ואנחנו צריכים ניהול של כל החיבורים האלה בממשק אסינכרוני, כלומר שהשרת יכול לטפל בהמון שיחות עם AI בו זמנית.

מה שיפה כאן זה שאחרי שמסיימים את הסטאפ האסינכרוני אפשר להמשיך לכתוב Jobs בדיוק כמו שהיינו כותבים רגיל ב Rails, ובאופן אוטומטי מריץ המשימות האסינכרוני יריץ את הג'ובים בתוך לולאה אסינכרונית. זה הקוד מדף התיעוד שלהם:

# Keep your existing adapter as default
config.active_job.queue_adapter = :solid_queue  # or :sidekiq, :good_job, etc.

# Base class for all LLM jobs
class LLMJob < ApplicationJob
  self.queue_adapter = :async_job
end

# LLM jobs inherit the async adapter
class ChatResponseJob < LLMJob
  def perform(conversation_id, message)
    # Runs with async-job - perfect for streaming
    response = RubyLLM.chat.ask(message)
    # ...
  end
end

# Regular jobs use your default adapter
class ImageProcessingJob < ApplicationJob
  def perform(image_id)
    # Runs with solid_queue - better for CPU work
    # ...
  end
end

אנחנו מקימים שני Queue Adapters, אחד זה Good Job הרגיל עבור הג'ובים הסינכרוניים והשני הוא Async::Job עבור הג'ובים של ה AI.

3. קוד קריא וקל להרחבה

הספריה בנויה בתור ספריית Ruby והאינטגרציה עם ריילס היא סוג של "קומה מעל" וכולה כתובה בקובץ אחד. קל מאוד להחליף חלקים באינטגרציה עם ריילס או אפילו לכתוב את כל האינטגרציה הזאת בעצמנו כדי להתאים למערכת ולשיטת העבודה שלנו.

אחת הדוגמאות מהתיעוד מדברת על מתי שומרים ב DB הודעה חדשה. ברירת המחדל באינטגרציה הקיימת היא לשמור את ההודעה לפני ש AI מתחיל לענות כדי שיהיה יותר קל לעשות Streaming. בתיעוד יש דוגמה איך לשנות את זה ולשמור את ההודעה רק כשכבר יש תוכן כדי שאפשר יהיה להוסיף וולידציה ב DB.

בעבודה שלי עם הספריה הייתי צריך לסנן חלק מההודעות לפני השליחה ל AI ולהוסיף Metadata להודעות, שני דברים שהצלחתי לעדכן מאוד מהר ורק דרך המנגנון של ירושה.

סך הכל מאוד אהבתי את הספריה. כן צריך להגיד שאנחנו על קרקע מאוד לא יציבה, אני בטוח שעוד יהיו שינויי API ויש דברים בצורת הפעולה היום שאני לא אוהב - לדוגמה הבחירה שלהם לשמור את ה System Prompt ב DB גם בתור חלק מהשיחה. אבל באקוסיסטם של רובי וריילס אני בטוח שהיא תזכה להצלחה.