OpenAIで4Dを強化する!

人工知能は、デベロッパーとしてだけでなく、私たちの日常生活を急速に混乱させています。OpenAIChatGPT については、ほとんどの方がすでにご存知でしょう。この記事は、Qodly Studioを使った概念実証の実践的なユースケース、アプリ用の現実的なデータセットを AI で生成する方法についてです。言い換えれば、アプリのテストやデモンストレーションのために、サンプルデータを素早く生成する方法です。

基本の説明

ChatGPT は、GPT (Generative Pre-trained Transformer) モデルの一種で、会話の文脈における自然言語の理解と生成のために調整されています。ユーザーとテキストベースの会話をし、人間のような応答と、文脈に沿ったテキストを生成するように設計されています。ChatGPT は、チャットボット、バーチャルアシスタント、カスタマーサポートなど、自然言語によるユーザーとの対話が必要とされる幅広いアプリケーションに使用できます。

OpenAI API は、ChatGPT や OpenAI が提供する他のモデルの機能に開発者がアクセスし、使用できるようにするプログラミングインターフェースです。これは、開発者のアプリケーションとモデル間の橋渡しとして機能し、テキストプロンプトの送信や、モデルが生成した応答の受信を可能にします。

どう役立つのか?

これは Rest API なため、4D で使うのはとても簡単です。たとえば、新しいアプリを開発するとします。データクラス、属性、リレーションといったストラクチャーを設計します。デスクトップ画面や Qodly Webフォーム の画面と、トランザクションをデザインします。さて、何が足りないでしょうか? もちろんデータです!

インポートに使える csv や jsonファイルが常にあるとは限りませんし、関連するデータセットを収集し、調整する時間もありません。そこで AI が役に立ちます。この概念実証では、デベロッパーであるあなたにとって、シンプルでありながら便利で実用的な AI の使い方を紹介します。

「フランス人のファーストネームを生成して」「典型的なタイムシートのコメントを生成して」と言うだけで、それに応じてデータベースが満たされることを想像してみてください。Qodly Studio で作られたアプリで有用なデータを生成する例を以下のビデオでご覧ください。

興味がわいてきましたか? デモのコードはこちらから入手できます (4D v20 R2 以上):

4D, Qodly and OpenAI

自由に遊んだり、改良したり、あなたのケースに合わせたりしてください。貢献することもお忘れなく!

どう動作するのか?

実はとてもシンプルで、派手さはありません。

4D の汎用プログラミングでは一般的な、データクラスとその属性をリストする以外は、このデモの中心は OpenAI の API をクエリすることです。

これは専用のユーザークラスの、queryOpenAI() という関数でおこないます。

Function queryOpenAI() : Text
  var $url : Text
  var $headers; $data; $opts : Object
  var $request : 4D.HTTPRequest
	
  $url:="https://api.openai.com/v1/chat/completions"
  $headers:=New object("Authorization"; "Bearer "+This.apiKey; "Content-Type"; "application/json")
	
  $data:={}
  $data.model:="gpt-3.5-turbo"
  $data.messages:=This.messages.copy()
  $data.messages.push({role: "user"; content: This.userPrompt})
	
  $opts:={method: "POST"; headers: $headers; body: $data}
	
  $request:=4D.HTTPRequest.new($url; $opts)
  $request.wait()
	
  This.fetchStatusCode:=$request.response.status
	
  If (This.fetchStatusCode=200)
    return $request.response.body.choices[0].message.content
  Else 
    return ""
  End if 

4D.HTTPRequestクラスを使い慣れていれば、この関数に真新しいところはありませんが (登録後に自身のAPI Key を使う必要があることに注意してください)、This.messagesThis.userPrompt というプロパティは特別で、これらをリクエストのボディに記述することで、OpenAI にクエリすることができます。

これらのプロパティは、あなたの創造性が発揮されるところです。クラスのコンストラクターを見てください:

This.systemPrompt:="You are data generator. "
This.systemPrompt+="You will be provided with a description values to generate; and your task is to generate as many values as requested. "
This.systemPrompt+="Generated values must be separated by the character separator ¶. "
This.systemPrompt+="The list must start with 2 characters: ¶¶. "
This.systemPrompt+="The list must end with 2 characters: ¶¶. "
	
This.messages:=[]
This.messages.push({role: "system"; content: This.systemPrompt})
This.messages.push({role: "user"; content: "Generate a list of exactly 10 values for \"firstname\" of type Text."})
This.messages.push({role: "assistant"; content: "¶¶Alice¶Oliver¶Elsa¶Liam¶Maja¶Noah¶Ella¶Lucas¶Wilma¶Hugo¶¶"})
This.messages.push({role: "user"; content: "Generate a list of exactly 10 values for \"amount\" of type number."})
This.messages.push({role: "assistant"; content: "¶¶35¶64797¶101246¶3¶119¶4477¶647779¶357769¶94¶77¶¶"})
This.messages.push({role: "user"; content: "Generate a list of exactly 5 values for \"birthdate\" of type date."})
This.messages.push({role: "assistant"; content: "¶¶1980-10-05¶2035-05-02¶1995-12-15¶2022-10-14¶2011-05-23¶¶"})
	
This.userPrompt:="Generate a list of exactly "+String($quantity)+" values for \""+String($attributeName)+"\" of type "+This.attributeType+"."
This.userPrompt+=($remark#"") ? (" Remark: "+$remark) : ""
If ($attributeType="date")
  This.userPrompt+=". Date format: YYYY-MM-DD"
End if

この一連のコードは、3つの部分に分けることができます:

  1. システムプロンプト: ここでコンテキストと全体像を設定し、モデルを望む方向に誘導します。ここでは、要件のようなものを書いています。
  2. 予備会話: ユーザー (あなた) とアシスタント (AI) の会話を模倣します。OpenAI は、文脈に沿った応答を提供することに特化した生成モデルにすぎないことを忘れないでください。会話の冒頭を自分で書くことで、安定した回答を得られる可能性が高まります。ここでは、3つの質問と回答をシミュレートすることで、適切な形式の回答を得る可能性を高めます。
  3. ユーザープロンプト: これが本当の質問です。先にシミュレートした 3つの質問と同じ形式ですが、今回のプロンプトはユーザーがデモUIで設定したもので初期化されています。

上述のように、システムプロンプト、予備会話、ユーザープロンプトはすべてコレクション $data にプッシュされ、HTTPRequest のボディとして OpenAI に送信されます。

残りは、典型的な文字列の分割処理です。

要点

デモを見たり、自分で操作することで、OpenAI のクエリには時間がかかることがわかります。ダウンタイムが疑われる場合は、https://status.openai.com/ で確認できます。ある側面が、レスポンスタイムに大きな影響を与えます: APIレスポンスに含まれるトークンの量です。レスポンスが長ければ長いほど、取得に時間がかかります。しかし多くの場合、関連するデータセットを収集し、調整し、インポートするよりも、しばらくの間マシンを実行させた方が速いでしょう。

このデモには、いろいろな意味で最適化の余地があります。OpenAI API が提供しているストリーミング・モードは、データベースのレコード生成を現在よりはるかに速く開始できるようにすることで、体験を改善できるでしょう。

このような例があなたのインスピレーションになれば幸いです! OpenAI APIリファレンスには、興味深い機能やその他の使用例が満載です。ご遠慮なく、貢献したり、私たちに提案を送ったりしてください!

Avatar
- 4D 製品チームリーダー -Mathieu は 2020 年に製品チームリーダーとして 4D に入社しました。彼のチームは、4Dのユーザーの声であるプロダクトオーナーで構成されています。エンジニアリングチームと密に連携し、新機能の優先順位付けをしたり、あるいはその新機能が4Dユーザーの期待に沿うものであるか、検証を行うことが仕事です。Mathieuは以前、自動車、安全、広告など様々な業界のIT部門でプロジェクトディレクターやチームマネージャーを務め、国際的な舞台でのクラウド指向のサービスを専門としていました。