💰

【Azure Logic Apps】ChatGPTと話せるLINE Botを開発するハンズオン!~②ChatGPTのトークン消費量を節約

2023/04/16に公開
1

0. 前回まで

前回の記事では、ChatGPT API と話せる LINE Bot を Azure Logic Apps で構築してみました。

https://zenn.dev/himanago/articles/azure-logic-app-chatgpt-linebot

しかし

  1. トークン消費量が多い
  2. 複数往復の会話ができない

という課題が残りました。

そこで今回は、1. の解決をしてみたいと思います。

1. トークン消費量に関する前提

ChatGPT API は、やりとりの言葉をトークンという単位に換算し、その消費量で料金が決まります。

料金を節約したい場合や無料利用の範囲に収めたい場合は、このトークンを節約したくなります。

今回作った LINE Bot では ChatGPT は日本語で聞いて日本語で返してくるようになっているので、必然的にトークン消費量は多くなっています。

英語に翻訳してから ChatGPT に投げると、トークン消費量が減るのではないかと考えました。

そこで、今回は英語に翻訳してから ChatGPT に投げるようにしてみます。

2. トークン消費量を減らすためのフロー改修

(1) 質問を日→英翻訳するアクションの追加

翻訳 API は、Azure Cognitive Services の Translator Text API を使う方法もあるのですが、実は Logic Apps では無料かつ別リソースの作成が不要な翻訳アクションを使用することができます。

追加する場所を開きます。

全体のフローの一番左下の「For each」の中の、

「条件」→「スイッチ」→「ケース 1 : テキスト」の中です。

本当は「配列変数に追加」の手前にアクションを追加したいのですが、Logic Apps の仕様上、先頭にアクションを追加することができないので、いったんその下にアクションを追加します。

Translator と検索をし、「Microsoft Translator V2」を選択します。

「テキストの翻訳」を選択します。

「接続名」には translator と入力し、Subscription Key は空欄のままにしておきます。

空欄のまま作成すると、こちら のドキュメントにある通り、共有の翻訳リソースが使用されます。

呼び出しに制限(1 日あたり 55,000 文字、1 分あたり 100 リクエスト)がありますが、今回の LINE Bot では十分な量だと思います。

「テキストの翻訳」の設定は以下のように「ターゲット言語」を 英語 に、「テキスト」を動的なコンテンツから「HTTP 要求の受信時」の text に設定します。

ここまでの設定が終わったら、「テキストの翻訳」と「配列変数に追加」の順序を入れ替えるため、「配列変数に追加」をドラッグして「テキストの翻訳」の下に移動します。

「配列変数に追加」をクリックして中を開き、動的なコンテンツの「text」を×ボタンで消し、

同じ場所に動的なコンテンツから「翻訳されたテキスト」を選択します。

いったんこの状態で保存し、LINE Bot に(日本語の)質問メッセージを送信してみます。

すると、英語で回答が返ってきます。

英語で質問を投げていることになるので、回答も当然英語になってしまいます。

これでは意味がないので、次は日本語に戻す工夫をします。

(2) 日本語で回答を得る工夫

最初に思いつく方法としては、英語で回答を得たあとに、それを日本語に翻訳する方法です。

しかし、これをさきほどの「Microsoft Translator V2」で行うと、回答の「機械翻訳感」が際立ち、自然なやりとりができる ChatGPT の長所をつぶしてしまうことになります。

DeepL などの自然な翻訳をしてくれる API を別途使うという方法も考えられますが、今回はハンズオンの「超爆速」のコンセプトに従いもっと簡単な方法を採用します。

その方法は、ChatGPT に「回答を日本語で行うように追加の指示をする」という方法です。

ChatGPT API では、rolesystem であるメッセージをリクエストに含めることで、回答する際の前提を指定することができます。

では、これを入力メッセージの最初に入れてみましょう。

「テキストの翻訳」と「配列変数に追加」の間の「+」をクリックし、「配列変数に追加」アクションを追加します。

検索欄に 変数 と入力し、「ビルトイン」を選択し「配列変数に追加」をクリックします。

名前には ChatGPT入力メッセージ を設定し、値には以下のような JSON を設定します。

{
  "content": "You are an excellent assistant. I ask you a question in English, but you should answer it in Japanese.",
  "role": "system"
}

このメッセージは「あなたは優秀なアシスタントです。私はあなたに英語で質問をしますが、あなたはそれに対して日本語で回答をしてください。」を Bing 翻訳したものです。

このメッセージもトークン節約のために英語です。

ここまでの設定が終わったら変更を保存し、LINE Bot に質問メッセージを送信してみます。

すると、日本語で回答が返ってきます。

(3) この方法の弱点

これでトークンを節約しながらほぼ期待通りの回答を得ることができるのですが、たまにこちらのした質問をそのまま(少し言い換えて)返してきてしまうことがあります。

ChatGPT では対応しきれないような内容の質問のときにこの現象が多く見られますが、それ以外の場合はちゃんと返してくれることも多いので、今回はこれでよしとしましょう。

3. おわりに(つづく)

今回は ChatGPT API のトークン消費の節約を目指してフローを改善してみました。

残る課題は数往復の会話の実現です。

Web 版の ChatGPT のように、何往復も会話しながら応答内容を話の流れとともに修正し、知りたいことにたどり着くという使い方ができることを目指します。

そんな本ハンズオンシリーズ最後の記事はこちらです!

https://zenn.dev/himanago/articles/azure-logic-app-chatgpt-linebot3

もしよろしければ引き続きチャレンジしてみてください!

Discussion