はじめに
Oracle CloudのAutonomous Databaseで提供される自然言語によるクエリ実行(SELECT AI)を活用するいくつかのコツを紹介します。
- LLMが使用可能なメタデータの提供
- 一緒に使用される表を結合するビューを定義
- メトリックを計算するための列の定義
- LLMに提供するメタデータの制御
- プロンプトの改善
- SQL生成に優れたLLMを選択
事前準備
Autonomous Database:SELECT AI(自然言語によるクエリ実行)がOCI生成AIサービスに対応したので試してみたなどを参考にSELECT AIを使うことができる準備をします。
LLMが使用可能なメタデータの提供
メタデータの充実化手法
わかりやすい名前を使用
LLMが表および列の意味を解釈できない名前を使っている場合、既存の表またはビューにビューを定義します。
-- Table with Cryptic names
CREATE TABLE tab1 (
id NUMBER,
field1 VARCHAR2(256),
dt DATE,
flex_field2 VARCHAR2(4000));
-- View with readable names
CREATE OR REPLACE VIEW EMPLOYEE AS
SELECT id AS employee_id,
field1 AS full_name,
dt AS hire_date,
flex_field2 AS home_address
FROM tab1;
作成したビューをAIプロファイルに含めます。
コメントによるメタデータの拡張
表および列のコメントを定義し、AIプロファイルでコメントを有効化ます。
表および列のコメントは、それぞれの概要、使用方法、有効な値、および値の解釈方法を説明する簡単な説明です。
COMMENT ON MY_GENERIC_TABLE IS 'This table describes customer demographic data…'
AI プロファイル属性で、以下を指定します。
"comments":"true"
コメントやメタデータの文字数によって、 LLM でトークン制限を超える可能性があることに注意してください。
制約によるメタデータの拡張
LLMは、必要な結果を生成するために結合する表の組合せを決定できない場合があります。定義された外部キーなどの参照整合性制約をLLMが利用するように、AIプロファイル属性で、次を指定します。
"constraints":"true"
参考)外部キー制約を定義する例
CREATE TABLE employee (
emp_no NUMBER PRIMARY KEY,
emp_name VARCHAR2(50),
salary NUMBER,
dept_no NUMBER,
CONSTRAINT emp_dept_fk FOREIGN KEY (dept_no) REFERENCES department(dept_no)
);
注釈(annotations)によるメタデータの拡張
表および列に指定できる注釈(annotations/アノテーション)を使用することも可能です。AIプロファイルで注釈を有効にするには、次を指定します。
"annotations":"true"
列および表に注釈を定義する例を次に示します。
CREATE TABLE employee (
emp_no NUMBER ANNOTATIONS (mandatory, system_generated, alias 'employee number'),
emp_name VARCHAR2(50) ANNOTATIONS (display_value),
salary NUMBER,
dept_no NUMBER ANNOTATIONS (alias 'department number')
) ANNOTATIONS (primary_table 'Table storing main information about employees);
一緒に使用される表を結合するビューを定義
特定の表の結合が繰り返し使用されることがわかっている場合は、これらの表に対するビューを定義し、LLMの作業を簡素化できます。
制約を有効にするとLLMに役立ちますが、LLMで必要な結合が正しく推測される可能性もあります。事前結合表を使用すると、LLMは表間の意図した関係を使用できます。
メトリックを計算するための列の定義
頻繁に使用されるメトリックまたはKPIが1つ以上の列から算出される場合、それらを列として明示的に計算するビューを定義することを検討してください。このように、LLMはそれに遭遇するたびに意図した式を把握する必要はなく、一貫性のない結果や誤った結果の生成を回避できます。
たとえば、純利益率をよく参照する場合は、次の式を使用してビューの列を定義できます。
SELECT product_id, …, net_income/total_revenue*100 AS net_profit_margin FROM my_finance_table;
プロンプトで式を記述すると、柔軟性が向上すると考えられますが、LLMには、特定の数学計算を確実に実行するための制限があります。より安全で、このような計算をビュー定義に直接含める統一された解釈を提供します。
LLMに提供するメタデータの制御
LLMに提供するメタデータ・表が多すぎると、いくつかの問題が発生する可能性があります。
- LLMは、提供されるすべてのメタデータを処理して理解する必要がある。
- プロンプトが大きいほど、トークンが多くなり、コストが高くなる。
- プロンプトが大きいとLLMトークンの制限を超える可能性がある。
SELECT AIは、LLMに提供するメタデータを決定するための4つのオプションを提供します。
- スキーマのみを指定します。これには、オブジェクト・リスト内のスキーマ内のすべての表のメタデータが含まれます。
- 個々の表を指定します。これにより、メタデータがオブジェクト・リスト内の表に制限されます。
- スキーマ名と個々の表の組合せを指定します。
- オブジェクト・リスト・モードを自動モードとして指定
- LLMに提供するメタデータが動的に決定されます。
- 一連の表を指定し、場合によっては複数のAIプロファイルを定義する必要がなくなります。
AIプロファイルには最小数の表を指定することをお薦めします。
自動オブジェクト・リスト・モードは、メタデータでRAGを使用して、ユーザーが指定したプロンプトに適用できる可能性が最も高い表を識別します。
一連の表を指定し、場合によっては複数のAIプロファイルを定義する必要がなくなります。
ビューを作成することで、表の数を減らすことができます。これは、表の事前結合のもう1つの利点です。
AIプロファイルのオブジェクト・リストに基づいて間違った表が選択された場合、結果が正しくない可能性があります。
プロンプトの改善
LLMにあいまいな質問をすると、あまり役に立たない結果が返されます。
たとえば、「米国には何人の顧客がいますか?」という問いに、該当する顧客が数千人だとしても、答えとしてゼロが返される場合があります。
LLMは国列があることを認識していますが、使用する正しい値が判断できず、WHERE句で「US」、「USA」、「United States」、「United States of America」のどれかを指定します。
同じように、大文字と小文字の区別も問題を引き起こす可能性があります。この問題に対処するために、新しいAIプロファイル属性を使用して、文字列列の大文字と小文字を区別するWHERE句を有効または無効にできます。
"case_sensitive_values": false
SQL生成に優れたLLMを選択
結果を比較するために、いくつかのLLMを試してみる価値があります。
テキスト/自然言語からSQLへの生成の相対的なパフォーマンスを理解するには、BIRD-SQLなどの様々なベンチマークが参照になります。
さいごに
LLMの特性を理解してSELECT AIを活用すること、AIプロファイルのオプションを活用することで、期待の結果を得られます。