Freigeben über


KI: Natürliche Sprache in SQL

Das Zitat "Nur weil Sie nicht bedeuten können, dass Sie nicht bedeuten sollten" ist ein nützlicher Leitfaden, wenn Sie über KI-Funktionen nachdenken. Die natürliche Sprache von Azure OpenAI in SQL ermöglicht Benutzern beispielsweise das Erstellen von Datenbankabfragen in einfachem Englisch, was ein leistungsfähiges Tool sein kann, um ihre Produktivität zu verbessern. Leistungsstärke bedeutet jedoch nicht immer angemessen oder sicher. In dieser Übung wird gezeigt, wie Sie dieses KI-Feature verwenden, während sie wichtige Überlegungen berücksichtigen müssen, bevor Sie sich für die Implementierung entscheiden.

Nachfolgend finden Sie ein Beispiel für eine Abfrage mit natürlicher Sprache, die zum Abrufen von Daten aus einer Datenbank verwendet werden kann:

Get the the total revenue for all companies in London.

Mit den richtigen Eingabeaufforderungen konvertiert Azure OpenAI diese Abfrage in SQL, die verwendet werden kann, um Ergebnisse aus der Datenbank zurückzugeben. Daher können nicht technische Benutzer, einschließlich Business Analysts, Marketers und Führungskräften, wertvolle Informationen aus Datenbanken einfacher abrufen, ohne sich mit einer komplexen SQL-Syntax zu befassen oder auf eingeschränkte Datengrids und Filter zu vertrauen. Dieser optimierte Ansatz kann die Produktivität steigern, indem die Benutzer keine Unterstützung von technischen Experten benötigen.

Diese Übung bietet einen Ausgangspunkt, der Ihnen hilft, zu verstehen, wie natürliche Sprache für SQL funktioniert, Sie zu einigen wichtigen Überlegungen führen, Sie über Vor- und Nachteile nachdenken und Ihnen den Code zeigen, um zu beginnen.

In dieser Übung führen Sie die folgenden Schritte aus:

  • Verwenden Sie GPT-Eingabeaufforderungen, um natürliche Sprache in SQL zu konvertieren.
  • Experimentieren Sie mit verschiedenen GPT-Eingabeaufforderungen.
  • Verwenden Sie die generierte SQL-Datei, um die Zuvor gestartete PostgreSQL-Datenbank abzufragen.
  • Gibt Abfrageergebnisse aus PostgreSQL zurück und zeigt sie im Browser an.

Beginnen wir mit dem Experimentieren mit verschiedenen GPT-Eingabeaufforderungen, die zum Konvertieren natürlicher Sprache in SQL verwendet werden können.

Verwenden der natürlichen Sprache zum SQL-Feature

  1. In der vorherigen Übung haben Sie die Datenbank, APIs und Anwendung gestartet. Sie haben die .env Datei auch aktualisiert. Wenn Sie diese Schritte nicht abgeschlossen haben, führen Sie die Anweisungen am Ende der Übung aus, bevor Sie fortfahren.

  2. Wechseln Sie zurück zum Browser (http://localhost:4200), und suchen Sie den Abschnitt "Benutzerdefinierte Abfrage " der Seite unterhalb des Datagrids. Beachten Sie, dass bereits ein Beispielabfragewert enthalten ist: Abrufen des Gesamtumsatzes für alle Bestellungen. Gruppieren Sie nach Unternehmen, und schließen Sie die Stadt ein.

    Natürliche Sprache für SQL-Abfrage.

  3. Wählen Sie die Schaltfläche "Abfrage ausführen " aus. Dadurch wird die Natürliche Sprachabfrage des Benutzers an Azure OpenAI übergeben, die sie in SQL konvertiert. Die SQL-Abfrage wird dann verwendet, um die Datenbank abzufragen und mögliche Ergebnisse zurückzugeben.

  4. Führen Sie die folgende benutzerdefinierte Abfrage aus:

    Get the total revenue for Adventure Works Cycles. Include the contact information as well.
    
  5. Zeigen Sie das Terminalfenster an, in dem der API-Server in Visual Studio Code ausgeführt wird, und beachten Sie, dass die von Azure OpenAI zurückgegebene SQL-Abfrage angezeigt wird. Die JSON-Daten werden von den serverseitigen APIs verwendet, um die PostgreSQL-Datenbank abzufragen. Alle in der Abfrage enthaltenen Zeichenfolgenwerte werden als Parameterwerte hinzugefügt, um SQL-Einfügungsangriffe zu verhindern:

    { 
        "sql": "SELECT c.company, c.city, c.email, SUM(o.total) AS revenue FROM customers c INNER JOIN orders o ON c.id = o.customer_id WHERE c.company = $1 GROUP BY c.company, c.city, c.email", 
        "paramValues": ["Adventure Works Cycles"] 
    }
    
  6. Wechseln Sie zurück zum Browser, und wählen Sie "Daten zurücksetzen " aus, um alle Kunden erneut im Datagrid anzuzeigen.

Erkunden der natürlichen Sprache in SQL-Code

Tipp

Wenn Sie Visual Studio Code verwenden, können Sie Dateien direkt öffnen, indem Sie Folgendes auswählen:

  • Windows/Linux: STRG+P
  • Mac: Cmd + P

Geben Sie dann den Namen der Datei ein, die Sie öffnen möchten.

Hinweis

Ziel dieser Übung ist es, zu zeigen, was mit natürlicher Sprache für SQL-Funktionen möglich ist und wie Sie mit der Verwendung beginnen. Wie bereits erwähnt, ist es wichtig zu diskutieren, ob diese Art von KI für Ihre Organisation geeignet ist, bevor Sie mit einer Implementierung fortfahren. Es ist auch zwingend erforderlich, geeignete Eingabeaufforderungsregeln und Datenbanksicherheitsmaßnahmen zu planen , um unbefugten Zugriff zu verhindern und vertrauliche Daten zu schützen.

  1. Nachdem Sie die natürliche Sprache für das SQL-Feature in Aktion gesehen haben, untersuchen wir, wie sie implementiert wird.

  2. Öffnen Sie die Datei server/apiRoutes.ts , und suchen Sie die generateSql Route. Diese API-Route wird von der clientseitigen Anwendung aufgerufen, die im Browser ausgeführt wird und zum Generieren von SQL aus einer Abfrage mit natürlicher Sprache verwendet wird. Nachdem die SQL-Abfrage abgerufen wurde, wird sie verwendet, um die Datenbank abzufragen und Ergebnisse zurückzugeben.

    router.post('/generateSql', async (req, res) => {
        const userPrompt = req.body.prompt;
    
        if (!userPrompt) {
            return res.status(400).json({ error: 'Missing parameter "prompt".' });
        }
    
        try {
            // Call Azure OpenAI to convert the user prompt into a SQL query
            const sqlCommandObject = await getSQLFromNLP(userPrompt);
    
            let result: any[] = [];
            // Execute the SQL query
            if (sqlCommandObject && !sqlCommandObject.error) {
                result = await queryDb(sqlCommandObject) as any[];
            }
            else {
                result = [ { query_error : sqlCommandObject.error } ];
            }
            res.json(result);
        } catch (e) {
            console.error(e);
            res.status(500).json({ error: 'Error generating or running SQL query.' });
        }
    });
    

    Beachten Sie die folgenden Funktionen in der generateSql Route:

    • Er ruft den Benutzerabfragewert ab req.body.prompt und weist ihn einer Variablen mit dem Namen userPromptzu. Dieser Wert wird in der GPT-Eingabeaufforderung verwendet.
    • Sie ruft eine getSQLFromNLP() Funktion auf, um natürliche Sprache in SQL zu konvertieren.
    • Sie übergibt die generierte SQL an eine Funktion mit dem Namen queryDb , die die SQL-Abfrage ausführt, und gibt Ergebnisse aus der Datenbank zurück.
  3. Öffnen Sie die Datei server/openAI.ts im Editor, und suchen Sie die getSQLFromNLP() Funktion. Diese Funktion wird von der generatesql Route aufgerufen und wird verwendet, um natürliche Sprache in SQL zu konvertieren.

    async function getSQLFromNLP(userPrompt: string): Promise<QueryData> {
        // Get the high-level database schema summary to be used in the prompt.
        // The db.schema file could be generated by a background process or the 
        // schema could be dynamically retrieved.
        const dbSchema = await fs.promises.readFile('db.schema', 'utf8');
    
        const systemPrompt = `
        Assistant is a natural language to SQL bot that returns a JSON object with the SQL query and 
        the parameter values in it. The SQL will query a PostgreSQL database.
    
        PostgreSQL tables with their columns:    
    
        ${dbSchema}
    
        Rules:
        - Convert any strings to a PostgreSQL parameterized query value to avoid SQL injection attacks.
        - Return a JSON object with the following structure: { "sql": "", "paramValues": [] }
    
        Examples:
    
        User: "Display all company reviews. Group by company."      
        Assistant: { "sql": "SELECT * FROM reviews", "paramValues": [] }
    
        User: "Display all reviews for companies located in cities that start with 'L'."
        Assistant: { "sql": "SELECT r.* FROM reviews r INNER JOIN customers c ON r.customer_id = c.id WHERE c.city LIKE 'L%'", "paramValues": [] }
    
        User: "Display revenue for companies located in London. Include the company name and city."
        Assistant: { 
            "sql": "SELECT c.company, c.city, SUM(o.total) AS revenue FROM customers c INNER JOIN orders o ON c.id = o.customer_id WHERE c.city = $1 GROUP BY c.company, c.city", 
            "paramValues": ["London"] 
        }
    
        User: "Get the total revenue for Adventure Works Cycles. Include the contact information as well."
        Assistant: { 
            "sql": "SELECT c.company, c.city, c.email, SUM(o.total) AS revenue FROM customers c INNER JOIN orders o ON c.id = o.customer_id WHERE c.company = $1 GROUP BY c.company, c.city, c.email", 
            "paramValues": ["Adventure Works Cycles"] 
        }
        `;
    
        let queryData: QueryData = { sql: '', paramValues: [], error: '' };
        let results = '';
    
        try {
            results = await callOpenAI(systemPrompt, userPrompt);
            if (results) {
                console.log('results', results);
                const parsedResults = JSON.parse(results);
                queryData = { ...queryData, ...parsedResults };
                if (isProhibitedQuery(queryData.sql)) {
                    queryData.sql = '';
                    queryData.error = 'Prohibited query.';
                }
            }
        } catch (error) {
            console.log(error);
            if (isProhibitedQuery(results)) {
                queryData.sql = '';
                queryData.error = 'Prohibited query.';
            } else {
                queryData.error = results;
            }
        }
    
        return queryData;
    }
    
    • Ein userPrompt Parameter wird an die Funktion übergeben. Der userPrompt Wert ist die vom Benutzer im Browser eingegebene Abfrage der natürlichen Sprache.
    • A systemPrompt definiert den Typ des zu verwendenden KI-Assistenten und Regeln, die befolgt werden sollen. Dies hilft Azure OpenAI dabei, die Datenbankstruktur zu verstehen, welche Regeln angewendet werden sollen, und wie die generierte SQL-Abfrage und -Parameter zurückgegeben werden.
    • Eine benannte callOpenAI() Funktion wird aufgerufen, und die systemPrompt Werte userPrompt werden an sie übergeben.
    • Die Ergebnisse werden überprüft, um sicherzustellen, dass in der generierten SQL-Abfrage keine unzulässigen Werte enthalten sind. Wenn unzulässige Werte gefunden werden, wird die SQL-Abfrage auf eine leere Zeichenfolge festgelegt.
  4. Sehen wir uns die Systemaufforderung ausführlicher an:

    const systemPrompt = `
      Assistant is a natural language to SQL bot that returns a JSON object with the SQL query and 
      the parameter values in it. The SQL will query a PostgreSQL database.
    
      PostgreSQL tables with their columns:    
    
      ${dbSchema}
    
      Rules:
      - Convert any strings to a PostgreSQL parameterized query value to avoid SQL injection attacks.
      - Return a JSON object with the following structure: { "sql": "", "paramValues": [] }
    
      Examples:
    
      User: "Display all company reviews. Group by company."      
      Assistant: { "sql": "SELECT * FROM reviews", "paramValues": [] }
    
      User: "Display all reviews for companies located in cities that start with 'L'."
      Assistant: { "sql": "SELECT r.* FROM reviews r INNER JOIN customers c ON r.customer_id = c.id WHERE c.city LIKE 'L%'", "paramValues": [] }
    
      User: "Display revenue for companies located in London. Include the company name and city."
      Assistant: { 
        "sql": "SELECT c.company, c.city, SUM(o.total) AS revenue FROM customers c INNER JOIN orders o ON c.id = o.customer_id WHERE c.city = $1 GROUP BY c.company, c.city", 
        "paramValues": ["London"] 
      }
    
      User: "Get the total revenue for Adventure Works Cycles. Include the contact information as well."
      Assistant: { 
        "sql": "SELECT c.company, c.city, c.email, SUM(o.total) AS revenue FROM customers c INNER JOIN orders o ON c.id = o.customer_id WHERE c.company = $1 GROUP BY c.company, c.city, c.email", 
        "paramValues": ["Adventure Works Cycles"] 
      }
    `;
    
    • Der Typ des zu verwendenden KI-Assistenten wird definiert. In diesem Fall eine "natürliche Sprache für SQL-Bot".

    • Tabellennamen und Spalten in der Datenbank werden definiert. Das allgemeine Schema, das in der Eingabeaufforderung enthalten ist, finden Sie in der Datei "server/db.schema" und sieht wie folgt aus.

      - customers (id, company, city, email)
      - orders (id, customer_id, date, total)
      - order_items (id, order_id, product_id, quantity, price)
      - reviews (id, customer_id, review, date, comment)
      

      Tipp

      Sie können das Erstellen schreibgeschützter Ansichten in Betracht ziehen, die nur die Datenbenutzer enthalten, die abfragen dürfen, indem Sie eine natürliche Sprache in SQL verwenden.

    • Eine Regel wird definiert, um Zeichenfolgenwerte in einen parametrisierten Abfragewert zu konvertieren, um SQL-Einfügungsangriffe zu vermeiden.

    • Eine Regel wird definiert, um immer ein JSON-Objekt mit der SQL-Abfrage und den Darin enthaltenen Parameterwerten zurückzugeben.

    • Beispielbenutzeraufforderungen und die erwarteten SQL-Abfrage- und Parameterwerte werden bereitgestellt. Dies wird als "wenigen" Lernen bezeichnet. Obwohl LLMs auf große Datenmengen geschult werden, können sie mit nur wenigen Beispielen an neue Aufgaben angepasst werden. Ein alternativer Ansatz ist das "Zero-Shot"-Lernen, bei dem kein Beispiel bereitgestellt wird, und das Modell wird erwartet, dass die richtigen SQL-Abfrage- und Parameterwerte generiert werden.

  5. Die getSQLFromNLP() Funktion sendet das System und die Benutzeraufforderungen an eine Funktion mit dem Namen callOpenAI() , die sich auch in der Datei server/openAI.ts befindet. Die callOpenAI() Funktion ermittelt, ob Azure OpenAI in Foundry Models oder der OpenAI-Dienst durch Überprüfung von Umgebungsvariablen aufgerufen werden soll. Wenn ein Schlüssel, Endpunkt und Modell in den Umgebungsvariablen verfügbar sind, wird Azure OpenAI aufgerufen, andernfalls wird OpenAI aufgerufen.

    function callOpenAI(systemPrompt: string, userPrompt: string, temperature = 0, useBYOD = false) {
        const isAzureOpenAI = OPENAI_API_KEY && OPENAI_ENDPOINT && OPENAI_MODEL;
    
        if (isAzureOpenAI) {
            if (useBYOD) {
                return getAzureOpenAIBYODCompletion(systemPrompt, userPrompt, temperature);
            }
            return getAzureOpenAICompletion(systemPrompt, userPrompt, temperature);
        }
    
        return getOpenAICompletion(systemPrompt, userPrompt, temperature);
    }
    

    Hinweis

    Obwohl wir uns in diesem Lernprogramm auf Azure OpenAI konzentrieren, wenn Sie nur einen OPENAI_API_KEY Wert in der env-Datei angeben, verwendet die Anwendung stattdessen OpenAI. Wenn Sie openAI anstelle von Azure OpenAI verwenden, werden in einigen Fällen möglicherweise unterschiedliche Ergebnisse angezeigt.

  6. Suchen Sie die getAzureOpenAICompletion() Funktion.

    async function getAzureOpenAICompletion(systemPrompt: string, userPrompt: string, temperature: number): Promise<string> {
        const completion = await createAzureOpenAICompletion(systemPrompt, userPrompt, temperature);
        let content = completion.choices[0]?.message?.content?.trim() ?? '';
        console.log('Azure OpenAI Output: \n', content);
        if (content && content.includes('{') && content.includes('}')) {
            content = extractJson(content);
        }
        return content;
    }
    

    Diese Funktion führt folgende Aktionen aus:

    • Parameter:

      • systemPrompt, userPromptund temperature sind die hauptparameter.
        • systemPrompt: Informiert das Azure OpenAI-Modell über seine Rolle und die zu befolgenden Regeln.
        • userPrompt: Enthält die vom Benutzer bereitgestellten Informationen, z. B. Eingaben natürlicher Sprache oder Regeln zum Generieren der Ausgabe.
        • temperature: Bestimmt die Kreativitätsebene der Reaktion des Modells. Ein höherer Wert führt zu kreativeren Ausgaben, während niedrigere Werte (z. B. 0) mehr deterministische Antworten erzeugen.
    • Vervollständigung:

      • Die Funktionsaufrufe createAzureOpenAICompletion() mit systemPrompt, userPromptund temperature zum Generieren eines Abschlusses.
      • Er extrahiert den Inhalt aus der ersten Auswahl im Abschluss, wobei alle zusätzlichen Leerzeichen gekürzt werden.
      • Wenn der Inhalt JSON-ähnliche Strukturen enthält (durch vorhandensein { und }angegeben), extrahiert er den JSON-Inhalt.
    • Protokollierungs- und Rückgabewert:

      • Die Funktion protokolliert die Azure OpenAI-Ausgabe in der Konsole.
      • Er gibt den verarbeiteten Inhalt als Zeichenfolge zurück.
  7. Suchen Sie die createAzureOpenAICompletion() Funktion.

    async function createAzureOpenAICompletion(systemPrompt: string, userPrompt: string, temperature: number, dataSources?: any[]): Promise<any> {
        const baseEnvVars = ['OPENAI_API_KEY', 'OPENAI_ENDPOINT', 'OPENAI_MODEL'];
        const byodEnvVars = ['AZURE_AI_SEARCH_ENDPOINT', 'AZURE_AI_SEARCH_KEY', 'AZURE_AI_SEARCH_INDEX'];
        const requiredEnvVars = dataSources ? [...baseEnvVars, ...byodEnvVars] : baseEnvVars;
        checkRequiredEnvVars(requiredEnvVars);
    
        const config = { 
            apiKey: OPENAI_API_KEY,
            endpoint: OPENAI_ENDPOINT,
            apiVersion: OPENAI_API_VERSION,
            deployment: OPENAI_MODEL
        };
        const aoai = new AzureOpenAI(config);
        const completion = await aoai.chat.completions.create({
            model: OPENAI_MODEL, // gpt-4o, gpt-3.5-turbo, etc. Pulled from .env file
            max_tokens: 1024,
            temperature,
            response_format: {
                type: "json_object",
            },
            messages: [
                { role: 'system', content: systemPrompt },
                { role: 'user', content: userPrompt }
            ],
            // @ts-expect-error data_sources is a custom property used with the "Azure Add Your Data" feature
            data_sources: dataSources
        });
        return completion;
    }
    
    function checkRequiredEnvVars(requiredEnvVars: string[]) {
        for (const envVar of requiredEnvVars) {
            if (!process.env[envVar]) {
                throw new Error(`Missing ${envVar} in environment variables.`);
            }
        }
    }
    

    Diese Funktion führt folgende Aktionen aus:

    • Parameter:

      • systemPrompt, userPromptund temperature sind die wichtigsten Parameter, die weiter oben erläutert werden.
      • Ein optionaler dataSources Parameter unterstützt das Feature "Azure Bring Your Own Data", das weiter unten in diesem Lernprogramm behandelt wird.
    • Umgebungsvariablen überprüfen:

      • Die Funktion überprüft das Vorhandensein wesentlicher Umgebungsvariablen und löst einen Fehler aus, falls vorhanden.
    • Configuration-Objekt:

      • Ein config Objekt wird mithilfe von Werten aus der .env Datei (OPENAI_API_KEY, OPENAI_ENDPOINT, , OPENAI_API_VERSIONOPENAI_MODEL) erstellt. Diese Werte werden verwendet, um die URL für den Aufruf von Azure OpenAI zu erstellen.
    • AzureOpenAI-Instanz:

      • Eine Instanz von AzureOpenAI wird erstellt (unter Verwendung des Objekts config). Das AzureOpenAI Symbol ist Teil des openai Pakets, das am Anfang der Datei importiert werden soll.
    • Generieren eines Abschlusses:

      • Die chat.completions.create() Funktion wird mit den folgenden Eigenschaften aufgerufen:
        • model: Gibt das GPT-Modell (z. B. gpt-4o, gpt-3.5-turbo) wie in Ihrer .env Datei definiert an.
        • max_tokens: Definiert die maximale Anzahl von Token für den Abschluss.
        • temperature: Legt die Probenahmetemperatur fest. Höhere Werte (z. B. 0,9) liefern kreativere Antworten, während niedrigere Werte (z. B. 0) mehr deterministische Antworten erzeugen.
        • response_format: Definiert das Antwortformat. Hier wird festgelegt, dass ein JSON-Objekt zurückgegeben wird. Weitere Details zum JSON-Modus finden Sie in der Azure OpenAI-Referenzdokumentation.
        • messages: Enthält die Nachrichten zum Generieren von Chatabschlussen. Dieses Beispiel enthält zwei Meldungen: eine aus dem System (definieren von Verhalten und Regeln) und eine vom Benutzer (die den Eingabeaufforderungstext enthält).
    • Rückgabewert:

      • Die Funktion gibt das von Azure OpenAI generierte Abschlussobjekt zurück.
  8. Kommentieren Sie die folgenden Zeilen in der getSQLFromNLP() Funktion aus:

    // if (isProhibitedQuery(queryData.sql)) { 
    //     queryData.sql = '';
    // }
    
  9. Speichern Sie openAI.ts. Der API-Server erstellt den TypeScript-Code automatisch neu und startet den Server neu.

  10. Wechseln Sie zurück zum Browser, und geben Sie "Alle Tabellennamen aus der Datenbank auswählen" in die Eingabe " Benutzerdefinierte Abfrage " ein. Wählen Sie Run Query (Abfrage ausführen) aus. Werden Tabellennamen angezeigt?

  11. Wechseln Sie zurück zur getSQLFromNLP() Funktion in Server/openAI.ts , und fügen Sie die folgende Regel in den Rules: Abschnitt der Systemaufforderung ein, und speichern Sie die Datei.

    - Do not allow the SELECT query to return table names, function names, or procedure names.
    
  12. Wechseln Sie zurück zum Browser, und führen Sie die folgenden Aufgaben aus:

    • Geben Sie "Alle Tabellennamen aus der Datenbank auswählen " in die Eingabe " Benutzerdefinierte Abfrage " ein. Wählen Sie Run Query (Abfrage ausführen) aus. Werden Tabellennamen angezeigt?
    • Geben Sie "Alle Funktionsnamen aus der Datenbank auswählen " ein. Geben Sie in die Eingabe "Benutzerdefinierte Abfrage " ein, und wählen Sie erneut "Abfrage ausführen" aus. Werden Funktionsnamen angezeigt?
  13. FRAGE: Folgt ein Modell immer den Regeln, die Sie in der Eingabeaufforderung definieren?

    ANTWORT: Nein! Es ist wichtig zu beachten, dass OpenAI-Modelle gelegentlich unerwartete Ergebnisse zurückgeben können, die möglicherweise nicht den von Ihnen definierten Regeln entsprechen. Es ist wichtig, dies in Ihrem Code zu planen.

  14. Wechseln Sie zurück zu Server/openAI.ts , und suchen Sie die isProhibitedQuery() Funktion. Dies ist ein Beispiel für nach der Verarbeitung von Code, der ausgeführt werden kann, nachdem Azure OpenAI Ergebnisse zurückgegeben hat. Beachten Sie, dass die sql Eigenschaft auf eine leere Zeichenfolge festgelegt wird, wenn unzulässige Schlüsselwörter in der generierten SQL-Abfrage zurückgegeben werden. Dadurch wird sichergestellt, dass, wenn unerwartete Ergebnisse aus Azure OpenAI zurückgegeben werden, die SQL-Abfrage nicht für die Datenbank ausgeführt wird.

    function isProhibitedQuery(query: string): boolean {
        if (!query) return false;
    
        const prohibitedKeywords = [
            'insert', 'update', 'delete', 'drop', 'truncate', 'alter', 'create', 'replace',
            'information_schema', 'pg_catalog', 'pg_tables', 'pg_proc', 'pg_namespace', 'pg_class',
            'table_schema', 'table_name', 'column_name', 'column_default', 'is_nullable',
            'data_type', 'udt_name', 'character_maximum_length', 'numeric_precision',
            'numeric_scale', 'datetime_precision', 'interval_type', 'collation_name',
            'grant', 'revoke', 'rollback', 'commit', 'savepoint', 'vacuum', 'analyze'
        ];
        const queryLower = query.toLowerCase();
        return prohibitedKeywords.some(keyword => queryLower.includes(keyword));
    }
    

    Hinweis

    Es ist wichtig zu beachten, dass dies nur Democode ist. Möglicherweise sind andere unzulässige Schlüsselwörter erforderlich, um Ihre spezifischen Anwendungsfälle abzudecken, wenn Sie eine natürliche Sprache in SQL konvertieren möchten. Dies ist ein Feature, das Sie mit Bedacht planen und verwenden müssen, um sicherzustellen, dass nur gültige SQL-Abfragen zurückgegeben und für die Datenbank ausgeführt werden. Zusätzlich zu verbotenen Schlüsselwörtern müssen Sie auch die Sicherheit berücksichtigen.

  15. Wechseln Sie zurück zu Server/openAI.ts , und entfernen Sie die Auskommentierung des folgenden Codes in der getSQLFromNLP() Funktion. Speichern Sie die Datei.

    if (isProhibitedQuery(queryData.sql)) { 
        queryData.sql = '';
    }
    
  16. Entfernen Sie die folgende Regel aus systemPrompt der Datei, und speichern Sie sie.

    - Do not allow the SELECT query to return table names, function names, or procedure names.
    
  17. Wechseln Sie zurück zum Browser, geben Sie alle Tabellennamen aus der Datenbank erneut in die Benutzerdefinierte Abfrageeingabe ein, und wählen Sie die Schaltfläche " Abfrage ausführen " aus.

  18. Werden Tabellenergebnisse angezeigt? Auch ohne die Regel verbietet der Code nach der isProhibitedQuery Verarbeitung, dass dieser Abfragetyp für die Datenbank ausgeführt wird.

  19. Wie bereits erwähnt, kann die Integration natürlicher Sprache in SQL in Branchenanwendungen für Benutzer von Vorteil sein, aber sie enthält eigene Überlegungen.

    Vorteile:

    • Benutzerfreundlichkeit: Dieses Feature kann Benutzern ohne technische Kenntnisse die Datenbankinteraktion leichter zugänglich machen, wodurch die Notwendigkeit von SQL-Kenntnissen verringert und die Vorgänge möglicherweise beschleunigt werden.

    • Höhere Produktivität: Geschäftsanalysten, Marketer, Führungskräfte und andere nicht technische Benutzer können wertvolle Informationen aus Datenbanken abrufen, ohne sich auf technische Experten verlassen zu müssen, wodurch die Effizienz erhöht wird.

    • Breite Anwendung: Mithilfe erweiterter Sprachmodelle können Anwendungen so konzipiert werden, dass sie auf eine breite Palette von Benutzern und Anwendungsfällen ausgerichtet sind.

    Überlegungen:

    • Sicherheit: Einer der größten Bedenken ist Sicherheit. Wenn Benutzer mit Datenbanken mit natürlicher Sprache interagieren können, müssen robuste Sicherheitsmaßnahmen vorhanden sein, um unbefugten Zugriff oder böswillige Abfragen zu verhindern. Sie können erwägen, einen schreibgeschützten Modus zu implementieren, um zu verhindern, dass Benutzer Daten ändern.

    • Datenschutz: Bestimmte Daten sind möglicherweise vertraulich und sollten nicht leicht zugänglich sein, daher müssen Sie sicherstellen, dass angemessene Garantien und Benutzerberechtigungen vorhanden sind.

    • Genauigkeit: Während die Verarbeitung natürlicher Sprachen erheblich verbessert wurde, ist sie nicht perfekt. Falschinterpretation von Benutzerabfragen kann zu ungenauen Ergebnissen oder unerwartetem Verhalten führen. Sie müssen planen, wie unerwartete Ergebnisse behandelt werden.

    • Effizienz: Es gibt keine Garantien, dass die von einer Abfrage mit natürlicher Sprache zurückgegebene SQL effizient ist. In einigen Fällen sind möglicherweise zusätzliche Aufrufe an Azure OpenAI erforderlich, wenn nach der Verarbeitung Regeln Probleme mit SQL-Abfragen erkennen.

    • Schulung und Benutzeranpassung: Benutzer müssen geschult werden, um ihre Abfragen richtig zu formulieren. Obwohl es einfacher ist, SQL zu erlernen, kann es immer noch eine Lernkurve geben.

  20. Einige abschließende Punkte, die Sie berücksichtigen sollten, bevor Sie mit der nächsten Übung fortfahren:

    • Denken Sie daran, dass "Nur weil Sie nicht meinen sollten" hier gilt. Verwenden Sie extreme Vorsicht und sorgfältige Planung, bevor Sie natürliche Sprache in SQL in eine Anwendung integrieren. Es ist wichtig, die potenziellen Risiken zu verstehen und sie zu planen.
    • Bevor Sie diese Art von Technologie verwenden, besprechen Sie potenzielle Szenarien mit Ihrem Team, Datenbankadministratoren, Sicherheitsteam, Projektbeteiligten und anderen relevanten Parteien, um sicherzustellen, dass sie für Ihre Organisation geeignet ist. Es ist wichtig zu besprechen, ob die natürliche Sprache sql Sicherheit, Datenschutz und andere Anforderungen erfüllt, die Ihre Organisation möglicherweise eingerichtet hat.
    • Sicherheit sollte ein Hauptanliegen sein und in den Planungsprozess, die Entwicklung und den Bereitstellungsprozess integriert werden.
    • Während die natürliche Sprache in SQL sehr leistungsfähig sein kann, müssen sie sorgfältig geplant werden, um sicherzustellen, dass Eingabeaufforderungen über erforderliche Regeln verfügen und dass die Funktionalität nach der Verarbeitung enthalten ist. Planen Sie zusätzliche Zeit, um diese Art von Funktionalität zu implementieren und zu testen, und berücksichtigen Sie Szenarien, in denen unerwartete Ergebnisse zurückgegeben werden.
    • Mit Azure OpenAI erhalten Kunden die Sicherheitsfunktionen von Microsoft Azure, wobei sie die gleichen Modelle wie OpenAI ausführen. Azure OpenAI bietet private Netzwerke, regionale Verfügbarkeit und verantwortungsvolle KI-Inhaltsfilterung. Erfahren Sie mehr über Daten, Datenschutz und Sicherheit für Azure OpenAI.
  21. Sie haben jetzt erfahren, wie Sie Azure OpenAI verwenden, um natürliche Sprache in SQL zu konvertieren, und erfahren Sie mehr über die Vor- und Nachteile der Implementierung dieser Art von Funktionalität. In der nächsten Übung erfahren Sie, wie E-Mail- und SMS-Nachrichten mithilfe von Azure OpenAI generiert werden können.

Nächster Schritt