メインコンテンツへスキップ

Rubyist歓喜!AI開発が爆速になるRubyLLMがマジ最高らしい

·3 分
2025/03 Ruby LLM AI 開発 DSL

Rubyist歓喜!AI開発が爆速になるRubyLLMがマジ最高らしい

引用元:https://news.ycombinator.com/item?id=43331847

kyledrake 2025-03-15T13:52:11

このインターフェース、streamingとの連携もっとうまくならないとだめだね。レスポンスにラグがあるし、多くの人がレスポンスをノンブロッキングなスレッドでstreamしたいと思うはず。プロセスを待たせるんじゃなくてさ。ドキュメントの問題かもしれないけど、streamingは数秒以上かかるIO処理には必須でしょ。でもDSLはマジで最高。

bradgessler 2025-03-15T17:28:01

Rubyのasync IOの世界、もっと注目されてもいいのにね。async gemとか、async-http、async-websockets、Falcon web serverとかチェックしてみて!
https://github.com/socketry/falcon

earcar 2025-03-15T21:40:30

ありがとね!いい指摘だね。実はasync-http-faradayを使ってstreamingを改善しようとしてるところなんだ。デフォルトのアダプターをasync_httpとFalcon、async-jobを使うように設定するんだ。PumaとかSolidQueueみたいなスレッドベースじゃなくてね。これでRubyでのAIワークロードのリソース効率がマジで上がるはず。他のRuby LLMライブラリで実装されてるの知らないけど。今のブロックを使うやり方はRubyっぽいけど、asyncサポートでさらにproductionで使いやすくなるよ!

joevandyk 2025-03-15T16:40:02

>https://rubyllm.com/#have-great-conversationsから引用
>”# Stream responses in real-time
chat.ask ”Tell me a story about a Ruby programmer” do |chunk|
print chunk.content
end”

jupp0r 2025-03-15T17:09:32

これだと’chat.ask’が返ってくるまで同期的にブロックされるよね。streaming APIが処理を終えるまでアプリ全体のメモリ(数十~数百MB)が無駄になる覚悟は必要だよ。

jupp0r 2025-03-16T02:19:11

Railsはグローバルな可変ステートの塊みたいなもんだから、スレッドで頑張って。

andrewmutz 2025-03-16T03:02:30

RailsのデフォルトのアプリケーションサーバーはPumaで、スレッド使ってるよ。

jupp0r 2025-03-16T19:10:50

そうそう。RubyにはGILがあって、インタプリタで複数のスレッドが同時に実行されるのを防いでるんだ。Pumaはスレッド持ってるけど、同時にRubyコードは実行できない。でもIOは隠せる。

andrewmutz 2025-03-17T13:35:03

GILは、LLMとの通信に使われるHTTPリクエストみたいな一般的なIO処理の間は解放されるよ。

kyledrake 2025-03-15T23:05:46

それいいね!前に見なかった。

jatins 2025-03-15T02:57:00

langchain みたいなクソ DX なライブラリと比べて、マジで新鮮!

nullpoint420 2025-03-15T03:02:06

Ruby コミュニティって DUX をめっちゃ大事にしてるよね。なんで他の言語コミュニティにはないんだろ?

toasterlovin 2025-03-15T05:51:19

他の好きなものがある人をけなすつもりはないんだけど、Ruby は趣味の良い人たちのための言語とエコシステムだと思う。

continuational 2025-03-15T07:00:15

グローバルステートが好きってことだよね、きっと。

atemerev 2025-03-15T07:38:05

特定のケースで単純化できるとしても、グローバルステートを盲目的に拒否するのはセンスないよね。goto でさえ、エレガントな時もあるじゃん。

zelphirkalt 2025-03-15T08:26:25

でも大抵は長期的な問題を引き起こして、重要な作業を後回しにするだけなんだよね。

bmacho 2025-03-15T08:42:42

後回しにした結果、結局やらないってこともあるから、最初から強制的にやらせる言語よりはマシってこと。

lolinder 2025-03-15T13:36:14

でも後回しにしたせいで、グローバルステートを完全に解きほぐしてコードを再利用できるようにするのに何年もかかることもあるよね。そもそも最初にそれを使ったことで生産性が上がった?たぶん違うよね。
もしアプリが1年以上続くとか、3人以上でメンテするとか、50万行以上のコードになるとか(好きな指標に置き換えて)、グローバルステートの除去を後回しにするのはやめとけ。絶対後悔するし、最初からちゃんとやっても大した手間じゃないよ。
あと、グローバルステートを使うなって強制するメインストリームな言語はないよ。Java でさえ、必要ならグローバルステートを簡単に使えるし。

trevorhinesley 2025-03-15T14:01:57

それってグローバルステートのせいじゃなくて、アーキテクチャがダメダメなせいじゃない?ツール自体は悪くないよ。良いナイフも使い方次第ってこと。

lolinder 2025-03-15T14:13:53

グローバルステートって、アーキテクチャが重要なアプリだとほぼ確実に悪いアーキテクチャにつながるんだよね。 例外もあるだろうけど、システム内のどこからでも変数をいじれるようにすると、予測不能な影響が出やすくなって、大規模なコードベースではマジでヤバいことになるからね。グローバルステートを避けることで、腐敗の原因を一つ減らせるんだ。

もっとコメントを表示(1)
trevorhinesley 2025-03-15T15:40:27

「ほぼ」ってのがミソだよね。あなたの意見は尊重するけど、いつも絶対ダメとか言うのはどうかなって。長くいればいるほど「場合による」って思うようになるんだ。大規模なコードベースでグローバルステートをうまく使ってる例として、https://dev.37signals.com/globals-callbacks-and-other-sacril… が参考になるよ。

lolinder 2025-03-15T16:38:34

>それはいつも絶対ダメってことじゃないよ!
そんなこと言ってないじゃん!例外はあるって言ってるし。ルールを教えて、本当にわかってて破るなら良いけど、そうじゃなければグローバル変数は普通だなんて思わない方が良いよ。 例外になれる可能性は低いんだから、グローバル変数は特別な場合にしか使わないようにしないとね。

trevorhinesley 2025-03-16T00:25:48

グローバルステートを四肢切断に例えるのは極端すぎない?そこまで悪いものじゃないと思うな。RailsのCurrent singletonみたいに、グローバル変数を使う仕組みが組み込まれてるフレームワークもあるし。確かにグローバル変数は鋭いナイフだけど、使い道もあると思うよ。あなたの言う「ほぼ絶対ダメ」ってほどじゃないかな。だから、私は「場合による」って言うよ。

IshKebab 2025-03-15T10:08:59

grepできないコードも忘れちゃ困るぜ!型ヒントって一体何なんだ?

techscruggs 2025-03-15T13:44:18

Global Interpreter Lockがお好き?

simpaticoder 2025-03-15T13:26:07

世界が小さいときはグローバルステートって便利だよね。Rubyを使う人たちは世界を小さく保つのが好きみたいで、それには他のメリットもたくさんあるし。

lolinder 2025-03-15T13:32:40

Rubyは好きだけど、これはナンセンスだね。Railsアプリなんてすぐに巨大化するじゃん。どんなフレームワークでも同じだよ。世界を小さく保つなんて宣言できないよ。問題の大きさ次第だよ。

madeofpalk 2025-03-15T12:18:33

ある種の趣味だね。

choxi 2025-03-15T03:08:50

MatzさんがRubyは開発者の幸せを最適化するように設計したって言ってたよ。それが作られたときからの言語の核となる原則なんだって。

kuboble 2025-03-15T07:48:41

コードを書く開発者の幸せは、それを読んだりデバッグしたりする人の不幸になることもあるよね。2009年頃に数年間Rubyで仕事してたんだけど、method missingでロジックが実装されたコードを扱った経験は、今でも最悪の記憶だよ。

MatthiasPortzel 2025-03-15T11:50:32

binding.irbshow_sourceは、Rubyのデバッグですごく役に立ったな。binding.irbでブレークポイントを設定して、show_sourceでメソッドのソースコードを見つけることができるんだ。生成されたコードでも見つけられるのがすごいよね。

richjdsmith 2025-03-15T18:12:17

Rubyを何年も使ってるけど、デバッガでshow_sourceをこんな風に使うなんて考えたこともなかったよ。ありがとう、親切な人。おかげで今日は良い日になったよ!

viraptor 2025-03-15T09:07:50

Rubyのforwarded methodsも面倒なんだよね。生成されたインジェクションコードで作られてるから、どのメソッドに転送されるかを実行時に簡単に調べられないんだ。

RangerScience 2025-03-15T19:58:06

そうそう、それがまさに’切れ味の良いナイフ’ってやつだよね。俺が勧めるのは(そして目指してるのは)、’ライブラリ’コードにだけそのナイフを使うこと。アプリケーションコードは’シンプル’に保つべき(そうすればずっと扱いやすくなる)。そうしないと、マジでめちゃくちゃになっちゃうよ!

RangerScience 2025-03-15T19:55:53

どの言語も何か(またはいくつか)を優先してるよね。なぜなら、どの言語も理由を持った人(または人々)によって作られたから。Pythonなら正確さ、Javaなら分業、Goなら’シンプルさ’みたいな感じかな(もちろん、これらがそれぞれの言語の唯一の優先事項ってわけじゃないけどね)。別のコメントにもあるように、Matzさんは開発者の幸せを優先したんだよ。
俺が好きな例は、Rubyの配列演算の素晴らしさと奇妙さ。減算(arr1 - arr2)は要素ごとの削除だけど、加算(arr1 + arr2)は単純な追加。ほとんどの場合、これらはまさにやりたいことだけど、数学的には完全に’間違ってる’よね。

okeuro49 2025-03-15T21:40:42

> python and correctness
Pythonは読みやすさと’一つのことを行うためのただ一つの方法’だと思ってた。

rochak 2025-03-15T07:25:34

えーと、Goもそうじゃないの?個人的にはGoのツールの方が使いやすいな。

danenania 2025-03-15T07:40:52

どっちもDXを最適化してると思うけど、アプローチが全然違うよね。Rubyはコードを書くことに重点を置いてる。つまり、表現力豊かで直感的で楽しいものにするってこと。
Goは高速で堅牢なシステムを構築しやすくすることに重点を置いてる。でも、コード自体が醜くてボイラープレートだらけでも気にしないんだ。
経験を積むにつれて、Goのトレードオフを本当に評価するようになったよ。最初は楽しくないけど、4時にサーバーアラートを受け取る可能性は低い。何を作るかにもよるけどね。

jatins 2025-03-15T07:32:48

Goのエコシステムはマジ良いよね。でもGoってシンタックスがちょっとアレだから、RubyみたいにDSL作れないんだよねー。Rubyは表現力が高い分、ちょっと重いんだよね。個人的にはチーム開発ならGo、個人開発ならRubyLLMかな。

lolinder 2025-03-15T13:42:36

「DSL作れる=開発者体験が良い」ってのは違う気がするなー。RubyとGoは、開発者体験の重視ポイントが違うんだよね。Rubyは最初のコード書く人の体験優先、Goは後からメンテする人の体験優先。どっちが良いかは、新規コード書く時間とメンテ時間の割合で変わるんじゃない?

もっとコメントを表示(2)
smw 2025-03-15T18:51:37

Goがメンテしやすいってのは違うと思うな。コード量が多いほどメンテは大変になるし。Goは一行一行は読みやすいけど、全体像を掴むのが難しいんだよね。Goの変更って、予想以上にアプリの奥深くまで影響することが多いし。でもruntimeは最高だから、人気は落ちないと思うけど。

danenania 2025-03-15T19:30:12

>More lines of code typically makes maintenance more difficult.
コード量が多いってのは表面的な問題かもね。Goはファイル単体の読みやすさより、抽象化や間接参照の連鎖を最小限にすることに重点を置いてると思う。ロジックや設定がファイルにまとまってて、”Go to definition”を1、2回クリックすれば大体わかる。ボイラープレートは多いけど、ファイル間の結合は弱い。Rubyの美しいDSLは、壊れたり拡張が必要になったりすると大変。変更が色んなファイルに影響したり、テストを修正する必要が出てくる。

lolinder 2025-03-15T21:45:33

>or else just one or two “Go to definition” clicks away
これマジ重要。メンテ担当者はstatic analysisとかgrepでコードを理解する必要がある。Rubyは性質上static analysisが難しいけど、Goはその逆。

smw 2025-03-20T21:33:21

RubymineとかGolandのctrl-bがマジ使える。5年以上前から他のエディタより全然良かった。今はlspがあるから、違いは小さくなってるのかな?

drdaeman 2025-03-15T21:59:32

Goでも同じようなAPI作れるんじゃない?エラー処理とかoptional argumentsがないとか、言語特有の違いはあるけど。WithSomething()をAsk()の前に置く必要があるくらいかな。

jasongill 2025-03-15T15:06:16

昔Langchainに貢献してたんだけど、最初は良かったんだよねー。チャットモデルとかツールとかJSON modeとかがなかった頃の話だけど。LangchainがLLMメーカーに機能追加を促したけど、いつの間にか廃れてゾンビみたいになっちゃった。LLMプロバイダーが色々追加して、walled garden化してるし。Langchainは何度も方向転換しようとしてるけど、投資を受けずにいたら、コアチームはOpenAIとかAnthropicとかに行ってただろうね。

ekianjo 2025-03-15T03:40:54

langchainとかllamaindexってマジgarbage librariesだよね。ドキュメントは半分もないし、APIはバージョンごとに壊れるし。

brokegrammer 2025-03-15T10:35:29

それ言おうと思ってた。これらのライブラリに頼らず、自分で全部作ることにしたんだよね。PythonLLMがあっても良いかもね。Python界隈はdeveloper experienceを気にしてる人がいないみたいだし。

olegp 2025-03-15T04:57:48

誰かJavaScriptとかTypeScriptで同じくらいDXが良い感じのライブラリ知らない?

mathgeek 2025-03-15T10:15:14

もしかして: https://llmjs.themaximalist.com/ かな

gregmolnar 2025-03-15T15:04:34

でも例には気を付けてね!
https://github.com/crmne/ruby_llm/issues/25

earcar 2025-03-15T21:32:00

ご指摘ありがとう。evalはドキュメントの中だけで、あくまで例として載せてたんだけど、危険なパターンを推奨したくないから修正したよ。

soheil 2025-03-15T21:10:13

bobby drop table、まだあるあるなんだね

ketzo 2025-03-15T03:47:40

これのおかげでRails試してみようかな?Rubyのシンタックスってマジで良いよね。

drdaeman 2025-03-15T04:05:06

見た目がめっちゃ良くてクリーンなハイレベルAPIが良い感じだよね(もちろん仕事に合えばだけど)。
このAPIのセマンティクス(インスタンスビルダーで設定して、ask/paint/embedで言語ネイティブな方法でストリーミングと宣言的なツールを扱う)は、他の言語でも美しくて使いやすいと思うな。例えばPython、C#、Erlangとか。このレベルのAPIじゃ十分じゃないかもしれないけど、開発時間は確実に短縮できるはず。

ilrwbwrkhv 2025-03-15T03:21:37

マジで美しい。Rubyって表現力豊かで簡潔だよね。
TypeScriptのオプションを見ると、自分で自分に水責めしてるみたいじゃん。

gedy 2025-03-15T14:20:04

これって本当にRubyなの?インターフェースが良いだけじゃない?TypeScriptの例もそんなに変わらないと思うけど。

>// Just ask questions
>const chat: Chat = LLM.chat;
>chat.ask(“What’s the best way to learn TypeScript?”);

>// Analyze images
>chat.ask(“What’s in this image?”, { image: “ts_conf.jpg” });

>// Generate images
>LLM.paint(“a sunset over mountains in watercolor style”);

>// Create vector embeddings
>LLM.embed(“TypeScript is powerful and scalable”);

>// Let AI use your code
>class Calculator {
> description = “Performs calculations”;
> params = {
> expression: { type: “string”, desc: “Math expression to evaluate” },
> };

> execute(args: { expression: string }): string {
> return eval(args.expression).toString();
> }
>}

>chat.withTool(new Calculator()).ask(“What’s 123 * 456?”);

williamcotton 2025-03-15T15:18:04

余分な括弧、セミコロン、キーワード、型アノテーションが多いんだよね。Rubyは読みやすさを最優先にしてる。TypeScriptも読めるけど、構文をスキャンしたりコードを書いたりするのにRubyより労力がかかると思う。
あと、const chat: Chat = LLM.chat; はクラスのインスタンス化じゃなくて、Rubyは裏でやってるんだよね。ファクトリを作るには、さらに括弧が必要じゃん!
これは主にシンタックススタイルの問題だね!

drdaeman 2025-03-15T22:46:43

追加の括弧とかセミコロン、キーワード、型アノテーションのことだよね。細かい文法の違いなんて、重要じゃないと思ってたんだ。構文を勉強中の人とか、色んな言語を見たことない人以外は気にしないんじゃないかな?

もちろん人それぞれだけど、APIで色々やったり、一回の呼び出しで便利なものが返ってくる方が嬉しいな。セミコロンとかインデントとか括弧とか、些細なことすぎて気にならない。コードが何をするかしか見てないし(typoは別だけど笑)。

たぶん昔のC vs Pascal vs BASICのsyntax論争のせいかな。SchemeとかLisp書くときも、括弧なんて「見えてなかった」し。でも今Lispのコード見るとsyntaxが変に見えて時間がかかるなー、最近使ってないから。

結局は人それぞれだけど、const chat = new LLM.Chat();chat = RubyLLM.chatは同じことだと思うんだよねー。画面のtokenなんて覚えてないし、どっちも「chat objectを作ってchatに代入する」って認識してる(言葉にはしないけど)。constとか;とかで悪くなるとは思わないな。でも実験したわけじゃないから、間違ってるかも。実験方法もわかんないし。

const chat = new LLM.Chat();chat = RubyLLM.chatは同じことだと思う

みたいな感じかな。

maleldil 2025-03-15T16:02:57

chat = RubyLLM.chat

って、曖昧じゃね?代入なのか新しいオブジェクトの生成なのかわかんないし。読みやすいとは思えないな。

もっとコメントを表示(3)
xutopia 2025-03-15T19:08:49

Rubyistなら完璧に理解できるよ。よくある書き方だし。

shellac 2025-03-15T17:09:38

「代入か新しいオブジェクトの生成か」ってどういうこと?RubyLLM.chatが返すものをchatに代入するだけじゃない?関数名がもっとわかりやすい方がいいってことかな?

maleldil 2025-03-15T18:04:18

chatがRubyLLMのfield/property/memberなのか、method呼び出しなのかが不明ってこと。

nickisnoble 2025-03-15T18:17:24

Rubyにはmethodしかないし、全部objectだよ。だから問題ない。

caseyohara 2025-03-16T01:04:22

そう思うのは勝手だけど、Ruby触ったことある人ならわかるでしょ。Rubyにfield/property/memberなんてないんだから。methodしかない。括弧はmethod呼び出しでは省略可能。

freen 2025-03-15T03:08:13

へー、考えさせられるね。
Ruby: パーティーに遅れてきたけど、ビール樽持ってきた。

wtf242 2025-03-15T04:31:39

https://github.com/alexrudall/ruby-openai

を長年使ってるけど問題ないよ。良いgemだし。

strudey 2025-03-15T18:39:10

どうもありがとう、気に入ってくれて嬉しいよ!RubyのAIライブラリが増えるのは良いことだと思う。

dismalaf 2025-03-15T04:13:18

RubyにはすでにLLMと連携するためのツールがたくさんあるよね。TorchやTensorflowみたいなものへのバインディングも長年あるし。

aguynamedben 2025-03-15T04:59:45

Rubyは元気いっぱいだよ!

init0 2025-03-15T04:54:38

LLMとやり取りするためのAPIとして、めっちゃ簡潔だね!OllamaのサポートPRが下書きにあるの楽しみ!

jiangplus 2025-03-15T06:14:28

LLMベースのアプリのスクリプトを書いてるんだけど、これめっちゃ簡単に感じる!

soheil 2025-03-15T21:03:54

例えば、
chat.ask ”What’s being said?”, with: { audio: ”meeting.wav” }

みたいな場合に、本番環境で使うより、何かをテストするための使い捨てコマンドを実行するCLIみたいなものに便利だと感じるな。ユーザーが75%の時間しか有効なレスポンスを得られないのは嫌だよね、たぶん?

tommica 2025-03-15T10:16:20

構文がマジで美しい!

nextaccountic 2025-03-15T10:18:33

Rubyから俺が受けた印象は、構文が重要ってこと。良い構文はプログラマーを幸せにするんだよね。

dkobia 2025-03-15T15:51:08

いろんな言語のソフトウェアをサポートしてるけど、Rubyは一番構文的に刺激的だわ。

brink 2025-03-15T22:31:13

綺麗さとシンプルさを混同してるんじゃない?あの”美しい”構文の裏にはたくさんの複雑さと魔法が隠されてるんだよ。スクリプトや小さなプログラムには最高だけど、大規模プロジェクトでは悪夢だよ。単純すぎるんだ。

the_gastropod 2025-03-16T02:32:23

他人の好きなものを否定するのはやめとけってことだね。
Rubyのトレードオフが好きな人はたくさんいるし、Shopify、GitHub、GitLab、Airbnb、Stripeみたいな超巨大企業がRubyをめっちゃうまく使ってるじゃん。
嫌なら使わなきゃいいんだよ。

brink 2025-03-16T03:12:42

こっちの好きにさせてもらうわ。
あんたの承認なんかいらないし。
Rubyは10年やったから、この件に関しては多少は発言権あると思ってる。

desireco42 2025-03-15T19:18:00

このライブラリのシンプルさにマジで感動した!
レスポンス待ちが問題になるのは確かだね。
そういう用途向けじゃないと思うけど、インプットに基づいて成果物を処理・作成するツールには使えるんじゃないかな。
MistralとローカルLLMが大好きなんで、これはぜひ追加したいところだね。

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。