みなさん、こんにちは。今回の AKARI Tech Blog は、DX Solution 事業本部 VPoE の丸尾が担当します。
みなさん、LLMOpsやっていますか?LLMOps という言葉を初めて聞いた方でも、プロンプトエンジニアリングは耳にしたことがある方も多いのではないでしょうか。
LLMOps とはトレース・コスト監視・プロンプトエンジニアリング・実験管理・評価などの、LLMをアプリケーションで運用するための概念で、ここ最近のLLMの急激な普及に伴いLLMを包括的に管理するために求められてきました。
燈でも LLM を活用したサービス開発が進み、ユーザー数の増加に伴って LLMOps の導入を進めています。
LLMOpsの詳細な定義は他の記事に譲るとして、ここではLLMOpsのツールとして代表的なものを、Weave・Langfuseを紹介いたします。
LLMOps ツールの比較
Weave と Langfuse は、以下のような LLMOps の代表的な機能をいずれも備えています。
- トレース
- コスト監視
- プロンプトテンプレートの管理
- 実験管理
- 評価
また、利用方法としても、クラウド版・セルフホスト版の両方が用意されており、、簡単に試したい方はクラウド版、入力プロンプトの機密性を重視される方はセルフホスト版を利用することもできます。
どちらも現在活発に開発されているサービスであり、LLMOpsとして必要な機能は、今後どちらのサービスでも実装されていくと筆者は考えています。
大きな違いとしては、既存のソースコードに組み込む際の記述方法にやや違いがあります。 これらのツールの代表的な使い方は、公式ドキュメントや各種記事が充実していますので、今回はこちらについて深ぼってみます。
Langfuseの場合
from langfuse.openai import openai ## langfuse.openaiをインポート completion = openai.chat.completions.create( name="test-chat", model="gpt-4o", messages=[ {"role": "system", "content": "You are a very accurate calculator. You output only the result of the calculation."}, {"role": "user", "content": "1 + 1 = "}], temperature=0, metadata={"someMetadataKey": "someValue"}, ) print(completion.choices[0].message.content)
Weaveの場合
import openai import weave weave.init("sample") # initを呼ぶ completion = openai.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "You are a very accurate calculator. You output only the result of the calculation."}, {"role": "user", "content": "1 + 1 = "}], temperature=0, ) print(completion.choices[0].message.content)
両者を比較して
どちらのライブラリも、これだけでOpenAIのコストや出力を保存することができます。 特筆すべき点としては、
- Langfuseの場合は、OpenAIのライブラリをラップしたLangfuse独自のライブラリ langfuse.openai をインポートする
- Weaveの場合は、weave.init する
既存のプロジェクトにLLMOpsを導入するとき、Weave は weave.init を呼ぶだけでプロジェクト全体を監視対象にできるため、導入スピードが速そうです。一方で、weave.init を必ず呼ぶ必要があるため、LLMを実行するエントリポイントとなるファイが様々なところに散らばっている場合、導入が煩雑になるかもしれません。特定の箇所だけで LLMOps を利用したい場合や、開発者に明示的に利用を促したい場合には Langfuse の導入が適していると言えるでしょう。
Weaveの中の実装を見にいく
ところでWeaveは、どのようにしてinitするだけで既存のopenaiライブラリをトレースできるようにしているのでしょうか。結論から言うと、weave.init 時に各ライブラリのメソッドに対して、ラップ関数をモンキーパッチしているようです。
ちなみに、ストリーミングの場合は、ストリーミングかを判断して、最後のチャンクまで取れたことを確認してトレースしているようです。
Langfuseも同様ですが、各種LLMサービスのライブラリにアップデートに即時追従し続ける必要があると思われ、ツール開発者の皆様には頭が上がりません。。。
余談ですがこうした LLMOps ツールの利用を視野に入れると、HTTP リクエストで直接 API を叩くのではなく、公式 SDK を利用することがより推奨されるでしょう。
まとめ
- Weave・LangfuseでLLMOpsに求められる基本的な機能はカバーされており、すぐに導入可能。
- 導入時のプログラムの書き方が若干異なる。WeaveはLLMのSDKにモンキーパッチを当てる実装で、LangfuseはLLMのSDKをラップした独自のライブラリがある。
We’re Hiring!
燈では、LLMを用いたアプリケーション開発やそのLLMOpsを推進しています!LLMOpsやLLMをアプリケーションに実装するエンジニアを募集しています!興味がある方は、ぜひカジュアル面談でお話しましょう!🔥