In einer Reihe aktueller Artikel habe ich über das Einlesen von SQL Server-Daten in PowerShell, das Filtern dieser Daten und die Durchführung grundlegender Datenanalysen mit Diagrammen gesprochen. Sie können diese Funktionen erweitern, indem Sie Ihren PowerShell-Skripten chatgpt-basierte Datenanalysefunktionen hinzufügen. Dieser Artikel führt Sie durch den Prozess.

Bevor wir beginnen, empfehle ich die Lektüre meiner Artikel zu zwei Schlüsselthemen: Verwenden von PowerShell zum Diagrammieren von SQL Server-Daten und Zugriff auf ChatGPT mit PowerShell. Diese Artikel enthalten Informationen, die Sie zum Erstellen eines PowerShell-Skripts benötigen, das KI-basierte Datenanalysen für SQL Server-Daten verwendet.

Übersicht über grafische Elemente

In diesem Artikel werde ich mein vorhandenes PowerShell-Diagrammskript (das Sie hier überprüfen können) anpassen, um ChatGPT-Unterstützung einzuschließen. Um dies zu erreichen, müssen wir einige visuelle Komponenten in das Windows-Formular einführen:

  1. ein Eingabefeld zur Interaktion mit ChatGPT durch das Stellen von Fragen;
  2. ein Ausgabefeld, in dem die Antworten von ChatGPT angezeigt werden; Und
  3. eine „Senden“-Schaltfläche, mit der eine Anfrage gestartet werden kann.
  4. Wie diese Elemente aussehen, sehen Sie in Abbildung 1.

    Brien Posey

    Abbildung 1. So sieht die Datenanalyse-App aus.

    Eine Sache, die diese App so einzigartig macht (neben der Tatsache, dass wir PowerShell verwendet haben, um SQL Server-Daten aufzunehmen und grafisch darzustellen), ist, dass ChatGPT normalerweise nicht auf Ihre persönlichen Daten zugreift. In diesem Fall stellt das Skript ChatGPT jedoch die notwendigen Informationen zur Analyse und Generierung von Erkenntnissen zur Verfügung.

    Wie Sie sich vorstellen können, ist das Skript etwas komplex, aber beginnen wir mit der Besprechung der grafischen Elemente. Wenn Sie in PowerShell ein grafisches Element erstellen, beispielsweise eine Schaltfläche oder ein Textfeld, erstellen Sie zunächst ein benanntes Objekt. Anschließend fügen Sie diesem Objekt die erforderlichen Attribute hinzu. Abschließend fügen Sie das Objekt zum Windows-Formular hinzu.

    Etiketten erstellen

    Um Ihnen zu zeigen, was ich meine, schauen wir uns den in Abbildung 1 angezeigten Text an, der den Benutzer auffordert, seine ChatGPT-Abfrage einzugeben. Obwohl es sich nur um Text handelt, wird er im Windows-Formular als grafisches Objekt behandelt. Hier sind die Befehle, die zum Erstellen dieses Textes verwendet werden:

    $Label1 = New-Object System.Windows.Forms.Label
    $Label1.Text = "Please enter your ChatGPT query below:"
    $Label1.Autosize = $True
    $Label1.Location = New-Object System.Drawing.Size (20,500)
    

    In den obigen Befehlen beginnen wir mit der Erstellung eines Label-Objekts, das wir $Label1 nennen. Beschriftungsobjekte werden speziell zur Anzeige von Text verwendet.

    Sobald dieses Objekt erstellt wurde, müssen wir mit dem Hinzufügen von Attributen beginnen. Konkret fügen wir den Textinhalt hinzu, den wir anzeigen möchten, konfigurieren die Etikettengröße (die auf „Automatisch“ eingestellt ist) und bestimmen die Position auf dem Bildschirm für die Platzierung des Etiketts (20 horizontale Pixel und 500 vertikale Pixel von der oberen linken Ecke). des Formulars).

    Nachdem wir die Beschriftung definiert haben, besteht der nächste Schritt darin, die Beschriftung zum Formular hinzuzufügen. Wir können dies tun, indem wir den folgenden Befehl verwenden:

    $Form.Controls.Add($Label1)

    Immer wenn Sie ein grafisches Objekt zu einem Formular hinzufügen, verwenden Sie diesen Befehl und stellen Sie sicher, dass Sie den Namen des Objekts ersetzen, das Sie hinzufügen möchten.

    Erstellen anderer grafischer Elemente

    Obwohl ich nur die Struktur eines Etiketts besprochen habe, folgen andere grafische Elemente wie Textfelder und Schaltflächen einem sehr ähnlichen Prozess. Der einzige wirkliche Unterschied besteht darin, dass Sie möglicherweise zusätzliche Attribute angeben müssen, z. B. die Klickaktion einer Schaltfläche oder die Größe eines Textfelds.

    Übrigens ist die Schaltfläche in diesem Setup so konfiguriert, dass beim Klicken eine PowerShell-Funktion aufgerufen wird. Wenn ein Benutzer auf die Schaltfläche klickt, erfasst das Skript insbesondere den in das Eingabefeld eingegebenen Text und übergibt diesen Text dann an eine Funktion, die den Text wiederum an ChatGPT sendet. Die Antwort von ChatGPT wird dann im Ausgabefeld angezeigt.

    Grafische Elemente ändern

    Dies unterstreicht einen wichtigen Punkt zur Funktionsweise von GUI-basierten PowerShell-Skripten. Tatsächlich wünschte ich, jemand hätte mir das erklärt, als ich lernte, sie zu bauen.

    Wann immer Sie eine Änderung an einem grafischen Element vornehmen möchten, können Sie dies tun, indem Sie einfach dessen Attribute ändern. Dies kann im Handumdrehen erfolgen, ohne dass Sie sich um andere zuvor definierte Attribute kümmern müssen.

    Lassen Sie mich Ihnen zeigen, was ich meine. Hier ist der Teil des Skripts, der das Ausgabetextfeld generiert:

    $OutputBox = New-Object System.Windows.Forms.textbox
    $OutputBox.Text = ""
    $OutputBox.Multiline = $True
    $OutputBox.Size = New-Object System.Drawing.Size(400,450)
    $OutputBox.Location = new-object System.Drawing.Size(500,10)

    Wie Sie sehen, habe ich ein Textfeldobjekt namens $OutputBox erstellt. Ich habe außerdem mehrere Attribute konfiguriert, die sicherstellen, dass das Feld zunächst leer ist, mehrzeiligen Text unterstützt und die Größe und Position des Felds definiert.

    Stellen Sie sich vor diesem Hintergrund vor, dass auf der Box die Worte „Hallo Welt“ stehen sollen. In diesem Szenario müsste ich keinen der oben gezeigten Codes überarbeiten. Ich muss nur eine einzige Codezeile schreiben:

    $OutputBox.Text=”Hello World”
    

    Diese Codezeile bewirkt, dass sich der Inhalt des Textfelds sofort dynamisch ändert. Besser noch: Dies kann von überall im Skript aus durchgeführt werden.

    Beispiel-PowerShell-Skript

    Nachdem ich nun einen Überblick über die Funktionsweise der verschiedenen grafischen Elemente gegeben habe, werde ich erklären, wie der Rest des Skripts funktioniert, und seine Fähigkeiten demonstrieren.

    Ich werde damit beginnen, den vollständigen Quellcode des Skripts zu teilen. Bevor Sie es verwenden können, müssen Sie jedoch einige Änderungen vornehmen. Insbesondere müssen Sie Ihre eindeutigen SQL Server-Instanzdetails und Ihren eigenen ChatGPT-API-Schlüssel angeben.

    Hier ist das gesamte Skript:

    #Acquire Data from SQL Server
    $Data = Invoke-SQLCmd -ServerInstance Win11SQL\SQLEXPRESS -Database MyAppDB -Query “Select Month, ItemsSold From Table1”
    
    $DataSource1= [ordered]@{}
    ForEach($Item in $Data){
    $CurrentMonth = $Item.Month
    $CurrentItem = $Item.ItemsSold
    $DataSource1.Add($CurrentMonth, $CurrentItem)
    }
    
    #Initialize ChatGPT
    
    # Define API key and endpoint
    $ApiKey = ""
    $ApiEndpoint = "https://api.openai.com/v1/chat/completions"
    
    # we use this list to store the system message and will add any user prompts and ai responses as the conversation evolves.
    [System.Collections.Generic.List[Hashtable]]$MessageHistory = @()
    
    Function Initialize-MessageHistory ($message){
    # Clears the message history and fills it with the system message (and allows us to reset the history and start a new conversation)
        $script:MessageHistory.Clear()
        $script:MessageHistory.Add(@{"role" = "system"; "content" = $message}) | Out-Null
    }
    
    Function AddTo-MessageHistory ($message){
        $script:MessageHistory.Add(@{"role" = "system"; "content" = $message}) | Out-Null
    }
    
    #Main script body - ChatGPT Section
    
    $AISystemMessage = "All queries made pertain to the following dataset consisting of months and numbers. The numbers reflect the number of sales made in each month"
    Initialize-MessageHistory $AISystemMessage
    ForEach ($Item in $Data){
      $AISystemMessage = "For the month of " + $Item.Month + " the number of items sold was " + $Item.ItemsSold
      AddTo-MessageHistory $AISystemMessage
      }
    
    function Invoke-ChatGPT ($MessageHistory) {
    # Function to send a message to ChatGPT. (We need to pass the entire message history in each request since we're using a RESTful API)
        # Set the request headers
        $headers = @{
        "Content-Type" = "application/json"
        "Authorization" = "Bearer $ApiKey"
        }  
    
        # Set the request body
        $requestBody = @{
            "model" = "gpt-3.5-turbo"
            "messages" = $MessageHistory
            "max_tokens" = 1000 # Max amount of tokens the AI will respond with
            "temperature" = 0.7 # Lower is more coherent and conservative, higher is more creative and diverse.
        }
    
        # Send the request
        $response = Invoke-RestMethod -Method POST -Uri $ApiEndpoint -Headers $headers -Body (ConvertTo-Json $requestBody)
    
        # Return the message content
        return $response.choices[0].message.content
    }
    
    Function Button_Press
    {$UserMessage=$InputBox.Text
    
        # Add new user query to the message history
        $MessageHistory.Add(@{"role"="user"; "content"=$userMessage})
    
        # Query ChatGPT
        $aiResponse = Invoke-ChatGPT $MessageHistory
    
        # Show response
        $OutputBox.Text=$AIResponse
    
        # Add ChatGPT response to list of messages
        $MessageHistory.Add(@{"role"="assistant"; "content"=$aiResponse})
    }
    
    $Label1 = New-Object System.Windows.Forms.Label
    $Label1.Text = "Please enter your ChatGPT query below:"
    $Label1.Autosize = $True
    $Label1.Location = New-Object System.Drawing.Size (20,500)
    
    $InputBox = New-Object System.Windows.Forms.textbox
    $InputBox.Text = ""
    $InputBox.Size = New-Object System.Drawing.Size(800,20)
    $InputBox.Location = new-object System.Drawing.Size(20,520)
    
    $OutputBox = New-Object System.Windows.Forms.textbox
    $OutputBox.Text = ""
    $OutputBox.Multiline = $True
    $OutputBox.Size = New-Object System.Drawing.Size(400,450)
    $OutputBox.Location = new-object System.Drawing.Size(500,10)
    
    $Button1 = New-Object System.Windows.Forms.Button
    $Button1.Location = New-Object System.Drawing.Size (20,550)
    $Button1.Size = New-Object System.Drawing.Size(80,20)
    $Button1.Text = "Submit"
    $Button1.Add_Click({Button_Press})
    
    # Load the assemblies
    
    [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
    
    # Chart Object  
    $Chart1 = New-object System.Windows.Forms.DataVisualization.Charting.Chart  
    $Chart1.Location = New-Object System.Drawing.Size (10,10)
    $Chart1.Width = 450  
    $Chart1.Height = 450  
    $Chart1.BackColor = [System.Drawing.Color]::White
    
    # Chart area   
    
    $ChartArea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea  
    $ChartArea.Name = "ChartArea1"  
    $ChartArea.AxisY.Interval = 10  
    $ChartArea.AxisX.Interval = 1  
    $Chart1.ChartAreas.Add($ChartArea)
    
    # Data Series 1 - The series is called Sales
    [void] $chart1.Series.Add("Sales")
    
    #Chart parameters   
    $chart1.Series["Sales"].chartarea = "ChartArea1"  
    $chart1.Series["Sales"].color = "Blue"      
    $Chart1.Series["Sales"].Points.DataBindXY($DataSource1.keys, $DataSource1.values)
    
    # Display all of the graphical elements on a form
    
    $Form = New-Object Windows.Forms.Form
    $Form.Text = "Sales"
    $Form.Width = 1000
    $Form.Height = 1000
    $Form.controls.add($Chart1)
    $Form.Controls.Add($Label1)
    $Form.Controls.Add($InputBox)
    $Form.Controls.Add($OutputBox)
    $Form.Controls.Add($Button1)
    $Form.Add_Shown({$Form.Activate()})
    $Form.ShowDialog()
    

    So funktioniert das Skript

    Ich habe den größten Teil des Skriptcodes in früheren Artikeln behandelt (am Anfang dieses Artikels erwähnt), daher werde ich diese Erklärung hier nicht wiederholen. Allerdings muss ich die Beziehung zwischen den ChatGPT-Elementen, den SQL Server-Daten und der GUI klären.

    Initialisierungsaufgaben

    Der Skript startet durch die Durchführung mehrerer Initialisierungsaufgaben. Es beginnt mit dem Erfassen der Daten aus einer SQL Server-Tabelle und dem Schreiben dieser Daten in eine Variable namens $Data und eine Hash-Tabelle namens $DataSource1. Darüber hinaus richtet dieser erste Teil des Skripts wesentliche Komponenten für ChatGPT ein, darunter den API-Schlüssel, den API-Endpunkt und eine Hash-Tabelle namens $MessageHistory, die zum Speichern des Konversationsverlaufs mit ChatGPT verwendet wird.

    Unterhalb dieses Codeabschnitts gibt es einige Funktionen, die ich in Kürze besprechen werde. Anschließend finden Sie einen Teil des Hauptteils des Skripts, gefolgt von zusätzlichen Funktionen. Auch wenn es seltsam erscheinen mag, Körpercode auf diese Weise mit Funktionen zu vermischen, ist diese Reihenfolge beabsichtigt. Bei Verwendung einer konventionelleren Anordnung funktionierte der Code nicht richtig.

    Hauptskriptkörper – ChatGPT-Abschnitt

    Der Abschnitt mit dem Namen „Hauptskripttext – ChatGPT-Abschnitt“ beginnt mit dem Aufruf der Funktion Initialize-MessageHistory. Diese Funktion erfüllt zwei wichtige Zwecke. Zunächst wird die Hash-Tabelle gelöscht und für die Verwendung vorbereitet. Zweitens wird ChatGPT darüber informiert, dass das Skript Daten bereitstellt.

    Normalerweise wäre die Verwendung von ChatGPT für die Datenanalyse keine Option, da der Zugriff auf die Daten fehlt. Um die Datenanalyse zu ermöglichen, müssen wir ChatGPT über die zu erwartenden Daten informieren und diese Daten dann bereitstellen. Daher teilt die Funktion Initialize-MessageHistory ChatGPT mit: „Alle gestellten Abfragen beziehen sich auf den folgenden Datensatz, der aus Monaten und Zahlen besteht.“ Die Zahlen spiegeln die Anzahl der Verkäufe wider, die in jedem Monat getätigt wurden.“ Auch wenn diese Nachricht zu detailliert erscheint, habe ich festgestellt, dass weniger beschreibende Nachrichten dazu führen, dass ChatGPT Schwierigkeiten hat, die Daten genau zu interpretieren.

    Als nächstes stellt das Skript ChatGPT den Datensatz bereit. Leider war der Versuch, entweder die Variable $Data oder die Hash-Tabelle $DataSource1 an ChatGPT zu übergeben, erfolglos. Daher musste ich eine Methode zur Kontextualisierung der Daten entwickeln, damit ChatGPT weiß, wie sie zu interpretieren ist. Letztendlich habe ich mir den folgenden Codeblock ausgedacht. Dies ist wohl der wichtigste Codeabschnitt im gesamten Skript:

    ForEach ($Item in $Data){
      $AISystemMessage = "For the month of " + $Item.Month + " the number of items sold was " + $Item.ItemsSold
      AddTo-MessageHistory $AISystemMessage
      }
    

    Dieser Codeblock beginnt mit einer ForEach-Schleife, die die in der Variablen $Data gespeicherten Elemente durchläuft. Dies sind die Daten, die ursprünglich vom SQL Server gelesen wurden. Für jeden Datensatz, der durch die Variable $Item dargestellt wird, generiert das Skript eine Nachricht mit der Angabe für den Monat [month name]die Anzahl der verkauften Artikel betrug [number of items sold]. Diese Nachricht wird dann mithilfe der AddTo-MessageHistory-Funktion an ChatGPT übergeben. Im Wesentlichen analysiert dieser Codeblock die Daten Zeile für Zeile, fügt etwas Kontext hinzu und sendet die Daten an ChatGPT.

    Button_Press-Funktion

    Der Rest des Skripts besteht hauptsächlich aus grafischen Elementen. Allerdings ist die Schaltfläche an ein Objekt namens $Button1 gebunden. Wenn auf diese Schaltfläche geklickt wird, ruft das Skript eine Funktion namens Button_Press auf. So sieht diese Funktion aus:

    Function Button_Press
    {$UserMessage=$InputBox.Text
    
        # Add new user query to the message history
        $MessageHistory.Add(@{"role"="user"; "content"=$userMessage})
    
        # Query ChatGPT
        $AIResponse = Invoke-ChatGPT $MessageHistory
    
        # Show response
        $OutputBox.Text=$AIResponse
    
        # Add ChatGPT response to list of messages
        $MessageHistory.Add(@{"role"="assistant"; "content"=$aiResponse})
    }
    

    Diese Funktion setzt zunächst die Variable $UserMessage auf $InputBox.Text. Die Variable $InputBox.Text entspricht dem, was der Benutzer in das Eingabefeld eingibt. Die Variable $UserMessage wird im gesamten Skript immer dann verwendet, wenn Eingaben an ChatGPT gesendet werden müssen. Daher weist diese Codezeile das Skript an, alles, was der Benutzer eingibt, als ChatGPT-Eingabe zu verwenden.

    Anschließend fügt die Funktion den Text des Benutzers zum Nachrichtenverlauf hinzu und sendet dann denselben Text an die Invoke-ChatGPT-Funktion. Die Invoke-ChatGPT-Funktion wiederum übergibt den Text des Benutzers an ChatGPT. Die Antwort von ChatGPT wird in einer Variablen namens $AIResponse gespeichert. Diese Antwort wird dann in das Ausgabetextfeld geschrieben und dem Nachrichtenverlauf hinzugefügt.

    Anwendungsfälle in der Datenanalyse

    Nachdem ich nun einen kurzen Überblick über die Funktionsweise des Skripts gegeben habe, wollen wir untersuchen, wie das Skript verwendet werden könnte.

    In Abbildung 2 werden Sie feststellen, dass das Diagramm (absichtlich) nicht die genaue Verkaufsmenge für einen bestimmten Monat anzeigt. Daher könnten wir ChatGPT um spezifischere Informationen bitten, wie in Abbildung 3 dargestellt.

    Brien PoseyEs Wird Ein Diagramm Angezeigt, In Dem Nicht Die Verkaufsmenge Für Jeden Monat Angezeigt Wird

    Figur 2. Das Diagramm zeigt nicht die genaue Menge der Verkäufe pro Monat an, obwohl PowerShell das Hinzufügen solcher Zahlen zu einem Diagramm unterstützt.

    Brien PoseyZeigt Eine Anfrage An Chatgpt An, Um Informationen Darüber Bereitzustellen, Wie Viele Artikel Jeden Monat Verkauft Wurden

    Figur 3. Sie können ChatGPT fragen, wie viele Artikel in einem bestimmten Monat verkauft wurden.

    Eine weitere Verwendung des Skripts besteht darin, ChatGPT zu bitten, Ihnen Informationen über Gesamtverkäufe bereitzustellen. Wenn Sie beispielsweise wissen möchten, wie viele Artikel insgesamt im zweiten Quartal verkauft wurden, können Sie diese Frage einfach an ChatGPT stellen. Sie können die Ausgabe in Abbildung 4 sehen.

    Brien PoseyZeigt Die Antwort Von Chatgpt Auf Die Frage, Wie Viele Artikel Im Zweiten Quartal Verkauft Wurden

    Figur 4. ChatGPT sagt mir, wie viele Artikel im zweiten Quartal verkauft wurden.

    Zugegebenermaßen wäre es nicht allzu schwierig, ein PowerShell-Skript zu erstellen, das ohne die Hilfe von ChatGPT Antworten auf diese Fragen generieren kann. Dennoch bietet die Verwendung von ChatGPT zwei Vorteile. Erstens reduziert es die Menge an Code, die Sie schreiben müssen. Zweitens ist das Skript völlig dynamisch. Sie müssen nicht vorhersagen, welche Fragen ein Benutzer stellen könnte. Stattdessen können Benutzer nach allem fragen, was sie wollen, und ChatGPT hat die Aufgabe, zu bestimmen, wie eine relevante Antwort gegeben werden kann. Dies ist wichtig, da es schwierig wäre, bestimmte Abfragen durch fest codierte Antworten zu beantworten. Wenn ein Benutzer beispielsweise Informationen zu zukünftigen Umsatzschätzungen auf der Grundlage historischer Daten erhalten möchte, könnte er theoretisch PowerShell-Code schreiben, um eine solche Abfrage zu verarbeiten, aber das wäre nicht einfach.

    Brien PoseyZeigt Ein Beispiel Für Die Schätzung Zukünftiger Verkäufe Durch Chatgpt

    Abbildung 5. ChatGPT kann zukünftige Verkäufe schätzen.

    Schließlich kann das Skript für vergleichende Analysen verwendet werden. Wie in Abbildung 6 dargestellt, können Sie ChatGPT bitten, Datensätze zu vergleichen, beispielsweise den Umsatz des ersten Quartals mit dem Umsatz des zweiten Quartals.

    Brien PoseyBeispiel Für Eine Vergleichende Analyse Durch Chatgpt, Bei Der Die Umsätze Des Ersten Und Zweiten Quartals Verglichen Werden

    Abbildung 6. ChatGPT verglich die Umsätze des ersten und zweiten Quartals.

    Abschluss

    Das von mir entwickelte Skript ist zwar leistungsstark, aber kaum mehr als ein Proof of Concept. Es gibt unzählige Möglichkeiten, das Skript zu verbessern und zu erweitern. PowerShell unterstützt Dutzende verschiedener Diagrammtypen sowie zahlreiche visuelle Elemente wie Legenden, Beschriftungen und visuelle Effekte. Ein einzelnes Formular kann mehrere Diagramme aufnehmen, von denen jedes mehrere Datenreihen enthalten kann. Ebenso kann PowerShell mehrere Datenquellen abfragen und diese Daten aggregieren. Es ist sogar möglich, mit PowerShell eine interaktive Berichts-Engine zu erstellen und Diagramme, Daten und andere Informationen in Formate wie JPEG-Bilder oder HTML-Seiten zu exportieren. Letztendlich könnte man in PowerShell eine vollständige Datenanalyseanwendung erstellen.

    Über den Autor

    Kopfschuss Von Brien PoseyBrien Posey ist ein Technologie-Bestsellerautor, Redner und 21-facher Microsoft MVP. Zusätzlich zu seiner laufenden Arbeit im IT-Bereich absolvierte Posey eine Ausbildung zum kommerziellen Astronautenanwärter, um sich auf einen Flug zur Erforschung polarer mesosphärischer Wolken aus dem Weltraum vorzubereiten.
5/5 - (387 votes)
Anzeige
Nina Weber
Nina Weber is a renowned Journalist, who worked for many German Newspaper's Tech coloumns like Die Zukunft, Handelsblatt. She is a contributing Journalist for futuriq.de. She works as a editor also as a fact checker for futuriq.de. Her Bachelor degree in Humanties with Major in Digital Anthropology gave her a solid background for journalism. Know more about her here.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein