【ChatGPT】中国語の先生と添削係をDIYしてみた

# 背景
私は日本語・英語・中国語と3ヵ国語がまあまあ喋れるのですが、野暮用でもう1個言葉を覚える必要が出てきました。そこでAI教師を探してみたのですが、英語以外の分野ではAI語学教師というのはまだ製品化されているものはなさそうでした。ということで、今回はChatGPTを使って自作してみることにします。

# 目的
ChatGPTで実用的なAI語学教師を実装し、私が4つ目の言語を習得すること。とはいえ、いきなり知らない言語の先生を作っても自分で性能が評価できないので、今回はまず中国語の先生を作ってみることにします。

語学習得に必要なことは、1に発音、2に暗記です。ここでは単に中国の先生 (Teacher=先生Aさん) と1対1で対話するのではなく、それを聞いている別の先生 (NoteTaker=記録係Cさん) が、生徒 (Student=生徒Bさん) の発言の趣旨を推測し、よりネイティブに近い表現を列挙してくれるようにします。生徒である私は、もちろんNoteTakerが列挙した表現は暗記します。

![graphviz (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601114/6ee82bfa-1b37-24d2-2d8e-621a65fc4dbb.png)

# 結果
今回は「ホテルのバーで、店員さんとお客さん」というロールプレイをしてみました。まずは結果をお見せします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601114/566fd2ea-88ed-5892-2c27-d03b5d29da20.png)
緑色 (先生Aさん)・青色 (先生Cさん) がAIの出力、白色 (生徒Bさん) が私の入力です。
目的通り、記録係Cさんが、ネイティブっぽい表現を列挙してくれています。
ただ、以下の2点が気になります。
- バーに来ているのにこんな丁寧な言い方をするお客さんがいるか！ 
  - 先生Cの添削について、中国人のわたしの嫁の感想
- 私 (生徒Bさん) が「ホテルの上から人を見下ろして『見ろ！人がゴミのようだ！』と言うために来た」といったらマジレスでたしなめられた。

どちらにしろ堅苦しいのです。こんなバーテンダーだと私は行きたくないですが、よく考えれば相手はバーテンダーじゃなくて語学教師でしたね。まあ普通、語学教師の演技力というのはこの程度なので、どちらかというとリアリティが増しているかもしれません。

ちなみに時折、思わぬ誤作動をすることがあります。その中で最も多かったのが **「先生Aが生徒Bの発言まで全部書きあげてしまう」** という不具合でした。ただ、こういう状態に入っても、もう一度会話をやり直すとうまくいく場合が多いので、少なくとも私が勉強するには差し支えはなかったです。

# 実装
今回はPythonで実装します。なお以下で出てくるChatBotは、お好きなサービスをラップして実装してください。```ChatBot.ask(msg)```でチャットボットにメッセージを送信できることと、ChatBotが2台使えることが必要です。

```Python
from colorama import Fore
language = "中国語"
first = "您好"
example = """Aさん : 欢迎光临！"""
example2 = """Aさん : 欢迎光临！
Bさん : 您好。请给我您们的菜单。"""
example_answer = """1. 您好。请让我看看您们的菜单。
2. 您好。您们的菜单在哪？"""
```

まずは設定部分です。今回は中国語の先生なので中国語ですが、韓国語の先生がほしい場合は```language```を```韓国語```として、例文をGoogle翻訳にかけてあげるとよいです。

```Python
roleplay = """
舞台 : ホテルの最上階にあるバー。
先生 (Aさん) : バーで働くバーテンダー。Bさんと雑談しながら、注文をとりたい。
生徒 (Bさん) : バーにきたお客さん。
"""
```
今回はロールプレーにしてみます。

```Python
prompt_teacher = f"""
あなたは{language}の先生で、Aさんという名前です。
あなたには生徒である私とロールプレイをしてもらいます。ここでは私はBさんと言います。
ロールプレイの設定は以下となっています。
<ロールプレイの設定はじめ>
{roleplay}
<ロールプレイの設定おわり>

また、あなたの出力は"Aさん : (発言内容)"というフォーマットに従ってください。
<出力例はじめ>
{example}
<出力例おわり>
あなたはAさんなので、Bさんの発言はしなくてよいです。

では、あなたが"{first}"というところから始めましょう。すぐに私がそれに対して返事します。
さあどうぞ。
"""
```
先生Aさんの実装です。```あなたはAさんなので、Bさんの発言はしなくてよいです。```の部分は、放っておくとChatGPTがAさんの発言もBさんの発言もすべてロールプレイして完結してしまうことがあるのを抑制するためです。

```Python
prompt_notetaker = f"""
あなたは{language}の先生で、以下のAさんの手伝いをしてもらいます。あなたの他に{language}の先生 (Aさん) と、生徒 (Bさん) がいます。
先生 (Aさん) と生徒 (Bさん) は、{language}の練習のためロールプレイをしています。
あなたには先生 (Aさん) と生徒 (Bさん) の会話を聞いてもらいます。
そして、生徒 (Bさん) の発言内容に対して、Cさんであるあなたは、同じ内容だがよりネイティブに近い表現を提案してください。
これにより、生徒 (Bさん) がよりよい表現を覚えることができます。
以下、あなたへの入力と、あなたが出力する内容の詳細をお伝えします。

[あなたへの入力]
・ロールプレイの内容
<ロールプレイの設定はじめ>
{roleplay}
<ロールプレイの設定おわり>

・会話の内容
会話内容は<会話はじめ>と<会話おわり>で囲まれ、"発言者 : 発言内容"のフォーマットに従って入力されます。
<会話はじめ>
{example2}
<会話おわり>

[あなたが出力する内容]
・あなたはBさんの発言について、よりネイティブに近い表現を箇条書きで出力します。フォーマットは以下に従ってください。
<例はじめ>
{example_answer}
<例おわり>
・あなたが出力する例文は1個以上3個以内にしてください。

では始めましょう。まずは以下の会話の中で、Bさんの発言を処理してください。
<会話はじめ>
[ANSWER_A]
[ANSWER_B]
<会話おわり>
"""
```
記録係Cさんの実装です。1回目の会話の解析までを頼んでしまうのがポイントです。

```Python
prompt_notetaker2 = """
すばらしいです。さて、会話は以下のように続きました。以下の会話についても、Bさんの発言を処理してください。なお、最初にお伝えした入力内容と、出力フォーマットを思い出し、必ず従ってください。
<会話はじめ>
[ANSWER_A]
[ANSWER_B]
<会話おわり>
"""
```
記録係Cさんの実装その2です。2回目以降は「1回目と同じようにやって」と頼みます。

```Python
msg_teacher = teacher.ask(prompt_teacher)
print(Fore.GREEN + msg_teacher)
msg_student = "Bさん : " + input(Fore.WHITE + "Bさん : ")
msg_notetaker = notetaker.ask(prompt_notetaker.replace("[ANSWER_A]", msg_teacher).replace("[ANSWER_B]", msg_student))
print(Fore.BLUE + msg_notetaker)

while(True):
    msg_teacher = teacher.ask(msg_student)
    print(Fore.GREEN + msg_teacher)
    msg_student = "Bさん : " + input(Fore.WHITE + "Bさん : ")
    msg_notetaker = notetaker.ask(prompt_notetaker2.replace("[ANSWER_A]", msg_teacher).replace("[ANSWER_B]", msg_student))
    print(Fore.BLUE + msg_notetaker)
```

最後に会話部分の実装です。GUIを組む時間がなかったので、今回はCUIベースで実装しています。
```teacher```と```notetaker```は自作の```ChatBot```クラスのインスタンスです。

# まとめ

AIを相手に日本語でなにかを作るという体験は新鮮でしたし、今回は8時間程度で実装も完了したので、このスピード感にも驚きました。
まずは自分が利用できるだけの精度の先生が完成したので、これで4つ目の言語を覚えてみようと思います。今なら「AIで○○語を覚えた初めての日本人」みたいな称号が簡単に取れそうですね。頑張ってみようと思います。