자연어로 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 문자열 배열이며, 각 문자열은 스키마가 포함되어야 하는 테이블의 이름입니다. 예: ["Contacts", "Addresses"].

      • stream: 스트림 옵션의 문자열 값입니다("on" 또는 "off").

      예를 들어 다음과 같습니다.

      복사
      {
          "action" : "get sql",
          "data tables" : [ "Products", "Invoices" ],
          "stream" : "off"
      }
  • 동작은 모델에서 검색할 응답 유형을 지정합니다.

    • 쿼리: 사용자의 프롬프트에 대한 모델의 최종 응답을 자연어로 반환합니다.

    • 데이터 전용 쿼리: 이 스크립트 단계에서 실행된 모델의 마지막 SQL 쿼리에 의해 검색된 데이터만 반환합니다.

    • SQL 가져오기: 전체 상호 작용 동안 모델에 의해 생성된 모든 SQL 문을 반환합니다.

    • 첫 번째 SQL만 가져오기: 모델에 의해 생성된 첫 번째 SQL 문만 반환합니다.

    • DDL 가져오기: 이 스크립트 단계가 생성하여 모델로 보내는 데이터베이스 스키마(데이터 정의 언어)를 반환합니다.

  • 데이터 테이블는 테이블에 대한 데이터베이스 스키마를 모델에 지정하는 방법을 나타냅니다. 지정된 테이블에 대한 스키마만 전송됩니다.

    • 목록에서: 목록에서 특정 테이블을 선택합니다.

    • 이름별: 테이블 이름 목록을 텍스트 표현식으로 제공합니다. 캐리지 리턴으로 여러 테이블 이름을 구분합니다.

    • DDL별: 사용자 설정 DDL 텍스트 표현식을 제공합니다. 이를 통해 어떤 스키마 정보가 모델로 전송되는지 정확하게 제어할 수 있습니다.

  • 데이터 테이블목록에서인 경우 테이블은 테이블을 선택하는 위치입니다.

  • 스트림동작쿼리일 때 응답이 전달되는 방식을 결정합니다.

    • : 응답이 검색되고 점진적으로 전달됩니다(단어별 또는 청크 단위). 이를 통해 FileMaker 클라이언트가 더 반응성을 느낄 수 있습니다.

    • : 전체 응답을 사용할 수 있게 되기 전에 검색됩니다. 이로 인해 완전한 응답을 기다리는 동안 FileMaker 클라이언트가 응답하지 않는 것처럼 보일 수 있습니다.

  • 매개 변수는 모델 제공자가 지원하는 추가 매개 변수에 대한 키-값 쌍으로 구성된 JSON 객체의 텍스트 표현식입니다. 예를 들어 다음과 같습니다. {"온도": 0.7, "seed": 42}. 지원되는 매개 변수의 키 이름과 유효한 범위는 모델 공급자의 문서를 참조하십시오.

  • 프롬프트 템플릿 이름프롬프트 템플릿 구성 스크립트 단계를 사용하여 구성된 사용자 설정 프롬프트 템플릿의 이름을 지정합니다. 이 옵션을 사용하여 AI 모델에서 최적의 응답을 달성하는 데 도움이 되는 추가 프롬프트를 설계합니다.

  • 응답 대상은 스크립트 단계의 결과를 저장할 필드 또는 변수를 지정합니다.

  • 웹 뷰어에서 JavaScript 수행은 스크립트 단계가 완료된 후 대상 웹 뷰어에서 수행할 JavaScript 코드를 지정합니다. 이 옵션은 다음 스크립트 단계로 웹 뷰어에서 JavaScript 실행 스크립트 단계를 실행하는 것과 유사하며, 여기에서 응답 대상을 JavaScript 함수로 전달하고 스트림 옵션이 일 때 응답 대상을 웹 뷰어로 스트리밍할 수 있다는 점은 제외됩니다.

    • 웹 뷰어는 현재 레이아웃에서 웹 뷰어의 객체 이름을 지정합니다.

    • 함수 이름은 웹 뷰어에서 호출할 자바스크립트 함수의 이름입니다.

호환성 

제품 지원
FileMaker Pro
FileMaker Go
FileMaker WebDirect
FileMaker Server 부분
FileMaker Cloud 부분
FileMaker Data API 부분
사용자 설정 웹 발행 부분

다음 버전에서 시작됨 

22.0

설명 

이 스크립트 단계를 사용하면 SQL 문을 직접 작성하는 대신 자연어를 사용하여 데이터베이스를 쿼리할 수 있습니다. AI 모델을 사용하여 자연어 프롬프트를 해석하고, 데이터베이스 스키마를 분석하고, 적절한 SQL 쿼리를 생성한 다음, 이 스크립트 단계가 SQL 쿼리를 실행한 후, 모델은 자연어로 결과를 가지고 응답할 수 있습니다. FileMaker 데이터를 모델로 보낼 필요가 없습니다.

이 스크립트 단계와 모델 간의 상호 작용은 일반적으로 다음 단계를 따릅니다.

  1. 이 스크립트 단계는 프롬프트 및 관련 데이터베이스 스키마(데이터 테이블에 의해 지정된 DDL)를 구성된 AI 모델로 보냅니다. (여기에는 선택적 프롬프트 템플릿에 제공된 프롬프트가 포함됩니다.)

  2. 모델은 프롬프트와 스키마를 분석하고 데이터베이스에서 요청된 정보를 검색하도록 설계된 하나 이상의 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("No error")을 반환합니다.

  • FileMaker Server, FileMaker Cloud, FileMaker Data API, OData API, Custom Web Publishing에서 실행되는 스크립트에서는 웹 뷰어에서 JavaScript 수행 옵션이 지원되지 않습니다.

예제 1 

AI 계정을 구성한 다음 자연어로 SQL 쿼리 수행 스크립트 단계를 사용하여 이름 및 회사 필드에 데이터가 있는 연락처 테이블의 데이터에 대해 질문합니다. 스크립트 단계에서 연락처 테이블에 대한 스키마와 "Which company does Alea work for?"라는 메시지가 모델에 표시됩니다. 모델은 필수 SQL 쿼리를 생성하고 이 스크립트 단계에서 실행한 다음 모델이 응답 필드에 저장된 자연어 응답을 제공합니다.

복사
AI 계정 구성 [ 계정 이름: "my-account" ; 모델 제공자: OpenAI ; API 키: "sk-..." ]

자연어로 SQL 쿼리 수행 [ 계정 이름: "my-account" ; 모델: "gpt-4o" ; 프롬프트: "Which company does Alea work for?" ; 지정된 옵션: 목록에서 ; 동작: 쿼리 ; 데이터 테이블: 목록에서 ; 테이블... ; 스트림 ; 응답 대상: Contacts::Response ]

Contacts::Response 필드에 저장된 가능한 응답:

Alea works for Acme Anvils, Inc.

예제 2 

사용자에게 사용자 설정 대화 상자에서 질문을 요청합니다. 기본 버튼은 "쿼리", 버튼 2는 "데이터 전용", 버튼 3은 "취소"이며 질문은 $$UserPrompt 변수에 저장됩니다. 그런 다음 동작 수행에 대한 사용자의 선택을 반영하도록 $options 변수를 설정합니다: query 또는 query for data only. 사용자가 질문을 입력하고 취소를 클릭하지 않은 경우, 자연어로 SQL 쿼리 수행 스크립트 단계를 실행하고 $$UserPrompt 및 $options를 전달한 다음, 다른 사용자 설정 대화 상자에 표시되는 $$QueryResultData에 모델의 결과를 반환합니다. 쿼리는 연락처 및 직원 테이블로 제한됩니다.

복사
AI 계정 구성 [ 계정 이름: "my-account" ; 모델 제공자: OpenAI ; API 키: "sk-..." ]

사용자 설정 대화상자 보기 [ "Ask the database:" ; $$UserPrompt ]

변수 설정 [ $options ; Value: 
    Let ( [
        $choice = Get ( LastMessageChoice ) ;
        action_choice = Case ( 
            $choice = 1 ; "query" ;
            $choice = 2 ; "query for data only"
            ) 
        ] ; 
    
        JSONSetElement (
            ""; 
            [ "action" ; action_choice ; JSONString ] ;
            [ "data tables" ; JSONMakeArray ( 
                    "Contacts¶Employees" ;
                    "¶" ; 
                    JSONString 
                ) ;
                JSONArray ] ; 
            [ "stream" ; "off" ; JSONString ]
        )
    )
]

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

    자연어로 SQL 쿼리 수행 [ 계정 이름: "my-account" ; 모델: "gpt-4o" ; 프롬프트: $$UserPrompt ; 지정된 옵션: JSON 데이터별 ; 응답 대상: $$QueryResultData ]
    
    사용자 설정 대화상자 보기 [ "Data Result:" ; $$QueryResultData ]
    
End If

프롬프트가 "Which company does Alea work for?"라고 가정한, $$QueryResultData에 저장된 가능한 응답이며 사용자가 데이터 전용 버튼을 클릭했습니다.

Acme Anvils, Inc.

예제 3 

디버깅을 위해 SQL 가져오기DDL 가져오기 동작을 사용하는 것을 보여줍니다. 스크립트는 먼저 제품 및 주문 테이블에 대해 생성된 DDL을 검색한 다음 특정 프롬프트에 대해 모델에 의해 생성된 모든 SQL 문을 검색하여 검토를 위해 각각을 별도의 변수에 저장합니다.

복사
자연어로  SQL 쿼리 수행 [ 계정 이름: "my-account" ; 모델: "gpt-4o" ; 프롬프트: " " ; 지정된 옵션: 목록에서 ; 동작: DDL 가져오기 ; 데이터 테이블: 이름별 ; "Products¶Orders" ; 응답 대상: $$ProductsOrdersDDL ]

자연어로 SQL 쿼리 수행 [ 계정 이름: "my-account" ; 모델: "gpt-4o" ; 프롬프트: "Find the total value of orders for Product ID 101" ; 지정된 옵션: 목록에서 ; 동작: SQL 가져오기 ; 데이터 테이블: 이름별 ; "Products¶Orders" ; 응답 대상: $$GeneratedSQL ]

사용자 설정 대화상자 보기 [ "Debugging Information" ; "Generated DDL:" & ¶ & $$ProductsOrdersDDL & ¶ & ¶ & "Generated SQL:" & ¶ & $$GeneratedSQL ]

$$ProductsOrdersDDL에 저장된 가능한 DDL:

복사
CREATE TABLE "Products" (
"ProductID" int, /*제품을 고유하게 식별하는 기본 키*/
"ProductName" varchar(255), /*제품의 자세한 이름*/
"Price" int, /*제품의 가격(USD)*/
PRIMARY KEY (ProductID)
);

CREATE TABLE "Orders" (
"OrderID" int, /*주문을 고유하게 식별하는 기본 키*/
"ProductID" int, /*제품 테이블과의 다대일 관계에 대한 외부 키*/
"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