うさラボ

お勉強と備忘録

【ell-ai】LLMフレームワークell-aiを試す

概要

Xを徘徊していたらとあるポストを見つけました

Langchainより簡単にLLMを利用できるell-aiというものがあるようなので試してみようと思います

環境

ell-ai==0.0.6
python-dotenv==1.0.1

準備

  1. 必要なライブラリをダウンロード
    仮想環境はuvを利用します

      uv init .
      uv add ell-ai
      uv add python-dotenv
    

スクリプトの作成

公式ドキュメントをもとに簡単なスクリプトを作成してみます docs.ell.so

以下のスクリプトを作成してみました。
ほぼ公式ドキュメントにあったコードのプロンプトを日本語化しただけものになります。

import os
import ell
import openai

from dotenv import load_dotenv
load_dotenv()

ell.init(verbose=True)

OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
client = openai.Client(api_key=OPENAI_API_KEY)

# NOTE: シンプルに質問して回答してもらう
#       ell.simple
@ell.simple(model="gpt-3.5-turbo", client=client)
def hello(message : str):
    """あなたは元気に挨拶をする人です""" # System Message
    return f"{message}"    # User Message

print(hello("こんにちは"))

API_KEYはスクリプトのパスに作成した.envファイルに定義してあります。
dotenvライブラリで読み込み後にos.getenvで取得しています。

とりあえず動かしてみる

早速動かしてみます。

短いコードでAPIが叩けたことが確認できました。
シンプルな応答を確認するのはよさそう。

$ uv run hello.py 
こんにちは!どうぞよろしくお願いします。今日はどんなお手伝いが必要ですか?

関数の初めに定義して文字列がSystemMessageになり、関数の戻り値(retrun)がUserMessageになるようです。

以下のように、SystemMessage/UserMessageを定義することもできました。

@ell.simple(model="gpt-3.5-turbo", client=client)
def hello2(message : str):
    return [
        ell.system("あなたは元気のない挨拶をする人です"),
        ell.user(f"{message}")
    ]

print(hello2("こんにちは"))

再実行

$ uv run hello.py 
こんにちは!元気ですか?何かお話しましょうか?
こんにちは、元気がないですが… お話しましょうか?

うまく動いているようですが、何が起きているのがわかりにくいですね.. 詳細を確認するために以下コードをimport分の下に追加して再実行してみます

ell.init(verbose=True)

詳細にプロンプトや回答が確認できます。
指定したプロンプトで質問ができていることも確認できました.

関数がLanchainでいうところchainみたいなイメージなのかな?と理解しました
関数の中で別の関数呼び出したりもできるので柔軟にいろいろとできそうだなと感じます。

complexデコレータ

今回利用した@ell.simpleデコレータのほかに@ell.complexもあります。
マルチモーダル コンテンツ、構造化された出力、および複雑なインタラクションをしたい場合にcomplexデコレータを利用するとドキュメントに記載されていました。

公式ドキュメントを参考に、構造化データを返すようなスクリプトを作成しました。 pydanticで構造体を定義し、complexデコレータのresponse_formatパラメータで指定をすることで構造体データを返すようです(LangchainのJsonOutputParserみたいな感じ?)

import os
import ell
import openai

from pydantic import BaseModel, Field
from dotenv import load_dotenv
load_dotenv()

ell.init(verbose=True)

OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
client = openai.Client(api_key=OPENAI_API_KEY)

class MovieReview(BaseModel):
    title: str = Field(description="映画のタイトル")
    rating: int = Field(description="10点満点で評価")
    summary: str = Field(description="映画のサマリ")

# NOTE: 構造体で返したり、マルチモーダルしたりする方
#       ell.complex
@ell.complex(model="gpt-4o-2024-08-06", response_format=MovieReview, client=client)
def generate_movie_review(movie: str):
    """あなたは映画批評ジェネレーターです。映画の名前が与えられたら、構造化されたレビューを返す必要があります。"""
    return f"映画名: {movie} についてのレビューの生成をします"

review_message = generate_movie_review("マトリックス")
review = review_message.parsed
print(f"Movie: {review.title}, Rating: {review.rating}/10")
print(f"Summary: {review.summary}")

実行をすると、OutputがJSON形式でデータを返していることが確認できました。
review_message.parsedでデータアクセスができるようです。

$ uv run hello.py 
╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ generate_movie_review(マトリックス)
╠═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ Prompt:
╟───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
│      system: あなたは映画批評ジェネレーターです。映画の名前が与えられたら、構造化されたレビューを返す必要があります。
│
│        user: 映画名: マトリックス についてのレビューの生成をします
╟───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║ Output:
╟───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
│   assistant: 
│              {"title":"マトリックス","rating":9,"summary":"マトリックスは、指導的なビジュアル効果と革新的なストーリーテリングで映画史に新たな地平を切り開いた、1999年のサイエンスフィクション映画です。ウォシャウスキー姉妹が監督・脚本を手がけ、キアヌ・リーブス、ローレンス・フィッシュバーン、キャリー=アン・モスが主演。現実世界と究極の仮想現実「マトリックス」の間で展開するスリリングな物語は、テクノロジーと人間の存在意義を問いかけます。特に、バレットタイム効果を含むアクションシーンは目を見張るもので、多くの後続作品に影響を与えました。サウンドトラックも印象的で、視覚と聴覚の両面で観客を引き込みます。本作は哲学的テーマとアクションを見事に融合させ、観客に深い思索を促しながらも、エンターテインメントとして非常に楽しめる作品です。"}
╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

いい感じです、確かに簡単かも。
ほかにもToolを動かすこともできるようです。

注意点

注意点としては09/19時点で利用できるモデルは以下しかありません。

  • openai
  • ollama
  • anthropic

絶賛更新中のようなので、今後に期待ですね。
自分が好きなcohereモデルもPRが上がっていたので追加されるのが楽しみです。

github.com

おまけ

今回は利用しませんでしたが、GUIで開発を支援するell-studioというものもあるようです。
画像で見るとかなりおしゃれかつプロンプトのバージョン管理などもできるようです。