LLMの勢いがすごいです。そろそろエンジニアも廃業かと思いきや、なかなか僕の仕事は無くなりません。
昨今LLM自体の開発が進む一方で、LLMOpsのツールはそんなに発展しないなぁと思っていましたが、Gunosyさんのブログで、promptfooというすごいツールを知りました。
promptfooの出来栄えに感動したので、promptfooをkubernetesで動かせるツールを作りました。
要約
kubernetes上でpromptfooを定期実行(cronjob)するツールを作りました。PromptFooConfigというCRDに、prompt, openai_key, scheduleを設定すれば、cronjobが実行されます。
この記事で、promptfoo自体の紹介はしないので、気になる方はGunosyさんのblogを読んでください。
モチベーション
LLMをproductionで使う時の課題として、時間が経つことで、当初想定していたoutputを得られなくなってしまうことが挙げられます。例えば、以下のようなケースがあると思います。
- コード、promptの変更によって、想定されるoutputを入手できなくなる
- OpenAI APIのsilent updateによって、想定されるoutputがいつの間にか手に入らなくなっていた
前者の課題については、promptfooをCI/CDに組み込むことで解決できます。
しかし、後者の課題は、promptfoo単体では解決できません。定期実行するための機能を備えていないからです。
promptfooはCLIツールなので、定期実行できる環境さえあればどこでも実行できますが、kubernetes上でcronjobとして実行することができれば、1つの解決策になるだろうと考えました。
使い方
このsampleを参考にしていただければ、問題なく使えるはずです。
spec fieldに、実行したいyamlの内容をprompt, cronjobの設定をschedule, open_ai_api_keyをopenaiapikeyを書きます。
spec:
prompt: |.....
schedule: "*/10 * * * *"
openaiapikey: "sk-*****"
このCRDを作成すると、対応するconfigmap, cronjobが作成されます。openAI APIによってpromptのoutputが変化していないか、定時観測することができます。
課題
あくまでただの趣味で作成したツールなので、課題はたくさんあります。例えば、以下のような課題があります。
- secretでkeyを渡せない
- promptfooのファイルをstring型で渡す必要がある
- pod containerの内容が洗練されていない
- cronjobの結果を管理する方法がない
また、そもそも論として「自分でcronjobを書けばいいのでは?CRD要らなくない?」「サービス全体の整合性をチェックしたいが、promptfooだと複雑なことができなくない?」という点も、課題として挙げられます。その通りだと思います。趣味開発なのでいいか、と開き直っていますが、次はもっと洗練されたOSSを作りたいですね。
終わり