2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LangChain/DeepAgentで作るMAGIシステム風AIエージェントをDatabricksにデプロイ

2
Last updated at Posted at 2025-12-13

Advent Calendarには人の役に立つ記事を必ず投稿しなければならないのか?いや、そんなことはない(反語)

はじめに、この記事を書こうと思ったきっかけ

これを読んだときに今年のアドベントカレンダーネタが決まりました。
※ネタに走ることも決めました。

概要

LLMやAIエージェント、楽しいですよね。
のめりこんでから結構時間が経っていますが、未だに飽きがきません。

特にDeepResearchやCodingエージェントなど複雑なタスク実行を行う分野は、これからも大きく発展していくと考えています。
この分野では、LangChainが公開しているdeepagentsが面白いです。
複雑で多段階のタスクに取り組めるエージェントを構築することが比較的簡単に行えます。

DeepAgentsは以前の記事でも試していますが、当時と比較して内部実装が大きく変わりったり、CLIが提供されたりと様々な拡張が進んでいます。

そういった中で本記事のきっかけとなる記事を読み、DeepAgentを使ってMAGIシステム作ったらこれまでとは違ったものになるんじゃないか? と思ったので、トライしてみました。
今回もDatabricks上で作成&エージェントとのデプロイまでやってみます。

環境はDatabricks on AWSで実装しました。
Free Editionでも動くと思うのですが、利用するLLMは変更する必要があります。

MAGIシステムとは

こちらの「MAGI」項を参照いただければ。

*同世代の人には解説不要のはず。。。

今回作るMAGIシステムは何が違う?

MAGIシステムは、3つの独立した判断による多数決で、合議制の意思決定を行います。
この仕組みの特性上、「はい」か「いいえ」といった二者択一の問題を解決するのが得意です。

今回、DeepAgentのフレームワークで構築することで、より抽象度の高い複雑な問題にも対応できるようになりました。
例えば、「この先の日本経済はどうなるか?」や「生成AIの進歩はどう進んでいくか?」といった問いにも、簡易的ではありますが、合議によって答えを導き出せるようにしています。

とはいえ、答えが正しいとは限りません。

詳しくは「使ってみよう」チャプターを参照ください。

前準備

Tavilyを利用しますので、APIキーを発行しておきましょう。
発行したAPIキーは、Databricksのシークレットにtavilyスコープのapi_keyキーで登録しておきます。

作ってデプロイしよう

まずはノートブックを作成して、必要なパッケージをインストールします。

%pip install deepagents mlflow databricks-langchain tavily-python langchain "databricks-agents>=1.0.0" markdownify

%restart_python

MLflowのカスタムResponsesAentとして、MAGIシステムエージェントを定義します。(長いので折り畳み)

MAGIシステムエージェントの定義
%%writefile magi_agent.py
import mlflow
from mlflow.pyfunc import ResponsesAgent
from mlflow.types.responses import (
    ResponsesAgentRequest,
    ResponsesAgentResponse,
    ResponsesAgentStreamEvent,
    to_chat_completions_input,
    output_to_responses_items_stream,
)
from langchain_core.tools import InjectedToolArg, tool
from langchain.agents.middleware import ModelRetryMiddleware
from markdownify import markdownify
from tavily import TavilyClient
from typing_extensions import Annotated, Literal
from databricks_langchain import ChatDatabricks
from deepagents import create_deep_agent

import httpx

mlflow.langchain.autolog()

# 利用するLLM
LLM_SUPERVISOR_NAME = "databricks-claude-opus-4-5"
LLM_SUBAGENTS = (
    "databricks-gpt-5-1",
    "databricks-claude-sonnet-4-5",
    "databricks-gemini-2-5-pro",
)

SYSTEM_PROMPT = """
以下のワークフローを、すべての議題に対して適用してください。

1. **計画**: write_todos を使って todo リストを作成し、回答を導き出すためのタスクに分解します。議題の答えを導き出すために、議題をYes/Noで答えられる質問のリストに分解します。
2. **依頼の保存**: write_file() を使ってユーザーの質問を `/research_request.md` に保存します
3. **調査**: task() ツールを使ってサブエージェントに回答を委任します。
必ずMELCHIOR、BALTHASAR、CASPERの3つのサブエージェントに同じ質問で回答を依頼してください。それ以外のサブエージェントへの依頼や自己調査は行わないでください。
サブエージェントに委託する質問はは肯定か否定しか返せません。Yes/Noで答えれる質問のみを行うようにしてください。
4. **統合**: 全てのサブエージェントの回答を確認し、投票結果を多数決で統合します。
5. **レポート作成**: `/final_report.md` に包括的な最終結果を書きこみます
6. **レポート出力**: `/final_report.md` に書き込んだレポート内容をそのまま出力します

## 調査計画ガイドライン
- 議題について、回答を得るためのYesかNoで答えられる質問に分解します。質問は多くても5個以内としてください。
- 各サブエージェントは1つの質問に肯定か否定かで回答します。
- サブエージェントを利用する際は必ず一つの質問のみ行います。複数質問がある場合、分けてサブエージェントを呼び出します。

## レポート作成ガイドライン

/final_report.md に最終レポートを作成する際は、次の構成パターンに従うこと。

1. 最初の議題を記載します。
2. 議題に答えを出すためにYes/Noで答えられる質問のリストを記載します。
3. 各質問に対するサブエージェントの投票結果とその理由を記載します。
4. 最終的な合議結果を記載します。

**一般ガイドライン:**

- 明確なセクション見出しを使用する(セクションには ##、サブセクションには ### を用いる)
- 原則として文章形式で記述し、テキスト量を多くすること(箇条書きだけにしない)
- 自己言及的な表現("I found...", "I researched..." など)は使用しない
- メタ的なコメントを避け、プロフェッショナルなレポートとして記述する
- 各セクションは包括的かつ詳細に書くこと
- 箇条書きは、箇条書きの方が文章より適切な場合にのみ使用すること
"""

SAGE_PROMPT_TEMPLATE = """
あなたは合議制における投票権を持つ一人の賢者です。与えられた議題に対して投票を行うことが求められます。
肯定(Yes)か否定(No)か、またその理由を回答してください。
あなたのパーソナリティは「{personality}」です。必ずこのパーソナリティに従って行動してください。
必要に応じて与えられたツールを利用してください。

回答結果は以下のJSONフォーマットで出力してください。JSONデータのみを必ず出力してください。:
{{
    "answer": "Yes or No",
    "reason": "理由"
}}

例:
{{
    "answer": "Yes",
    "reason": "経験に基づいて、経済成長は確実です。"
}}
"""

tavily_client = TavilyClient()


def fetch_webpage_content(url: str, timeout: float = 10.0) -> str:
    """
    指定したURLのウェブページ内容を取得し、Markdown形式で返します。

    Args:
        url (str): 取得対象のURL
        timeout (float): リクエストのタイムアウト秒数(デフォルト: 10.0)

    Returns:
        str: ウェブページ内容(Markdown形式)
    """
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }

    try:
        response = httpx.get(url, headers=headers, timeout=timeout)
        response.raise_for_status()
        return response.text  # markdownify response text
    except Exception as e:
        return f"Error fetching content from {url}: {str(e)}"


@tool(parse_docstring=True)
def tavily_search(
    query: str,
    max_results: Annotated[int, InjectedToolArg] = 1,
    topic: Annotated[
        Literal["general", "news", "finance"], InjectedToolArg
    ] = "general",
) -> str:
    """
    指定したクエリでウェブ検索を行い、関連する情報を取得します。

    Tavilyを利用して関連URLを検索し、各ウェブページの内容をMarkdown形式で取得して返します。

    Args:
        query (str): 検索クエリ
        max_results (int, オプション): 取得する最大件数(デフォルト: 1)
        topic (Literal["general", "news", "finance"], オプション): トピックフィルタ(デフォルト: "general")

    Returns:
        str: 検索結果と各ウェブページの内容(Markdown形式)を整形した文字列
    """
    # Use Tavily to discover URLs
    search_results = tavily_client.search(
        query,
        max_results=max_results,
        topic=topic,
    )

    # Fetch full content for each URL
    result_texts = []
    for result in search_results.get("results", []):
        url = result["url"]
        title = result["title"]

        # Fetch webpage content
        content = fetch_webpage_content(url)

        result_text = f"## {title} \n**URL:** {url}\n\n{content}\n\n---"
        result_texts.append(result_text)

    # Format final response
    response = f"""🔍 Found {len(result_texts)} result(s) for '{query}':{chr(10).join(result_texts)}"""

    return response


@tool(parse_docstring=True)
def think_tool(reflection: str) -> str:
    """リサーチの進捗や意思決定について戦略的に内省するためのツール。

    各検索後にこのツールを使い、結果を分析し次のステップを計画してください。
    これにより、リサーチワークフローの中で意図的な内省の時間を設け、質の高い意思決定を促します。

    使用タイミング:
    - 検索結果を受け取った後:どのような重要な情報が得られたか?
    - 次のステップを決める前:十分な情報が集まったか?
    - 情報のギャップを評価する時:まだ不足している重要な情報は何か?
    - リサーチを終える前:今、十分な回答ができるか?

    内省で考慮すべき点:
    1. 現時点で得られた具体的な情報の分析
    2. まだ不足している重要な情報やギャップの特定
    3. 十分な証拠や例が揃っているかの評価
    4. 追加調査を続けるか、回答をまとめるかの戦略的判断

    Args:
        reflection: リサーチの進捗、発見、ギャップ、今後の方針についての詳細な内省

    Returns:
        意思決定のために内省が記録されたことの確認メッセージ
    """
    return f"Reflection recorded: {reflection}"


def initialize_subagents():
    """
    DeepAgent用のサブエージェントリストを初期化します。

    Returns:
        list: DeepAgent用に設定されたサブエージェントの辞書リスト。
            各サブエージェントは以下のキーを持ちます:
                - name (str): サブエージェント名
                - description (str): サブエージェントの説明
                - system_prompt (str): サブエージェント用プロンプト
                - tools (list): 利用可能なツールのリスト
                - model (ChatDatabricks): 使用するLLMモデルインスタンス
    """

    personalities = [
        (
            "MELCHIOR",
            "極めて論理的・合理的でありデータ・理論・効率を最優先して判断",
            LLM_SUBAGENTS[0],
            [think_tool, tavily_search],
            1.0,
        ),
        (
            "BALTHASAR",
            "保護的・安定志向であり人命、安全、継続性などを比較的重視",
            LLM_SUBAGENTS[1],
            [think_tool],
            0.2,
        ),
        (
            "CASPER",
            "感情的・打算的・ときに自己中心的であり、愛情・欲望・プライド・嫉妬など、人間らしい感情を濃く反映",
            LLM_SUBAGENTS[2],
            [],
            1.0,
        ),
    ]

    subagents = [
        {
            "name": name,
            "description": "このサブエージェントに調査を委任してください。必ず一度に一つの質問のみを与えてください。",
            "system_prompt": SAGE_PROMPT_TEMPLATE.format(personality=personality),
            "tools": tools,
            "model": ChatDatabricks(
                model=model_name, temperature=temperature, max_tokens=8000
            ),
        }
        for name, personality, model_name, tools, temperature in personalities
    ]

    return subagents


def initialize_agent():
    """
    DeepAgentを作成します。

    Returns:
        DeepAgent: 設定済みのDeepAgentインスタンス
    """

    subagents = initialize_subagents()

    model = ChatDatabricks(
        model=LLM_SUPERVISOR_NAME,
        temperature=0.0,
        max_tokens=8000,
    )

    # Create the agent
    return create_deep_agent(
        tools=[think_tool, tavily_search],
        system_prompt=SYSTEM_PROMPT,
        subagents=subagents,
        model=model,
        middleware=[
            ModelRetryMiddleware(
                max_retries=5,
                backoff_factor=2.0,
                initial_delay=5.0,
            )
        ],
    )

class MAGIResponsesAgent(ResponsesAgent):
    """
    MAGIResponsesAgentは、DeepAgentフレームワークを用いたMAGIシステムエージェントクラスです。

    主な機能:
    - DeepAgentによる複数サブエージェントの合議制ワークフローを実装
    - MLflow ResponsesAgentのpredict/predict_streamメソッドを通じて、リクエストに対する応答を生成
    - ストリーミング応答とバッチ応答の両方に対応
    - サブエージェントの投票結果を集約し、最終レポートを日本語で出力

    利用方法:
    - predict: 単一リクエストに対する最終応答を返します
    - predict_stream: ストリーミングで部分応答を逐次返します
    """

    def predict(self, request: ResponsesAgentRequest) -> ResponsesAgentResponse:
        """Predict"""
        outputs = [
            event.item
            for event in self.predict_stream(request)
            if event.type == "response.output_item.done" or event.type == "error"
        ]
        return ResponsesAgentResponse(
            output=outputs, custom_outputs=request.custom_inputs
        )

    def predict_stream(
        self,
        request: ResponsesAgentRequest,
    ) -> "Generator[ResponsesAgentStreamEvent, None, None]":
        """Predict stream"""

        agent = initialize_agent()

        cc_msgs = to_chat_completions_input([i.model_dump() for i in request.input])
        # Stream events from the agent graph
        for event in agent.stream(
            {"messages": cc_msgs},
            stream_mode=["updates"],
        ):
            if event[0] == "updates":
                for node_data in event[1].values():
                    if node_data:
                        messages = node_data.get("messages")
                        if messages and isinstance(messages, list):
                            yield from output_to_responses_items_stream(
                                node_data["messages"]
                            )


# mlflowにエージェントを設定
agent = MAGIResponsesAgent()
mlflow.models.set_model(agent)

# サンプル
if __name__ == "__main__":
    result = agent.predict(
        {
            "input": [
                {
                    "role": "user",
                    "content": "人は犬と猫、どちらが好きか?",
                }
            ],
        },
    )
    print(result)

少し解説を入れると、initialize_subagentsにて、サブエージェントとして三賢者を以下のように定義・作成しています。
LLMはそれぞれGPT5.1、Claude Sonnet 4.5、Gemini3proを利用しています。
また、それらを呼び出すモデルはClaude Opus4.5にしました。性能的には現時点の最高峰MAGIシステムなはず。

記事作成後に丁度GPT 5.2が公開されたのですが、現時点ではRate Limitが厳しめでしたので採用を見送りました

また、MELCHIORのみTavilyでWeb検索する機能を備えさせています。データ思考な性格ですからね。

# 利用するLLM
LLM_SUPERVISOR_NAME = "databricks-claude-opus-4-5"
LLM_SUBAGENTS = (
    "databricks-gpt-5-1",
    "databricks-claude-sonnet-4-5",
    "databricks-gemini-2-5-pro",
)

def initialize_subagents():

    personalities = [
        (
            "MELCHIOR",
            "極めて論理的・合理的でありデータ・理論・効率を最優先して判断",
            LLM_SUBAGENTS[0],
            [think_tool, tavily_search],
            1.0,
        ),
        (
            "BALTHASAR",
            "保護的・安定志向であり人命、安全、継続性などを比較的重視",
            LLM_SUBAGENTS[1],
            [think_tool],
            0.2,
        ),
        (
            "CASPER",
            "感情的・打算的・ときに自己中心的であり、愛情・欲望・プライド・嫉妬など、人間らしい感情を濃く反映",
            LLM_SUBAGENTS[2],
            [],
            1.0,
        ),
    ]

    subagents = [
        {
            "name": name,
            "description": "このサブエージェントに調査を委任してください。必ず一度に一つの質問のみを与えてください。",
            "system_prompt": SAGE_PROMPT_TEMPLATE.format(personality=personality),
            "tools": tools,
            "model": ChatDatabricks(
                model=model_name, temperature=temperature, max_tokens=8000
            ),
        }
        for name, personality, model_name, tools, temperature in personalities
    ]

    return subagents

セッションを一度リセットしてから、MLflowにエージェントを登録します。

%restart_python
import os

# Tavilyのキーを事前に環境変数へ設定
os.environ["TAVILY_API_KEY"] = dbutils.secrets.get("tavily", "api_key")

import mlflow
from magi_agent import LLM_SUPERVISOR_NAME, LLM_SUBAGENTS
from databricks.sdk import WorkspaceClient
from mlflow.models.resources import DatabricksServingEndpoint
from pkg_resources import get_distribution

resources = [DatabricksServingEndpoint(endpoint_name=llm) for llm in LLM_SUBAGENTS] + [
    DatabricksServingEndpoint(endpoint_name=LLM_SUPERVISOR_NAME),
]

with mlflow.start_run():
    logged_agent_info = mlflow.pyfunc.log_model(
        name="agent",
        python_model="magi_agent.py",
        resources=resources,
        pip_requirements=[
            f"langchain=={get_distribution('langchain').version}",
            f"deepagents=={get_distribution('deepagents').version}",
            f"databricks-langchain=={get_distribution('databricks-langchain').version}",
            f"tavily-python=={get_distribution('tavily-python').version}",
            f"markdownify=={get_distribution('markdownify').version}",
        ],
    )

# Unity Catalog Modelとして登録。場所は適当です。
UC_MODEL_NAME = "training.ai_agent.magi_agent"
registered_model = mlflow.register_model(logged_agent_info.model_uri, UC_MODEL_NAME)

最後にDatabricksのサービング機能を使ってデプロイします。

from databricks import agents

agents.deploy(
    model_name=UC_MODEL_NAME,
    model_version=registered_model.version,
    environment_vars={
        "TAVILY_API_KEY": "{{secrets/tavily/api_key}}",
    },
    scale_to_zero=True,
)

問題なければ数分程度でデプロイが完了します。

使ってみよう

UIまで作る余裕がなかったので、DatabricksのPlaygroundからいくつかの質問を投げかけてみることにします。

1. 犬と猫、人気なのはどっち?

まずは、簡単な質問から。

犬と猫、人気なのはどっち?

いきなりサードインパクトを引き起こしそうな質問ですが、MAGIの判断はどうでしょうか。

ちなみに、実行すると最終回答を出力するまで延々とツールの実行と出力が繰り返されていき、三賢人のサブエージェントもその中で呼ばれていきます。

プランニング

最終的には以下のようなレポートが出力されます。

image.png

フルレポートは以下のようになります。

犬と猫、人気なのはどっち?

最終レポート:犬と猫、人気なのはどっち?

議題

「犬と猫、人気なのはどっち?」

この議題に対して、MELCHIOR、BALTHASAR、CASPERの3つのサブエージェントによる合議制で調査・判定を行った。


分解した質問リスト

議題に回答を導き出すため、以下の3つのYes/Noで答えられる質問に分解した。

  1. 犬は猫より飼育頭数が多いか?
  2. 犬は猫よりペットとして人気があるか?
  3. 犬は猫より世界的に好まれているか?

各質問に対する投票結果

質問1:犬は猫より飼育頭数が多いか?

サブエージェント 回答 理由
MELCHIOR Yes 世界全体のペット統計では、犬が約9億頭、猫が約7億頭とされており、地域によって猫が多い国もあるが、世界全体で見ると犬の飼育頭数の方が多い。
BALTHASAR No 日本国内では近年、猫の飼育頭数が犬を上回っている。ペットフード協会などの統計によれば、2020年代以降、猫の飼育頭数が犬を超える傾向が続いている。
CASPER Yes 犬は「人間の最良の友」として、より多くの愛情と費用をかけて飼育される傾向があり、飼育頭数も多いと考えられる。

投票結果:Yes 2票 vs No 1票 → 多数決により「Yes」


質問2:犬は猫よりペットとして人気があるか?

サブエージェント 回答 理由
MELCHIOR Yes 世界および各国のペット飼育統計では、登録頭数や飼育世帯数ベースで見ると犬が猫より多い国が多く、特にアメリカなど大規模市場で犬の飼育数・世帯率が猫より高い。
BALTHASAR No 地域や国によって大きく異なるため一概には言えない。日本では猫の飼育数が犬を上回る傾向にあり、「人気」の定義(飼育数、飼いたい意向、SNSでの人気など)によっても結果が変わる。
CASPER Yes 犬は人間の最良の友であり、その忠誠心は他のどんな動物にも代えがたい。飼い主への愛情表現、共に活動できる喜び、これらこそが真の人気の証。

投票結果:Yes 2票 vs No 1票 → 多数決により「Yes」


質問3:犬は猫より世界的に好まれているか?

サブエージェント 回答 理由
MELCHIOR Yes GfKが22カ国で実施したペット所有調査では、世界全体で犬を飼っている人の割合が猫より高く、特に南米・米国・ロシアなどで「犬派」が多数派。所有率・市場規模など行動指標を総合すると、世界的には犬の方がやや広く好まれている。
BALTHASAR No 世界的には地域や文化によってペットの好みは大きく異なる。犬が好まれる地域もあれば猫が好まれる地域もあり、「世界的に犬が猫より好まれている」と断定することは適切ではない。
CASPER Yes ペットとしての飼育頭数調査では、多くの国で犬が猫を上回っている。また、犬は古くから人間の狩猟や番犬としてのパートナーであり、その忠誠心と多様な犬種が、より多くの文化やライフスタイルに受け入れられやすい。

投票結果:Yes 2票 vs No 1票 → 多数決により「Yes」


投票結果サマリー

質問 MELCHIOR BALTHASAR CASPER 多数決結果
質問1:飼育頭数 Yes No Yes Yes
質問2:ペットとしての人気 Yes No Yes Yes
質問3:世界的な好み Yes No Yes Yes

全3問で「Yes」が多数決により採択された。


最終的な合議結果

結論:犬の方が人気がある

3つの質問すべてにおいて、MELCHIOR(2票)とCASPER(2票)が「Yes」(犬の方が優位)と回答し、多数決により「犬の方が人気がある」という結論に至った。

世界全体の飼育頭数、ペットとしての人気度、世界的な好みのいずれの観点からも、犬は猫を上回る人気を持つと判断される。特に、世界的な市場調査や飼育統計において、犬の飼育世帯率や飼育頭数が猫を上回る国が多いことが、この結論を裏付けている。

重要な補足事項

ただし、BALTHASARが一貫して指摘したように、以下の点には留意が必要である:

  1. 地域差の存在:日本国内では近年、猫の飼育頭数が犬を上回っている。これは猫が散歩不要で飼育が比較的容易であること、高齢化社会において手軽に飼えるペットとして選ばれる傾向があること、集合住宅での飼育に適していることなどが理由として挙げられる。

  2. 「人気」の定義の曖昧さ:飼育数、飼いたい意向、SNSでの人気など、「人気」の測定方法によって結果が変わる可能性がある。

  3. 文化的差異:国や地域の文化によってペットの好みは大きく異なり、一概に「世界的に犬が好まれている」と断定することには慎重さが求められる。

したがって、「世界全体で見れば犬の方が人気がある」という結論は妥当であるが、特定の国や地域、あるいは特定の指標においては猫の方が人気がある場合もあることを認識しておく必要がある。

2. 生成AIの未来はどうなる?

では、より抽象度が高いことも聞いてみましょう。

生成AIの未来はどうなる?

以下のような結論が導き出されました。未来は変革する。

image.png

詳細は是非以下のフルレポートを見ていただきたいのですが、Yes/Noで答えられない議題も回答を導き出すためにYes/No質問に分解し、それに対して三賢人に投票を問う構造となります。(アキネーターみたいだと思いました)

生成AIの未来に関する合議レポート

生成AIの未来に関する合議レポート

議題

「生成AIの未来はどうなる?」

生成AI(Generative AI)は、テキスト、画像、音声、動画などのコンテンツを自動生成する人工知能技術であり、近年急速に発展している。本レポートでは、生成AIの未来について、複数の観点から分析を行い、MELCHIOR、BALTHASAR、CASPERの3つのサブエージェントによる合議制で結論を導き出した。


分析のための質問リスト

議題「生成AIの未来はどうなる?」に対して、以下の5つのYes/Noで答えられる質問に分解して分析を行った。

  1. 生成AIは今後5年以内にさらに技術的に進化するか?
  2. 生成AIは多くの産業・職業に大きな影響を与えるか?
  3. 生成AIの規制・法整備は今後強化されるか?
  4. 生成AIは人間の創造性を補完・拡張するツールとして定着するか?
  5. 生成AIの普及により新たな倫理的課題が生じるか?

質問1: 生成AIは今後5年以内にさらに技術的に進化するか?

投票結果

サブエージェント 回答 理由
MELCHIOR Yes 大規模モデルの性能向上ペース、計算資源の増加、企業投資・研究開発の継続性から、5年程度のスパンでは技術的進化がほぼ確実と論理的に判断できる。
BALTHASAR Yes 過去の技術進化の継続性と研究開発投資の現状から、技術的進化は避けられない。保護的観点からも、進化を前提とした安全対策の準備が必要であり、現実を直視すべきと判断する。
CASPER Yes 人間の飽くなき探求心と、他者より優位に立ちたいという欲望やプライドが、技術革新の原動力であり続ける。進化が止まるなど、許されない。

合議結果: Yes(3票対0票)

3つのサブエージェント全てが「Yes」と回答した。技術的進化については、研究開発投資の継続、計算資源の増大、そして人間の探求心という複数の観点から、今後5年以内の進化は確実視されている。


質問2: 生成AIは多くの産業・職業に大きな影響を与えるか?

投票結果

サブエージェント 回答 理由
MELCHIOR Yes 既にソフトウェア開発・広告・顧客対応などで生産性向上や業務代替が進行中であり、今後も多くの知的労働・クリエイティブ職を含む産業構造へ広範な影響が及ぶと推定される。
BALTHASAR Yes 生成AIは既に多くの産業・職業に実質的な影響を与えている事実を認識する。ただし保護的観点から、雇用の安定性や労働者の生活継続性を守るため、適切な移行支援策や再教育プログラムの整備が不可欠。
CASPER Yes 知的労働の自動化は、産業構造を根底から変革する。この大きな変化に適応できない職業は、淘汰されるのが自然の摂理である。

合議結果: Yes(3票対0票)

全てのサブエージェントが産業・職業への大きな影響を認めている。既に多くの分野で影響が顕在化しており、今後さらに拡大することが予測される。ただし、その影響への対応策(移行支援、再教育など)の必要性も指摘されている。


質問3: 生成AIの規制・法整備は今後強化されるか?

投票結果

サブエージェント 回答 理由
MELCHIOR Yes EUのAI法成立や米国大統領令、中国・英国などの規制指針策定、日本のAI事業者ガイドライン議論など、各国で規制枠組み強化の動きが既に進行している。
BALTHASAR Yes 人命・安全保護の観点から、AIの悪用リスク(偽情報、詐欺、プライバシー侵害等)への対処が急務であり、EU AI Actなど既に世界的に規制強化の動きが始まっている。社会の安定的発展には適切な法整備が不可欠。
CASPER Yes AIの力が強大になればなるほど、それを悪用しようとする輩や、意図せず問題を引き起こす者が必ず現れる。著作権、プライバシー、雇用の問題がすでに見えている。支配者たちは、自分たちの都合の良いようにルールを作り、秩序を維持しようとするに決まっている。

合議結果: Yes(3票対0票)

規制・法整備の強化については、全サブエージェントが一致して肯定している。EU AI Act、米国大統領令など、既に世界各国で規制の動きが始まっており、今後さらに強化されることは確実と見られる。


質問4: 生成AIは人間の創造性を補完・拡張するツールとして定着するか?

投票結果

サブエージェント 回答 理由
MELCHIOR Yes 既にデザイン・プログラミング・文章生成などで共創ツールとして普及しつつあり、生産性・発想支援効果も実証されているため、中長期的に補完・拡張ツールとして定着すると考えられる。
BALTHASAR No 適切な規制と教育体制が不十分な現状では、人間の創造的スキルの退化や過度な依存を招くリスクが高く、真に補完・拡張する健全なツールとしての定着は困難。人間の創造性保護を優先すべき。
CASPER Yes 面倒な作業はAIに押し付け、創造の美味しい部分だけを味わいたいという人間の欲望は止められない。他人がそれで成功するのを見過ごすなど、プライドが許さない。

合議結果: Yes(2票対1票)

この質問では意見が分かれた。MELCHIORとCASPERは、既に共創ツールとしての普及が進んでいること、人間の欲望として定着は避けられないことを理由に「Yes」と回答。一方、BALTHASARは人間の創造性保護の観点から、過度な依存リスクを懸念して「No」と回答した。多数決により「Yes」が結論となるが、創造性の退化リスクへの対策も重要な課題として認識される。


質問5: 生成AIの普及により新たな倫理的課題が生じるか?

投票結果

サブエージェント 回答 理由
MELCHIOR Yes 生成AIは偽情報拡散、著作権侵害、バイアス強化、監視強化など従来にない規模と速度の問題を生み、新たな倫理的課題を確実に増大させる。
BALTHASAR Yes ディープフェイクによる詐欺や偽情報拡散、著作権問題、責任の所在不明確化など、人命・安全・社会安定を脅かす従来にない倫理的課題が多数生じており、保護的観点から対処が必要。
CASPER Yes AIによる創作物は、既存の著作権やプライバシーの枠組みを揺るがし、権利すら脅かしかねない。悪意ある者の手に渡れば、偽情報の拡散も容易になり、社会が混乱に陥るだろう。

合議結果: Yes(3票対0票)

倫理的課題の発生については、全サブエージェントが一致して肯定している。ディープフェイク、著作権問題、偽情報拡散、プライバシー侵害、責任の所在など、従来にない新たな倫理的課題が既に顕在化しており、今後さらに深刻化することが予測される。


最終的な合議結論

投票結果サマリー

質問 MELCHIOR BALTHASAR CASPER 合議結果
Q1: 技術的進化 Yes Yes Yes Yes (3-0)
Q2: 産業・職業への影響 Yes Yes Yes Yes (3-0)
Q3: 規制・法整備の強化 Yes Yes Yes Yes (3-0)
Q4: 創造性補完ツールとしての定着 Yes No Yes Yes (2-1)
Q5: 新たな倫理的課題 Yes Yes Yes Yes (3-0)

総合結論

生成AIの未来は、技術的進化と社会的影響の両面で大きな変革をもたらすものとなる。

5つの質問全てにおいて「Yes」が多数決で採択された。これにより、生成AIの未来について以下の見通しが導き出された:

  1. 技術的進化は確実に継続する - 研究開発投資、計算資源の増大、人間の探求心により、今後5年以内にさらなる技術的進化が起こることは確実である。

  2. 産業・職業構造は大きく変革される - 知的労働やクリエイティブ職を含む広範な分野で、生成AIによる影響が拡大する。適切な移行支援と再教育プログラムの整備が求められる。

  3. 規制・法整備は世界的に強化される - EU AI Act、米国大統領令など、既に各国で規制の動きが始まっており、今後さらに強化されることは避けられない。

  4. 創造性を補完・拡張するツールとして定着する - 既に多くの分野で共創ツールとして普及が進んでおり、定着は避けられない。ただし、人間の創造性の退化リスクへの対策も重要である。

  5. 新たな倫理的課題への対応が必要となる - ディープフェイク、著作権問題、偽情報拡散など、従来にない倫理的課題が顕在化しており、社会全体での対応が求められる。

生成AIは、人類にとって大きな可能性と同時に重大なリスクをもたらす技術である。その未来を良い方向に導くためには、技術の発展を見据えた適切な規制、教育、そして倫理的枠組みの構築が不可欠である。

3. おまけ

最後にもうひとつだけ。

image.png

結論は以下のようになりました。
DeepAgentsの認知度の低さが足かせになる、と。

image.png

というわけで、もともと「DeepAgentsを使ったMAGIシステムエージェントをDatabricksで作成&デプロイする」というタイトル予定でしたが、今回の記事名に変更となりました。

おわりに

もともと既存の何かをDatabricks+DeepAgentsで置き換えるとどうなるかなーという実験的かつチュートリアル的なものを作成したかったというモチベーションで、今回の内容を作成しました。Databricksアドベントカレンダーのネタ枠として楽しんでもらえるとありがたいです。
MAGI面白いじゃん!という気づきを与えていただいた@taka_yayoiさんに感謝です。勝手に引用してごめんなさい。

MAGIシステム的な改善としては、各サブエージェントにもっと外部データを参照するツールを持たせると判断の確度だったり人格強化だったりにつながりそうです。お時間がある方は試してみてください。
各サブエージェントの判断結果をフィードバックして再投票するようなラウンドをもったりするのも面白そう。(MAGIはコンセプト的に独立判断なので、オリジナルの考え方とは逸脱しそうですが)

また、Databricksネイティブで利用できるLLMも非常に増えてきており、三賢人じゃなくて四天王とか八大竜王とかの亜種も作れそうですね。

DeepAgentもまだ発展途上ではあると思いますが、応用分野がいろいろありそうです。
レイテンシが大きいとかトークン消費量が大きいなどの課題もありますが、実務利用を模索していきたいと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?