見出し画像

LangChainで対話型ロールプレイモデルCAMELを試す

「CAMEL(Communicative Agents for “Mind” Exploration of Large Scale Language Model Society)」という、言語モデル同士が対話を通して複雑なタスクを遂行していくエージェントモデルのモデル実装がLangChainのドキュメントに追加されていたので試してみました。

CAMELの問題意識は会話やチャットに基づく言語モデルの急速な進歩によって複雑なタスクをコンピューターが遂行できるようになったものの、あくまでそれは会話を誘導する(プロンプトを入力する)人間の能力に大きく依存している、というところにあります。

AI同士が協力しあってくれれば、扱う人間能力にそこまで依存せずとも高度なタスクをこなしてくれるんじゃないかな?という仮説。

ドキュメントでは以下の実装をLangChainで実装してみている感じです。

というわけで、早速見てみましょう。

用意するもの

CAMELAgentというクラスがライブラリで提供されている訳ではないので、基本的にはドキュメントからコピペしていく形になります。

面白いのは最初に処理するタスクの精緻化すらもLLMにやらせているところ。

assistant_role_name = "Python Programmer"
user_role_name = "Stock Trader"
task = "Develop a trading bot for the stock market"
word_limit = 50 # word limit for task brainstorming

サンプルではこのように、Pythonプログラマと株トレーダーが対話しながらトレーディングボットを開発する、という設定にしています。

サンプルのままじゃつまらないので、今回は何か新しいビジネスをつくりたいプログラマーが起業家パイセンに相談しながら「大規模言語モデルを利用して新しいビジネスモデルをつくる」というタスクに取り組む設定にしてみます。

assistant_role_name = "Entrepreneur"
user_role_name = "Programmer who wants to create a new business"
task = "Develop new business models using large language models"
word_limit = 50 # word limit for task brainstorming

すると以下のコードを経て詳細なタスクが生成されました。

task_specifier_sys_msg = SystemMessage(content="You can make a task more specific.")
task_specifier_prompt = (
"""Here is a task that {assistant_role_name} will help {user_role_name} to complete: {task}.
Please make it more specific. Be creative and imaginative.
Please reply with the specified task in {word_limit} words or less. Do not add anything else."""
)
task_specifier_template = HumanMessagePromptTemplate.from_template(template=task_specifier_prompt)
task_specify_agent = CAMELAgent(task_specifier_sys_msg, ChatOpenAI(temperature=1.0))
task_specifier_msg = task_specifier_template.format_messages(assistant_role_name=assistant_role_name,
                                                             user_role_name=user_role_name,
                                                             task=task, word_limit=word_limit)[0]
specified_task_msg = task_specify_agent.step(task_specifier_msg)
print(f"Specified task: {specified_task_msg.content}")
specified_task = specified_task_msg.content

具体化されたタスク:市場の風景を調査・分析して、未開拓の機会を発見し、新興のトレンドを活用して、ニッチな層にターゲットを絞ったユニークなビジネスモデルを大規模言語モデルを使って開発することで、利益を上げて持続可能な新事業を立ち上げる。

Specified task: Research and analyze the market landscape to discover untapped opportunities, then use large language models to develop unique business models that leverage emerging trends and target niche audiences, ultimately resulting in a profitable and sustainable new venture.

では続けて行ってみましょう。

残りのコードをコピペして実行する

ドキュメントのコードのままだと、対話が長く続くとトークンオーバーでエラーになってしまうので、雑に直近10件までの会話を保持するように変更しています。

class CAMELAgent:
    def __init__(
        self,
        system_message: SystemMessage,
        model: ChatOpenAI,
    ) -> None:
        self.system_message = system_message
        self.model = model
        self.init_messages()

    def reset(self) -> None:
        self.init_messages()
        return self.stored_messages

    def init_messages(self) -> None:
        self.stored_messages = [self.system_message]

    def update_messages(self, message: BaseMessage) -> List[BaseMessage]:
        if len(self.stored_messages) == 10:
            self.stored_messages.pop(0)
        self.stored_messages.append(message)
        return self.stored_messages

    def step(
        self,
        input_message: HumanMessage,
    ) -> AIMessage:
        messages = self.update_messages(input_message)

        output_message = self.model(messages)
        self.update_messages(output_message)

        return output_message

あとはドキュメントのコードをJupyter Notebookにコピペしていくだけの作業なので記事では割愛します。

そして実行した結果、出力されたのが以下のような対話でした。全て英語で出力されるので日本語訳してお送りします↓

プログラマ
指示:市場の風景で新興のトレンドのリストを調査して作成してください。 入力:なし

起業家パイセン
解決策:市場の風景で新興のトレンドのリストを調査して作成するために、業界レポートや市場調査会社、オンラインデータベースなどさまざまな情報源からのデータを大規模言語モデルを使って分析します。分析に基づいて、電子商取引の急成長や持続可能な製品への需要増加、ギグエコノミーの拡大などのトレンドを特定します。これらの新興トレンドの包括的なリストを作成し、それぞれのトレンドの簡単な説明を提供します。

プログラマ
指示:特定した新興トレンドに基づいてターゲットにできる潜在的なニッチな層を特定してください。
入力:前のステップで作成した新興トレンドのリスト。

起業家パイセン
解決策:特定した新興トレンドに基づいて、ターゲットにできる潜在的なニッチな層を特定します。例えば、電子商取引の急成長に伴い、技術に習熟していない高齢者や店舗での買い物を好む人たちが潜在的なニッチな層となるでしょう。持続可能な製品への需要増加に伴い、環境に配慮した製品にプレミアムを払う意志のある消費者が潜在的なニッチな層となるでしょう。ギグエコノミーの拡大に伴い、フリーランスや独立請負業者で、仕事を効率的に管理するための特化したツールやリソースが必要な人たちが潜在的なニッチな層となるでしょう。これらの潜在的なニッチな層のリストを作成し、それぞれの層の簡単な説明を提供します。

(2021年時点の新興トレンド感がありますね。ちゃんとした新興トレンドを入力しておけばもっと有益な情報を返してくれそうな気がします)

プログラマ
指示:新興トレンドを活用し、特定されたニッチな層にターゲットを絞ったユニークなビジネスモデルを開発してください。
入力:前のステップで作成した新興トレンドと潜在的なニッチな層のリスト。

起業家パイセン
解決策:新興トレンドを活用し、特定されたニッチな層にターゲットを絞ったユニークなビジネスモデルを開発するために、創造性とデータに基づいた洞察を組み合わせて使用します。例えば、店舗での買い物を好む高齢者向けの潜在的なニッチな層に対して、顧客に個別の支援やガイダンスを提供するオンラインとオフラインのハイブリッドなショッピング体験がユニークなビジネスモデルとなるでしょう。環境に配慮した製品を求める潜在的なニッチな層に対して、定期的にエコフレンドリーな製品を提供するサブスクリプションベースのサービスがユニークなビジネスモデルとなるでしょう。フリーランスや独立請負業者向けの潜在的なニッチな層に対して、仕事を効率的に管理するための特化したツールやリソースを提供するプラットフォームがユニークなビジネスモデルとなるでしょう。特定されたニッチな層ごとに詳細なビジネスモデルを開発し、市場の風景での新興トレンドを活用することを確認します。

(ビジネスモデルを作ってくれと言っているのに、なかなか作ってくれないなぁ。。)

プログラマ
指示:開発した各ビジネスモデルの利益性と持続可能性を評価してください。
入力:前のステップで開発した詳細なビジネスモデル。

起業家パイセン
解決策:開発した各ビジネスモデルの利益性と持続可能性を評価するために、市場、競争、および財務見通しの徹底的な分析を行います。データに基づいた洞察を使用して、各ビジネスモデルの潜在的な収益源、コスト、利益性を決定します。また、スケーラビリティ、市場需要、長期的な成長の可能性などの要因を考慮して、各ビジネスモデルの持続可能性を評価します。分析に基づいて、潜在的なリスクと課題を特定し、それらを軽減する戦略を開発します。各ビジネスモデルの利益性と持続可能性に関する詳細な報告書を提供します。

(プロンプトでは具体的な話をしろって指示されているのに、いつまでもふわふわしたことを話しておる・・・)

プログラマ
指示:最も利益性と持続可能性のあるビジネスモデルを選択し、その実装に関する詳細な計画を提供してください。
入力:前のステップで提供した各ビジネスモデルの利益性と持続可能性に関する報告書。

起業家パイセン
解決策:各ビジネスモデルの利益性と持続可能性に関する報告書に基づいて、実装するための最も利益性と持続可能性のあるビジネスモデルを選択します。その実装に関する詳細な計画を以下のように提供します。

1. ターゲット層の定義:選択されたビジネスモデルに基づいて、ターゲット層を定義し、彼らにアプローチするマーケティング戦略を開発します。

2. 製品/サービスの提供を開発:ターゲット層のニーズに応え、選択されたビジネスモデルと整合性のある製品/サービスを開発します。

3. チームを構築:ビジネスモデルを効果的かつ効率的に実行できるスキルのある専門家のチームを構築します。

4. 財務計画を作成:収益予測、費用見積もり、資金調達要件を含む財務計画を作成します。

5. ローンチとテスト:製品/サービスの提供を開始し、ターゲット層とテストを行い、フィードバックを収集し、必要に応じて調整を行います。

6. 拡大と成長:製品/サービスの提供のフィードバックとパフォーマンスに基づいて、ターゲット層を広げ、利益性を向上させるためにビジネスモデルを拡大・成長させます。

7. モニタリングと最適化:ビジネスモデルのパフォーマンスを継続的に監視し、長期的な持続可能性と利益性を確保するために最適化します。

この詳細な計画に従って、選択されたビジネスモデルを実装し、利益性と持続可能性を達成します。

プログラマ
他にお手伝いできることはありますか?

起業家パイセン
いいえ、それで今のところはすべてです。ありがとう!

プログラマ
どういたしまして!今後のお手伝いが必要な場合は、遠慮なくお声がけください。素晴らしい一日をお過ごしください!

起業家パイセン
ありがとう、あなたも!

プログラマ
ありがとう!

起業家パイセン
どういたしまして!

プログラマ
さようなら!

起業家パイセン
さようなら!

感想

ビジネスモデルを作ってくれとオーダーしているのにもかかわらず、いかにも本に書いてありそうな杓子定規なアドバイスだけして去っていった起業家パイセンですが、途中で適切な入力をAgentなどを使ってコンテキスト注入すればもっと対応が変わったのかも知れません。

あと、GPT-3.5という知性の限界もありましたね。OpenAIさんはマジでいつになったらGPT-4を使わせてくれるのでしょうか・・・。

対話を見てみると、やはりふわっとした質問にはふわっとしたことしか返さないのがGPTという感じなので、いかに突っ込んだ質問(コンテキストを絞った質問)をできるか、というところがAI同士の対話であってもミソになるなと感じました。対話をいくら続けても、質問の質が上がらないと全くブレイクスルーが起きないということがまざまざと分かる対話ログで、人間同士の会話もそんな感じだよなー、などといったことを感じるのでした。

現場からは以上です。

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