SemanticKernel und SEO

Die Plattform Studios bietet ppedv Kunden Video Aufzeichnungen von Events und Webcasts. Da die Zugriffszahlen merklich zurück gegangen sind,,habe ich mich mit der Google Search  Console auf die Suche gemacht. Im Menüpunkt Videoseiten kann man erkennen, wie viiele Videos indiziert sind.

Screenshot 2024-09-06 073840

Es waren 0.  Zwar sind die Seiten indiziert und die Texte, werden aber von Google nur als Beiwerk eingestuft.
Die Meldung
Das Video ist nicht der Hauptinhalt der Seite
Damit tauchen die Videos nicht direkt in der Suche auf, wie folgt dargestellt

Screenshot 2024-09-06 074123

Es könnte die Vermutung aufkommen, das man versucht die eigene Plattform Youtube zu promoten. Auch wenn es verlockend klingt, will ich die Videos google nicht schenken.

Also Foren durchstöbert und verschiedene Tipps probiert. Einer ist das in Url und H1 das Wort Video auftauchen muss. Lösbares Problem. Ca 3 Tage später das Ergebnis:
Screenshot 2024-09-06 074359

Auf den ersten Blick haben diese Videos gemein, das die Beschreibung vergessen wurde, Es ist also weniger Text auf der Darstellungsseite. Könnte Sinn machen. Unsere Videos haben meist den Session Abstrakt als Beschreibung, der schnell ein paar hundert Wörter hat.

Lösung Nummer 1: per Hand 1000 Video Texte editieren. 3-5 Minuten pro Video. Könnten mal 2 Wochen Arbeit sein und danach reif für die Klapse.

Lösung ein LLM schreibt Zusammenfassung

Meine Forschungen beschäftige sich mit lokal betriebene LLM. Ich bin aus Kostengründen und Compliance kein Freund von Cloud Lösungen. Modelle im Open Source Lizenz Modell gibt es reichlich, wie Mistral oder von Microsoft Phi-3. Rund 2 GB Download per
git clone https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-onnx

Phi-3 wird in der ONNX Variante benötigt um mit Microsoft ML.NET genutzt werden zu können. Wenn sie wie ich keine GPU mit CUDA oder gar eine NPU (Neural Processing Unit) haben, muss per CPU und WIndowsML gearbeitet werden. Also das passende Modell.

var modelPath = @"C:\stateof\phi-3\Phi-3-mini-4k-instruct-onnx\
cpu_and_mobile\cpu-int4-rtn-block-32-acc-level-4"
;

 

ONNX ist eines der gängigen Formate für AI Modelle. Um es laufen zu lassen benötigt man eine Runtime

NuGet Gallery | Microsoft.ML.OnnxRuntime.Managed 1.19.2

Sprache wird von LLM wie ChatGPT in Vektoren um gesetzt um diese dann mit einer mathematischen Funktion zu vergleichen.  Den Vorgang nennt man Tokenization

   1:  var model = new Model(modelPath);
   2:  var tokenizer = new Tokenizer(model);
   3:  var systemPrompt = "You are an AI assistant that creates a shorten summary text within maximal two sentences for SEO reasons. " +
   4:      "Dont use words 'Vortrag' 'Sprecher', 'Zusammenfassung', 'SEO','Inhalt', 'Kurzfassung' and similar. Neither names of people. Also Dont mention event names, place or date. Try to prevent word repetition. Answer only German. ";
   5:   
   6:   

Eine Eigenschaft von vielen LLM ist die Fähigkeit die Ausgangssituation als sogenannter System Prompt zusammen zu fassen. Dieser wird bei jedem Modelldurchlauf vorab geladen und mit dem User Prompt zur Verarbeitung gebracht. Ich habe einige Versuche benötigt um ein akzeptables Ergebnis zu erhalten. Also Anwendung gestartet zugesehen und dann abgebrochen.

Bei Plattformen wie ChatGPT wird die Konversation gesammelt und als ganzes für den nächsten Durchlauf als Eingabe Parameter gefüttert. Ein Neuronales Netzwerk wie ein LLM hat eigentlich kein Gedächtnis. Softwareentwickler nennen das Stateless.

Ich lade meinen Texte aus XML Dateien. Da dies aber hier keine Rolle spielt, verzichte ich auf den C# Code. Relevanter ist das Prompt Format. Ein Modell wird mit einer spezifischen Steuersequenz trainiert um die Eingabe Parameter zu setzen. Diese findet man in der Modelcard.

fullPrompt = $"<|system|>{systemPrompt}<|end|><|user|>
{textNode.Value.Trim()}<|end|><|assistant|>"
;
 
Die Datenbasis ist eine Liste von Tokens, also muss auch die Eingabe als Token vorliegen.
   1:  var tokens = tokenizer.Encode(fullPrompt);
   2:  var generatorParams = new GeneratorParams(model);
   3:  generatorParams.SetSearchOption("max_length", 2048);
   4:  generatorParams.SetSearchOption("past_present_share_buffer", false);
   5:  generatorParams.SetInputSequences(tokens);
   6:   
   7:  var generator = new Generator(model, generatorParams);

Wir sehen hier Parameter die ich einfach so kopiert habe ohne genau erforscht zu haben wie sie sich auswirken. In Zeile 7 lauert dann die Runtime.

Nun wird von der AI Wort für Wort Text erraten. Eigentlich ein Token, das wieder in Text zurück konvertiert wird. Diese Arbetisweise eines Transformer Modells ist auch der Grund warum es mit verschiedenen Sprachen ziemlich gut zurecht kommt. Manche der Abstrakts waren vorher Englisch und danach Deutsch.

   1:   while (!generator.IsDone())
   2:      {
   3:          generator.ComputeLogits();
   4:          generator.GenerateNextToken();
   5:          var outputTokens = generator.GetSequence(0);
   6:          var newToken = outputTokens.Slice(outputTokens.Length - 1, 1);
   7:          var output = tokenizer.Decode(newToken);

Ein relative bekanntes Problem von Phi-3 ist, das das Modell manchmal Amok läuft. Man stellt ne Frage, bekommt ne Antwort und eine weitere Frage und Antwort usw. Hatte auch den Fall das die Antwort eine Sequenz von Strichen war.
Man benötigt also Code der das Model einfängt und die Token Erstellung einer Schleife abbricht.

   1:  if (output.ToString().Contains(....
   2:        || output.ToString().Contains("**"))
   3:          {
   4:              break;
   5:          }

Die Durchlaufzeit lokal lag nun bei 6h! Die Texte sind nicht 100%, aber das wären sie beim Praktikanten auch nicht.
Hier fehlt der komplette Code. Den hab ich mir tatsächlich von ChatGPT schreiben lassen.

Kommentare sind geschlossen