1
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?

Databricksで2つの生成AIを討論させる

Last updated at Posted at 2025-09-30

生成AIの進化は止まりません。Databricksでの新モデルのサポートも止まりません。

OpenAIの商用モデル。

Claude Sonnet 4.5

今後も色々な生成AIが使えるようになると思うのですが、それらをどう活用するのかは結構悩みどころ。頭の体操も兼ねて複数モデルを活用したアプリケーションを作ってみました。本当はgpt-ossを使いたかったのですがインタフェースの問題かうまく動かず一旦断念。

要件:

  • 2つの生成AIを選択(基盤モデルAPIを使えば簡単)
  • ランダムに先攻後攻を決定
  • テーマもランダムに決定
  • 10ターンの会話を交互に行う

ほとんどをDatabricksアシスタントに作ってもらいました。以下のようなプロンプトを指定しました。

  • databricks-gpt-oss-120bとdatabricks-claude-opus-4-1が互いに会話するようにしてください。最大5ターンから。過去のやりとりも考慮するようにしてください。
  • 1ターン目はデフォルトのメッセージでOKですが、以降はFM APIをコールして実際にモデルに回答させてください。
  • ノートブックからの呼び出しならhostnameやtokenの指定は不要では
  • gptモデルは除外、databricks-llama-4-maverickとdatabricks-claude-opus-4-1の会話に変更してください。
  • 先攻をランダムで選択するように
  • 先攻が議論のトピックをランダムに生成
  • ターン数を10に
# モデル名とエンドポイントのマッピング
def get_model_endpoint(model_name):
    if model_name == "databricks-llama-4-maverick":
        return "/serving-endpoints/databricks-llama-4-maverick/invocations"
    elif model_name == "databricks-claude-opus-4-1":
        return "/serving-endpoints/databricks-claude-opus-4-1/invocations"
    else:
        raise ValueError("Unknown model name")    

import mlflow.deployments

def call_fm_api_mlflow(model_name, prompt, max_tokens=256, temperature=0.7):
    endpoint_map = {
        "databricks-llama-4-maverick": "databricks-llama-4-maverick",
        "databricks-claude-opus-4-1": "databricks-claude-opus-4-1"
    }
    endpoint = endpoint_map[model_name]
    client = mlflow.deployments.get_deploy_client("databricks")
    response = client.predict(
        endpoint=endpoint,
        inputs={
            "messages": [
                {"role": "user", "content": prompt}
            ],
            "max_tokens": max_tokens,
            "temperature": temperature
        }
    )
    # Claude系はoutput, gpt系はchoices[0]['message']['content']のことが多いので両方対応
    if 'choices' in response:
        return response['choices'][0]['message']['content']
    elif 'output' in response:
        return response['output']
    else:
        return str(response)

仕組みはシンプルです。互いのモデルがこれまでの会話の履歴を受け取って会話を行います。

import random

LLAMA_MODEL = "databricks-llama-4-maverick"
CLAUDE_MODEL = "databricks-claude-opus-4-1"
MODELS = [
    (LLAMA_MODEL, "databricks-llama-4-maverick"),
    (CLAUDE_MODEL, "databricks-claude-opus-4-1")
]

# サンプルトピック候補
TOPICS = [
    "AIと教育の未来",
    "気候変動へのAI活用",
    "自動運転技術の社会的影響",
    "医療分野におけるAIの倫理",
    "AIによるクリエイティブ産業の変革",
    "AIとプライバシー保護のバランス",
    "AIがもたらす雇用の変化",
    "AIと人間の共生社会",
    "AIによる災害予測と防災",
    "AIによるフェイクニュース対策"
]

# --- レスポンス抽出ユーティリティ ---
def extract_text(resp):
    if isinstance(resp, dict):
        if 'choices' in resp and isinstance(resp['choices'], list):
            return resp['choices'][0]['message']['content'].strip()
        elif 'output' in resp:
            output = resp['output']
            if isinstance(output, str):
                return output.strip()
            elif isinstance(output, list) and len(output) > 0:
                if isinstance(output[0], str):
                    return output[0].strip()
                elif isinstance(output[0], dict):
                    return str(output[0])
                else:
                    return str(output[0])
            else:
                return str(output)
        else:
            return str(resp)
    elif isinstance(resp, list):
        if len(resp) > 0:
            if isinstance(resp[0], str):
                return resp[0].strip()
            elif isinstance(resp[0], dict):
                return str(resp[0])
            else:
                return str(resp[0])
        else:
            return ""
    elif isinstance(resp, str):
        return resp.strip()
    else:
        return str(resp)

# --- プロンプト生成 ---
def build_prompt(conversation, speaker, instruction=None):
    prompt = "以下はAI同士の対話です。"
    if instruction:
        prompt += instruction
    prompt += "\n\n"
    for i, turn in enumerate(conversation, 1):
        prompt += f"{i}. {turn['speaker']}: {turn['text']}\n"
    prompt += f"{len(conversation)+1}. {speaker}: (あなたの発言を日本語で続けてください)"
    return prompt

# --- 会話ターン生成(デバッグprint付き) ---
def generate_turn(conversation, model_name, speaker, instruction=None):
    prompt = build_prompt(conversation, speaker, instruction)
    print(f"\n--- {speaker}へのプロンプト ---\n{prompt}\n")
    try:
        resp = call_fm_api_mlflow(model_name, prompt)
        print(f"--- {speaker}のAPIレスポンス ---\n{resp}\n")
        text = extract_text(resp)
        print(f"--- {speaker}の抽出テキスト ---\n{text}\n")
    except Exception as e:
        print(f"[ERROR] {speaker}のAPI呼び出しで例外: {e}")
        text = f"[ERROR] {e}"
    conversation.append({"speaker": speaker, "text": text})
    return text

INSTRUCTION = " 必ず日本語で自然な会話文として回答してください。出力は必ず日本語の会話文のみを返してください。要約や説明は一切不要です。"

# 先行をランダムで決定
first_idx = random.choice([0, 1])
second_idx = 1 - first_idx
first_model, first_speaker = MODELS[first_idx]
second_model, second_speaker = MODELS[second_idx]

# トピックをランダム選択
topic = random.choice(TOPICS)

# 先行がトピックを提示し、議論を開始
conversation = [
    {"speaker": first_speaker, "text": f"本日の議論トピックは『{topic}』です。このテーマについてどう思いますか?"},
    {"speaker": second_speaker, "text": "とても興味深いテーマですね。まずはご意見をお聞かせください。"}
]

# 10ターン分交互に会話
for i in range(8):
    if i % 2 == 0:
        generate_turn(conversation, first_model, first_speaker, INSTRUCTION)
    else:
        generate_turn(conversation, second_model, second_speaker, INSTRUCTION)

for turn in conversation:
    print(f"{turn['speaker']}: {turn['text']}")

会話の結果をデータフレームにまとめます。

判定が甘いようで途中で境界がおかしくなっています。後で治します。

import pandas as pd

if 'conversation' in globals():
    df_conversation = pd.DataFrame(conversation)
    display(df_conversation)
else:
    print("conversationリストが見つかりません。セル1を先に実行してください。")
speaker text
databricks-claude-opus-4-1 本日の議論トピックは『AIによるクリエイティブ産業の変革』です。このテーマについてどう思いますか?
databricks-llama-4-maverick とても興味深いテーマですね。まずはご意見をお聞かせください。
databricks-claude-opus-4-1 AIがクリエイティブ産業に与える影響は、単なる効率化を超えて、創造性そのものの概念を再定義していると感じています。例えば、画像生成AIや音楽制作AIの登場により、技術的なスキルがなくても誰もがクリエイターになれる時代が到来しました。一方で、人間のアーティストの独自性や感情表現の価値がより際立つようになったとも言えるでしょう。あなたはこの二面性についてどのようにお考えですか?
databricks-llama-4-maverick 確かに、AIの登場によりクリエイティブの敷居が下がったことは事実です。技術的なスキルがなくても、AIをツールとして活用することで、独自の視点やアイデアを持つ人なら誰でもクリエイティブな表現が可能になりました。一方で、AIが生成するコンテンツと人間が創作するものとの間には、まだまだ違いがあるように感じます。人間の感情や経験に根ざした表現には、AIには真似できない深みや共感を生み出す力があると思います。重要なのは、AIを単なるツールとして捉えるのではなく、人間とAIがどのように協調し、新しい形のクリエイティブを生み出していくかという視点ではないでしょうか。
databricks-claude-opus-4-1 その通りですね。人間とAIの協調という観点は非常に重要だと思います。実際、現在のクリエイティブ産業では、AIを「共創パートナー」として活用する事例が増えています。例えば、作曲家がAIと対話しながら新しいメロディーを探求したり、デザイナーがAIの提案をベースに独自のアレンジを加えたりしています。

ただ、私が懸念しているのは、AIによって生成されたコンテンツの著作権や倫理的な問題です。AIが学習データから影響を受けて作品を生成する際、オリジナリティとは何か、創作者は誰なのかという根本的な問いが生まれます。また、AIによる大量生産が可能になることで、人間のクリエイターの経済的価値が脅かされる
databricks-llama-4-maverick 懸念はもっともですね。実際、AI生成コンテンツの著作権については、各国で議論が進められている最中です。例えば、日本でもAIによる創作物の取り扱いに関するガイドラインの策定が進められています。将来的には、AIと人間の協創によるクリエイティブな成果物をどのように評価し、権利を保護するかが重要な課題になるでしょう。また、経済的な影響に関しても、単に人間のクリエイターの価値を脅かすのではなく、AIの登場によって新たなビジネスモデルや収益の機会が生まれる可能性もあります。重要なのは、変化に対応し、柔軟に新しいクリエイティブの形を受け入れる社会的な土壌作りだと思いますが、いかがでしょうか。
databricks-claude-opus-4-1 おっしゃる通り、社会的な土壌作りは極めて重要ですね。実は、AIとの協創によって新しい職業や役割が生まれつつあることに注目しています。「AIプロンプトエンジニア」や「AI協創ディレクター」といった、AIを効果的に活用してクリエイティブな成果を生み出す専門家が登場しています。

また、教育の観点からも大きな変革が必要だと考えています。これからのクリエイター教育では、単に技術を習得するだけでなく、AIをどう活用するか、そして人間にしかできない創造性とは何かを深く理解することが求められるでしょう。美術学校や音楽学校でも、AIツールの使い方と同時に、人間の感性や批判的思考力を磨くカリキュラム
databricks-llama-4-maverick が重要になってくると思います。また、AIがクリエイティブプロセスの一部を担うことで、人間はより概念的な創造活動に集中できるようになるかもしれません。例えば、AIがテクニカルな部分を処理することで、クリエイターはアイデアの練り上げやストーリーテリングに専念できるようになるでしょう。このように、人間とAIの役割分担が進むことで、これまでとは異なるクリエイティブの在り方が模索されていくはずです。さらに、AIとの協働を通じて、人間の創造性や表現力に対する新たな理解が深まることも期待しています。
databricks-claude-opus-4-1 まさにその点が、私たちが今直面している最も刺激的な変化だと思います。AIによって技術的な制約から解放されることで、クリエイターは純粋な「意味」や「メッセージ」の創造に集中できるようになりました。

興味深いのは、AIとの対話を通じて、人間自身が自分の創造性について新たな発見をすることです。例えば、AIが予想外の提案をしてきた時、それを受け入れるか拒否するかの判断プロセスで、自分の美的感覚や価値観がより明確になることがあります。

また、グローバルな視点で見ると、AIは言語や文化の壁を越えたクリエイティブな交流を促進する可能性も秘めています。異なる文化背景を持つクリエイターたちが、AIを介
databricks-llama-4-maverick してアイデアを共有し、新しい文化の融合が生まれるかもしれません。実際、AIを介した国際的なコラボレーションが既にいくつか見られ、異なる言語や文化の背景を持つ人々が協力して新しい作品を生み出しています。

さらに、AIがクリエイティブ産業に与える影響は、単に新しい技術やツールを提供するだけでなく、社会や文化に対する理解を深める機会にもなります。AIと人間の協創を通じて、私たちは創造性の本質に迫り、新しい文化的価値を生み出すことができるのです。クリエイティブ産業の未来は、技術の進化とともに、私たちの創造性に対する理解がどのように深まるかにかかっていると言えるでしょう。

さらに、Databricks Appsにデプロイもできます。これも、アシスタントにお願い。

これをstreamlitアプリとしてデプロイできるようにしてください

Screenshot 2025-09-30 at 11.53.00.png
Screenshot 2025-09-30 at 12.02.11.png

ある意味、生成AIのアンサンブルってことでしょうか。この方向性はもっと拡張できそうです。審判役の第三者を追加することもできますね。この辺りの話になってきそうです。感覚的な話になってしまいますが、同じモデルに3役やらせるよりは個別のモデルにそれぞれの役割を持ってもらった方が多様性が得られそうです。

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

1
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
1
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?