価値を優位にシステムとして当たり前のチューニングをする
次に考えるべきことは、要件である。システムは何らかの価値を提供するもの。つまり要件は価値と言い換えることができる。
ではシステムで実現したい価値とは何か。ユーザーに回答する速度なのか、確実性のある回答なのか、利用しやすいことなのか、これらいずれについても「目指したいUXが存在するはず。その価値を損なってはいけない」と坂本氏は言う。
だがその一方で、その価値を損なわないために、妥協しなければならない他のものもある。つまり何を妥協できて、何が妥協できないのかをしっかり判断する必要があるというわけだ。
その例として坂本氏が取り上げたのは速度。まず考えるべきことの一つが、同期か非同期か。同期処理は対話型生成AIや機械学習を用いた監視などのアラート、不正検知、コールセンターの自動化などで求められる。一方、購入履歴からのレコメンドや議事録作成、紙書類の電子化、需要予測などは非同期処理でも十分だが、「人は同期処理に越したことはないと思ってしまいがち」と坂本氏は指摘する。だが同期処理すればするほど、考えることは増える。例えば、RDBMSだと要求の速度を満たせないから、インメモリーDBにしたとする。「インメモリーDBにした瞬間に、RDBMSより考えなくてはいけないことが出てくる」(坂本氏)
言語もPythonにすればAIエンジニアが書いたコードがそのまま流用できるかもしれないが、Cで書くと書き直さないといけなくなる。また推論をユーザーの手元でさせるのであれば、エッジ推論を選択するのも一つの手だが、スマートフォンのスペックで足りるのかなど、考慮する必要がある。一方、サーバで推論させるのであればスペックには不安はなくなるものの、バースト的なトラフィックに対しては考慮が必要になる。「このように同期処理にすればするほど、実装コストや難易度は上がっていく」(坂本氏)
非同期のバッチ処理以外の選択肢として最近注目されているのが、半同期処理のイベント駆動である。AWSであれば図のような構成が考えられる。
一方はAWS LambdaからAmazon SQSという昔ながらのキューイングサービスにデータを送る。Amazon SQSはコンポーネント間で任意の量のメッセージを送信、保存、受信することができるというサービス。例えば1秒間に10人処理するようにしたとすると、1秒間に100人アクセスが来ても、処理できるのは10人のみなので、バーストしてエラーになることはない。もう一方はイベント駆動の仕組みとしてAmazon DynamoDBを用意。DynamoDBへの書き込み処理をトリガーにLambdaを起動する。「この仕組みの良さは、問い合わせに対して受け付けたというレスポンスを返し、実際の処理は後続で行うことができること。サーバ負荷を考慮したシステムにできます」(坂本氏)
このような半同期処理の仕組みは金融など、信頼性が必要かつトラフィック量が読めないところに使用されているという。
では具体的にどうやって使うのか。坂本氏は実際にARISE analyticsのプロジェクトでAWSのイベント駆動を組み合わせた使った例を紹介。大量に送られてくる写真の中から、特徴的な写真をAIで検出するための仕組みを構築するというもの。「1度に1万枚の写真が送られてくると同期処理は難しいので、非同期とイベント駆動を組み合わせた仕組みにした」と坂本氏は話す。
すべてをリアルタイムで即時結果を出せるのなら良いが、現実はそうではない。「UXと共に、このシステムにとって優先すべきことは何か。ユーザーへの価値を最大化するためにどの要件が捨てることができるのかを考える。それが我々エンジニアとしての価値」だと坂本氏は言う。
開発が終わると運用が始まる。開発中に運用まで気を回すことはなかなか難しいが、「そこにも目を向けないといけない」と坂本氏は言う。
AIソリューションにおいては、再現性がカギを握る。なぜならAIは生成のたびに答えが変わるからだ。問い合わせを考えると生成した結果に再現性がないのは問題である。「お宅のAIに暴言を吐かれた」というクレームがあっても、それを再現できなければ対応が難しい。しかもユーザーは想定外の使い方をすることもある。システムは運用フェーズに入ると想定外なことが起こるので再現性が大事なるのだ。再現性を担保するにはどうすればよいか。
「システムであればリクエストに使用されたパラメーターを取得し、ライブラリなどあらゆるバージョンは商用と合わせる。AIであれば、シード値を乱数などで使用している場合は可能な限り固定する。コミットIDであればどのコミットでデプロイされているかを管理すること。そしてこれらすべてを管理し、ロギングを実施することで再現性を担保できる」(坂本氏)
だが、それでも再現できないことも起こりうる。その場合は「ロールバックできるようにすること」と坂本氏はアドバイスする。ロールバックは、1つ前のバージョンに戻すという意味の再現性と考えれば良いという。
最後に坂本氏は「システムは柔軟に変更ができるように開発すること。本当の価値を見極め、捨てられるもの、捨てられないものを把握し、再現できるものを準備すること。これがAIソリューションを開発するうえでは重要だ」と語り、セッションを締めた。