
Kenn Ejima
@kenn
LLMアプリを駆動する言語はimperative(逐次的)なものよりもdeclarative(宣言的)なほうがいい。 逐次的言語の例はJavaScriptやPython、宣言的言語の例はCSSやSQLやReact。 逐次的な実行といえば、Difyのようなワークフローツールで、Aを実行したら次にBを実行、その結果がCならDを実行、そうでなければEを実行、のようにフローチャートで定義していくもの。このアプローチは分岐やループの数だけ煩雑になるだけでなく、各ステップでエラーが蓄積していくのでLLMと相性がよくない。 一方、宣言的アプローチでは「何をしたいか」というゴールだけを提示し、そこに至るまでの詳細な道筋はシステムに任せる。 たとえば、LLMとの対話の中でユーザーに情報を入力してもらう必要があるとして、 The user has provided the following fields so far: - [ ] Name - [x] Email - [ ] Phone Number - [ ] Agree to DM Ask for any missing fields. If all fields are complete, call `finish()`. のような一つのシステムプロンプトを自己ループさせ、情報が埋まるごとにチェックをつけていき、完了したらそこで終了とする。こうすることで、どの情報をどの順番で聞くかはLLMに任せ、ループの回数が増えることによるエラーの蓄積を避け、ランダムな会話が間にはさまれても問題が起きにくくなる。 プログラミングの世界では、ユーザーインターフェースのような複雑な分岐を生むものほど宣言的に記述することが望ましい場面が増えてくる。ユーザーの操作というのは非常に気まぐれなので、冪等性(同じ操作であれば何度実行しても変更が蓄積されず変化しないこと)を担保することで開発者のメンタルモデルをシンプルに維持することが可能になる、というわけだ。 これを意識することで、プロンプトやアプリの設計が変わってくるはず。お試しあれ。
エラーの蓄積がいかに大きな問題となるかについての解説はこちら https://x.com/kenn/status/1875...