Microsoft Ignite 2021の基調講演で発表された「Azure OpenAI Service」。公式ページにある通りOpenAI でOpenAI APIを発行してもらったのでExpamplesにある49個のアプリから「SQL translate」をPythonから実行して試行錯誤します。
OpenAIのExpamplesにあるSQL translateとは
公式の説明では「Translate natural language to SQL queries.」とあり、“自然言語をSQLクエリに変換”となります。文章でデータベースからこんなデータが欲しいと書くだけで、SQLを自動生成してくれます。
公式のタグでは「Code」と「Transformation」の2つが付与されています。
プログラムを見るとエンジンは「Davinci-codex」となっており、Codex系のエンジンであることが確認できます。
サンプルコードでは最初に「### Postgres SQL tables, with their properties:」とあり、まずはSQLクエリを生成したい対象のテーブル情報を入れる必要があります。
早速使ってみた
公式にあるコードを参考に、好きな文章を入れられるように str という変数に会話を入れて実行できるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
Python Code ‘’’ import os import openai openai.api_key = os.getenv("OPENAI_API_KEY") str = """### Postgres SQL tables, with their properties: # # Employee(id, name, department_id) # Department(id, name, address) # Salary_Payments(id, employee_id, amount, date) # ### A query to list the names of the departments which employed more than 10 employees in the last 3 months SELECT""" response = openai.Completion.create( engine="davinci-codex", prompt=str, temperature=0, max_tokens=150, top_p=1.0, frequency_penalty=0.0, presence_penalty=0.0, stop=["#", ";"] ) print(response["choices"][0]["text"]) ‘’’ |
サンプルを見ると、Postgres SQLに対して3つのテーブルがあるとなっています。
- Employee(社員)テーブル 社員ID、社員名、部門ID
- Department(部門)テーブル 部門ID、部門名、住所
- Salary_Payments(給与) 給与ID、社員ID、給与額、支払日
上記ではわかりやすくEmployeeテーブルのIDを社員IDと記述していますが、サンプルを見ると「id」となっており、id=テーブルID(社員ID、部門ID、給与ID)と自動的に解釈してくれていることがわかります。
このテーブルに対して、「過去3ヶ月間に10人以上の従業員を雇用した部門名をリストアップするクエリ」という自然言語から参照するSQLクエリが生成されます。
実行すると「DISTINCT department.name
FROM department
JOIN employee ON employee.department_id = department.id
JOIN salary_payments ON salary_payments.employee_id = employee.id
WHERE salary_payments.date > (CURRENT_DATE – INTERVAL ‘3 months’)
GROUP BY department.name
HAVING COUNT(employee.id) > 10」と生成されます。
生成したクエリを見ると、「部門をリストアップ」から参照するテーブルが「department」となっているだけでなく、部門テーブルと給与テーブルが結合できないことを解釈し、部門テーブルの部門IDと社員テーブルの部門IDを結合しています。社員テーブルの社員IDと給与テーブルの社員IDを結合するといった複雑な内容も理解しているようです。
どんなときに使えるのか?
文章(自然言語)からSQLクエリが生成されるので、前半のテーブル構造までの記述を準備することで非エンジニアでもSQLを理解しなくても自分でSQLクエリを作ることが出来ます。
データがほしいときに、マーケティング担当者から情報システム部門にこんなデータが欲しいと依頼して出力してもらったデータを確認して分析し、新たな仮設に対して再び依頼する「SQL translate」を使うことで、マーケティング担当者が自分自身でSQLクエリを作って実行することが出来ます。
Codex系の特徴ですが生成されたクエリが問題ないかを確認するためには、ある程度クエリが理解できる必要があります。意図しないクエリによってデータベースに問題を起こさないためにも、「マーケティング担当者は○○データベースに対してReadOnlyアクセス」のようにアカウントごとに権限をきちっと設計した上で使う必要があります。
運用ルールをきちんと決めることで、非エンジニアでもデータベースを使うことが出来、より幅広いスタッフがデータを活用することが出来ます。