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.
- pinecone-io/pinecone-python-client: The Pinecone Python client
- hwchase17/langchain: ⚡ Building applications with LLMs through composability ⚡
- jerryjliu/llama_index: LlamaIndex (GPT Index) is a data framework for your LLM applications
- microsoft/guidance: A guidance language for controlling large language models.
Typescript
- openai/openai-node: Node.js library for the OpenAI API
- rileytomasek/pinecone-client: Pinecone.io client with excellent TypeScript support.
- hwchase17/langchainjs
Rubyにも意外とある
ここからは Ruby のおすすめのライブラリを紹介していきます。
Boxcars
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
こちらも私が最近リリースしたライブラリで、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とのインテグレーションを推し進めることで、普段開発しているアプリとの親和性をどんどん高められる(あくまで初学者向きではありますが)と思っているので、ぜひ皆さんも参加してみてください!