みなさんこんにちは。エンジニアの佐藤です。本日はLINEとAgentforceを仲介するWebサーバーのお話です。
とは言え、このテーマは実はそれほど難しくありません。というのは、LINEもAgentforceもWebフックやREST APIといった業界標準を尊重して作られているからです。つまり、あとは手順に乗っているデータの解釈の問題で、手順自体はほとんど自明なのです。
そこで生成AI(LLM)に全部のプログラムコードを一度に書かせるという目標を立てました。昨今はプログラム開発を含む様々な仕事でChatGPTのようなLLM(大規模言語モデル)の利用が注目を集めています。このブログをお読みのあなたも、きっと日常的にご利用のことでしょう。
LLM登場以前の開発はこうでした。マニュアルを読み、該当知識を仕入れ、サンプルを作って動作確認する。そしてあるべき機能要件を眺めてサンプルを組み合わせることで全体的な形にしていく。筆者は前者をソフト開発における「ハードウェア的な部分」、後者を「真にソフトウェア的な部分」と呼んでいました。どちらにも固有の仕事があり、前者は言わば「外部仕様と内部仕様のすり合わせ」で、技術者には高い客観性と正確さが要求されるのに対し、後者は「ソリューション要件の網羅」が肝心で、どちらかと言えば創造性と統合の問題でした。
LLMに任せると高い精度の結果が出てくるのは、このうちの「統合」の部分ではないか、というのが筆者の意見です。LLMは本質的には「関数」で、それ自体に意思はありませんので、「そもそもどうしたいのか」と言った創造的な内容は開発者が指示する必要があります。また、開発対象物の外にはどんな世界があるのか、つまりインフラ要件や入出力データの形式もまた、正確に情報提供してもらわなければ正しいコードは出力できないでしょう。しかしこれらが入力されれば、それらの間を仲介するコードによる全体の「統合」作業は、プログラミング言語という比較的狭い知識ドメインに閉じた地道な作業であり、世界の公開情報を読み尽くした「文脈の辞書」であるLLMの中で関係文脈を辿っていけば、自動構成できる可能性が高い。筆者はそんなふうに感じていました。
そこで筆者は今回、このテーマを、十分な品質のプログラムコードを生成させるにはどんな情報が必要十分か?という程度を探る試みとして挑戦することにしました。以下はその経緯です。なお、生成AI結果は実行のたびに揺れ動きますので、以下の手順を正確にフォローしても結果は異なっている場合があります。
要素技術の動作を確認する
今回のプログラムは以下のような全体図をしています。特別な点は何もなく、できれば短時間でサクッと作りたいものです。

最初にLINE側ですが、
また、Github line-bot-sdk-pythonに受信したメッセージを折り返すサンプルがありますので、これが参考になりそうです。今回はこのサンプルを手元で動作確認しました。(Webフックを受けるにはDNSやTLS証明書の準備が必要になりますが、一般的な話なので省略します。)
次にSalesforce側ですが、
Salesforceの仕様はAgent API Developer Guideに書かれています。
こちらもGet Started with the Agent APIに丁寧に解説されているので、開発者組織でこれを辿って動作を確認しました。
プロンプトしてみる
ここまで来たら、もう「誰か」にお願いして、自分はもっと別の仕事(案件営業とか)に行きたいと思うでしょう。その役割をLLMにやらせるため、プロンプトを書いていきます。ただし漠然とプロンプトしても精度の高い生成結果にはならないと思いましたので、以下のように構成しました。
# 全体的処理手順 ## LINEからのHTTPリクエストの処理 ... ## Agentforceの呼び出しと返却内容の処理 ... ... # 注意事項 ## Agentforceのセッション管理 ... ## Salesforceのアクセストークンの管理 ... ... # サンプルコード / コマンド ## LINEメッセージを折り返すサンプル ... ## Agentforceを呼び出すcurlコマンドと返信内容 ...
プロンプト全文はこちらです(英語の方がLLMが良くしてくれるだろうとの期待から、英語で書いてみました)。「全体的処理手順」と「注意事項」はあっさりしたものです。もし対人で要件を申し伝えるとしたら、ホワイトボードや作業チケットに書かれた内容そのままと言っても良いでしょう。
工夫したのは「サンプルコード / コマンド」の追加です。ここには、冒頭に説明した「ハードウェア的な部分」の正確な情報が書かれています。ただし、その記述は要素技術の動作確認結果そのままであり、経験の浅い人間の作業担当者が見たら「えっとー、」となってしまうかもしれません。そしてWebサイトをGoogle検索したりしてPython言語やSQLite、CURLコマンドを勉強したことでしょう。そういう仕事はLLMが学習済みで、丁寧に仕上げてくれると期待されます。
今回の要件は秘密性は無いので、ChatGPTに入力して解答生成しました。20秒ほどでコードが生成されました。
(ほぼ)一発で動いた!
出力されたコードは、残念ながらそのままでは動きませんでした。以下のような間違いがありました。
- Salesforce OAuthのエンドポイントが、マイドメインではなく、一般的な"login.salesforce.com"になっていた。
- Agentforceのメッセージ送信で使用するsequenceIdの数値が大きすぎた。
さらに、Agentforce API Start sessionエンドポイントで、リファレンスではexternalSessionKeyにはUUIDを指定するようにと指示されていますが、出力コードではLINEのユーザーIDが使用されています。(ただしこちらはこのままでも動作しました。)
これらはいずれも、筆者が指示していなかったか、そもそも知らなかった話です。最初の2点を修正すると、目論見通りに動作しました!動作したコードはこちら。

この画面はAgentforceに「マイクロプロセッサについて教えて」というトピックを定義し、アクションは何ら定義せずに、バグ入りPentiumプロセッサについて質問したものです。Agentforceの言語設定を英語のまま使っているので言語のブレはありますが、期待通りの内容の回答が得られています。
ソースコードを読んでみましたが、SQLiteを用いたアクセストークンやセッションIDなどが期待通りに実装されており、目論見通りです。
工数を比較してみる
LINEとAgentforceの動作確認が完了した時点からの作業工数を比較してみましょう。計測したわけではありませんが、生成AIを使った場合の所要時間は、感覚的には以下のように思いました。
| 作業項目 | 所要時間(分) |
|---|---|
| プロンプト作文 | 10 |
| 生成内容確認 | 5 |
| 動作確認 | 10 |
| 合計 | 25 |
生成AIを使わなかったら、60分はかかっていたでしょう。約2倍の効率化ということになります。個人的な感想ですが、特にSQLite周辺の実装をほぼ全部生成してもらえたのが助かりました。(筆者はSQLiteを知ってはいましたが、Pythonから動かしたことはありませんでした。)
振り返って、十分な品質のプログラムコードを生成させるにはどんな情報が必要十分か?
目論見通り、それは以下だ、というのが正直な感想です。
- プラン(そもそもどうしたいのか)
- 大まかな処理の流れ
- 生成するモジュールとその外部との正確な接続情報
実のところ筆者は、これまで生成AIによるコード生成について以下のような不満を持っていました。
- 細部が甘い。
- しれっと重大な問題が、全体にまぶされている。
しかし生成内容の外部にあたる部分を、動作確認した内容で厳密にインプットした結果、生成AIが悩むことはなくなり、細部まで仕上がった、のではないでしょうか。
今後も可能性を探っていきたいと思います。最後までお読みくださりありがとうございました。