見出し画像

GPTを使って、「万博」関連1,105チーム同士の「マッチング/共創」を加速させるLINEボットを作ってみた

突然ですが、「TEAM EXPO 2025」というものを聞いたことはありますか?

画像引用:TEAM EXPO 2025公式サイトのトップページ

画像左上の独特なキャラクターをみて気づいた方もいるかもしれませんが、大阪万博の企画の1つです。

TEAM EXPO 2025」は多様な人たちがチームを組み、多彩な活動で大阪・関西万博とその先の未来に挑む、みんながつくる参加型プログラムです。

https://team.expo2025.or.jp/

とある通り、企画持ちより系のプロジェクトです。

この共創チャレンジというのが、現時点で1,105チームほどあります。各共創チャレンジはそれぞれ自身のページを持っており、以下のキャプチャのようなかたちで、それぞれの取組について紹介しています。

万博はまだ2年先なのに、既に1,000チーム以上集まっているという盛り上がり!なのですが、ここで課題があります。

「共創チャレンジ」なのに、チームが多すぎてお互いを認識できず、逆に共創が生まれにくくなっているのではないか。

そこで今回は、日本最大級となるAIコミュニティ「CDLE(シードル)」の生成モデルチームをコアとし、私がCEOをつとめるカナメプロジェクト社と、AIに関する技術顧問をつとめるCrystal社にてGPT開発を行い、このマッチング問題解消に向けたアプリを開発して、「TEAM EXPO 2025 Meeting#2」にて出展・発表してみました。

TEAM EXPO 2025 Meeting#2 に登場したミャクミャク(大阪・関西万博公式キャラクター)

問題を整理すると以下のようになります。

  • 1,105チーム間で、共創に繋がりそうなマッチングを行いたい
    ※ただし、チームの情報は2,000文字程度のテキストで書いてある

これに関して、ざっくり以下のようなやり方で進めていきました。

  1. チームの情報を、マッチングに適した観点に沿って300字程度にGPTで要約

  2. 要約したテキストを、意味が近いと距離が近くなるベクトルに変換(GPTの embedding / 埋め込みベクトル機能を利用)

  3. 自身と距離が近い共創チャレンジをマッチング候補として列挙し、最終マッチングはGPTが行う

1. チームの情報を、マッチングに適した観点に沿って300字程度にGPTで要約

データの取得について

それぞれの共創チャレンジのテキスト情報は、万博の事務局様にCSV形式のデータとして提供していただきました。改めましてありがとうございます!

要約について

各チームの情報をそのまま扱ってもいいのですが、マッチングの際の利便性を考えて、一度観点に沿った要約を行います。

今回は、全体として2,000字前後のチーム紹介テキストを、「やりたいこと」「提供できること」「欲しい支援」の3つの観点に沿って要約しました。全体としては300字前後になっています。

プロンプトのイメージは以下です。

「テキスト」以下の内容を、「観点」に沿って要約し、「アウトプット形式」のスタイルで出力してください。それぞれの観点の要約は100字程度とします。

###観点
・やりたいこと
・提供できること
・欲しい支援

###テキスト
<ここに元のテキストが入ります>

###アウトプット形式
#タイプ:共創チャレンジ
#チーム名:
#やりたいこと:
#提供できること:
#欲しい支援:

これをChatGPTで一つひとつ行うのは大変なので、LangChainなどを使って自動化します。

2. 要約したテキストを、意味が近いと距離が近くなるベクトルに変換(GPTの embedding / 埋め込みベクトル機能を利用)

埋め込みとマッチング

GPTのAPIの機能の一つに、埋め込みベクトルへの変換というものがあります。これは、テキストを、意味が近ければ距離が近くなるようなベクトル(数字の羅列)に変換するという便利機能です。この機能を使ってマッチングを行います。

マッチングのさせ方としては、色々なパターンが考えられます。

  1. 要約したテキスト全体の距離を測る(全体として似ている同士がマッチングされる)

  2. 提供できることと、欲しい支援をマッチングさせる(サポート相手のマッチングになる)

  3. 提供できることと、欲しい支援をマッチングを、やりたいこと同士の距離で絞り込む(向かう方向が近いサポート相手が見つかるかも)

などなど、考えると色々なパターンが出てきます。観点別に要約しているのも、こういった組み合わせを創出するためです。

今回は、最もシンプルな1番の、テキスト全体の距離を測る方法を試してみました。

距離計算

今回は1,105チームのマッチングなので、一番シンプルな全体の距離計算だとしても、1,105 x 1,105で120万通り以上の計算が必要になります。

また、問い合わせのたびに毎回計算するのも無駄なので、今回はあらかじめまとめて計算しておき、結果を保存する方法を取りました。

ベクトル間の距離なので、計算はコサイン類似度で行います。

※コサイン類似度:2つのベクトルの類似度を測定する方法。2つのベクトルのなす角のコサイン値を計算することで得られる。

3. 自身と距離が近い共創チャレンジをマッチング候補として列挙し、最終マッチングはGPTが行う

GPTによるマッチング

最後に、GPTを使ったマッチングを行います。GPTに情報を与えるとマッチングの候補を出してくれますが、これにはトークン数の制限(渡せる文字数の制限)があります。

10チームほどのマッチングであれば問題ありませんが、今回は1,105チームのマッチングなので、このままだとトークン数制限に引っかかってしまいます。よって、事前に絞り込みが必要です。

そこで、これまでの工程でマッチングする可能性が高そうなチームを絞り込み、10チーム程の候補をGPTに渡すという処理を行いました。

マッチングのプロンプトのイメージは以下です。

「共創チャレンジリスト」以下の共創チャレンジのうち、「自分」と共創できそうな共創チャレンジを3つ選び、理由をそれぞれ100文字以内で教えてください。出力は「アウトプット形式」に従ってください。

###自分
<マッチングを探したい共創チャレンジの要約テキスト>

###アプトプット形式
共創チャレンジ1:
理由:

共創チャレンジ2:
理由:

共創チャレンジ3:
理由:

###共創チャレンジリスト
<コサイン類似度が1番目に高い共創チャレンジの要約テキスト>

<コサイン類似度が10番目に高い共創チャレンジの要約テキスト>

マッチング候補として出力する共創チャレンジリストの作り方

上記プロンプトの最後で、共創チャレンジリストを出力しています。今回は単純に要約テキスト全体の類似度が高い共創チャレンジを候補としたので、コサイン類似度が高い(=テキストが類似している)チャレンジを候補として出力しています。

ここの出し方を工夫すると、様々な観点に沿ったマッチングができると考えられます。今回は時間の制約もあり、シンプルな方法のみ試しましたが、今後は色々なパターンを試していこうと考えています。

アプリとしての実装

全体としての設計は以上で、アプリとしては以下のような構成で実現しました。こちらのフロント部分は、Yanoさんにご担当頂きました。詳しくは以下のブログに記載されていますが、ここでは簡単に何箇所か引用してご紹介します。

全体のアーキテクチャ

このような形で、LINEのボットとして実装しています。今回、全体のフローとしては、要約・埋め込みベクトル化・マッチングの3箇所でGPTを使っていますが、実際に問い合わせがあった際に走るのは最後のマッチングAPIのみです。事前に共創チャレンジ間の距離は計算済みなので、DBを参照して最後のマッチングプロンプトのみ自動生成します。

APIの種類としては、最初の要約はGPT3.5、埋め込みベクトルは専用のモデル、最後のマッチングはGPT4と、用途によってモデルを使い分けました。


Chatでのキャラクターは猫風にしています。「にゃー」と発言すると、マッチング相手をみつけてくれます(笑)

おかげさまで、TEAM EXPO 2025 Meeting#2 当日は多くの方にご登録頂きました。ありがとうございました!

最後に少し宣伝をさせてください。カナメプロジェクトでは、GPTなどを活用した開発や実証実験、コンサルティングなどを行っています。こういった開発にご興味がありましたら、お気軽にご連絡ください!お待ちしております。

▶︎お問い合わせ・相談窓口はこちら:


この記事が気に入ったらサポートをしてみませんか?