6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

もっとRubyでLLMを使いたい。Railsで開発しているアプリにLLMを簡単に組み込む方法

Last updated at Posted at 2023-06-28

LLMライブラリですが、PythonとTypescriptのものが多く、今回お話するRubyについてはまだまだ下火である印象です。ただし、かなりの数の人が、Railsでアプリを開発していると思いますし、そのアプリにLLMの機能をインテグレーションしたいというニーズは多いのではないかと私は思っています。結局、PythonやTypescriptのLangchainで実装してみても、普段開発しているウェブアプリケーションと結びつきにくいと感じている方は多いのではないでしょうか。

LLMライブラリの現状(2023-06-28現在)

まずは、利用者が多いであろうPython、Typescriptについて現状のLLMライブラリをまとめました。

Python

Typescript

Rubyにも意外とある

ここからは Ruby のおすすめのライブラリを紹介していきます。

Boxcars

BoxcarsAI/boxcars: Building applications with composability using Boxcars with LLM's. Inspired by LangChain.

Langchain のように、ベクトルデータベースとの連携というよりは、Google検索や、SQL、ActiveRecordなどのクエリをLLMに生成させて検索するといったような、機能が豊富にあります。ActiveRecordを自然言語で操作する体験は結構面白い。

Langchain.rb

andreibondarev/langchainrb: Build LLM-backed Ruby applications

こちらは、非公式のRuby版Langchainです。今後名前を変えていくけれど一旦はこの名前を使っているそうです。私も開発に参加しています。最近のアップデートでは、AcitveRecordとのインテグレーションが追加されました。

ActiveRecord側(RDB側)の更新と同期して、接続したベクトルデータベースのデータを更新するようなフックが用意されました。
例えば、こんな感じです。

class Product < ActiveRecord::Base
  vectorsearch provider: Langchain::Vectorsearch::Pinecone.new(
                 api_key: # ...
		 environment: # ...
                 index_name: "Products",
                 llm: Langchain::LLM::OpenAI.new(api_key: # ...
               )

  after_save :upsert_to_vectorsearch
end

実際のアプリとの連携をイメージしやすいですね!

Baran

moekidev/baran: Text Splitter for Large Language Model (LLM) datasets.

Baranは私が最近リリースした、テキスト分割のためのライブラリです。
LLMの文脈ではテキスト分割が割りとよく出てきます。テキスト分割は、プロンプトのトークン制限を回避したり、ベクトル検索の精度を高めたりするのに有効な方法です。
例えば、Langchainでは、Text splitter というモジュールが用意されています。

Split by character | 🦜️🔗 Langchain

この Baran は Langchain.rb でも利用されています。
Markdownも分割できて、イメージとしては以下のような感じ。

splitter = Baran::MarkdownSplitter.new
splitter.chunks(markdown)
# => [{ cursor: 0, text: "..." }, ...]

Langchain.rb を使うのは大げさすぎるけど、テキスト分割はやりたいといったシーンがあったのでライブラリに起こしました。

ActivePinecone

moekidev/active_pinecone: ActiveRecord-esque base class that lets you use Pinecone. Enjoy development with LLM and Rails!

こちらも私が最近リリースしたライブラリで、Active〇〇のシリーズです。ActiveRecordライクなインターフェースで、ベクトルデータのモデルを操作できます。

例えば、こんな感じで Recipe モデルを用意して、

class Recipe < ActivePinecone::Base
  vectorizes :title, :body
end

作成や

recipe = Recipe.create(
  title: "卵焼き",
  body: "卵を割ります...",
  author: "たけし"
)

セマンティック検索ができます。

recipes = Recipe.search("卵を使った料理")

recipes.first.title
# =>  "卵焼き"

また、アシスタントもついていて、

assistant = Recipe.assistant

reply = assistant.reply("おいしい卵焼きの作り方を教えて")

reply.content
# => "美味しい卵焼きの作り方をお教えしますね!..."

reply.references
# [#<Recipe:0x000...>, ...]

楽しいでしょう?

Ruby界隈のLLMコントリビュートはまだまだ

どのライブラリもコントリビュータの数がまだまだ少ないです。
先述した通り、個人的には、Railsとのインテグレーションを推し進めることで、普段開発しているアプリとの親和性をどんどん高められる(あくまで初学者向きではありますが)と思っているので、ぜひ皆さんも参加してみてください!

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?