Yodeee's Tech Diary

日々の開発や勉強したことをつれづれなるままに

ChatGPT × Alexa × AWS × Slackで英会話学習サービスを作ってみた

はじめに

こんにちは。 今回はChatGPT × Alexa × Slack で英会話学習サービスを開発してみたので、その報告です。

昨今、AI技術の進歩とともに、ChatGPTが多くの注目を集めており、私も何かサービスを作りたいなと思っていました。

そんなとき、私のデスクの横にあるAlexaに目が止まり、AlexaでChatGPTと話すことができたら面白いのでは!?とひらめきすぐに検索をしてみました。

既にあるやん...

note.com

まあ、ホットトピックだし仕方ないと思いながらも、もうAlexaを活用して少し方向性を替えたサービスを作れないかなと考えてみました。

英会話練習とか需要あるのでは?

英会話練習においては、現在も多くの課題が存在しています。 例えば、英会話スクールや家庭教師を利用する際には、費用が高くなることが多く、継続的な学習には大きな負担がかかります。 さらに、対人での英会話練習では緊張してしまうことが多く、リラックスして学習できないという問題もあります。(私もその一人)

そこで、今回はChatGPTを活用した英会話練習用のAlexaスキルを開発することを考えてみました。

本記事では、このサービスの概要とどのように作ったのか、かんたんな手順を紹介します。

なお、今回作ったサービスはマネタイズも何も考えていないためスキルの一般公開はしていません。 もし使ってみたいという方がいましたら、詳細な手順とLambdaのソースコードGithubのレポジトリにあげているので参考にしてみてください。

開発したサービスの概要

開発したサービスは、ユーザーがAlexaに「Alexa、Please open ai english teacher」と話しかけることで、ChatGPTを活用した英会話練習が始まります。

スキルが起動後、「Let's talk」と話しかけると、ChatGPT APIと連携し、英会話スクールの先生役となり、英語での会話が可能になります。

ユーザーはAlexaと英語でやりとりを行い、対話が終わると「Stop」と返答することで終了し、その際のチャットログがSlackに送信されることで、ユーザーは自分の英語の進歩を振り返ることができます。

サービスの全体構成

サービスの全体構成は下記のようになっています。

技術要素としては下記です。

  • Alexa スキル: ユーザーとのインタラクションを担当
  • AWS Lambda: スキルのバックエンド処理を担当
  • ChatGPT API: 英会話の生成を担当
  • Slack API: チャットログの送信を担当

開発手順

開発手順では、まずChatGPTにプロンプトで詳細な要件と制約を伝えました。

あなたはプロのAlexaスキル開発エンジニアです。
ChatGPTを活用した英会話学習ができるAlexaのスキルを開発します。

下記の要件をもとに開発の手順を詳細に教えて下さい。
詳細な手順を教えるために、もっと情報が必要な場合は、質問してください。


要件:
・このAlexaスキルはChatGPTを活用して英会話の練習を行うことができます。
・「Alexa、Please open ai english teacher」とAlexaに呼びかけると、Alexaのスキルが起動し、
・スキルが起動後、Alexaは「Let's talk」とAlexaに話しかけると、ChatGPT APIと連携してChatGPTが英会話スクールの先生になりきり、英会話の文章を生成し、Alexaが生成された文章を発話します。
・Alexaが発話したことに英語でAlexaに返答すると、その内容をChatGPTに送信し、ChatGPTから返ってきたメッセージをAlexaが発話します。
・Alexaに「Stop」と返答すると、対話は終了となり、今までのチャットログをSlackに送信します。


制約:
プログラミング言語:JavaScript
ランタイム:Node.js (version 18)
関数のホスト先:Lambda
chatGPT API : OpenAIApiの"gpt-3.5-turbo-0301"
openaiはnpm のバージョン3.2.1を使用
Alexaのスキル定義はCLIを用いず、コンソール上で定義します

参考:
chatGPT APIをJavaScriptで利用する場合は下記のように定義します。

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

export async function ask(content: string, model = "gpt-3.5-turbo-0301") {
  const response = await openai.createChatCompletion({
    model: model,
    messages: [{ role: "user", content: content }],
  });

  const answer = response.data.choices[0].message?.content;
  console.log(answer);
}

const question = "東京の観光名所について教えてください";
ask(question);

実は上記のプロンプトは10回くらい書き換え、ようやくまともな回答が得られたときのプロンプトです...

最初は思い通りの手順が出てこなかったため、OpenAI APIの使用モデルバージョンやJavaScriptでChatGPT APIを利用する際のコード例も提供しました。

このように、開発手順の詳細な指示と参考情報を与えることで、下記のように具体的な手順を教えてくれました。

※手順はさらに続くので割愛

ちなみに今回は有料版のGPT-4を使用しています。GPT-3.5ではまったく異なる手順が出力される可能性が高いのでご注意ください。

ChatGPTから出力された情報をもとに、ChatGPTから得られた手順やコードを使用して、Alexaスキルの開発を進めました。

手順通りに開発後、実行してみると、コードにいくつか誤りがあり、Lambdaの処理でこけてしまいうまく動かなかったため、

そこはAlexaの公式ドキュメント等を見ながら実装を修正しました。

補足 - 実装上の注意点

1. 会話履歴

注意が必要な点として、現在GPT APIはブラウザ版のChatGPTとは異なり、過去の会話履歴を覚えることができません。 公式ドキュメントにも下記のように記載があります。 「Chat models take a list of messages as input and return a model-generated message as output.」

そのため、下記のようにLambda Handlerメソッド外で会話履歴を保持するリストをグローバル変数として宣言しておき、 Lambdaのインメモリでキャッシュするようにします。

// Handler外で変数を定義
let conversationHistory = [];

const LaunchRequestHandler = {

また今回は試していないですが、ChatGPTなどの大規模言語モデルの機能を拡張できるライブラリである、LangChainの[ChatMessageHistory)(https://docs.langchain.com/docs/components/memory/chat_message_history)を使用しても良いかと思います。

他の手段としては、下記のように会話履歴をDynamoDBに保存し、文章生成要求時に過去の会話履歴をDBから取得するという方式も有効だと思います。

ご参考までにDynamoDBに会話履歴を保存する方式については、Githubレポジトリの別ブランチにサンプルを書いています。

2. 初回プロンプト

また初回の文章要求時にGPTに英会話教師になってもらうためのプロンプトを送る必要があるのですが、 ChatGPTが出力してくれるプロンプトだとうまく英語での会話が成り立たなかったため、 トライ・アンド・エラーを繰り返しながら改良し、下記のように修正しました。

あなたは、プロの英会話教師です。
以下の制約条件と入力文をもとに、英語を出力してください。
# 制約条件:
・出力に「Teacher: 」等の語り手の記載は不要
・Word数は20文字以下
# 入力文:
私は初級の英語学習者で日常英会話の練習をしています。
あなたは英語教師として、私と英語で会話してください。
英語の表現で何か間違いがあれば英語で指摘してください。
会話の流れは下記のとおりに進めてください。
1. まず、下記の形式で始めることを宣言し、学習者に自己紹介を求める:
例: "Ok! Let's get started. First, Please introduce yourself."
2. 学習者が自己紹介をする場面を想定し、教師が話すテーマの候補を示す:
例: "What topic would you like to discuss today? Hobbies, travel, food, or others?"
3. 学習者が選択したテーマについて英語で会話する:
例: "(Assuming the learner chose 'hobbies') "Great! What hobbies do you have, and why do you enjoy them?""
まずあなたは1を出力してください。

上記のようにすることで、最初に自己紹介を行い、 そこから何をテーマに話すかを決め、そのテーマについて英語で会話ができるようになりました👏

3. APIからのエラー

また利用しているとGPT APIから429エラーが返ってきて、会話が途中で止まってしまうことがあります。 その場合、下記の記事に記載の通り、Open AI APIの無料枠を使い切ってしまったことが原因かと思われます。

qiita.com

まとめ・展望

この記事では、ChatGPT API を活用した AI 英会話サービスを開発してみたという内容でかんたんな手順を紹介しました。 今回はかんたんに実装してみただけなので、今後の展望として、このサービスをさらに拡張し、多様な英語学習シナリオや学習リソースを提供することが考えられます。 また、ユーザーのスキルレベルに合わせて会話内容を調整する機能や、学習者の進捗をトラッキングしてフィードバックを提供する機能も追加できます。

この記事を通じて、ChatGPT API の他の活用方法を思いつく一助になれれば幸いです。