Gemini 1.5 Proを使って自分の強みを分析してみた

記事タイトルとURLをコピーする

G-gen の神谷です。今回、Gemini 1.5 Pro を活用して、ビジネス心理テストであるストレングスファインダーで自身の強みを分析し、AI によるマネジメントやメンタリングが可能か、試してみました。本記事では、その取り組みの詳細をご紹介します。

ストレングスファインダーとは

まず、ストレングスファインダーについて説明します。

ストレングスファインダーは、個人の強みを特定し、それを活かすための評価ツールです。クリフトンという心理学者によって開発され、現在はギャラップ社が提供しています。 34の資質(強み)を測定し、個人の弱みではなく強みに焦点を当てることで、より良いパフォーマンスと幸福度の向上を目指す思想の元作られています。

34の資質は、行動の原動力となる思考や感情のパターンを表しており、以下のようなものがあります。

  • アレンジ: 物事を最適な状態に整える
  • 運命思考: 自分の人生には使命があると信じている
  • 回復志向: 問題の解決を急がない
  • 活発性: 新しい活動をすぐに始める
  • 個別化: 個人の長所や短所をよく観察する
  • 規律性: 秩序あるルーティーンを作る

(全34項目は割愛)

これらの資質は生まれつきのものであり、環境によって変化しにくいと考えられています。自分の強みを知ることで、それを伸ばし活かすことができます。

以下が私のレポートになりますが、目標志向、達成欲、自我などが上位に来ており、共感性や社交性、慎重さは下位でした。

ストレングスファインダー

トップ5の資質については日本語訳書籍の付録にクーポンコードがついているので、それを使って Web テストを受験し、レポートをダウンロードして確認できます。 34の資質まで知りたくなるので、その際は公式 Web サイトから追加のクーポンを購入することで、すべて見ることができます。

Strength Mentor Bot の作成

ストレングスファインダーの結果は非常に興味深いものでしたが、これを実際のマネジメントやメンタリングにどう活かせるのか考えてみました。 自分の強みを理解するだけでなく、部下や同僚の強みを把握し、適切なアドバイスができたら素晴らしいですよね。 そこで私は、自分のストレングスファインダーの結果を理解した上で、メンタリングしてくれる AI ボットを作ってみました。

ユーザーが「神谷の強みを教えてください。」と問いかけると、私のレポートをもとに、適切な回答を返してくれます。以下はその一例です。

Strength Mentor Bot のサンプル1

ボットの回答を見ると、私の上位資質である「目標志向」、「戦略性」、「学習欲」を踏まえて、データ分析プロジェクトでその強みを活かすにはどうしたらいいかの示唆を提示してくれています。

Gemini 1.5 Pro を使った実装

このボットの実装には、Gemini 1.5 Pro を使用しました。以下のようなシンプルなコードで実現できます。

# Vertex AI ライブラリをインポート
import vertexai
from vertexai.generative_models import GenerativeModel, Part
  
# プロジェクトIDを設定  
project_id = "your_project_id"
vertexai.init(project=project_id, location="us-central1")
  
# 質問のプロンプトを設定
prompt = "神谷の強みを教えてください"
  
# 入力として使用するPDFファイルのパスを指定
file_path = "path_to_your_pdf_file"
  
# PDFファイルをPart objectとして読み込み  
pdf_file = Part.from_uri(file_path, mime_type="application/pdf")
  
# プロンプトとPDFファイルをリストに格納
contents = [pdf_file, prompt]
  
# 生成モデルのパラメータを設定
generation_config = {
    "temperature": 0,  # 生成時の多様性を制御。0に近いほど確定的な出力になる
    "top_p": 0.95,  # top-p サンプリングの閾値。高いほど多様な出力になる
    "top_k": 40,  # 考慮する最高確率のトークンの数
    "candidate_count": 1,  # 生成する候補の数  
    "max_output_tokens": 8192,  # 出力トークンの最大数
}
  
# 使用する生成モデルを指定し、GenerativeModelオブジェクトを作成
model = GenerativeModel("gemini-1.5-pro-preview-0409", generation_config=generation_config)
  
# モデルにプロンプトとPDFを渡して応答を生成
response = model.generate_content(contents)
  
# 生成された応答のテキストを出力
print(response.text)

Part.from_uri 関数で PDF を読み込み、プロンプトと一緒に contents 配列に入れるだけです。あとはそのまま Gemini 1.5 Pro に渡すだけで、PDF の内容を理解した上で質問に答えてくれます。

以前は Gemini 1.0 を使っており、PDF の分割やチャンクごとのエンベディング抽出、類似ベクトル検索などの前処理が必要でしたが、Gemini 1.5 Pro ではそれらが不要になり、実装が非常にシンプルになりました。これにより、開発者は本質的なタスクに集中できるようになります。

34の資質を JSON 形式で抽出

さらに、Gemini 1.5 Pro を使えば、PDF から34の資質を JSON 形式で簡単に抽出できます。以下のサンプルコードをご覧ください。

import vertexai
from vertexai.generative_models import GenerativeModel, Part
import json
  
# プロジェクトIDを設定  
project_id = "your_project_id"
vertexai.init(project=project_id, location="us-central1")
  
# Google Cloud StorageのPDFファイルのパスを指定  
file_path = "gs://xxx/Gallup_Analytics_and_Reporting.pdf"
  
# PDFファイルをPart objectとして読み込み
pdf_file = Part.from_uri(file_path, mime_type="application/pdf")
  
# 34の資質とユーザー名を抽出するプロンプトを設定
prompt = """
以下のPDFから34の資質とその順位をJSON形式で抽出してください。
また、ページのヘッダーからユーザ名も抽出してください。
フォーマットは以下の通りです。
[
 {
   "user_name": "ユーザ名",
   "strength_item": "資質名",
   "rank": 順位
 },
 ...
]
"""
  
# プロンプトとPDFファイルをリストに格納
contents = [pdf_file, prompt]
  
# 生成モデルのパラメータを設定(JSON形式のレスポンスを指定)
generation_config = {
   "temperature": 0,
   "top_p": 0.95,
   "top_k": 40,
   "candidate_count": 1,
   "max_output_tokens": 8192,
   "response_mime_type": "application/json"  # レスポンスのMIMEタイプをJSONに設定
}
  
# 使用する生成モデルを指定し、GenerativeModelオブジェクトを作成
model = GenerativeModel("gemini-1.5-pro-preview-0409", generation_config=generation_config)
  
# モデルにプロンプトとPDFを渡してJSON形式の応答を生成
response = model.generate_content(contents)
  
# 生成されたJSON文字列をパースして、Pythonのデータ構造に変換
strengths = json.loads(response.text)
  
# 抽出された資質情報を整形してコンソールに出力
print(json.dumps(strengths, indent=2, ensure_ascii=False))

プロンプトで34の資質とその順位を JSON 形式で抽出するように指示し、なおかつリクエストパラメータで "response_mime_type": "application/json"を指定します。 レスポンスとして生成されたテキストを json.loads でパースすることで、簡単に構造化されたデータを取得できます。

出力結果は以下のようになりました。

[
  {
    "user_name": "乗治 神谷",
    "strength_item": "目標志向",
    "rank": 1
  },
  {
    "user_name": "乗治 神谷",
    "strength_item": "達成欲",
    "rank": 2
  },
  {
    "user_name": "乗治 神谷",
    "strength_item": "自我",
    "rank": 3
  },
    -- 省略 --
  {
    "user_name": "乗治 神谷",
    "strength_item": "収集心",
    "rank": 32
  },
  {
    "user_name": "乗治 神谷",
    "strength_item": "回復志向",
    "rank": 33
  },
  {
    "user_name": "乗治 神谷",
    "strength_item": "共感性",
    "rank": 34
  }
]

1位から34位まですべての資質が正確に抽出できています。

BigQuery への保存と分析

抽出した34の資質を BigQuery や Google Sheet に保存することで、メンバーの類似性や組織的傾向を定量的に分析したり、可視化することができます。以下は、BigQuery にデータを保存するサンプルコードです。

from google.cloud import bigquery
  
# BigQueryクライアントを作成
client = bigquery.Client(project="your_project_id")
  
# テーブルIDを指定  
table_id = "gemini_ocr_sample.strengths"
  
# BigQueryのスキーマを定義
job_config = bigquery.LoadJobConfig(
   schema=[
       bigquery.SchemaField("user_name", "STRING"),  # ユーザー名のカラム(文字列型)
       bigquery.SchemaField("strength_item", "STRING"),  # 資質名のカラム(文字列型)
       bigquery.SchemaField("rank", "INTEGER"),  # 順位のカラム(整数型)
   ],
   write_disposition="WRITE_TRUNCATE",  # テーブルが存在する場合は上書きする
)
  
# JSONデータをBigQueryにロード
job = client.load_table_from_json(strengths, table_id, job_config=job_config)
job.result()  # ロードジョブが完了するまで待機
  
# ロードされた行数を出力
print(f"Loaded {len(strengths)} rows to {table_id}")

BigQuery に保存されたデータを使って、以下のような分析や可視化が可能です。

  • 組織全体での各資質の平均順位を算出し、組織の強みや弱みを特定する
    • 上位の資質は組織の強みと言えるので、それを全面に打ち出していく
    • 下位の資質は組織の弱みと言えるので、補強策を検討する
  • 部署ごとの資質の分布を比較し、部署間の特性の違いを明らかにする
    • 営業部門は社交性や適応性が高い、開発部門は分析思考や着想が高い、など
    • 各部署の特性を活かした役割分担や、不足している資質を補うための人員配置を検討できる
  • メンバー間の資質の類似度を計算し、類似するメンバーをクラスタリングする
    • 類似度の高いメンバー同士は価値観や行動特性が似ているので、相性が良いチームを作れる
    • 逆に類似度の低いメンバー同士は多様な視点を持ち寄れるので、イノベーティブなチームを作れる

このように、構造化されたデータを活用することで、個人の強みの理解だけでなく、組織全体の特性や傾向を把握することができます。

実際に、弊社 G-gen メンバー7人の平均的な資質を可視化したグラフからは、最上志向、達成欲、学習欲などが上位に来ており、ベンチャー企業らしい傾向が見て取れました。

G-gen メンバーの上位資質

以下のようにユーザ別の資質をヒートマップ化することで、より詳細な分析をすることができます。

ユーザ別各資質のヒートマップ

チームビルディングへの応用

Gemini 1.5 Pro の強力な機能の一つは、複数の PDF を同時に処理できることです。これを利用して、複数のメンバーのストレングスファインダーの結果を分析し、チームビルディングに活かすことができます。

例えば、以下のようなプロンプトを与えることで、2人のメンバーの資質を比較し、潜在的な対立点を予測することができます。

import vertexai
from vertexai.generative_models import GenerativeModel, Part
import json
  
# プロジェクトIDを設定
project_id = "your_project_id"
vertexai.init(project=project_id, location="us-central1")
  
# 2人のユーザーの資質を比較し、衝突する可能性があるケースを尋ねるプロンプトを設定
prompt = "「大津 和幸」さん(最初のPDF)と「宣之 渡邉」さん(2つめのPDF)の資質を比較し、彼らがぶつかるとしたらどういったケースが有るか教えてください。上位5資質だけの比較で良いです"
  
# 1人目のユーザーのPDFファイルをPart objectとして読み込み
pdf_file_1 = Part.from_uri("gs://ohtsu.pdf", mime_type="application/pdf")
  
# 2人目のユーザーのPDFファイルをPart objectとして読み込み  
pdf_file_2 = Part.from_uri("gs://norry.pdf", mime_type="application/pdf")
  
# プロンプトと2つのPDFファイルをリストに格納
contents = [prompt, pdf_file_1, pdf_file_2]
  
# 生成モデルのパラメータを設定
generation_config = {
   "temperature": 0.2,  # 生成時の多様性を制御。0.2は比較的確定的な出力を生成
   "top_p": 0.95,  # top-p サンプリングの閾値。高いほど多様な出力になる
   "top_k": 20,  # 考慮する最高確率のトークンの数
   "candidate_count": 1,  # 生成する候補の数
   "max_output_tokens": 1024,  # 出力トークンの最大数
   "response_mime_type": "text/plain"  # レスポンスのMIMEタイプをプレーンテキストに設定
}
  
# 使用する生成モデルを指定し、GenerativeModelオブジェクトを作成
model = GenerativeModel("gemini-1.5-pro-preview-0409", generation_config=generation_config)
  
# モデルにプロンプトと2つのPDFを渡して応答を生成
response = model.generate_content(contents)
  
# 生成された応答のテキストを出力
print(response.text)

ここで注目すべきは、contents 配列に複数の PDF とプロンプトを一緒に詰め込んでいる点です。Gemini 1.5 Pro の API は、PDF やテキスト、音声、動画などの異なるデータフォーマットを、マルチモーダルなオブジェクトとして同じ配列で扱うことができます。 これにより、開発者は様々なデータ型を気にすることなく、シームレスに処理を行うことができます。

出力結果は以下の通りです。

## 大津さんと宣之さんの資質比較と衝突の可能性

大津さんと宣之さんの上位5資質を比較し、衝突の可能性について考察します。

**大津さんの上位5資質**

1. **社交性:** 初対面の人とも打ち解けやすく、人脈作りが得意。
2. **アレンジ:** 物事を整理・組織化し、柔軟性も備えている。
3. **学習欲:**  常に学び向上することに意欲的で、新しい知識やスキルの習得を楽しむ。
4. **コミュニケーション:**  自分の考えを言葉で表現することが得意で、プレゼンテーション能力も高い。
5. **包含:**  他者を受け入れ、輪から外れている人を気遣う。

**宣之さんの上位5資質**

1. **最上志向:**  優れたものを最高レベルに引き上げようと努力し、品質を重視する。
2. **着想:**  独創的で、新しいアイデアや概念を生み出すことを楽しむ。
3. **個別化:**  個人のユニークな資質に関心を持ち、それぞれに合った対応をする。
4. **適応性:**  状況に合わせて柔軟に対応し、変化を楽しむ。
5. **学習欲:**  大津さんと同じく、常に学び向上することに意欲的で、新しい知識やスキルの習得を楽しむ。

**衝突の可能性**

大津さんと宣之さんは、どちらも「学習欲」が高い点は共通していますが、他の資質には違いが見られます。

* **スピード感の違い:** 大津さんは「アレンジ」の資質から、効率性やスピード感を重視する可能性があります。一方、宣之さんは「最上志向」の資質から、品質を重視し、時間をかけて完璧を目指そうとする傾向があります。このため、プロジェクトの進め方や納期に関して意見が対立する可能性があります。
* **計画性 vs 柔軟性:** 大津さんは「アレンジ」の資質から、計画的に物事を進めることを好む可能性があります。一方、宣之さんは「適応性」の資質から、状況に合わせて柔軟に対応することを好みます。このため、計画の変更や予期せぬ事態への対応について、意見が合わない可能性があります。
* **全体 vs 個人:** 大津さんは「社交性」や「包含」の資質から、チーム全体を重視し、調和を保とうとする傾向があります。一方、宣之さんは「個別化」の資質から、個人の能力や個性に注目し、それぞれに合った対応をしようとします。このため、チーム運営や個人の評価について、意見が分かれる可能性があります。
* **アイデアの実現性:** 大津さんは「分析思考」の資質は上位ではないため、宣之さんの「着想」から生まれた斬新なアイデアに対し、実現可能性や論理的な裏付けを求める可能性があります。宣之さんは、実現可能性よりもアイデアの面白さや独創性を重視するため、衝突が起こる可能性があります。

**衝突を避けるためには**

* **お互いの資質を理解し尊重する:**  お互いの強みと弱みを理解し、尊重することが重要です。
* **コミュニケーションを密にする:**  意見が異なる場合は、しっかりと話し合い、お互いの考えを理解するように努めることが重要です。
* **役割分担を明確にする:**  それぞれの資質を活かせるような役割分担をすることで、衝突を避け、お互いの強みを活かすことができます。

大津さんと宣之さんは、異なる資質を持つからこそ、お互いに補完し合い、より良い結果を生み出す可能性を秘めています。お互いの違いを理解し、尊重することで、衝突を避け、協力して目標達成を目指せるでしょう。 

異なるユーザ(PDF)それぞれの上位資質と順位を正確に抽出できており、なおかつユーザ同士の共通点や相違点をもとにして、回答が生成されていました。

このようにして得られた知見を活用することで、以下のようなチームビルディングが可能になります。

  • メンバーの資質の組み合わせを考慮したチーム編成
    • 類似した資質を持つメンバーでチームを組むことで、得意分野に特化した高い生産性を発揮できる
    • 異なる資質を持つメンバーでチームを組むことで、多様な視点からの議論を活発化できる
  • メンバー間の対立を未然に防ぐためのコミュニケーション改善
    • お互いの強みや特性を理解し合うことで、相手の言動の真意を汲み取れるようになる
    • 対立が起きそうな場面では、第三者の視点から調整役を務められる
  • 個人の強みを活かすためのタスクアサイン
    • 各メンバーの強みに合ったタスクを割り当てることで、モチベーションとパフォーマンスを最大化できる
    • 苦手な分野のタスクは、得意なメンバーにサポートしてもらうことで、互いの成長にもつながる

このように、ストレングスファインダーの結果を Gemini 1.5 Pro で分析することで、個人の強みを活かしつつ、チームとしての総合力を高めることができます。

神谷 乗治 (記事一覧)

クラウドソリューション部

クラウドエンジニア。2017 年頃から Google Cloud を用いたデータ基盤構築や ML エンジニアリング、データ分析に従事。クラウドエース株式会社システム開発部マネージャーを経て現職。Google Cloud Partner Top Engineer 2023,2024、Google Cloud Champion Innovators(Database)、著書:「GCPの教科書III【Cloud AIプロダクト編】」