自然言語で SQL クエリーを実行

自然言語プロンプトとデータベーススキーマをモデルに送信し、返された SQL クエリーを利用してデータベースから結果を取得して応答に使用します。

オプション 

  • [アカウント名:] では、このスクリプトステップで使用する AI アカウントのテキスト式を指定します。現在のファイルで、[AI アカウント設定] スクリプトステップを使用してアカウントを設定し、このスクリプトステップが実行される前にこの名前を割り当てることができます。

  • [モデル:] では使用するテキスト生成モデルの名前を指定します。モデル名をテキスト式として指定します。サポートされているモデルについては、FileMaker 動作環境を参照してください。

  • [プロンプト:] ではモデルに送信する自然言語の要求または質問のテキスト式を指定します。

  • [指定されたオプション:] で、このスクリプトステップの他のオプションがどのように構成されるかを決定します。

    • 一覧から: 下記の設定を使用してオプションを個別に構成します。

    • JSON データで: JSON オブジェクトを指定して次のオプションを構成します。このオプションは値を動的に設定する場合に役立ちます。JSON オブジェクトにはスクリプトステップのオプションとその値に対応するキーと値のペアが含まれている必要があります。サポートされているオプションのキーは次のとおりです:

      • action: 目的の処理に対応する文字列値: "query""query for data only""get sql""get first sql only""get ddl"

      • data tables: 文字列の JSON 配列。各文字列はスキーマを含める必要があるテーブルの名前です。例: ["連絡先", "住所"]

      • stream: [ストリーム] オプションの文字列値 ("on" または "off")。

      例:

      コピー
      {
          "action" : "get sql",
          "data tables" : [ "製品", "請求書" ],
          "stream" : "off"
      }
  • [処理:] ではモデルから取得する応答のタイプを指定します。

    • クエリー: ユーザのプロンプトに対するモデルの最終的な応答を自然言語で返します。

    • データのみを取得: このスクリプトステップで実行されたモデルの最後の SQL クエリーによって取得したデータのみを返します。

    • SQL を取得: インタラクション全体でモデルによって生成されたすべての SQL ステートメントを返します。

    • 最初の SQL のみを取得: モデルによって生成された最初の SQL ステートメントのみを返します。

    • DDL を取得: このスクリプトステップが生成してモデルに送信するデータベーススキーマを (データ定義言語で) 返します。

  • [データテーブル:] はテーブルのデータベーススキーマをモデルに指定する方法を示します。指定したテーブルのスキーマのみが送信されます。

    • 一覧から: 一覧から特定のテーブルを選択します。

    • 名前で: テーブル名の一覧をテキスト式として提供します。改行で複数のテーブル名を区切ります。

    • DDL で: カスタム DDL のテキスト式を指定します。これにより、モデルに送信するスキーマ情報を正確に制御できます。

  • [テーブル...] では [データテーブル] が [一覧から] の場合のテーブルを選択します。

  • [ストリーム] は [処理:] が [クエリー] の場合に応答がどのように送信されるかを決定します。

    • オン: 応答は (単語ごとまたは一定のまとまりで) 段階的に取得および送信されます。これを指定すると FileMaker クライアントの応答性が向上したように感じます。

    • オフ: 応答全体を取得してから表示します。これを指定すると完全な応答を待っている間は FileMaker クライアントが応答していないように見える場合があります。

  • [引数:] ではモデルプロバイダがサポートする追加の引数のキーと値のペアで構成される JSON オブジェクトのテキスト式を指定します。例: {"温度": 0.7, "種": 42} サポートされている引数のキー名とその有効な範囲については、モデルプロバイダのマニュアルを参照してください。

  • [プロンプトテンプレート名:] では [プロンプトテンプレートを構成] スクリプトステップを使用して構成されたカスタムプロンプトテンプレートの名前を指定します。このオプションを使用すると AI モデルから最適な応答を得るための追加のプロンプトを設計できます。

  • [応答のターゲット:] ではスクリプトステップの結果を保存するフィールドまたは変数を指定します。

  • [Web ビューアで JavaScript を実行:] ではスクリプトステップの完了後にターゲットの Web ビューアで実行する JavaScript コードを指定します。このオプションは次のスクリプトステップとして [Web ビューアで JavaScript を実行] スクリプトステップを実行するのと似ていますが、[応答のターゲット:] が JavaScript 関数に渡されて [ストリーム] オプションが [オン] の場合に応答が Web ビューアにストリーミングされます。

    • [Web ビューア:] では現在のレイアウト上の Web ビューアのオブジェクト名を指定します。

    • [関数名:] は Web ビューアで呼び出す JavaScript 関数の名前です。

互換性 

製品 サポート
FileMaker Pro はい
FileMaker Go はい
FileMaker WebDirect はい
FileMaker Server 一部
FileMaker Cloud 一部
FileMaker Data API 一部
カスタム Web 公開 一部

起点バージョン 

22.0

説明 

このスクリプトステップを使用すると SQL ステートメントを直接記述せずに自然言語を使用してデータベースにクエリーを実行できます。AI モデルを使用して自然言語プロンプトを解釈し、データベーススキーマを分析し、適切な SQL クエリーを生成してから、このスクリプトステップで SQL クエリーを実行すると、モデルは結果を自然言語で応答します。FileMaker のデータをモデルに送信する必要はありません。

このスクリプトステップとモデルの間のインタラクションは通常次の手順で実行されます:

  1. このスクリプトステップがプロンプトおよび関連するデータベーススキーマ ([データテーブル] で指定した DDL) を設定した AI モデルに送信します。(これにはオプションのプロンプトテンプレートで指定されたプロンプトが含まれます。)

  2. モデルがプロンプトおよびスキーマを分析し、指定した情報をデータベースから取得するための 1 つ以上の SQL クエリーを生成します。

  3. このスクリプトステップが生成された SQL クエリーをモデルから受け取って実行します。

  4. このスクリプトステップが SQL クエリー実行の結果をモデルに送り返します。

  5. プロンプトに完全に対応するには結果の追加の処理または改良が必要であるとモデルが判断した場合、追加の SQL クエリーが生成されることがあります (手順 2 から 4 を繰り返します)。これにより複雑なクエリーや複数ステップのデータ取得ができるようになります。

  6. モデルが十分な情報を得ると、受け取ったプロンプトと SQL クエリーの結果に基づいて最終的な応答が生成されます。

  7. このスクリプトステップが最終的な応答を受け取って [応答のターゲット:] に保存します。

[処理:] オプションはこのプロセスのさまざまな段階で [応答のターゲット:] に返される内容を決定します:

処理 機能

クエリー

SQL 生成の繰り返しと実行ラウンドを含め、ワークフロー全体 (手順 1 から 7) を完了します。[応答のターゲット:] はモデルの最終的な自然言語の応答を受け取ります。応答には会話型の回答に統合された SQL クエリーから取得したデータが含まれる場合があります。

データのみを取得

手順 1 から 6 を実行しますが手順 7 の前で停止します。[応答のターゲット:] は最後のクエリーによって返されたデータのみを受け取ります。

デバッグの場合:

SQL を取得

手順 1 から 6 を実行しますが手順 7 の前で停止します。[応答のターゲット:] はインタラクションでモデルによって生成されたすべての SQL ステートメントのテキストを受け取ります。

最初の SQL のみを取得

手順 1 から 2 のみを実行して停止します。[応答のターゲット:] はモデルによって生成された最初の SQL ステートメントのみのテキストを受け取ります。このオプションはデバッグ中のトークン使用量を減らすのに役立ちます。

DDL を取得

手順 1 ([データテーブル] オプションに基づく DDL の生成) のみを実行します。モデルとのインタラクションはありません。[応答のターゲット:] は生成された DDL のテキストを受け取ります。

デバッグ処理はスクリプトのテスト中にスクリプトステップがモデルおよびデータベーススキーマとどのように情報交換するかを理解するために役立ちます。

メモ 

  • [プロンプトテンプレート名:] を指定した場合、このスクリプトステップは [プロンプトテンプレートを構成] スクリプトステップで構成されたテンプレートを使用します。これらのテンプレートでは実行中に動的に置き換えられる :schema::question::sql_query:、および :sql_results: などの定数を使用できます。使用できる定数はテンプレートタイプと現在の [処理:] によって異なります。

  • [データベースの管理] ダイアログボックスで入力したフィールドコメントはモデルに送信されるデータベーススキーマに含まれます。コメントにフィールドの目的の説明を入力するとモデルの性能を向上させて有用な SQL ステートメントを生成することができます。 (たとえば、フィールドが関連テーブルのレコードを識別する外部キーの場合など)。DDL および SQL クエリー生成におけるデータベーススキーマのベストプラクティスを参照してください。

  • このスクリプトステップはモデルから最終的な自然言語の応答を受け取るまで、SQL 生成と実行のどのラウンドが最後なのかを判断できません。

  • [クエリー] または [データのみを取得] 処理の実行中、このスクリプトステップはモデルによって生成されたすべての SQL ステートメントおよび最後に実行された SQL クエリーの結果を受け取って保存します。これらは [SQL を取得] および [データのみを取得] 処理でそれぞれ返される結果と同じです。

  • エラーなしでこのスクリプトステップが実行されても関連する情報が見つからない場合は、[応答のターゲット:] にメッセージが返され、Get (最終エラー) 関数はエラー 0 (「エラーなし」) を返します。

  • FileMaker Server、FileMaker Cloud、FileMaker Data API、OData API、およびカスタム Web 公開によって実行されるスクリプトでは、[Web ビューアで JavaScript を実行:] オプションはサポートされていません。

例 1 

AI アカウントを構成してから、[自然言語で SQL クエリーを実行] スクリプトステップを使用して「名前」および「会社」フィールドにデータがある「連絡先」テーブルのデータについて質問します。このスクリプトステップは「連絡先」テーブルのスキーマおよび「鈴木さんが働いているのはどの会社ですか?」というプロンプトをモデルに送信します。モデルが必要な SQL クエリーを生成してこのスクリプトステップが実行すると、モデルによって「応答」フィールドに自然言語の応答が返されます。

コピー
AI アカウント設定 [アカウント名: "my-account" ; モデルプロバイダ: OpenAI ; API キー: "sk-..."]

自然言語で SQL クエリーを実行 [アカウント名: "my-account" ; モデル: "gpt-4o" ; プロンプト: "鈴木さんが働いているのはどの会社ですか?"; 指定されたオプション: 一覧から ; 処理: クエリー ; データテーブル: 一覧から ; テーブル...; ストリーム ; 応答のターゲット: 連絡先::応答]

「連絡先::応答」フィールドに格納される応答の例:

鈴木さんは Acme Anvils, Inc. で働いています。

例 2 

カスタムダイアログボックスでユーザに質問します。デフォルトのボタンは「クエリー」、ボタン 2 は「データのみ」、ボタン 3 は「キャンセル」です。質問は $$UserPrompt 変数に保存されます。次に $options 変数を設定してユーザが [処理:] に [クエリー] または [データのみを取得] を選択した際に反映するようにします。ユーザが質問を入力して [キャンセル] をクリックしなかった場合、[自然言語で SQL クエリーを実行] スクリプトステップを実行し、$$UserPrompt と $options を渡し、$$QueryResultData にモデルからの結果が返され別のカスタムダイアログボックスに表示されます。クエリーは「連絡先」および「従業員」テーブルに制限されています。

コピー
AI アカウント設定 [アカウント名: "my-account" ; モデルプロバイダ: OpenAI ; API キー: "sk-..."]

カスタムダイアログを表示 ["データベースに要求:" ; $$UserPrompt]

変数を設定 [$options ; 値: 
    Let ([
        $choice = Get (最終メッセージ選択) ;
        action_choice = Case (
            $choice = 1 ; "クエリー" ;
            $choice = 2 ; "データのみを取得"
            ) 
        ] ; 
    
        JSONSetElement (
            ""; 
            ["処理" ; action_choice ; JSONString] ;
            ["データテーブル" ; JSONMakeArray (
                    "連絡先¶従業員" ;
                    "¶" ; 
                    JSONString
                ) ;
                JSONArray] ; 
            ["ストリーム" ; "off" ; JSONString]
        )
    )
]

If [not IsEmpty ($$UserPrompt) and $choice ≠ 3]

    自然言語で SQL クエリーを実行 [アカウント名: "my-account" ; モデル: "gpt-4o" ; プロンプト: $$UserPrompt ; 指定されたオプション: JSON データで ; 応答のターゲット: $$QueryResultData]
    
    カスタムダイアログを表示 ["データの結果:" ; $$QueryResultData]
    
End If

プロンプトが「鈴木さんが働いているのはどの会社ですか?」で、ユーザが [データのみ] ボタンをクリックしたと仮定すると、$$QueryResultData に保存される応答の例は:

Acme Anvils, Inc.

例 3 

[SQL を取得] および [DDL を取得] 処理を使用してデバッグする方法を紹介します。スクリプトは最初に「製品」テーブルと「注文」テーブルで生成された DDL を取得してから、特定のプロンプト用にモデルによって生成されたすべての SQL ステートメントを取得し、それぞれをレビュー用に別々の変数に保存します。

コピー
自然言語で SQL クエリーを実行 [アカウント名: "my-account" ; モデル: "gpt-4o" ; プロンプト: " " ; 指定されたオプション: 一覧から ; 処理: DDL を取得 ; データテーブル: 名前で ; "製品¶注文" ; 応答のターゲット: $$ProductsOrdersDDL]

自然言語で SQL クエリーを実行 [アカウント名: "my-account" ; モデル: "gpt-4o" ; プロンプト: "製品 ID 101 の注文の合計値を探してください" ; 指定されたオプション: 一覧から ; 処理: SQL を取得 ; データテーブル: 名前で ; "製品¶注文" ; 応答のターゲット: $$GeneratedSQL]

カスタムダイアログを表示 ["情報をデバッグ" ; "生成された DDL:" & ¶ & $$ProductsOrdersDDL & ¶ & ¶ & "生成された SQL:" & ¶ & $$GeneratedSQL]

$$ProductsOrdersDDL に保存される DDL の例:

コピー
CREATE TABLE "Products" (
"ProductID" int, /*製品を固有に識別する主キー*/
"ProductName" varchar(255), /*製品のわかりやすい名前*/
"Price" int, /*製品価格*/
PRIMARY KEY (ProductID)
);

CREATE TABLE "Orders" (
"OrderID" int, /*注文を固有に識別する主キー*/
"ProductID" int, /*「製品」テーブルとの多対 1 のリレーションシップの外部キー*/
"Quantity" int, /*注文された製品の数量*/
PRIMARY KEY (OrderID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);

$$GeneratedSQL に保存される SQL ステートメントの例:

コピー
SELECT SUM("Quantity" * "Price") AS "TotalValue" FROM "Orders" JOIN "Products" ON "Orders"."ProductID" = "Products"."ProductID" WHERE "Orders"."ProductID" = 101