promptfooをkubernetesで動かすツールを作った

LLMの勢いがすごいです。そろそろエンジニアも廃業かと思いきや、なかなか僕の仕事は無くなりません。

昨今LLM自体の開発が進む一方で、LLMOpsのツールはそんなに発展しないなぁと思っていましたが、Gunosyさんのブログで、promptfooというすごいツールを知りました。

promptfooの出来栄えに感動したので、promptfooをkubernetesで動かせるツールを作りました。

要約

kubernetes上でpromptfooを定期実行(cronjob)するツールを作りました。PromptFooConfigというCRDに、prompt, openai_key, scheduleを設定すれば、cronjobが実行されます。

github.com

この記事で、promptfoo自体の紹介はしないので、気になる方はGunosyさんのblogを読んでください。

モチベーション

LLMをproductionで使う時の課題として、時間が経つことで、当初想定していたoutputを得られなくなってしまうことが挙げられます。例えば、以下のようなケースがあると思います。

  • コード、promptの変更によって、想定されるoutputを入手できなくなる
  • OpenAI APIのsilent updateによって、想定されるoutputがいつの間にか手に入らなくなっていた

前者の課題については、promptfooをCI/CDに組み込むことで解決できます。

しかし、後者の課題は、promptfoo単体では解決できません。定期実行するための機能を備えていないからです。

promptfooはCLIツールなので、定期実行できる環境さえあればどこでも実行できますが、kubernetes上でcronjobとして実行することができれば、1つの解決策になるだろうと考えました。

使い方

このsampleを参考にしていただければ、問題なく使えるはずです。

github.com

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を作りたいですね。

終わり