What LLMs can (and can’t) do for your Ruby projects today

LRUG - May 2025

lbarasti

Confronting the Anxiety

Confronting the Anxiety

Confronting the Anxiety

Our angle today

Focus on what we can control.

Consider the adoption of techniques that look

  • Effective
  • Practical
  • Low risk
  • Fun

battle-tested

improves your day-to-day

internal use / read-only

think beyond current limitations

for Tools

3 use cases

class Weather < RubyLLM::Tool
  description 'Gets current weather for a location'
  param :latitude, desc: 'Latitude (e.g., 52.5200)'
  param :longitude, desc: 'Longitude (e.g., 13.4050)'


  
  
  
  
  
  
  
end

Defining a tool in Ruby LLM

What

class Weather < RubyLLM::Tool
  description 'Gets current weather for a location'
  param :latitude, desc: 'Latitude (e.g., 52.5200)'
  param :longitude, desc: 'Longitude (e.g., 13.4050)'

  def execute(latitude:, longitude:)
    url = "#{METEO_API}?lat=#{latitude}&lon=#{longitude}"

    response = Faraday.get(url)
    JSON.parse(response.body)

    
  end
end

Defining a tool in Ruby LLM

class Weather < RubyLLM::Tool
  description 'Gets current weather for a location'
  param :latitude, desc: 'Latitude (e.g., 52.5200)'
  param :longitude, desc: 'Longitude (e.g., 13.4050)'

  def execute(latitude:, longitude:)
    url = "#{METEO_API}?lat=#{latitude}&lon=#{longitude}"

    response = Faraday.get(url)
    JSON.parse(response.body)
  rescue StandardError => e
    { error: e.message }
  end
end

Defining a tool in Ruby LLM

class Weather < RubyLLM::Tool
  description 'Gets current weather for a location'
  param :latitude, desc: 'Latitude (e.g., 52.5200)'
  param :longitude, desc: 'Longitude (e.g., 13.4050)'

  def execute(latitude:, longitude:)
    url = "#{METEO_API}?lat=#{latitude}&lon=#{longitude}"

    response = Faraday.get(url)
    JSON.parse(response.body)
  rescue StandardError => e
    { error: e.message }
  end
end

Defining a tool in Ruby LLM

What

Creating a chat with RubyLLM

How

require 'ruby_llm'
# require tools...










How

require 'ruby_llm'
# require tools...

chat = RubyLLM.chat(model: 'gpt-4o-mini')

weather_tool = Weather.new
search_tool = SemanticSearch.new





Creating a chat with RubyLLM

How

require 'ruby_llm'
# require tools...

chat = RubyLLM.chat(model: 'gpt-4o-mini')

weather_tool = Weather.new
search_tool = SemanticSearch.new

instructions = "You're a helpful assistant"

chat.with_instructions(instructions)
    .with_tools(weather_tool, search_tool)

Creating a chat with RubyLLM

How

chat.with_instructions(instructions)
    .with_tools(weather_tool, search_tool)

response = chat.ask(
  "what's the weather like in London?")

puts response.content
# => The temperature is 15 degrees...

Creating a chat with RubyLLM

LLMs calling tools

How

LLMs calling tools

LLMs calling tools

LLMs calling tools

How

  • Making things up Guessing
  • Acting as a router
  • Converting natural language into code (and back)

Tool calling...

... Leverages some LLMs strengths 👀

Why

Tool calling...

... Addresses some LLMs weaknesses

Why

  • No agency in the real world
  • Hallucinations
  • Failing at elementary maths

Concept

Ruby Assistant

A terminal-based chatbot that knows about

🌦️ the weather

💿 your database

📚 ruby gems

Concept

Ruby Assistant

💎 RubyLLM

🤖 OpenAI

🌐 pgvector

Powered by

1. (Hand-wavy) API integrations

🙋 What's the weather in Rome?

Weather tool: api.open-meteo.com/v1/forecast?

        latitude=#{latitude}&longitude=#{longitude}

[⠙] Thinking...Fetching weather for 41.9028, 12.4964
[⠇] Thinking...

🤖 The current weather in Rome is as follows:
- Temperature: 18.5°C
- Wind Speed: 12.7 km/h

2. Natural Language → SQL

🙋 Who submitted the last order in the database?

[⠋] Thinking...Executing query:

  SELECT users.username FROM orders JOIN users ON
   orders.user_id = users.id ORDER BY orders.order_date DESC
  LIMIT 1;

[⠋] Thinking...

🤖 The last order in the database was submitted by the user "alex_wilson."

3. Semantic search

🙋 Does ruby_llm support image generation?

[⠋] Thinking...Query: "ruby_llm image generation"
[⠋] Thinking...

🤖 Yes, RubyLLM supports image generation. You can create images using the method RubyLLM.paint.

References

Agent failures

Costs

Open-weight vs proprietary models

Privacy

Infosec

MCP

Bonus material

MCP example

Considerations on cost

Made with Slides.com