TECHSCORE BLOG

クラウドCRMを提供するシナジーマーケティングのエンジニアブログです。

AutoGenでReflexion - Synergy!の新機能を考える

先日、弊社では社内アイデアソンを開催しました。アイデアソンでは「LLMを用いたSynergy!新機能」というテーマについて、社内のエンジニア達でアイデアを出し合いました。
同じ内容をLLMに考えてもらいたいと思い、AutoGenというライブラリを使って「LLMを用いたSynergy!新機能」を考えるプログラムを作成したので、本記事で紹介します。
プロンプトエンジニアリングの手法であるReflexionを用いて実装しているので、それも含めて紹介します。

想定読者は以下のような人です。

  • LLMについてなんとなく知っている
  • AIエージェントを使って何かしてみたい
  • AutoGenの使用例を知りたい

なお、Synergy!とは弊社のプロダクトであるCRMツールのことです。
Synergy!についてはこちらを参照してください。

AutoGenとは?

AutoGenは、Microsoftが開発したツールで、AIエージェントが互いに協力してタスクを解決できるようにするフレームワークです。
このフレームワークでは、AIエージェントと呼ばれる個々の役割を持ったAIが相互作用し、大規模言語モデル(LLM)によるシステム開発を可能にします。
具体例として、数学の問題解決、コード生成・実行、テキスト環境での意思決定、グループチャット、チェスの対局などがあります。

AutoGenの特徴は以下3点です。

  1. 複数AIエージェントでのやりとり
    • 役割が明確なAIエージェント同士がそれぞれのタスクに集中し、他のAIエージェントとのインタラクティブなコミュニケーションをすることで、質の高いアウトプットが見込めます。
  2. プログラムの生成と実行
    • 任意のAIエージェントが生成したプログラムを他のAIエージェントが実行することが可能です。加えて、Function callingによる既存プログラムの実行も可能で、LLMのみでは解決できないタスクを解決できます。
  3. 人間の介入(Human-in-the-loop)
    • AIエージェント同士のやりとりができるのはもちろんですが、やりとりに人間が介入してフィードバックをすることもでき、柔軟なタスク解決を実現できます。

Reflexionとは?

Reflexionとはプロンプトエンジニアリングの手法です。※Reflectionではないです。
リクエストを受けてLLMが生成したものを評価し、その評価をLLMに渡すことで生成物に対する自己内省を促し、再度LLMに生成させる手法です。

シンプルにフロー化すると以下のようになります。

  1. 生成
    • LLMがテキストやプログラムなどを生成
  2. 評価
    • 生成物を評価
  3. 自己内省
    • 評価を受け、LLMが自身の生成物を自己内省し、再度テキストやプログラムなどを生成

Reflexionの解説:https://www.promptingguide.ai/techniques/reflexion

実装

ここからはPythonで実装をします。
※Pythonのバージョンは3.11を使います。

前準備

まず、.envファイルに以下の環境変数を記述します。

OPENAI_API_KEY="XXXXXXXXXXXXXXXXXXX"

ここからはコードを書いていきます。

import os
import autogen
from dotenv import load_dotenv

load_dotenv(dotenv_path)

llm_config = {
    "model": "gpt-4o",
    "api_key": os.environ["OPENAI_API_KEY"],
    "timeout": 120,
}

AIエージェントとして利用するLLMに関する設定を行います。
先日リリースされた gpt-4o を早速使ってみます。

AIエージェントの作成

ここでは3つのAIエージェントの作成を行っていきます。
※AssistantAgentのsystem_messageはこちらを参考にしています。

user_proxy

user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    code_execution_config=False,
    human_input_mode="TERMINATE",
    max_consecutive_auto_reply=8,
)

AIエージェント同士の会話をコントロールしてくれるAIエージェントで、UserProxyAgentから生成されます。UserProxyAgentは会話のコントロールやコードの実行などを行うためのクラスです。

会話のコントロールをLLMに任せることも可能ですが、人間にフィードバックを求めることでAIエージェント同士の会話に人間が介入することも可能で、デフォルトでは人間が介入する仕様になっています。
今回は自動で会話をしてほしいため、人間にフィードバックは求めないように設定しています。

create_assistant

try:
    with open("Synergy.txt", "r", encoding="utf-8") as file:
        synergy_data = file.read()
except FileNotFoundError:
    print("File not found.")
except Exception as e:
    print(f"An error occurred: {e}")

create_assistant = autogen.AssistantAgent(
    name="create_assistant",
    system_message=f"""You are an create assistant tasked to consider novel and feasible ideas. You try generate the best ideas possible for the user's request. If you receive a critique from a user, respond with a revised version of your previous ideas incorporating the criticism.
    You will write down the ideas and your thinking about the ideas.
    You are familiar with Synergy!, A description of Synergy! is given below, {synergy_data}.
    Please give me at least four ideas, and output them in Japanese.
    """,
    llm_config=llm_config,
)

実際にアイデアを考えてくれるAIエージェントです。
system_messageで、このエージェントの役割を設定するプロンプトを記述します。
役割に加えて、ファイルから読み込んだSynergy!の製品データもプロンプトに渡しています。

reflection_assistant

reflection_assistant = autogen.AssistantAgent(
    name="reflection_assistant",
    system_message="Generate critique and recommendations on the generated ideas by create_assistant. Provide detailed recommendations, including requests for down-to-earth and practical, limited thinking related to Synergy!, devise feasible, cost-effective, etc..",
    llm_config=llm_config,
)

生成されたアイデアを評価し、批判してくれるAIエージェントです。
create_assistantが生成したアイデアを評価してほしいので、次の項目ではそのためのReflexionのフローを設計していきます。

フロー設計

def reflection_message(recipient, messages, sender, config):
    print("Reflecting...")
    return f"Reflect and provide critique on the following writing. \n\n {recipient.chat_messages_for_summary(sender)[-1]['content']}"


nested_chat_queue = [
    {
        "recipient": reflection_assistant,
        "message": reflection_message,
        "max_turns": 1,
    },
]

user_proxy.register_nested_chats(
    nested_chat_queue,
    trigger=create_assistant,
)

Reflexionのフローを設計するために以下の設定を行います。

  1. reflection_assistantを呼び出すようにnested_chat_queueを設定
    • max_turnsを設定することで、会話を何回続けるのか上限を定めることが可能
  2. user_proxyに、create_assistantが呼ばれたらnested_chat_queueを呼び出すように設定を追加

会話の開始

user_proxy.initiate_chat(
    create_assistant,
    message=f"""
    Develop new features devise feasible, cost-effective and practical features using LLM (Large Language Model) for Synergy! that meet #requirement.
    
    #requirement
    1. Please be very aware that we are not using AI, but LLM!.
    2. Need to do some limited thinking related to Synergy! with features.
    3. New ideas, but down-to-earth and practical, functions that others have not thought of but are effective.
    4. Do your own thinking that you deem valid, not generally valid measures!.
    5. Never propose a feature that uses AI data analysis, learning, etc. Limit feature ideas to what can be achieved with LLM.
    """,
    max_turns=2,
)

このコードを実行すると会話が始まります。この設定の場合、user_proxyがcreate_assistantとの会話を始め、自動的に会話が進んでいきます。
messageには「LLMを用いたSynergy!新機能」を考えてほしいことと、生成するアイデアの条件を記述したプロンプトを渡しています。

実行結果

create_assistantが最初に生成した結果と批判を受けてから生成した結果を記載します。

最初に生成したアイデア


create_assistant (to user_proxy):
わかりました。以下にSynergy!におけるLLM(大規模言語モデル)を利用した新機能アイデアをご提案します。これらの機能はAIデータ分析や学習を利用せず、LLMの自然言語処理能力を活用した現実的で費用対効果の高いものです。

顧客コメント自動分類機能

概要: 顧客からのフィードバックやアンケート結果を自然言語で自動的に分類する機能。
機能詳細:

  • 顧客からの自由回答を自然言語処理で分析し、ポジティブ、ネガティブ、要望などに自動分類。
  • 分類結果はリアルタイムでCRMデータベースに追加され、マーケティング戦略の立案に利用可能。

利点: フィードバックの迅速な活用、顧客のニーズの迅速な把握、マーケティング施策の強化。

批判を受けてから生成したアイデア


create_assistant (to user_proxy):

フィードバックを基に、さらに強化した新機能アイデアを以下に提案します。

顧客コメント自動分類機能

概要: 顧客からのフィードバックやアンケート結果を自然言語で自動的に分類する機能。
機能詳細:

  • 顧客からの自由回答を自然言語処理で分析し、ポジティブ、ネガティブ、要望などに自動分類。
  • 分類結果はリアルタイムでCRMデータベースに追加され、マーケティング戦略の立案に利用可能。
  • 分類結果の透明性を確保し、手動での修正も可能。
  • 定期的に品質管理とテストで分類アルゴリズムの精度を向上。
  • 分類結果の査定や修正を簡単に行えるインターフェースを提供し、結果の信頼性を高める。

利点: フィードバックの迅速な活用、顧客のニーズの迅速な把握、マーケティング施策の強化。

批判を受けてから生成したアイデアの方が具体的でユニークな結果となっていますね。

まとめ

今回は、AutoGenを使ってReflexionの実装を行いました。
最初に生成された結果を批判し、再度アイデアを生成することで、クオリティの高いものが生成されることが確認できました。

ただ、期待するアイデアとしてはまだまだなので、プロンプトを改良したり、読み込むテキストの質を上げたりして、改善を続けていこうと思います。

AutoGenではAIエージェント同士の会話だけでなく、プログラムの実行やFunction callingなども可能なので是非試してみてください!

森永 泰隆(モリナガ ヤスタカ)

新卒2年目のエンジニア。最近はLLM関連のものに興味があります。


シナジーマーケティング株式会社では一緒に働く仲間を募集しています。