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

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

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

### Python
- [openai/openai-python: The OpenAI Python library provides convenient access to the OpenAI API from applications written in the Python language.](https://github.com/openai/openai-python)
- [pinecone-io/pinecone-python-client: The Pinecone Python client](https://github.com/pinecone-io/pinecone-python-client)
- [hwchase17/langchain: ⚡ Building applications with LLMs through composability ⚡](https://github.com/hwchase17/langchain)
- [jerryjliu/llama_index: LlamaIndex (GPT Index) is a data framework for your LLM applications](https://github.com/jerryjliu/llama_index)
- [microsoft/guidance: A guidance language for controlling large language models.](https://github.com/microsoft/guidance)

### Typescript
- [openai/openai-node: Node.js library for the OpenAI API](https://github.com/openai/openai-node)
- [rileytomasek/pinecone-client: Pinecone.io client with excellent TypeScript support.](https://github.com/rileytomasek/pinecone-client)
- [hwchase17/langchainjs](https://github.com/hwchase17/langchainjs)

## Rubyにも意外とある
ここからは Ruby のおすすめのライブラリを紹介していきます。

### Boxcars
[BoxcarsAI/boxcars: Building applications with composability using Boxcars with LLM's. Inspired by LangChain.](https://github.com/BoxcarsAI/boxcars)

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

### Langchain.rb
[andreibondarev/langchainrb: Build LLM-backed Ruby applications](https://github.com/andreibondarev/langchainrb)

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

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

```ruby
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.](https://github.com/moekidev/baran)

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

[Split by character | 🦜️🔗 Langchain](https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/character_text_splitter)

この 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!](https://github.com/moekidev/active_pinecone)

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

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

```ruby
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とのインテグレーションを推し進めることで、普段開発しているアプリとの親和性をどんどん高められる（あくまで初学者向きではありますが）と思っているので、ぜひ皆さんも参加してみてください！