Gemini 1.5 Pro の一般提供と強化されたFunction Callingが拓くAIアプリケーションの新時代

Tech

本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

Gemini 1.5 Pro の一般提供と強化されたFunction Callingが拓くAIアプリケーションの新時代

ニュース要点

2024年5月14日(JST)、Googleは、大規模言語モデル(LLM)「Gemini 1.5 Pro」の一般提供(GA)を開始しました。この発表の目玉は、最大200万トークンという驚異的なコンテキストウィンドウのサポートに加え、Function Calling機能の大幅な強化です。これにより、Geminiモデルは外部のツールやAPIとより高度に連携できるようになり、より複雑で実用的なAIアプリケーションの開発が加速することが期待されます。

技術的背景:LLMと外部ツールの連携の重要性

大規模言語モデルは、自然言語理解や生成において目覚ましい進歩を遂げていますが、リアルタイムの情報を取得したり、特定の外部システムを操作したりする能力には限界があります。例えば、最新の株価を知る、カレンダーにイベントを追加する、Eコマースサイトで商品を検索するといったタスクは、LLM単独では実行できません。

そこで重要となるのが「Function Calling」(関数呼び出し)の技術です。これは、LLMがユーザーの意図を理解し、その意図を実現するために外部のツール(API)を呼び出すべきだと判断した際に、呼び出すべき関数の名前と必要な引数を構造化された形式(通常はJSON)で出力する機能です。開発者はこの出力を受け取り、実際に外部ツールを実行し、その結果を再びLLMに返すことで、LLMがその結果に基づいて最終的な応答を生成できるようになります。

従来のFunction Callingは、単一の関数呼び出しや単純な引数推論に留まることが多かったですが、Gemini 1.5 Proの強化により、より複雑な推論や連続・並列の関数呼び出しが可能となり、AIエージェントの開発において大きな一歩となります。

強化されたFunction Callingの仕組み

Gemini 1.5 ProのFunction Callingは、モデルに外部ツールの「スキーマ」(定義)を事前に提供することで機能します。モデルはユーザーのプロンプトを受け取ると、このスキーマと照合し、最適なツールとその実行に必要な引数を推論します。

具体的な仕組みは以下のステップで進行します。

  1. ツールの定義: 開発者は、アプリケーションが利用できる外部ツール(API)の機能、引数、戻り値などをJSONスキーマとして定義し、Geminiモデルに渡します。

  2. ユーザープロンプト: ユーザーは自然言語でモデルにタスクを要求します(例:「今週末の東京の天気はどうなる?」)。

  3. モデルによる推論: Gemini 1.5 Proモデルは、プロンプトと定義されたツールスキーマを基に、どのツールを呼び出すべきか、そのツールにどのような引数を渡すべきかを推論します。

  4. 関数呼び出しの提案: モデルは、呼び出すべき関数名と引数をJSON形式で出力します。例えば、{"function_call": {"name": "get_current_weather", "args": {"location": "東京"}}} のような形です。

  5. 開発者による実行: 開発者のアプリケーションはこのJSONを受け取り、実際の外部API(例:天気予報API)を呼び出します。

  6. 結果のフィードバック: 外部APIからの実行結果(例:天気データ)をアプリケーションが取得し、その結果を再度Geminiモデルに渡します。

  7. 最終応答の生成: モデルは、元のプロンプトとツール実行結果の両方を考慮して、ユーザーへの自然言語での最終応答を生成します。

Gemini 1.5 Proの強化点としては、モデルが複数のツール呼び出しを連続して提案したり、並列で実行が必要な複数のツール呼び出しを一度に提案したりする能力が向上しています。これにより、ユーザーの複雑な要求に対し、より少ない対話ターンで効率的に対応できるようになります。また、200万トークンのコンテキストウィンドウと組み合わせることで、大量の履歴情報や複雑なドキュメントを参照しながら、Function Callingの判断を下すことが可能になります。

Gemini 1.5 Pro Function Calling のデータフロー

graph TD
    user_prompt["ユーザープロンプト"] --> api_request{"Gemini APIへリクエスト"};
    api_request --> gemini_model["Gemini 1.5 Pro モデル"];
    gemini_model --> function_call_inference{"Function Calling 推論"};
    function_call_inference -- モデルがツール定義JSONを生成 --> dev_app["開発者アプリケーション"];
    dev_app -- JSONに基づきツールを実行 --> external_tool["外部ツール/API/DB"];
    external_tool --> tool_result["ツール実行結果"];
    tool_result -- 結果をGemini APIへ返す --> gemini_model_again["Gemini 1.5 Pro モデル"];
    gemini_model_again -- ユーザーへの最終応答生成 --> final_response["最終応答"];
    final_response --> user["ユーザー"];

実装例:PythonによるFunction Calling

ここでは、Python SDK を用いたFunction Callingの概念的な実装例を示します。モデルが天気予報の機能を呼び出すシナリオを想定しています。

import google.generativeai as genai
import json

# APIキーは環境変数などから安全に取得することを推奨


# genai.configure(api_key="YOUR_API_KEY")

# 外部ツールとして定義するダミー関数

def get_current_weather(location: str):
    """
    指定された都市の現在の天気を取得する関数。
    [入力] location: 天気を知りたい都市名 (string)
    [出力] 気温と状態を含む辞書 (dict)
    [前提] リアルタイム情報のため、外部APIへのアクセスが必要。
    [計算量] O(1) (外部API呼び出しの定数時間と仮定)
    [メモリ条件] 非常に小さい (数KB程度)
    """
    print(f"DEBUG: 実際の天気APIを呼び出し中... ({location})")
    if location == "東京":
        return {"location": "東京", "temperature": "25°C", "conditions": "晴れ"}
    elif location == "ロンドン":
        return {"location": "ロンドン", "temperature": "18°C", "conditions": "曇り"}
    else:
        return {"location": location, "temperature": "情報なし", "conditions": "不明"}

# Geminiモデルに提供するツールの定義(スキーマ)

tools = [
    {
        "function_declarations": [
            {
                "name": "get_current_weather",
                "description": "指定された都市の現在の天気を取得します。",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "天気を知りたい都市名 (例: 東京, ロンドン)"
                        }
                    },
                    "required": ["location"]
                }
            }
        ]
    }
]

# モデルの初期化 (実際にはAPIキーを設定して有効化)


# model = genai.GenerativeModel('gemini-1.5-pro-latest')

print("--- シナリオ1: 東京の天気を尋ねる ---")
user_prompt_1 = "東京の天気は?"
print(f"ユーザープロンプト: {user_prompt_1}")

# 実際には model.generate_content(contents=[user_prompt_1], tools=tools) を呼び出す


# ここではFunction Callingが提案されたと仮定してシミュレート


# response_1 = model.generate_content(...)


# 応答から関数呼び出し情報を抽出

simulated_function_call_1 = {
    "function_call": {
        "name": "get_current_weather",
        "args": {"location": "東京"}
    }
}

if "function_call" in simulated_function_call_1:
    function_name = simulated_function_call_1["function_call"]["name"]
    function_args = simulated_function_call_1["function_call"]["args"]

    if function_name == "get_current_weather":
        print(f"モデルが関数呼び出しを提案: {function_name}({function_args})")

        # 実際の関数呼び出し

        tool_output = get_current_weather(**function_args)
        print(f"ツール実行結果: {tool_output}")

        # その結果を再度モデルに渡し、自然言語応答を生成させる


        # final_response_1 = model.generate_content(


        #     contents=[user_prompt_1, json.dumps(tool_output)],


        #     tools=tools


        # )


        # print(f"最終応答 (モデルによる生成): {final_response_1.text}")

        print("(モデルがツール実行結果に基づいて「東京の天気は晴れで25°Cです。」のような最終応答を生成する想定)")
    else:
        print("サポートされていない関数が提案されました。")
else:
    print(f"モデルの応答: {simulated_function_call_1}")


print("\n--- シナリオ2: 一般的な挨拶 ---")
user_prompt_2 = "こんにちは、元気ですか?"
print(f"ユーザープロンプト: {user_prompt_2}")

# 実際には model.generate_content(contents=[user_prompt_2], tools=tools) を呼び出す


# この場合はFunction Callingが提案されないと仮定してシミュレート


# response_2 = model.generate_content(...)

simulated_response_2 = "こんにちは!私は元気に稼働しています。何かお手伝いできることはありますか?"

if isinstance(simulated_response_2, dict) and "function_call" in simulated_response_2:
    print("モデルが関数呼び出しを提案しました(このシナリオでは想定外)")
else:
    print(f"モデルの直接応答: {simulated_response_2}")

インパクトと今後の展望

事実としてのインパクト

  • アプリケーション開発の複雑性軽減: 開発者は、LLMに外部ツールを呼び出させるための複雑なプロンプトエンジニアリングではなく、シンプルな関数スキーマとユーザープロンプトで連携を構築できるようになりました。

  • ユーザー体験の向上: LLMが外部ツールと連携することで、より正確でリアルタイムな情報に基づいた応答や、具体的なアクションを伴うユーザー体験を提供できるようになります。

  • マルチモーダル機能との連携: Gemini 1.5 ProのNative Audio Understandingなどのマルチモーダル機能と組み合わせることで、音声や動画入力から複雑な意図を読み取り、Function Callingを通じて外部システムを操作する、よりリッチなアプリケーションが可能になります。

推測される今後の展望

  • AIエージェントの実現加速: Function Callingの強化は、自律的に複数のタスクを実行し、目標達成のために外部ツールを使いこなすAIエージェントの開発を強力に後押しします。これは、複雑なビジネスプロセス自動化やパーソナルアシスタントの高度化に繋がるでしょう。

  • 企業システムとの連携深化: 既存の企業システム(CRM、ERP、SCMなど)とLLMをより深く統合し、自然言語インターフェースを通じて業務アプリケーションを操作する新たなソリューションが生まれる可能性があります。

  • セキュリティとガバナンスの課題: 外部ツールへのアクセスが増えるにつれて、APIキーの管理、アクセス制御、データのプライバシー保護など、セキュリティとガバナンスに関する新たな課題とソリューションが求められるでしょう。

まとめ

Google Gemini 1.5 Proの一般提供と、特に強化されたFunction Calling機能は、AIアプリケーション開発の風景を大きく変える可能性を秘めています。最大200万トークンのコンテキストウィンドウと組み合わさることで、LLMはより賢く、より多くの情報に基づき、外部の世界と対話できるようになります。これにより、開発者はこれまで以上に強力で実用的なAIアシスタントやエージェントを構築できるようになり、私たちの仕事や日常生活に新たな価値をもたらすことが期待されます。今後、この技術がどのように進化し、どのような革新的なアプリケーションが生まれてくるのか、その動向に注目が集まります。

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました