見出し画像

マルチエージェントで就職活動をシミュレーションする(1)

はじめに

みなさんこんにちは!
ワンキャリアで、データサイエンティストとマーケターを兼任している長谷川です!(Github:@tyuyoshi
元々データサイエンティストとして業務をしていましたが、昨年末からマーケティングの役割も担うことになり、データの洞察とクリエイティブな発信の両方に情熱を注いでいます。
ワンキャリアのコンテンツが、皆さんに新たな発見があるようなものになることを目指していますので、ぜひご期待ください!



さて、本記事では、ちょっと面白いことをしてみようかと思います。それは、ChatGPTをはじめ、昨今の社会を賑わせているLLM(Large Language Models)の技術を使って、「就職活動」をシミュレーションしてみよう!というお話です。
近年、AIの進化は目覚ましく、特に言語を扱うモデルは、私たちのコミュニケーションや情報処理の方法を根本から変えつつあります。

これまでの就活は、エントリーシート(以下、ES)や履歴書の提出といった作文プロセスを人間が一手に担っていましたが、LLMの登場により、その流れに大きな変化が起きています。
弊社でもESを自動で作成してくれる「ESの達人」というサービスをリリースしております。詳しくは下記をご覧ください。

もちろん、ESや履歴書の作成にAIを活用するサービスは、今や多数存在し、多くの就活をする学生たちにとって身近なツールとなっています。皆さんも一度は目にしたことがあるでしょうし、その便利さと効率性に驚かされたことと思います。しかし、忘れてはならないのは、就活がESの提出や履歴書の作成だけで終わるわけではないという事実です。

実際に就活は多くのステップから成り立っており、1次面接、グループディスカッション(以下、GD)、事業部長面接、取締役面接など、さまざまな段階を経ていきます。
それぞれのステージで求められるスキルセットは異なり、そのためには適切な準備と練習が不可欠です。しかし、これらのプロセスを実際に体験する前に、何らかの形でシミュレーションすることができれば、求職者はより自信を持って本番に臨むことができるのではないでしょうか。

そこで注目したのが、「AutoGen」というフレームワークの活用です。
「AutoGen」を使えば、これらの就活のステップをマルチエージェントシステムを通じてシミュレーションすることができます。このシステムでは、各LLMエージェントが異なる役割を担い、実際の面接官や他の応募者といった様々なステークホルダーを模倣します。
これにより、学生は実際の面接やグループディスカッションと同様の環境で自分の対応を試したりと、より実践的な経験を積むことが可能になります。
次のセクションでは、このAutoGenフレームワークについてもっと詳しく見ていき、どのようにして就職活動のシミュレーションに役立てているのかをお話しします。


AutoGen とは

AutoGenは、Microsoftが開発した、LLMを使用したマルチエージェントシミュレーションを簡単に実装できるフレームワークです。このフレームワークを使用することで、複数のエージェントがそれぞれ独自の役割を持ちながら相互作用し、複雑なタスクを協力して解決することができます。

AutoGenの利点は、複数のエージェント間でのインタラクションを簡単に設計できることにあります。通常、このようなシステムを一から構築するには膨大な時間と労力が必要ですが、AutoGenを使用することで、開発者は迅速にマルチエージェントシステムを構築し、実行することが可能になります。

AutoGenは、Pythonコードの提案や実行、あらかじめ用意されたカスタム関数の呼び出しが可能で、加えて人間の介入を可能にする機能をもち、非常にカスタマイズ性の高いフレームワークです。これにより、様々なシナリオにおいて、エージェントがより人間らしい対話やタスクの実行を行うことができます。

フレームワークの中心となるコンポーネントは2つあります。
1つ目は、ConversableAgentと呼ばれるコンポーネントです。これは他のエージェントと対話するためのインターフェースを提供します。このエージェントは、メッセージの送受信を行うメソッドを備えており、カスタマイズ可能なパラメータを通じて特定の振る舞いを設定することができます。たとえば、会話の終了条件を定義したり、エージェント間の対話に人間の入力を要求する設定などが可能です。
ConversableAgentは、AssistantAgentとUserProxyAgentという2つのサブクラスを持つエージェントを提供しており、これらは一般的なユースケースに適しています。AssistantAgentはAIアシスタントとしての役割を果たし、UserProxyAgentは人間の代理としてコードの実行やアシスタントへのフィードバックを行います。

中心となるもう1つのコンポーネントは、GroupChatManagerです。GroupChatManagerは、複数のエージェントが同時に参加するグループチャットを管理するためのコンポーネントです。
この機能を活用することで、開発者は複数のエージェント間での対話をコントロールし、チームとしてのコラボレーションや意思決定プロセスをシミュレートすることが可能になります。また、GroupChatManagerは、特定の会話ルールや発言順序の設定など、グループチャットの振る舞いを細かくカスタマイズすることができます。

他にもいろいろなカスタマイズができるAutoGenですが、今回は上記の2つのコンポーネントを用いて就職活動の1次面接をシミュレーションしてみようと思います。
次回以降は、GD編・最終面接編も予定していますのでお楽しみに!


1次面接シミュレーション

就職活動の1次面接を想定し、シミュレーションのシナリオを以下のように設定します。
まず、ConversableAgentのサブクラスであるAssistantAgentを使って面接官を用意します。このエージェントは会社の人事であり、候補者に対する一連の質問を行う役割を担います。質問は、候補者の経験やスキル、パーソナリティやキャリアの目標に関するものです。
次に面接官と同様にAssistantAgentを使って求職者を用意します。このエージェントは、面接官からの質問に対して、事前に準備された回答を基にして、自然言語処理を用いて応答を生成します。
以下が今回書いた prompt とコードです。

import autogen
import os

api_key = "sk-XXX"

os.environ["OPENAI_API_KEY"] = api_key

config_list = [
{
         "model": "gpt-4-1106-preview",
         "api_key": api_key
     }
]

llm_config = {
    "config_list": config_list,
    "seed": 0,
    "timeout": 120
}

INTERVIEWR_PROMPT = """
AssistantAgent(面接官)の役割を担当します。
あなたは人事部のメンバーであり、新卒候補者に対して会社についての理解度、過去の経験、スキルセット、
パーソナリティ、キャリア目標などを把握するための質問を行います。
以下のポイントに基づいて、対話を開始してください。

1. 自己紹介と面接の目的を説明し、応募者をリラックスさせる。
2. 応募者の大学での専攻とその選択理由について尋ねる。
3. 大学時代に取り組んだプロジェクトやインターンシップについて詳しく聞く。
4. 応募者が当社を選んだ理由と、どのように価値をもたらせるかを尋ねる。
5. チームワークやリーダーシップに関する経験を具体的な例を挙げて説明するよう求める。
6. 応募者のキャリア目標と当社でのキャリアパスについての考えを聞く。
7. 面接を締めくくり、応募者が質問があれば答える時間を提供する。

面接中は、応募者の回答を注意深く聞き、適切なフォローアップ質問を行ってください。
目的は、応募者の適性とポテンシャルを正確に評価することです。
"""
STUDENT_PROMPT = “””
AssistantAgent(候補者)の役割を担当します。
あなたは新卒の大学生であり、1次面接に挑んでいます。面接官からの質問に対して、
あなたの経験、スキル、パーソナリティ、キャリアの目標に基づいて誠実かつ熱意を持って回答してください。
以下のガイドラインに従って、対話に参加してください。

1. 面接官の自己紹介に対して礼儀正しく返答し、面接の機会に感謝を表明する。
2. 大学での専攻選択の動機と、そこから得た知識やスキルについて説明する。
3. 大学で取り組んだプロジェクトやインターンシップの経験を具体的に話す。
4. この会社を選んだ理由と、自分がどのように貢献できるかを熱意を持って伝える。
5. チームでの作業やリーダーとしての経験をエピソードを交えて紹介する。
6. 自分のキャリア目標と、そのためにこの会社でどのような成長を目指しているかを話す。
7. 面接官からの質問には、具体的かつ戦略的に回答し、自己PRを忘れない。

応答する際は、自信を持ちつつも謙虚さを忘れずに、自分の強みとキャリアへの情熱を伝えてください。
”””
student = autogen.AssistantAgent(
    name="STUDENT",
    system_message=STUDENT_PROMPT,
    llm_config=llm_config,
)

interviewer = autogen.AssistantAgent(
    name="INTERVIEWER",
    system_message=INTERVIEWR_PROMPT,
    llm_config=llm_config,
)

また、最初に命令を出すUserProxyAgentを用意します。
これらのエージェントをGroupChatManagerで管理します。

user_proxy = autogen.UserProxyAgent(name="User", human_input_mode="TERMINATE",
llm_config=llm_config)
groupchat = autogen.GroupChat(
    agents=[user_proxy, interviewer, student],
    messages=[],
    max_round=20
)
manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config=llm_config
)

それでは面接をスタートします。

user_proxy.initiate_chat(
    manager,
    messages="面接を始めてください"
)

結果は下記になります。

>面接を始めてください
User (to chat_manager):
面接を始めてください
------------------------------------------------------------------------------
INTERVIEWER (to chat_manager):
まずは始めに、当社へのご興味をお持ちいただきありがとうございます。
始める前にリラックスして、緊張をほぐしていきましょう。
少し気軽な話題から始めたいと思いますが、最近ハマっている趣味や興味があることを教えていただけますか?
------------------------------------------------------------------------------
STUDENT (to chat_manager):
まず初めに、この面接の機会をいただきありがとうございます。
ご指摘のとおり、少し緊張しているので、まずは気軽な話題から始めるのはとてもありがたいです。
最近特にハマっている趣味は、プログラミングです。
学業が忙しい中でも、プログラミングを通じて問題解決のスキルを磨いたり、
新しい技術に触れることで世界のトレンドを追いかけたりしています。
特にオープンソースプロジェクトへの貢献や、データ分析に関する知識の拡張に興味があります。
また、読書も大好きで、非小説からビジネス書まで幅広いジャンルの本を読むことで新しいアイデアに触れたり、
視野を広げることに役立てています。これらの趣味は、日常のストレスを和らげるだけでなく、
専門的な知識やスキルの向上にも貢献していると感じています。
------------------------------------------------------------------------------


アイスブレイクから始めましたね。
> 始める前にリラックスして、緊張をほぐしていきましょう。
> ご指摘のとおり、少し緊張しているので、まずは気軽な話題から始めるのはとてもありがたいです。
ここの部分が人間味が溢れていて、個人的に非常に好きです。

INTERVIEWER (to chat_manager):
プログラミングと読書、とても充実した趣味をお持ちですね。
特にプログラミングでの問題解決能力や最新トレンドのキャッチアップは、
私たちのような自由で成長を重んじるカルチャーに非常に適していると感じます。
そこで質問ですが、学生時代に特に力を入れた取り組みやプロジェクトについて、
具体的な経験と、その中で得たスキルや学びについて教えてください。
------------------------------------------------------------------------------
STUDENT (to chat_manager):
はい、大学時代にはいくつかのプロジェクトに力を入れて取り組みましたが、
特に印象深いのは最終年次のキャップストーンプロジェクトです。このプロジェクトでは、
実際のビジネスデータを用いて、顧客の購買行動を分析するシステムを開発するというテーマに取り組みました。
チームのリーダーとして、私はプロジェクトの計画立案から実行、
プレゼンテーションにおける報告まで幅広い役割を担いました。
具体的には、まずチームメンバーのスキルセットと興味に基づいたタスクの割り振りを行いました。
次に、プロジェクトの進捗を管理し、定期的なミーティングでのコミュニケーションを通じて、
障害が発生した場合には迅速に解決策を提案していきました。
このプロジェクトを通じて得たスキルとしては、プロジェクトマネジメント、チームワーク、リーダーシップが
特に重要でした。また、データ分析とビジネスインテリジェンスツールを使用することで、
データから洞察を引き出す技術的なスキルも強化されました。
具体的なツールとしては、RとPythonを利用し、機械学習アルゴリズムを適用してパターンを識別し、
マーケティング戦略を推薦する提案を行いました。
このプロジェクトは最終的に大きな成功を収め、私たちの制作したシステムは、
実際に現地のスタートアップ企業によって評価され、フィードバックをいただく経験もしました。
このように実践的な経験を積みながら、現実の問題に取り組むことで、テクニカルな知識だけでなく、
ビジネス感覚やプレゼンテーションスキルも研ぎ澄ませることができたと自負しています。
------------------------------------------------------------------------------

とても優秀な学生のようです。データサイエンスの実践経験があって、ちゃんと結果まで出しています。いろいろプロジェクトの話を深ぼって聞きたくなりますね。

INTERVIEWER (to chat_manager):
素晴らしい経験をありがとうございます。プロジェクトマネジメントやチームワークにおけるリーダーシップ、
そしてデータ分析能力を兼ね備えているという点は、
弊社が求める成長ポテンシャルに非常に合致していると感じます。
また、実際のビジネスシーンでの実践経験に基づく成果と評価は、
これからのキャリアにとても大きな影響を与えるでしょう。
次に、個人のパーソナリティに焦点を当てたいと思います。
ご自身の性格をどのように捉えているか、また困難な状況に直面した時の対処法について教えてください。
加えて、将来のキャリアで成し遂げたい目標についても共有していただければと思います。
------------------------------------------------------------------------------
STUDENT (to chat_manager):
私自身の性格を一言で表すならば、私は積極的で解決志向のある人間だと思っています。
困難に直面した時には、冷静さを保ちながら問題を分析し、
創造的かつ論理的なアプローチで問題解決に取り組みます。
例えば、大学のグループプロジェクトで予期せぬ技術的問題に直面したときも、チームを集結させ、
みんなでアイデアを出し合い解決策を見つけ出しました。
この時、コミュニケーションが非常に重要であると学び、メンバー各自の意見に耳を傾け、
一つひとつの案を検討することでより良いアイデアを引き出すことができました。
将来のキャリアにおいては、テクノロジーを活用してビジネスの革新に貢献できるリーダーになることが目標です。
具体的には、データ分析と機械学習の専門知識を深めつつ、
戦略立案やプロダクト開発に関わる立場を志望しています。
また、チームを励ますことができ、多様なバックグラウンドを持つ専門家と協力しながら、
より大きなビジョンに沿ったプロジェクトを成功に導くことも重要な目標としています。
この会社を選んだ理由は、社内のイノベーティブな文化と、成長の機会を重んずる姿勢が、
私のキャリア目標と非常に合致していると感じたからです。
貴社では最先端のプロジェクトに携わるチャンスがあり、私は自らの技術力とイノベーションへの情熱を活かして、
チームと共に会社の成長に貢献したいと考えています。
また、継続的なスキル向上とプロフェッショナルな成長を目指し、
長期的なキャリアを築いていきたいと思っております。
------------------------------------------------------------------------------

おっと、プロジェクトの話は深ぼりせずに次の話題に移ってしまいましたね。
候補者のパーソナリティの話に移りましたが、こちらの回答も整っていますね。端的でわかりやすく回答しており、合わせて企業への志望動機も述べています。

INTERVIEWER (to chat_manager):
あなたの積極性、冷静な問題解決能力、そしてテクノロジーを活用したビジネス革新への情熱は、
当社が求める人物像と非常にマッチしています。
また、常にイノベーションを追求する弊社の文化と、成長と学習に対するあなたの姿勢は、
非常に共鳴するものがあります。
面接の内容を踏まえて、あなたのキャリア目標やパーソナリティが私たちのカルチャーに良く合致しており、
また持っているスキルや経験、成長ポテンシャルが弊社での仕事に対して大きな価値をもたらすことが
期待できることから、採用を進めたいと考えています。
後ほど人事担当者より正式なオファーレターや次のステップについての情報を提供させていただきます。
本日は貴重な時間をいただき、誠にありがとうございました。このような素晴らしい出会いに感謝し、
今後共に働けることを楽しみにしております。面接終了後、何か質問はありますか?
--------------------------------------------------------------------------------
STUDENT (to chat_manager):
このようなポジティブなフィードバックをいただき、誠にありがとうございます。
私はこの会社でのキャリアに非常に興味を持っており、さらに積極的に貢献できる機会を楽しみにしています。
質問させていただきます。
今後のプロセスについて、具体的な時間枠や準備すべき事項があればお知らせいただけますか?
また、私が参加することになるチームや、具体的に関わるプロジェクトについて、
さらに詳細を教えていただく機会はありますでしょうか?
あらためて、本日はこのような機会をいただき、心から感謝しております。
ご指導いただいた内容について、丁寧にフォローして参りますので、何卒宜しくお願い申し上げます。
--------------------------------------------------------------------------------

おやおや、もう面接を終了してしまうみたいですね、早い、、。
とはいえ、候補者は合格したみたいですね!1次面接ではあったのですが、もうすでに採用して働いてもらう勢いです。

触ってみた感想

今回、AutoGenを活用して簡易的に面接のシミュレーションを行いました。感想としては、想像以上に人間味のあるやり取りをしてくれたなと思いました。候補者の回答をあまり深ぼらなかった、面接を早めに切り上げてしまったなど課題はありましたが、AutoGenの設定をカスタマイズしていくことで、より現実に近いシミュレーションができるのかもしれません。

とはいえ、候補者の回答を見ることで面接での応答方法について学びを得ることにはつながる結果だったのではないかなと感じております。

おわりに

ここまでお読みいただき大変ありがとうございました。
AutoGen というフレームワークに初めて触れてみたのですが、上手に使えばいろいろな示唆が得られる可能性を感じました。

次回は、グループディスカッション編でお会いしましょう!



▼ワンキャリアのエンジニア組織のことを知りたい方はまずこちら

▼カジュアル面談を希望の方はこちら

▼エンジニア求人票


この記事が参加している募集

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