⛓️

Ruby版LangchainのLangchainrbをさわってみる(Assistant編)

2024/07/15に公開

はじめに

https://github.com/patterns-ai-core/langchainrb
本記事では、Ruby 版 Langchain の Langchainrb を紹介します。
基本的なチャット操作と RAG に関しては以下の記事にまとめています。
興味があればそちらもぜひ読んでみてください。
https://zenn.dev/keisuke90/articles/a9f8bfcbae952c
https://zenn.dev/keisuke90/articles/5eca239f26d7bd
今回はタイトルにある通り Langchainrb の Assistant 機能に関してまとめたいと思います。

そもそも Assistant とは?

Assistant とは Openai API の Assistant API のことを指しており、現在は OpenAI の LLM のみで利用することができます。
Assistant API を利用することで LLM は特定の機能に特化したエージェントとして振る舞い、指定したツールを使用することができるようになります。
Assistant を利用する場合に、thread と tool という概念が登場します。

Thread

スレッドはアシスタントとユーザーの会話セッションを保持したオブジェクトです。
通常のチャットではメッセージを配列で管理し、配列が大きくなった場合は能動的にメッセージを削除する処理を行う必要があります。
スレッドでは LLM へのリクエスト時にそのサイズを検証し、サイズが制限を超えた場合は自動的に古いメッセージが削除されます。
これにより、効率的な会話の管理が可能となります。

Tool

ツールとはアシスタントが利用することができるアクションを定義したものになります。
使用可能なツールを指定しておくことで、アシスタントが必要に応じて自動でツールを使用することができます。

assistant = Langchain::Assistant.new(
  llm: llm,
  instructions: "You are a Meteorologist Assistant that is able to pull the weather for any location",
  tools: [
    Langchain::Tool::Weather.new(api_key: ENV["OPEN_WEATHER_API_KEY"])
  ]
)

上記の例の場合、天気予報 API をツールとして定義しておくことで、天気予報を確認する必要が出た場合に API を使用して、その結果を元に出力を生成することができます。

Langchainrb で利用できる tool

  • calculator
  • database
  • file_system
  • ruby_code_interpreter
  • google_search
  • news_retriever
  • tavily
  • weather
  • wikipedia

Assistant API をつかってみる

今回は file_system のツールを試しに使ってみたいと思います。
Langchain::Assistant のインスタンスを初期化します。

llm = llm(ENV['OPENAI_API_KEY'], 'gpt-4o')
thread = Langchain::Thread.new
assistant = Langchain::Assistant.new(
  llm: llm,
  thread: thread,
  tools: [
    Langchain::Tool::FileSystem.new
  ]
)

まずはファイルのリストを出力してみます。

content = 'カレントディレクトリのファイルを出力して'
assistant.add_message(content: content)
assistant.run(auto_tool_execution: true)
puts assistant.messages
assistant.messages.each do |message|
  puts "#{message.role}: #{message.content}"
end

# 出力
assistant: カレントディレクトリのファイルとディレクトリは以下の通りです:

- .
- ..
- .rspec
- bin
- .env.sample
- spec
- ruby_rag.gemspec
- README.md
- Rakefile
- .gitignore
- .env
- lib
- Gemfile
- .rubocop.yml
- Gemfile.lock
- exe
- .git
- LICENSE.txt

次はファイルを作成してみます。

content = 'sample.txtというファイルを作成して、sampleと10回書き込んでください'
〜省略〜

# 出力
assistant: `sample.txt` ファイルを作成し、"sample" という文字列を10回書き込みました。

最後にファイルの中身を確認してみます。

content = 'sample.txtの中身を出力してください'
〜省略〜

# 出力
assistant: `sample.txt`の中身は以下の通りです:

sample
sample
sample
sample
sample
sample
sample
sample
sample
sample

実際にファイルが作成されています。

ちなみにファイルの削除はできません。
ファイルの内容を削除することはできますが、ファイル自体の削除はできません。

content = 'sample.txtを削除してください'
〜省略〜

# 出力
assistant: `sample.txt` の内容を削除しました。ファイル自体は空のまま残っています。

これは Langchain::Tool::FileSystem クラスにファイル削除が実装されていないからで、実装次第ではファイルを削除することも可能になると思われます。
(が、非常に危険ですね…)
https://github.com/patterns-ai-core/langchainrb/blob/e9ea090b5b61dbec053cf51e420ab2a787aa13ab/lib/langchain/tool/file_system/file_system.rb

さいごに

今回は Langchainrb で OpenAI の AssistantAPI を触ってみました。
FileSystem の Tool は色々な使い方ができそうで面白いなと思いました。
ちょっと残念なのが、本家 Langchain と比較するとライブラリで実装されている Tool の数が少ないことです。
ここは今後の開発に期待したいと思います。
最後まで読んでいただきありがとうございました。

Discussion