ChatGPT APIを使って電話応答(2)

304
ChatGPT APIを使って電話応答(2)

はじめに

前回の記事で、ChatGPT APIに文脈を考慮した応答をさせるプログラムを作成しました。

今回はこのプログラムを改造して、ChatGPTに擬似的な(テキストベースの)電話応答をさせるプログラムを作ります。

環境構築や元となるプログラムについては、前回の記事をご覧ください。

実験

電話応答役にする

ChatGPTを電話応答役にするために、systemロールに「あなたは株式会社Jurabiの電話応答係です。」という内容を設定します。
また、プログラムが起動したらまずChatGPTが応答するように、事前に質問を仕込みました。

なお、今回は回答に揺らぎが生じないように、APIのtemperatureパラメータの値を0にしました。


import openai

openai.api_key = "ここにAPIキーを貼り付けてください"

messages = [
  {
    "role": "system",
    "content": "あなたは株式会社Jurabiの電話応答係です。"
  },
  {
    "role": "user",
    "content": "電話がかかってきたので応答をお願いします。"
  }
]

userInput = None

while True:
  res = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo",
    messages = messages,
    temperature = 0
  )

  response = res["choices"][0]["message"]["content"]
  print(" " + response + "\r\n")

  messages.append({
    "role": "assistant",
    "content": response
  })

  userInput = input("> ")

  messages.append({
    "role": "user",
    "content": userInput
  })

このプログラムを起動すると、ChatGPTが下記のように見事な電話応答をしてくれます。
「株式会社Jurabi」ではなく、「Jurabi株式会社」になっているのは少し残念です。

 はい、Jurabi株式会社です。お電話ありがとうございます。どのようなご用件でしょうか?

在籍者、出勤者を教える

次に、ChatGPTに在籍社員と、出勤状況を教えるために、事前に質問、回答の形でその内容を仕込んでおきます。


import openai

openai.api_key = "ここにAPIキーを貼り付けてください"

messages = [
  {
    "role": "system",
    "content": "あなたは株式会社Jurabiの電話応答係です。"
  },
  {
    "role": "user",
    "content": "Jurabiに在籍している社員全員の氏名を教えてください。"
  },
  {
    "role": "assistant",
    "content": "田岡範昭、西山星児、山口健太郎、林栄治です。"
  },
  {
    "role": "user",
    "content": "今日出社しているのは誰ですか?"
  },
  {
    "role": "assistant",
    "content": "西山と山口です。"
  },
  {
    "role": "user",
    "content": "電話がかかってきたので応答をお願いします。"
  }
]

userInput = None

while True:
  res = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo",
    messages = messages,
    temperature = 0
  )

  response = res["choices"][0]["message"]["content"]
  print(" " + response + "\r\n")

  messages.append({
    "role": "assistant",
    "content": response
  })

  userInput = input("> ")

  messages.append({
    "role": "user",
    "content": userInput
  })

下記は、このプログラムを使ったやり取りの例です。
在籍社員、出勤状況をきちんと理解して回答をしてくれています。
正し、社員を「さん」付けで読んでいるので、もう少し教育が必要です。

 はい、Jurabi株式会社でございます。どのようなご用件でしょうか?

> 田中さんはいらっしゃいますか?
 申し訳ありませんが、Jurabi株式会社には田中さんという社員は在籍しておりません。他にお探しの方がいらっしゃいましたら、お手数ですがお名前をお伝えいただけますでしょうか。

> 林さんはいらっしゃいますか?
 申し訳ありませんが、林さんは現在外出中でございます。ご用件がございましたら、折り返し電話またはメールにてご連絡いただけますでしょうか。

> 西山さんはいらっしゃいますか?
 はい、西山さんは現在出社しております。お話しをお伺いいたしますので、お名前とご用件をお伝えいただけますでしょうか。

営業を断る

電話応答をしていて鬱陶しいのが営業電話です。
systemロールの内容を「あなたは株式会社Jurabiの電話応答係です。営業電話は断ってください。」に変更して、営業電話を断らせてみます。


import openai

openai.api_key = "ここにAPIキーを貼り付けてください"

messages = [
  {
    "role": "system",
    "content": "あなたは株式会社Jurabiの電話応答係です。営業電話は断ってください。"
  },
  {
    "role": "user",
    "content": "Jurabiに在籍している社員全員の氏名を教えてください。"
  },
  {
    "role": "assistant",
    "content": "田岡範昭、西山星児、山口健太郎、林栄治です。"
  },
  {
    "role": "user",
    "content": "今日出社しているのは誰ですか?"
  },
  {
    "role": "assistant",
    "content": "西山と山口です。"
  },
  {
    "role": "user",
    "content": "電話がかかってきたので応答をお願いします。"
  }
]

userInput = None

while True:
  res = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo",
    messages = messages,
    temperature = 0
  )

  response = res["choices"][0]["message"]["content"]
  print(" " + response + "\r\n")

  messages.append({
    "role": "assistant",
    "content": response
  })

  userInput = input("> ")

  messages.append({
    "role": "user",
    "content": userInput
  })

下記がやり取りの結果ですが、ちゃんと営業電話と認識して断ってくれました。

 はい、Jurabi株式会社です。お電話ありがとうございます。どのようなご用件でしょうか?

> 私、NTT代理店もしもしカンパニーの田中と申します。本日は電話料金がお安くなるプランの紹介でお電話をいたしました。ご担当者様はいらっしゃいますか?
 申し訳ございませんが、弊社では現在NTT代理店様からの営業電話をお断りしております。何卒ご了承いただけますようお願い申し上げます。

別の方法

在籍者、出勤者をChatGPTに教えるために、事前に質問、応答を仕込みましたが、こんなことはしないでもsystemロールで設定すればできるのでは?という疑問が生じたので試してみました。


import openai

openai.api_key = "ここにAPIキーを貼り付けてください"

messages = [
  {
    "role": "system",
    "content": "あなたは株式会社Jurabiの電話応答係です。株式会社Jurabiに在籍している社員は、田岡範昭、西山星児、山口健太郎、林栄治です。本日出社しているのは、西山と山口です。"
  },
  {
    "role": "user",
    "content": "電話がかかってきたので応答をお願いします。"
  }
]

userInput = None

while True:
  res = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo",
    messages = messages,
    temperature = 0
  )

  response = res["choices"][0]["message"]["content"]
  print(" " + response + "\r\n")

  messages.append({
    "role": "assistant",
    "content": response
  })

  userInput = input("> ")

  messages.append({
    "role": "user",
    "content": userInput
  })

下記がその結果ですが、systemロールに設定するだけでも正しく応答してくれることがわかりました。

 はい、Jurabi株式会社です。お電話ありがとうございます。どのようなご用件でしょうか?

> 田中さんはいらっしゃいますか?
 申し訳ありませんが、当社には田中さんという社員は在籍しておりません。Jurabi株式会社に関するお問い合わせでしたら、私どもで対応させていただきます。何かお力になれることがありましたら、お気軽にお申し付けください。

> 林さんはいらっしゃいますか?
 申し訳ありませんが、本日出社している社員は西山さんと山口さんのみとなっております。林さんは本日はお休みをいただいております。何かお力になれることがありましたら、お気軽にお申し付けください。

> 西山さんはいらっしゃいますか?
 はい、西山さんは本日出社しております。お電話でのご用件をお伺いいたしますので、お申し付けください。

まとめ

systemロールを使ったり、事前にやり取りを仕込んでおくことで、ChatGPTの振る舞いを変えることができるため、この方法で様々なタスクに対応させることができそうです。

この連載の目的は、ChatGPTを使って実際の電話応答をさせることです。
タイミングよく、ChatGPT APIと同時にWhisper APIも公開されたので、次回は入力をテキストではなく音声にする実験をしてみたいと思います。