6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLM(GPT)使って自然言語の日程調整を効率化した話

Posted at

きっかけ

仕事で、日程を調整する機会多いですよね。

社内の日程調整であればGoogleカレンダーを全社員で共有しているため、カレンダーから空いている日程を探してポチッと押すだけでいいんです。

一方、社外の人と日程調整をする場合は、カレンダーの共有などができないため、

以下の時間の中で30分ほどご都合の良い時間はありませんでしょうか?
    10月 28日 (月曜日)⋅13:00~14:00、15:00~16:00
    10月 29日 (火曜日)⋅16:00~17:00
    10月 31日 (木曜日)⋅13:00~14:00

といった感じの日程候補の文章をもらい、これで日程調整をすることになります。

この場合、自分のGoogleカレンダーとにらめっこして、空いている場所を探すんですが、これが面倒なんですよね〜

そこで、これをLLMを使って効率化することを試みました!

(この記事は GO Inc. Advent Calendar 2024の1日目です)

初期バージョン

OpenAIのGPTのAPIに対して、以下のようなプロンプトを投入することで、日程調整できないかこころみました。

OpenAIのGPTのAPIは、システムプロンプトとして役割の説明を、ユーザプロンプトとして処理してほしいデータを、それぞれ渡すことができます

システムプロンプトには役割の説明を書きます。

システムプロンプト

あなたは、日程調整役です。最初に私のスケジュールを教えますので、それを元に相手からもらった日程候補の中で、私が空いている時間を教えて下さい。

以下のJSON形式で出力してください。出力に「```json」や「```」といった文字は不要です。

{
  "time_range_list":[
    {"start":"YYYY/MM/DD HH:MM","end":"YYYY/MM/DD HH:MM"},
    {"start":"YYYY/MM/DD HH:MM","end":"YYYY/MM/DD HH:MM"},
  ]
}

time_range_listは、相手が提案した日程候補の中で、私が空いている時間のリストです。
startは開始時間、endは終了時間です。

ユーザープロンプトには処理して欲しいデータを指定します。私のスケジュールと、相手から来た日程調整の文章を、結合して指定します。なお、私のスケジュールの文字列は、Google カレンダーのAPIを使って、機械的に生成しています。

ユーザープロンプト

## 私のスケジュール

10/28(月)10:30〜11:00 マネージャ定例 
10/28(月)13:00〜13:30 1 on 1 山田さん
10/28(月)14:30〜15:00 1 on 1 井上さん
10/28(月)15:00〜15:30 エンジニアチームWeekly Sync 
10/29(火)11:00〜11:30 インシデントの件の認識合わせ
10/29(火)12:00〜13:00 昼飯 

## 相手から来た日程調整の文章

以下の時間の中で30分ほどご都合の良い時間はありませんでしょうか?
    10月 28日 (月曜日)⋅13:00~14:00、15:00~16:00
    10月 29日 (火曜日)⋅10:00~11:00

でてきた結果は以下の通り

1回目の結果

{"time_range_list":[
  {"start":"2023/10/28 13:30","end":"2023/10/28 14:00"},
  {"start":"2023/10/28 15:30","end":"2023/10/28 16:00"},
  {"start":"2023/10/29 10:00","end":"2023/10/29 10:30"}
]}

惜しい!出てきた3件はいずれも正解なんですが、1件足りない。10月 29日 (火曜日)⋅10:30~11:00も結果に入っているべきでしたが、漏れたようです。

試しに同じプロンプトで再度実行した所、

2回目の結果

{"time_range_list":[
  {"start":"2023/10/28 15:30","end":"2023/10/28 16:00"},
  {"start":"2023/10/29 10:00","end":"2023/10/29 10:30"}
]}

さっきよりも馬鹿になっている orz  出力がより少なくなりました。

その後も何度か試しましたが、なかなか出力が安定せず、また、日程候補が複雑になればなるほど間違いやすくなったので、このアプローチは諦めました。。。

改善バージョン

初期バージョンの反省を踏まえて、日程候補まで全部をGPTにお願いするのではなく、
相手から来た自然言語を解析する部分だけをGPTにお願いする作戦に変えました。

具体的には、相手の依頼文を、30分毎に区切った日付の配列に変換してもらうことだけを、GPTに依頼しました。

システムプロンプト(役割の説明)

次に示す会話の中に登場する、会議の時間候補を、30分ごとに区切って出力してください。

会話の中で、年が省略されている場合は、2024年としてください。

以下のJSON形式で出力してください。出力に「```json」や「```」といった文字は不要です。

{
  "time_range_list":[
    {"start":"YYYY/MM/DD HH:MM","end":"YYYY/MM/DD HH:MM"},
    {"start":"YYYY/MM/DD HH:MM","end":"YYYY/MM/DD HH:MM"},
  ]
}

time_range_listは、相手が提案した日程候補の中で、私が空いている時間のリストです。
startは開始時間、endは終了時間です。

ユーザプロントには、相手から来た日程調整の文章を、指定します

ユーザープロンプト(処理して欲しいデータ)

以下の時間の中で30分ほどご都合の良い時間はありませんでしょうか?
    10月 28日 (月曜日)⋅13:00~14:00、15:00~16:00
    10月 29日 (火曜日)⋅10:00~11:00

でてきた結果は以下の通り

結果

{"time_range_list":[
  {"start":"2024/10/28 13:00","end":"2024/10/28 13:30"},
  {"start":"2024/10/28 13:30","end":"2024/10/28 14:00"},
  {"start":"2024/10/28 15:00","end":"2024/10/28 15:30"},
  {"start":"2024/10/28 15:30","end":"2024/10/28 16:00"},
  {"start":"2024/10/29 10:00","end":"2024/10/29 10:30"},
  {"start":"2024/10/29 10:30","end":"2024/10/29 11:00"}
]}

これはバッチリ!完璧に自然言語から30分ごとの時間幅のリストに変換できています!

あとは、この結果を元に、普通のプログラミングで、空いている時間を計算すればツールの完成です!

できたツール

日程調整の文言を入れたら、自分のGoogleカレンダーの予定をみて、空いている時間を計算するWebツールを作りました。

image.png

こんな感じで、相手からの文章を入れて調整ボタンを押せば、空いている時間を教えてくれます。ついでに付近の自分の予定も表示しくれているので、結果の確かさも検証できます。

このツールはこちらのgithubで公開しています。

ツールの簡単な特徴は

まとめ

最初は、日程調整まで全部GPTにやらせようと思いましたが、無理でした。そこでGPTには相手の自然言語の依頼文を解析する部分だけを依頼し、残りは普通のプログラムで完成させました。

いくらGPTさんが賢いとはいえ、得手不得手があります。自然言語を構造化したデータに変換するのは得意ですが、結果が明確に定まる普通の計算は苦手です。もともと、GPTは「次に来る単語を予測する」という機能であるため、どうしても結果が定まりにくいです。結果が明確に定まるタスクをさせるのは不向きだと思いました。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?