DeepSeek V3の関数呼び出し(Function Calling)の使い方

DeepSeek V3の関数呼び出し(Function Calling)の使い方

主なポイント

機能: 関数呼び出しにより、AIモデルが外部ツールやAPIと連携し、特定のタスクを実行したり、リアルタイムデータにアクセスしてシステム操作や自動化ワークフローを実現します。

対応モデル: DeepSeek V3シリーズ、GPTシリーズ、Gemma 2、Mistral Nemo。

**実装方法 **: Novita AI経由でAPIをインストールし、** ドキュメント**から学習できます。

関数呼び出しは、大規模言語モデル(LLM)を強化し、外部とのやり取りを可能にします。テキスト生成だけでなく、タスクの実行、リアルタイムデータへのアクセス、複雑な操作を行うことができます。AIの知識と実行可能なタスクをつなぐ架け橋として、関数呼び出しはAIエージェントやチャットボットが外部ツールやサービスと連携する力を与えます。オープンソースの強力なモデルであるDeepSeek V3は、その優れたパフォーマンスと効率性で際立っています。

関数呼び出しとは

関数呼び出しは、大規模言語モデル(LLM)を強化し、外部とのやり取りを可能にします。テキスト生成だけでなく、タスクの実行、リアルタイムデータへのアクセス、複雑な操作を行うことができます。AIの知識と実行可能なタスクをつなぐ架け橋として、関数呼び出しはAIエージェントやチャットボットが外部ツールやサービスと連携する力を与えます。オープンソースの強力なモデルであるDeepSeek V3は、その優れたパフォーマンスと効率性で際立っています。

関数呼び出しの仕組み

出典: Google Cloud

  1. 関数の宣言: 機能、入力、出力を明確に説明した再利用可能なコードブロック(関数)を定義します。
  2. プロンプトの送信: 利用可能なツールをLLMに知らせるため、プロンプトと一連の関数宣言をLLMに提供します。
  3. モデルによる分析: LLMはプロンプトを評価し、提供された関数のいずれかを呼び出す必要があるかどうかを判断します。
  4. 構造化された出力: 関数呼び出しが必要な場合、LLMはJSON形式で構造化された出力を生成し、関数名とパラメーター値を指定します。
  5. 関数の呼び出し: アプリケーションまたはシステムは、構造化された出力を使用して指定された関数を呼び出し、必要なパラメーターを渡します。
  6. 関数の実行: 外部サービスまたはAPIが、提供されたパラメーターに基づいて関数を実行します。
  7. 出力応答: 外部サービスは結果または確認をAIに返します。
  8. モデルの応答: LLMは受け取った出力を使用して、ユーザーへの自然言語による応答を作成するか、さらなる処理を行います。

関数呼び出しで解決できる問題

リアルタイム情報へのアクセス

  • 株価の更新
  • 現在の天気データの取得
  • 速報ニュースへのアクセス

システムとのやり取り

  • メール送信
  • ソーシャルメディアへの投稿
  • データベースのクエリと書き込み

ワークフローの自動化

  • データのスクレイピングと処理
  • 複数ステップのタスク実行
  • 複雑な分析の自動化

データの正確性

  • 情報の最新性の保証
  • 正確なクエリ結果の提供
  • 古いデータによるエラーの削減

AI機能の強化

  • 動的なAPI統合
  • コンテキストに応じたタスク実行
  • 現実世界でのアクション実行

ユーザー体験の向上

  • パーソナライズされた応答
  • 会話を離れずにタスクを完了
  • 外部サービスのシームレスな統合

Novita AIを介したDeepSeek V3の関数呼び出しの使用方法

このガイドでは、関数呼び出しを使用して、ユーザーが指定した場所の現在の天気情報を取得する方法を示します。完全なPythonコード例を順を追って説明します。関数呼び出しの具体的なAPI形式については、APIリファレンス「チャット完了の作成」を参照してください。

referral

今すぐNovita AIで$20クレジットを入手!

  • クライアントの初期化

まず、Novita APIキーを使用してクライアントを初期化する必要があります。

from openai import OpenAI
import json

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    # Novita AI APIキーは https://novita.ai/settings/key-management から取得してください。
    api_key="<YOUR Novita AI API Key>",
)

model = "deepseek/deepseek_v3"
  • 呼び出す関数の定義

次に、モデルが呼び出すことができるPython関数を定義します。この例では、天気情報を取得する関数です。

# 天気データの取得をシミュレートするサンプル関数。
def get_weather(location):
    """指定された場所の現在の天気を取得します。"""
    print("get_weather関数を呼び出しています。場所: ", location)
    # 実際のアプリケーションでは、ここで外部の天気APIを呼び出します。
    # これはハードコードされたデータを返す簡略化された例です。
    return json.dumps({"location": location, "temperature": "60 degrees Fahrenheit"})
  • ツールとユーザーメッセージを含むAPIリクエストの構築

次に、NovitaエンドポイントへのAPIリクエストを作成します。このリクエストには、モデルが使用できる関数を定義する tools パラメーターと、ユーザーのメッセージが含まれます。

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "場所の天気を取得します。ユーザーは最初に場所を指定する必要があります。",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "都市と州、例:San Francisco, CA",
                    }
                },
                "required": ["location"]
            },
        }
    },
]

messages = [
    {
        "role": "user",
        "content": "サンフランシスコの天気はどうですか?"
    }
]

# リクエストを送信し、応答を表示します。
response = client.chat.completions.create(
    model=model,
    messages=messages,
    tools=tools,
)

# 本番環境では、応答にツール呼び出しが含まれているか確認してください。
tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.model_dump())
  • 出力
{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}
  • 関数呼び出しの結果で応答し、最終回答を取得

次のステップは、関数呼び出しを処理し、get_weather 関数を実行し、結果をモデルに送り返してユーザーへの最終応答を生成することです。

# tool_callが前のステップで定義されていることを確認
if tool_call:
    # アシスタントのツール呼び出しメッセージで会話履歴を拡張
    messages.append(response.choices[0].message)

    function_name = tool_call.function.name
    if function_name == "get_weather":
        function_args = json.loads(tool_call.function.arguments)
        # 関数を実行し、応答を取得
        function_response = get_weather(
            location=function_args.get("location"))
        # 関数の応答をメッセージに追加
        messages.append(
            {
                "tool_call_id": tool_call.id,
                "role": "tool",
                "content": function_response,
            }
        )

    # 関数の結果を含むモデルからの最終応答を取得
    answer_response = client.chat.completions.create(
        model=model,
        messages=messages,
        # 注意: ここではtoolsパラメーターを含めないでください。
    )
    print(answer_response.choices[0].message)
  • 出力
{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}

関数呼び出しの一般的な問題とベストプラクティス

AIモデルにおける関数呼び出しは、課題と機会の両方をもたらします。以下に、一般的な問題とそれに対応するベストプラクティスの比較を示します。

  • 不正確な解釈と明確なプロンプト

問題: モデルがユーザーの意図を不正確に解釈し、不要または誤った関数呼び出しを行う可能性がある。

ベストプラクティス: チャットボットの目的と利用可能な関数を説明する、明確で簡潔なシステムプロンプトを提供する。直接応答と適切な関数呼び出しの両方を示すマルチショットターンを使用する。

  • 複雑なワークフロー管理

問題: 複数の相互依存ステップを持つ複雑なワークフローの管理が困難。

ベストプラクティス: より複雑な手法に移る前に、まずプロンプトエンジニアリングから始める。ファインチューニングでは量より質に重点を置き、少数の高品質な例から始める。

  • 微妙な意思決定

問題: 関数の出力や外部データを解釈して微妙な意思決定を行う際の課題。

ベストプラクティス: 必要に応じてコンテキストを注入するために、検索拡張生成(RAG)を使用する。ファインチューニングとRAGを組み合わせて、それぞれの長所と短所のバランスを取る。

  • データ構造の複雑さ

問題: グラフやネストされたオブジェクトなど、進化する複雑なデータ構造を操作する際の制限。

ベストプラクティス: クリーンなコードとパフォーマンスのバランスを取りながら、適切な抽象化レベルを選択する。関数を簡潔で焦点を絞ったものに保ち、効率と可読性を向上させる。

  • レガシーシステムとの統合

問題: 乱雑で曖昧なレガシーシステムとの統合に苦労する。

ベストプラクティス: プロファイリングによって特定された、最も頻繁に呼び出される関数やホットスポットを最適化する。レガシーシステムを扱う際には、オーバーヘッドを削減するためにバッチ操作を検討する。

  • 安全性の問題

問題: 洗練された判断力なしに特権関数を実行する際の安全性の懸念。

ベストプラクティス: 予期しないAPI応答を管理するための堅牢なエラーハンドリング機構を実装する。強力なデータ保護対策と規制への準拠を確保し、ユーザーの信頼と機密情報を保護する。

  • スケーラビリティとパフォーマンス

問題: ミッションクリティカルなシステムに必要な厳格なスケーラビリティ、可用性、パフォーマンス要件を満たす信頼性が未検証。

ベストプラクティス: コンパイラの最適化を活用し、より焦点を絞った決定論的な出力を得るために低い温度設定を使用する。プロファイリングとホットスポットの最適化により、最も顕著なパフォーマンス向上を実現する。

  • 関数呼び出しへの過度の依存

問題: モデルが必要ない場合でも、不必要または不適切に関数を呼び出す可能性がある。

ベストプラクティス: 関数呼び出しの実装方法を慎重に管理する。外部サービスが利用できない場合でもシステムの信頼性を維持するために、適切なエラーハンドリングとフォールバック機構を実装する。

  • プライバシーと透明性の懸念

問題: LLMがユーザーに代わって意思決定や行動を行う際の透明性とユーザー同意に関する倫理的懸念。

ベストプラクティス: 明確な文書化とユーザー同意のメカニズムを実装する。データ処理が責任を持って行われ、GDPRやHIPAAなどのプライバシー規制に準拠していることを確認する。

結論として、関数呼び出しはLLMにとって大きな進歩であり、エンタープライズデータやシステムとのシームレスな連携を可能にし、開発者がより動的で機能的なアプリケーションを構築する力を与えます。外部アプリケーション、システム、APIと簡単に統合することで、LLMは非常に汎用性が高くなり、幅広いタスクを効率的に処理できるようになります。DeepSeek V3のようなモデルが先頭に立ち、この革新的なテクノロジーへの効率的なアクセスを提供し、AIイノベーションの無限の可能性を解き放ちます。

よくある質問

LLMの文脈における関数呼び出しとは何ですか?

関数呼び出しは、大規模言語モデルが特定のタスクに外部関数やツールが必要であることを認識し、その関数を実行するための構造化データを生成することを可能にする手法です。

関数呼び出しを使用する主な利点は何ですか?

主な利点としては、タスク処理の効率向上、開発者が関数を簡単に更新できる柔軟性、大規模な変更なしで新しい機能を追加できる拡張性、パーソナライズされたユーザーインタラクションなどが挙げられます。

Novita AIは、AIの野心を実現するオールインワンのクラウドプラットフォームです。統合API、サーバーレス、GPUインスタンス — コスト効率の高いツールが揃っています。インフラストラクチャを排除し、無料で始めて、AIのビジョンを現実にしましょう。

おすすめの記事