プロンプトエンジニアリングガイド:Llama 2で自然言語をSQLに変換 (2024/01/31)

プロンプトエンジニアリングガイド:Llama 2で自然言語をSQLに変換 (2024/01/31)

https://blogs.oracle.com/ai-and-datascience/post/prompt-engineering-natural-language-sql-llama2

投稿者:Anshuk Pal Chaudhuri | Consulting Member of Technical Staff

Lyudmil Pelov | Senior Principal Product Manager


大型言語モデル(LLM)は、自然言語のプロンプトを理解し、一貫した応答を生成する印象的な機能を示します。この機能により、自然言語をSQLなどの構造化問合せ言語に変換する新たな機会が生まれました。以前は、SQL問合せの作成に技術的な熟達度が必要であったのとは異なり、LLMは、ユーザーが入力を簡単な英語で明確にし、対応するSQLコードの自動生成を可能にします。



Code Llama


LLMを使用して自然言語をSQL問合せに変換する場合は、プロンプトが重要です。LLMモデルであるCode Llamaは、コードの生成と議論のためにファインチューニングされたLlama 2の上に構築されたAIモデルを使用して、さまざまな迅速なエンジニアリング技術で評価しました。テキスト プロンプトを使用して、コードを作成および照会できます。Code Llamaは、コーディング・タスクのために公的にアクセス可能なLLMの中の最先端のソリューションです。ワークフローを迅速化し、開発者の効率を向上させると同時に、初心者をコーディングするための学習曲線も減少します。Code Llamaには、生産性向上ツールと教育リソースの両方として機能する能力があり、プログラマがより堅牢で文書化されたソフトウェアを作成するのに役立ちます。


Code Llamaは、70億から340億の規模の範囲で、事前トレーニングおよびファインチューニングされた生成テキスト・モデルのコレクションです。これは、Hugging Face Transformers形式の34B指示チューニング・バージョンのリポジトリとして機能します。このモデルは、一般的なコード合成と理解のために設計されています。他のモデルについては、このブログ投稿の最後にあるリソースを参照してください。


Type Base model Python Instruct
7B codellama/CodeLlama-7b-hf codellama/CodeLlama-7b-Python-hf codellama/CodeLlama-7b-Instruct-hf
13B codellama/CodeLlama-13b-hf codellama/CodeLlama-13b-Python-hf codellama/CodeLlama-13b-Instruct-hf
34B codellama/CodeLlama-34b-hf codellama/CodeLlama-34b-Python-hf codellama/CodeLlama-34b-Instruct-hf


モデルの詳細については、Hugging FaceのCode Llamaを参照してください。


大まかに言えば、自然言語からSQLへの変換を行う際のプロンプト・エンジニアリングについて、次の重要な考慮事項があります。


  • 明確な指示を採用する: 明確で簡単な自然言語プロンプトを使用すると、LLMの理解と翻訳が容易になります
  • 十分なコンテキストの指定: LLMでは、ユーザーがSQL問合せを、表名や列名などのデータベース・スキーマに関する詳細とともに検索することを理解する必要があります。
  • 例の組込み: 対応するSQL問合せと組み合せた自然言語プロンプトの例をいくつか示すと、LLMが正しい構文で問合せを生成するのに役立ちます。
  • 検索拡張生成(RAG)の使用: 自然言語プロンプトとSQL問合せの関連サンプル・ペアを取得すると、精度が向上します。



課題


生成AIウェーブ、特にテキスト生成専用のLLMのサブセットが登場する中、ほぼすべての組織は、特定のニーズに合わせて生成AIアプリケーションを統合したいと考えています。この傾向は比較的単純に見えるかもしれませんが、高性能LLMの豊富さが現在出現しているため、現実はまったく異なります。


多くの堅牢なLLMは、一般的に広範囲にわたる知識を効果的に処理しますが、ローカライズされた企業またはドメイン固有の情報を処理する場合は、大幅に不足することがよくあります。組織の観点からは、ローカライズされた知識に基づいて応答する能力が主な要件であることがよくあります。たとえば、テキストからSQLへの生成モデルでは、構文的に正しいSQL問合せを生成する必要があるだけでなく、企業に固有のビジネス・セマンティクスの知識と、データ・スキーマに関する保護されたローカル情報も必要です。



ファインチューニング


ファインチューニングは、タスク固有のデータセットで事前トレーニング済モデルをさらにトレーニングするプロセスです。一般に、LLMの場合、基本の事前トレーニングは非常に大きいデータセットで実行されますが、ファインチューニングははるかに小さいデータセットで実行されます。


LLMの構築に不可欠な包括的なトレーニング・プロセスは、金銭的側面と時間的側面の両方でかなり高価です。そのため、どの企業でもビジネス・ユース・ケースの実装を試すのは効率的ではありません。LLMの使用に関連する運用コストを検討する場合でも、導入アプローチの非効率性のために費用が高くなる傾向があります。これは、検討しようとしているいくつかの方法論を採用する場合でも当てはまる現実です。


それでは、より正確で正確な結果を提供する、迅速で簡単なテクニックについて説明します。



プロンプト・エンジニアリング


プロンプトは、指定された入力を絞り込むことによって言語モデルの応答動作を指示するメソッドです。プロンプトの手法は、タスクの要件およびモデルの機能に応じて、単純なフレーズから詳細な指示まで多岐にわたります。適切な質問を提示することを目的として、特定のタスクのプロンプトを設計および最適化するプロセスをプロンプト・エンジニアリングと呼びます。


基本的に、迅速なエンジニアリングは、特定の目的とコンテキストに対して最も適した応答を生成するLLMを支援します。これは、リクエストの目的とコンテキストを十分に理解した応答を必要とするエンタープライズ・ビジネス・アプリケーションで特に重要になります。実践されたプロンプト手法には、基本的なダイレクト・プロンプト、モデル・ロール割当て戦略を含むロール・プロンプト、プロンプト内デモンストレーションを組み込んだ少数ショット・プロンプト、中間ステップ・ガイダンスによる思考連鎖(CoT)プロンプト、入力分解を含む自己マスク・プロンプトなどがあります。


LLMを使用して自然言語からSQLを生成する場合、プロンプトで正確な指示を提供することは、モデルの出力を制御するために不可欠です。Code Llamaモデルを使用した実験では、効果的なアプローチとして、プロンプト内で次の文字列を使用して説明を促し、個別のコンポーネントに注釈を付けます。


# An example of the SQL would be 'SELECT * FROM orders WHERE DATE(orderDate) = CURDATE() - INTERVAL 1 DAY AND status = 'ORDERED'


#が付いたこれらのコメントは、モデルがSQLをどのようにフォーマットするかを明示的に指示する命令として機能します。たとえば、##間の問合せを明確化するようにモデルに指示すると、冗長出力を合理化できます。これらの指示がないと、Code Llamaモデルは、SQL構造を説明し、後処理に不要な複雑さを導入して、出力トークンの消費が増加する傾向があります。###で始まる表スキーマを組み込むと、データベース・スキーマはコンテキストの境界をモデルにシグナルします。



アプローチ


1. 特定の質問、サンプルまたは参照SQLおよび表スキーマを定義します。質問の種類は非常に具体的でなければなりません。


Can you tell me about the orders which are completed one day ago (Type 1)


2. SQLを参照します。


Select * from orders where WHERE DATE(orderdate) = CURDATE() - INTERVAL 1 DAY AND status = 'COMPLETED' (Reference SQL for Type 1)


3. スキーマを参照します。


CREATE TABLE IF NOT EXISTS orders ( "schema=");


4. この情報は、索引内の「検索を開く」などのベクトル・データベースで定義できます。インデックスでは、すべてのドキュメントに次の属性があります。


  • Reference_Question
  • Reference_SQL
  • スキーマ


5. 類似性モデルを含むOpen Search問合せを起動して自然言語の質問を渡し、索引で定義されたタイプに対して返される最適なドキュメントを取得します。このコマンドは、参照SQLおよびスキーマを返します。


6. 質問、スキーマおよびサンプルSQLに基づいて、プロンプトが作成され、モデルが起動されます。


データがベクトル・データベースにすでに取り込まれているとします。ユーザーは、「まだ完了しておらず、2週間前にオーダーされたオーダーをすべて表示」という質問をすることができます。この質問は、参照質問と最も類似しています。プロンプトが作成されると、モデルは次の情報に従います。


Select * from orders where WHERE DATE(orderdate) = CURDATE() - INTERVAL 14 DAY AND status = 'INCOMPLETE'





コードスニペット


モデルは、Oracle Cloud Infrastructure (OCI) Object Storageで永続化し、Object Storageからインポートしたり、OCI Data ScienceのPyTorch Conda環境にダウンロードして、Conda環境キャッシュから実験して使用できます。


import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
 
model_id =  "codellama/CodeLlama-13b-Instruct-hf"
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)
 
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map="auto")
 
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
eos_token_id = tokenizer.eos_token_id
 
question = "Can you tell me about the orders which are completed two days ago?"
eval_prompt = """### Task
# Generate a SQL query to answer the following question:
# `{question}
 
# ### Database Schema
# This query will run on a database whose schema is represented in this string:
# Don't use joins for this schema and if all columns are required give the (*) notation.
 
# CREATE TABLE IF NOT EXISTS orders (
# <define your="" table="" schema="">;
 
# An example of the SQL would be 'SELECT * FROM orders WHERE DATE(orderdate) = CURDATE() - INTERVAL 1 DAY AND status = 'COMPLETED'
 
# ### SQL
# Given the database schema, here is the SQL query that answers `{question}`:
# ```sql
# """.format(question=question)
 
model_input = tokenizer(eval_prompt, return_tensors="pt").to("cuda")
 
#model.eval()
import sqlparse
outputs = tokenizer.batch_decode(model.generate(**model_input,eos_token_id=eos_token_id,pad_token_id=eos_token_id,max_new_tokens=100,do_sample=False,
    num_beams=1), skip_special_tokens=True)
print(sqlparse.format(outputs[0].split("```sql")[-1], reindent=True))


まとめ


急速に進化するAIの世界では、LLMを促す技術は比類のない柔軟性と使いやすさを提供し、高度なAIを幅広いオーディエンスがアクセスできるようにします。簡単なクエリを求める直接的なプロンプトや状況に応じたプロンプトから、複雑な問題解決のための少数のショットと思考連鎖の技術まで、これらの方法はLLMの巨大な可能性を引き出します。これにより、様々なコンテキストにわたる迅速なプロトタイプ作成、効率的なデータ処理、カスタマイズされた応答が可能になります。特に、コンテキスト依存のプロンプトと思考連鎖のプロンプトは、段階的な推論プロセスをシミュレートすることで、モデルの問題解決能力を向上させます。さらに、単純なプロンプトによってこれらのモデルを異なるタスクに適応させることで、大規模な再トレーニングの必要性が軽減され、貴重な時間とリソースが節約されます。このアプローチは、創造的な探求を奨励し、革新的なソリューションとアイデアにつながります。


Oracle Cloud Free Trialをお試しください。300米ドルのFreeクレジットを併用した30日間のトライアルでは、Oracle Cloud Infrastructure Data Scienceサービスにアクセスできます。詳細は、次のリソースを参照してください。



コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)