AIを活用したSQLクエリの構築 | オリジナル、AI翻訳

Home 2025.07

データベーススキーマ (PostgreSQL):

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    first_name VARCHAR(100),
    last_name VARCHAR(100),
    date_of_birth DATE,
    gender VARCHAR(10),
    phone_number VARCHAR(20),
    address TEXT,
    city VARCHAR(100),
    state VARCHAR(100),
    country VARCHAR(100),
    zip_code VARCHAR(20),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE,
    last_login TIMESTAMP WITH TIME ZONE,
    is_active BOOLEAN DEFAULT TRUE,
    role VARCHAR(50),
    profile_picture_url VARCHAR(255),
    bio TEXT,
    failed_login_attempts INTEGER DEFAULT 0,
    account_balance NUMERIC(10, 2) DEFAULT 0.00
);

上記はPostgreSQLデータベースです。以下はテーブル定義です。自然言語クエリの指示は以下の通りです。

2025年現在で20歳のユーザーで、先月のある日頃に作成され、先週のような最近のログインをしたユーザーで、ファーストネームがAndyのユーザーを取得したいです。そのようなユーザーをクエリするSQLを教えてください。


生成されたSQLクエリ:

SELECT *
FROM users
WHERE first_name ILIKE 'andy'
  AND CAST(created_at AS DATE) BETWEEN
      (CURRENT_DATE - INTERVAL '1 MONTH' - INTERVAL '1 DAY')
      AND
      (CURRENT_DATE - INTERVAL '1 MONTH' + INTERVAL '1 DAY')
  AND EXTRACT(YEAR FROM AGE(date_of_birth)) = 20
  AND last_login >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';

以下は、GrokのようなAIシステムとのユーザーのやり取りを追跡するために使用できるconversationsテーブルのPostgreSQLテーブル定義です。このテーブルは、会話に関する情報、ユーザー、コンテンツ、タイムスタンプ、関連するメタデータを追跡するように設計されています。

CREATE TABLE conversations (
    id SERIAL PRIMARY KEY,
    user_id INTEGER NOT NULL,
    title VARCHAR(255),
    conversation_type VARCHAR(50) DEFAULT 'chat',
    started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    ended_at TIMESTAMP WITH TIME ZONE,
    status VARCHAR(50) DEFAULT 'active',
    message_count INTEGER DEFAULT 0,
    last_message_at TIMESTAMP WITH TIME ZONE,
    is_archived BOOLEAN DEFAULT FALSE,
    ai_model_version VARCHAR(100),
    total_tokens_used INTEGER DEFAULT 0,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

説明:

このテーブルは柔軟に設計されており、個々のメッセージを別のmessagesテーブルに保存するか、感情分析や会話タグなどのフィールドを追加するなど、特定のニーズに基づいて拡張できます。メッセージテーブルやこのテーブルと対話するためのクエリが必要な場合はお知らせください!


ユーザーが自然言語(例: “最新の5つの会話を表示”または”タイトルにjavaという単語を含む会話”)を使用して自身の会話をクエリできるフロントエンドを有効にするには、conversationsテーブルからの結果を認証済みユーザーの会話に制限するSQLクエリを確実に作成する必要があります。これは、ユーザーのID(例: user_id)をクエリに組み込み、自然言語をSQL条件に変換することで実現されます。以下に、conversationsテーブルと対話するためのプロンプトと対応するSQLクエリを示しますが、ユーザーは常に自身のデータのみにアクセスできるようにします。

主な考慮事項

自然言語プロンプトとSQLクエリ

プロンプト1: “最新の5つの会話を表示”

解析された要件:

SQLクエリ:

SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;

プロンプト2: “タイトルにjavaという単語を含む会話”

解析された要件:

SQLクエリ:

SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
  AND title ILIKE '%java%';

フロントエンドの実装に関する注意事項

  1. ユーザー認証:
    • フロントエンドは認証済みユーザーのID(例: JWTトークンまたはセッションから)を取得し、バックエンドAPIに送信する必要があります。
    • バックエンドはuser_idを検証し、WHERE句で結果をフィルタリングする必要があります。
  2. 自然言語処理:
    • シンプルなルールベースのパーサーまたはAIモデル(例: Grok)を使用して、自然言語クエリを解析し、以下を抽出します:
      • 意図: 会話をリスト表示します。
      • フィルタ: キーワード(例: “java”)、ソート(例: “最新”)、または制限(例: “5”)。
    • 例として、”最新の5”をORDER BY started_at DESC LIMIT 5に、”タイトルにjavaという単語を含む”をtitle ILIKE '%java%'にマッピングします。
  3. API設計:
    • 以下のようなエンドポイント(例: /api/conversations)を作成します:
      • user_id: 認証済みセッションから。
      • query: 自然言語入力または構造化パラメータ(例: { filter: "title contains java" })。
    • バックエンドはクエリをSQLに変換し、user_idが常にWHERE句に含まれるようにします。
  4. セキュリティ:
    • ユーザーが直接SQLを入力したり、user_idフィルタを変更したりできないようにします。
    • SQLインジェクションを防ぐためにパラメータ化クエリ(例: :authenticated_user_id)を使用します。
    • ILIKE検索で悪意のあるパターンを避けるために入力を検証します。
  5. フロントエンド表示:
    • 会話リストを表示するためにidtitlestarted_atlast_message_atstatusなどのフィールドを返します。
    • UIにソートやフィルタリングオプション(例: “最新”のドロップダウンまたはタイトル検索用のテキスト入力)を提供します。

例のワークフロー

  1. ユーザーがログインし、フロントエンドがそのuser_id(例: 123)を取得します。
  2. ユーザーが検索バーに”最新の5つの会話を表示”と入力します。
  3. フロントエンドはバックエンドにリクエストを送信します: /api/conversations?user_id=123&query=最新の5.
  4. バックエンドはクエリを解析し、以下のSQLを生成します:
    SELECT *
    FROM conversations
    WHERE user_id = 123
    ORDER BY started_at DESC
    LIMIT 5;
    
  5. バックエンドは結果をJSONとして返し、フロントエンドは会話を表示します。

追加の注意事項

フロントエンドコード、バックエンドAPIの設定、または追加のクエリ例が必要な場合はお知らせください!


Back Donate