KI und so – (eine Zusammenfassung)

Ich hab‘ mich in letzter Zeit mal mit KI auseinandergesetzt – oder, naja, genaugenommen mit großen Sprachmodellen und generativer KI (also alles um das Thema „LLM“), was eigentlich nur einen kleinen, aber in letzter Zeit ziemlich in den Vordergrund getretenen Teil von dem ausmacht, was mit „KI“ (bzw. „AI“) bezeichnet wird. Und ich muss sagen: yep, bei aller Skepsis und allen Bedenken – geiler Sch🛎️s.

Vorab vielleicht ein paar Links, für die, die einfach mal loslegen wollen:

[Die vorliegende Version hier ist vom 8.7.2026, 11:00]
[Die vorliegende Version ist vom 09.07.2026, 13:00 (Ergänzung MTP im Abschn. „Bezeichnungssdetails“)]
[Die vorliegende Version ist vom 17.07.2026, 13:00 (Korrekturen und Ergänzung „warum KI nicht rechnen kann“)]

Bei den grauen, in einer kleineren Textgröße gehaltenen Abschnitten, handelt es sich um Zusatzinfos oder Anmerkungen von mir, die im Sinne des eigentlichen Themas nicht unbedingt weiterführen. Wenn Du nicht zu viel Komplexität auf einmal präsentiert bekommen möchtst, empfiehlt es sich, die erst mal zu ignorieren. 


Worum geht’s?

KI klingt im ersten Ansatz erst mal echt kompliziert – und tatsächlich ist sie das auch. Aber die Anwendung ist eigentlich total einfach. Es reicht, irgendeine Sprache halbwegs fließend zu beherrschen und irgendein Anliegen zu haben, das eine Maschine, die mit unserer realen Welt nur sehr mäßig, aber mit der Welt der Informationen und Daten, der Welt des reinen Wissens, der Algorithmen, der Logik (obwohl … naja, zumindest grob …) und ggf. dem Internet intensiv vertraut und super vernetzt ist, lösen kann.


Anwendungsfälle

Beispiele:

  • Eine neue Webapplikation auf Basis von bestehenden Frameworks, aktuellen Standardtechniken, strengen Clean-Code-Regeln und wenig Zeit zusammenkloppen: krass guter Anwendungsfall.✅
     
  • Detail-Informationen zu einem Fachgebiet, wovon Du nur mäßig Ahnung hast, wo sie aber von Dir wollen, dass Du für sie ’ne Webapplikation baust, zusammensuchen, auf Deinen Anwendungsfall einkochen und unter Beachtung deines aktuellen Horizonts darstellen lassen, um auf der Basis schnell zu lernen, mit den Leuten im Sinne von DDD fachlich ordentlich kommunizieren zu können: 1-A Anwendungsfall.
     
  • Du hast ’nen Satz total verwirrter Excel-Tabellen und willst die so zusammenbringen, dass Du daraus bestimmte Informationen ablesen kannst, hast aber zu wenig Erfahrung, wie man das automatisiert oder schlicht keinen Bock Dir die Mühe zu machen und hast außerdem Zeitdruck, weil Cheffe das wieder gestern haben will: mit der kleinen Einschränkung, dass Du der KI wahrscheinlich recht genau schildern musst, was Du eigentlich von ihr willst – ein Super Anwendungsfall.
     
  • Planst Du gerade ein neues Sport-, Freizeit- oder Einkaufszentrum und brauchst Unterstützung bei rechtlichen, planerischen, projektleiterischen, kommunikativen, die Software oder die Projektmanagementmethode bzw. das -Framework betreffenden Fragen, oder willst Du gar Teile deiner Arbeit an einen willfährigen Helfershelfer auslagern: guter bis sehr guter Anwendungsfall✅, aber immer bedenken: die Maschine ist fehlbar und merkt nicht, wenn sie Bullshit labert – Vertrauen ist gut, Kontrolle ist besser! Insbesondere bei allem, was Sicherheitsaspekte angeht (z.B. geologischen, geomorphologischen, hydrologischen, bauphysikalischen oder feuerpolizeilichen Fragestellungen), würde ich im Zweifel immer einen kompetenten Menschen hinzuziehen!
     
  • Dumme Fragen beantwortet kriegen wollen, aber zu faul sein, im Internet rumzugoogeln um erst mal die richtigen Fachwörter zu finden und anschließend bei Wikipedia Artikel querzulesen: durchaus brauchbarer Anwendungsfall✅ (Google schickt ja bereits von sich aus inzwischen bei den meisten Anfragen die KI los).
     
  • Ähnliche Problematik, aber dem Internet keine Kenntnis darüber geben wollen, dass man aktuell diese dummen Fragen hat: etwas komplizierterer, aber durchaus lösbarer Anwendungsfall.✅(mit lokaler KI oder evtl. Lumo)
     
  • Ein altes Bewerbungsfoto ohne zum Fotografen zu gehen aktualisieren und ggf. etwas aufhübschen lassen: kommt drauf an.  
    (Warum die Einschränkung? Naja – um das lokal zu machen bedarf es schon einiger Rechenpower und hinreichendem Fachwissen. Bleibt also nur online. So rein aus der Erfahrung: Mistral AI kann man bei dem Anliegen eher vergessen. ChatGPT liefert ganz ordentliche Ergebnisse, aber wenn man selbst eine recht genaue Vorstellung hat, wie das Ergebnis aussehen soll, sind das schon mehrere Schleifen, die man mit der KI drehen muss, und am Ende bin ich hingegangen und hab das Ergebnis noch händisch zurechtgefruckelt – zumal ich aus dem Umsonst-Volumen raus war. Vielleicht hätte eine spezialisiertere KI mir schneller oder besser geholfen. Am Ende war es zwar billiger als ein Besuch beim Fotografen und ich hatte relativ exakt das, was ich mir vorgestellt hatte, aber weniger Zeit habe ich da definitiv nicht reingesteckt (andererseits ist nach einer Stunde Foto-Session und 80 Euro Guthabenabfluss keineswegs sichergestellt, dass da ein brauchbares Bewerbungsfoto bei rauskommt …))
     
  • Für kommendes Wochenende eine Reise an die Küste planen und dafür Wetterbedingungen und Autobahnbaustellen raussuchen lassen: eher nicht
    das mit dem Wetter in der Zielregion kriegen die Dinger per Webrecherche noch halbwegs in den Griff, aber die Route dahin überfordert die meiste generative KI bereits, (evtl. weil sie nicht hinreichend mit Geo-Daten gefüttert ist, aber wenn Ihr Euch weiter unten anschaut, wie LLM-KIs zu ihren Ergebnissen kommen … ich denke, das ist einfach auch strukturell kein guter Anwendungsfall – da müssen dann Spezialisten wie Google Mops und so ran). Auch was die Vorstellung der Räumlichkeit und der Bewegung im Raum angeht, zeigen sich sogar bei großen, aktuellen Modellen Grenzen. Das wäre auf jeden Fall etwas, wo man diverse Schleifen mit der KI machen müsste und selber relativ viel Intelligenz reinstecken muss (z. B. erst mal die Route bei Google holen und für die KI aufbereiten) … lohnt sich aktuell noch nicht so richtig

Man kann es vielleicht auf folgende ungefähre „Formel“ einkochen:

Ist die Information grundsätzlich relativ statisch, schon seit einigen Monaten oder besser Jahren in der Welt und hat es nichts mit
  ⛔ sehr aktuellen,
  ⛔ nur regional relavanten,
  ⛔ dynamischen (z.B. Wetter),
  ⛔ schwer vorhersagbaren (z.B. menschlichem Verhalten),
  ⛔ sich vor allem in der realen Welt abspielenden
Szenarien zu tun, ist KI Dein Freund. Alles andere ist eher mühsam oder geht gar nicht.

Ich habe weiter unten dazu auch noch mal einen etwas ausfühlicheren Abschnitt „Was (derzeitige, LLM-basierte) KI nicht leisten kann“.


Rüstzeug für den Umgang mit / das Sprechen über KI

Mein Kernanliegen ist in diesem Beitrag weniger die praktische Anwendung – das ist zum einen bei den ersten Schritten völlig trivial, zum anderen hab ich dazu noch nicht so viel gesammelt, dass ich mich da zum Lehrer aufschwingen wollen würde, und zum dritten gibt’s dafür bereits x Tutorials und Videos da draußen – sondern eher, das Ausleuchten der Grundlagen, was ich so bisher noch nirgends in einer Tiefe, die mich zufriedengestellt hätte, gefunden habe. Mir geht’s darum, dass Leute wissen, was in dieser Art KI abläuft, dass sie nachvollziehen können, warum manche Sachen gut und manche Sachen schlecht funktionieren, und dass sie das Basisvokabular und die nötige Sachkenntnis bekommen, selber mit lokaler KI (auf dem eigenen Rechner) ein bisschen herumzuexperimentieren. Wenn ich so weit bin, über selbst programmierte Agenten, MCP, RAG und solche Sachen etwas zu erzählen, reiche ich einen Beitrag nach – das kommt hier noch nicht vor.

Ich baue das mal weitestgehend im Stil eines Glossars auf, wobei die Einträge aber von oben nach unten aufeinander aufbauen.

(gleich am Anfang kommt etwas schwere Kost … das mit den „Token“ würde ich auf jeden Fall mitnehmen, wer aber gar nicht so genau wissen will, was es mit Vektoren und Tensoren oder neuronalen Netzen auf sich hat, darf das gerne erst mal überspringen.)


Token

Eigentlich steht dieser Begriff „Token“ viel weiter hinten in der Hierarchie des nötigen Wissens, aber ich verwende ihn an so vielen Stellen, dass ich einfach mal vorab eine Kurzversion dazu bringe.

Ein Token ist die kleinste Einheit, die ein LLM (im Textverarbeitungsmodus) verarbeitet. Wenn ich jetzt „Token“ und „Wort“ gleichsetze, dann ist das zwar nicht korrekt, aber auch nicht wirklich schlimm falsch. Für’s erste Grundverständnis ist das vollkommen OK.

In Wahrheit ist ein Token kleiner als ein Wort. Im Deutschen ist das Verhältnis zwischen Token und Wort ungefähr 4:3, also 3000 Worte entsprechen in etwa 4000 Token. Im Englischen entspricht ein Token häufiger einem Wort als im Deutschen.

Auf eine DIN-A4-Seite passen je nach Formatierung bei Schriftgröße 12 zwischen 250 und 500 Wörter, also über den Daumen: 500 Token sind eine DIN-A4-Seite, 1K Token ungefähr zwei. Das deutsche Grundgesetz kommt auf knapp 40.000 Token (also knapp 40„K“).

In Wahrheit geht es also nicht um Wörter, sondern um etwas, das eher dem Konzept der „Morpheme“ aus der Linguistik (kleinste bedeutungstragende Einheiten bzw. Buchstabenkombinationen) nahekommt – Bruchstücke von Wörtern.

Im Deutschen ist das vielleicht relevanter, weil wir mehr grammatischen Schnickschnack verschriftlichen (ich mache, du machst, er macht, wir machen, ihr macht, …), relativ ausgiebig mit Vorsilben hantieren (vorstellen, nachstellen, überstellen, unterstellen, aufstellen, einstellen, abstellen, erstellen, bestellen, zer … äh … na … Prinzip klar, denke ich) und generell relativ lange Wörter haben. Allerdings hängt das Erstellen von Token nicht zwangsläufig an solchen Kategorien.

Außerdem spielen IDs, Übersetzungstabellen und Vektoren hier eine Rolle – aber das ist für den Anfang erst mal nebensächlich.


Vektoren und Tensoren

Keine Angst – ich bin selber nicht der größte Experte in dem Thema und mach’s kurz und simpel. Man muss diese Wörter auch nicht unbedingt verstehen, um mit KI umgehen zu können, also wer sich das ersparen will – kein Problem, einfach weiterscrollen – aber ich bringe die Begriffe weiter unten mehrfach und will auch den Laien die Chance geben, das jeweils nachvollziehen zu können.

Ein Vektor (manchmal auch „Array“) ist ganz plump gesagt eine sortierte Liste von Zahlen. „Sortiert“ meint hier allerdings nicht so was wie „ansteigend“, sondern so etwas wie „hat an derselben Stelle dieselbe Bedeutung“.

Ich geb mal ein Beispiel für die Leute, die sich das noch so gar nicht vorstellen können. Stell Dir eine Palette mit gleichmäßig nebeneinander und hintereinander darauf gestapelten, kleinen, jeweils gleich großen Kartons vor (also einer genau auf dem anderen – würde man in Wirklichkeit nicht so machen, ich weiß, aber es ist nur ein Gedankenexperiment). Die untere Lage bildet ein Quadrat von meinetwegen 10×10 Kartons, und dann sind weitere 9 Lagen Kartons darüber gestapelt. Jetzt schickst Du den/die Azubi mit einem Zettel los, um aus einem ganz bestimmten Karton etwas zu holen. In dem Fall macht es Sinn, wenn ihr im Betrieb für so einen Fall vereinbart habt: wenn auf dem Zettel „6-3-8“ steht, ist damit der 6. Karton von Links in der 3. Reihe von vorne in der 8. Lage von unten gemeint.  „6-3-8“ ist damit ein Vektor, und zwar einer mit 3 „Feldern“ (eigentlich wäre das korrekte Wort hier „Dimensionen“, aber das führt m.E. eher zu Verwirrungen, deswegen weiche ich da mal auf das Wording für Arrays aus, wie es in der angewandten IT üblich ist).

Man kann das ganze jetzt verkomplizieren und etwas von euklidischen Räumen, Koordinaten, Pfeilen, Nachkommastellen (dass oben im Beispiel nur ganze Zahlen vorkommen ist ein Sonderfall) und Blablabla erzählen, aber das Grundprinzip bleibt dasselbe.

Allerdings geht es bei den Vektoren, über die wir hier reden, nicht um 3 sondern um sehr viel mehr Zahlen (bzw. Felder) und es geht nicht um Kartons, sondern um so etwas wie „Eigenschaften“ oder „Merkmale“, aber auch hier gilt: eine Zahl an einer bestimmten Stelle (in einem bestimmten Feld) im Vektor bezieht sich jeweils auf immer dieselbe Eigenschaft.

Ein Vektor mit 1000 Feldern könnte z.B. so aussehen (die Zeilenumbrüche sind dem Platzmangel geschuldet – eigentlich gehören alle Zahlen in eine Zeile):

verdammt viele Zahlen, jeweils zwischen -1 und 1Um das zu verstehen, muss man sich vielleicht (zumindest für’s erste) etwas von dem räumlichen Verständnis, das oft mit dem Thema Vektor assoziiert ist, lösen. Es geht erst mal tatsächlich nur um eine Liste von Zahlen, bei der lediglich jeder Listenposition eine feste Bedeutung zugeordnet ist.

Ein Tensor ist einem Vektor nicht unähnlich. Tatsächlich ist ein Vektor ein Tensor vom „Rang“ 1 (aber das ignorieren wir im Weiteren mal einfach). Wenn Du Dir jetzt statt einer einfachen Reihe oder Spalte (man kann Vektoren horizontal oder vertikal notieren) eine Tabelle mit Zahlen drin vorstellst, also mehrere gleich lange Vektoren über- oder nebeneinander, bist Du im Grunde schon bei einem Matrix-Beispiel mit InizesTensor 2. Ranges (im Matheunterricht ist so etwas eine „Matrix“ ). Im Bild rechts sieht man so etwas in symbolischer Schreibweise. Ein Tensor 3. Ranges wäre unser obiges Karton-Beispiel (wenn wir jetzt mal seinen ursprünglichen Sinn vergessen), wenn in jedem dieser Kartons eine Zahl drin wäre, also eine 3-dimensionale Anordnung von Zahlen, ein Zahlenwürfel oder -quader. Man kann das Spielchen im Grunde beliebig weitertreiben, aber dann wird’s mit der Vorstellung langsam kompliziert. Reicht aber so auch erst mal.

Bei LLMs bzw. heutiger KI spielen (bei den „Gewichten“) vor allem Tensoren 2. Ranges und 3. Ranges eine Rolle. Und es spielt eine Mathematik eine Rolle, bei der Vektoren und Tensoren miteinander multipliziert (oder in dazu ähnlicher Weise miteinander „verknüpft“) werden. Auf die Details gehen wir jetzt nicht weiter ein. Wichtig ist: dabei geht vorne ein Vektor rein und hinten kommt ein veränderter Vektor raus, wobei die Anzahl der Felder i.d.R. gleich bleibt.


Neuronales Netz

Ein neuronales Netz (NN) ist – bildlich gesprochen – eine in den elektronischen, digitalen Raum übertragene Analogie zu Nervenverbindungen, wie sie in Gehirnen vorkommen (bzw. eine vereinfachte Variante davon).

Dabei gibt es – konzeptuell – „Knoten“ bzw. „Nodes“, die die Nervenzelle repräsentieren (oft als kleine Kreise dargestellt), und Verbindungen dazwischen (meist als Linien dargestellt), die die Verbindungen zwischen den Nervenzellen symbolisieren – und zwar in unserem Fall hier gerichtete Verbindungen jeweils von einer Node-Schicht (einem „Layer“) zur nächsten, denn ein NN besteht aus vielen Schichten von Nodes (wem es hilft: ähnlich zu gestapelten Eierpaletten), wobei zu jedem von ihnen mehrere Verbindungen aus der vorgelagerten Schicht eingehen und Verbindungen zu mehreren Nodes in der Folgeebene von ihnen ausgehen.

Die Anzahl der Nodes pro Schicht kann gleich sein, muss es aber nicht zwingend, so dass ein NN am „Anfang“ u.U. viel mehr Nodes hat, als am „Ende“.

Das Bild zeigt Schematisch ein Beispiel für ein Neuronales Netz mit drei Eingängen, drei Zwischenlayern und einem Ausgangsknoten

Simples Beispiel für ein neuronales Netz – Die Daten fließen hier von links nach rechts – die Layer stehen senkrecht.

Die Nodes repräsentieren den Datenzustand in einer bestimmten Schicht des Netzes. Jeder Node steht also für einen Vektor, denn „Daten“ sind an dieser Stelle der Geschichte und in unserem speziellen Fall Vektoren.

Die Linien (also die Verbindungen) symbolisieren technisch gesehen die Tensoren (s.o.), über die der Vektor des einen Knoten in einen neuen Vektor umgerechnet und an den nächsten Knoten weitergereicht wird, die Linien stellen also im Grunde Rechenschritte dar. Die Rechenvorschrift ist immer dieselbe, aber der Tensor ist für jede Verbindung individuell. Diese Tensoren nennt man die „Gewichte“ (Weights) oder „Parameter“ des NN, und sie machen den größten Teil bei der Definition eines NN aus.

Die Nodes repräsentieren, wie gesagt, Daten bzw. Vektoren. Allerdings ist das nicht die ganze Wahrheit. Quasi am „Eingang“ jedes Nodes findet noch mal Mathematik statt (allerdings immer (?) dieselbe, so dass man dafür nicht endlose Zahlenreihen speichern muss). Ob ein Node überhaupt auf einen Dateneingang „reagiert“ und seinerseits einen Vektor weiterreicht (im Fachjargon: ob er „feuert“), bestimmt eine Aktivierungsfunktion. bleibt deren Ergebnis unter einem bestimmten Schwellenwert, ist der Node für den aktuellen Durchlauf (Inferenzschleife – kommen wir auch noch zu) raus. Da fast immer mehrere eingehende Verbindungen ankommen, muss außerdem irgendeine Form von Summe oder Durchschnitt gebildet werden (muss ich noch rausfinden, ist aber für uns auch nicht so entscheidend).

Wie schon beschrieben sind die Verbindungen zwischen den Nodes „gerichtet“, außerdem reden wir hier von reinen Feed-Forward-Netzwerken, was bedeutet: die Information – also letztendlich die Vektoren – durchlaufen das Netz streng „vom einen Ende zum anderen“ (von oben nach unten oder links nach rechts – das ist ganz Deiner Vorstellung überlassen). Es gibt auch andere Fälle, aber die spielen hier keine Rolle.

OK – das war jetzt schon reichlich schwere Kost, zugegeben. Aber der Vollständigkeit halber: tatsächlich gibt es in keinem Rechner der Welt irgendeine Struktur, die dem nahekommt. All das wird rein „virtuell“ erzeugt. Das gedachte Konzept wird in Form von ablaufenden Algorithmen, Reihenfolgen und Hilfskonstrukten zum Leben erweckt. Es ist alles reine Mathematik. Alles, was ich oben erklärt habe, ist letztlich nur eine Krücke, eine Denkhilfe, damit Menschen sich das Konzept vorstellen und weiterentwickeln können. Die Wahrheit sind unendliche Ströme von Zahlen, die durch Rechenoperationen gepumpt werden. Irre Vorstellung, oder?

Und vielleicht das noch: man könnte auf die Idee kommen, die hier beschriebenen „Verbindungen“ im Sinne der (Schul-)Biologie mit einzelnen Zweigen von „Dendriten“ bzw. den Synapsen an deren Ende zu assoziieren, aber der Vergleich hinkt aus verschiedenen Gründen – befassen wir uns, wenn gewünscht, weiter unten auch noch mit, führt aber aus dem eigentlichen Thema ziemlich weit raus. Grundsätzlich würde ich vom unmittelbaren Vergleich der Konzepte abraten, da man sich damit leicht in eine Argumentationshölle ungeahnten Ausmaßes begeben kann.


Transformer

Transformer sind der Wissensspeicher, auf dessen Basis der „Denkapparat“ arbeitet. Sie bilden die Grundlage, auf deren Basis KIs ihre Schlussfolgerungen ziehen.

Es handelt sich dabei um eine auf bestimmte Art strukturierte Form von neuronalen Netzen, in denen Layer, Header, Hidden Layer und so abgefahrene Sachen wie „Aufmerksamkeit“ (Attention) vorkommen. In Transformern gibt es – wie oben schon angedeutet – keine Verbindungen innerhalb derselben Ebene oder zurück auf die nächsthöhere Ebene (anders als zum Beispiel im Gehirn von Menschen oder bei anderen KI-Architekturen). Es sind also reine Feed-Forward-Netzwerke.

Wichtig ist dabei zu verstehen: diese rein auf Zahlen fokussierte Struktur ist es, die das eigentliche „Verstehen“ von Eingangsdaten und das Generieren neuer Daten bewerkstelligt. Weit und breit kein „Wort“, keine „Bilder“ im Kopf (womit das Thema „Konnotation“ allerdings nicht abgefrühstückt ist – aber die Diskussion darüber ist an dieser Stelle des Beitrags noch nicht führbar) und keine Fähigkeiten, wie simple Addition oder gar Multiplikation (gehe ich weiter unten noch genauer drauf ein) … einfach nur: da kommen oben (viele) Zahlenreihen rein und unten gehen (wenige) Zahlenreihen raus – ein elektronisches Bauteil, das aufgrund seiner Verdrahtung aus einem Eingangssignal ein Ausgangssignal macht.

Man könnte noch viel mehr zu dem Thema sagen, aber dann wird’s echt schon recht tiefgründig, vieles davon (z. B. die recht essenzielle „Attention“ – die Aufmerksamkeitsmechanismen) kommt sowieso noch weiter unten und für den Hausgebrauch reicht das zu dem Thema erst mal.


Generative KI

KI, die auf Basis von vorliegenden Daten neue Daten „generieren“ kann – zum Beispiel (aber nicht ausschließlich) Texte oder Bilder – und inzwischen oft beides in beiden Richtungen.


Vortrainiert / Pre-trained

Ein neuronales Netz zu „trainieren“ bedeutet: Leute setzen sich hin und „füttern“ es – also in unserem Fall einen Transformer mit einer irren Menge an Daten, wobei immer wieder überprüft wird, ob der Transformer zu bestimmten Eingangsdaten korrekte Ausgangsdaten liefert. Anschließend wird jedes mal eine ziemlich aufwendige Mathematik angewendet („Backpropagation“– Algorithmen), um die Tensoren, also die Nervenzellen-Verbindungen bzw. Gewichte, immer besser zu justieren. Das Training ist also die „Lernphase“ für einen Transformer.

Tatsächlich müssen sie aber irgendwann damit aufhören und diesen Trainings-Modus beenden, weil der Transformer sonst überangepasst wird – es käme zum sogenannten „Overfitting“. Damit ist gemeint, dass das Modell zu stark auf die Trainingsdaten spezialisiert ist und auf weitere Eingaben schlecht „generalisiert“, sprich: der Fokus auf die Mustererkennung geht verloren – das Model tendiert dann dazu, jeden Einzelfall in seinen Gewichten abzubilden: das Muster verblasst und wird nur noch schlecht erkannt.

Ganz plump formuliert könnte man vielleicht sagen: der Transformer wird „gaga“, wenn man ihn zu lange und zu eintönig mit Daten füttert..

Auch das ist bei aktueller KI eine sehr entscheidende Tatsache: in der Anwendungsphase ist der Trainingsmodus abgeschaltet! Im laufenden Betrieb lernt eine KI nicht mehr „dazu“! (Stattdessen werden korrigierende Hinweise von Usern alle Nase lang ausgewertet und fließen in neue Model ein. Oft werden bestehende Model auf dieser Basis auch „nachtrainiert“ oder ganz neu trainiert, so dass sie dann halt doch irgendwie dazulernen – aber eben in einem kontrollierten, gesteuerten, periodisch stattfindenden und in sich abgeschlossenen Prozess, nicht wie Menschen permanent und „on the fly“, also im laufenden Betrieb).

„Gefühlt“ wird diese Aussage dem einen oder anderen aufgrund seiner Erfahrungen „falsch“ vorkommen. Allerdings gehört das dann eher in das Thema „Kontext“ (s.u.). Es sieht für den jeweiligen Nutzer aufgrund des durch die Korrektur entstandenen Kontexts lediglich so aus, als hätte die Maschine dazugelernt. Aber an den Parametern hat sich nichts geändert.

Und jetzt die Überraschung: da das Training vor der Anwendungsphase stattfindet und abgeschlossen ist, ist der Transformer anschließend „vortrainiert“ bzw. „pre-trained“.

GPT steht übrigens für „Generative Pre-trained Transformer“.

Kleine Ergänzung am Rande, falls jemand sich nicht vorstellen kann, wie das dann dazu führen kann, dass man damit eine Form von „Wissen“ erzeugen kann. Ich stelle mir als Analogie dazu Hologramme vor. Dort steckt die eigentliche Information auch nicht in einer expliziten Abbildung des Gegenstandes, sondern sie ergibt sich aus der Überlagerung von Lichtwellen aufgrund von Mustern, die mit den ursprünglich aufgenommenen Gegenständen zunächst mal nicht das geringste zu tun zu haben scheinen. Ein Hologramm ist zudem (quasi) flach und „erinnert“ sich trotzdem an 3-dimensionale Informationen. Tatsächlich kann man in einem einzigen Hologramm, wenn man unterschiedliche Lichtwellenlängen verwendet, sogar deutlich mehr als nur ein 3D-Bild speichern.

Die Gewichte bzw. Tensoren einer KI, die ja obendrein jeweils aus einer Kombination von vielen Zahlen bestehen, liefern – quasi analog zu unterschiedlichen Blickwinkeln und Lichtwellenlängen – je nach verschiedener Kombination von eingehenden Informationen andere „Wissensbilder“ aus (das ist noch nicht die ganze Wahrheit, weil die Attention da auch noch eine wichtige Rolle spielt – aber um eine Idee von der Sache zu kriegen hilft’s vielleicht.)


Gewichte (Weights) / Parameter

Zwei andere Wörter für die „Verbindungen“ oder „Tensoren“, oder anders gesagt: im Sinne von KI sind Gewichte, Parameter, Verbindungen und Tensoren alle im Grunde verschiedene Wörter für dieselbe Sache.

Wie viele Parameter der Transformer eines bestimmten Sprachmodells hat, wird in „B“ angegeben – gemeint sind englische „billions“, also zu Deutsch „Milliarden“. Der Transformer eines LLMs mit „7B“ hat also 7 Milliarden Nervenzellen-Verbindungen bzw. Parameter bzw. Gewichte bzw. Tensoren.

Die größten aktuell in Betrieb befindlichen LLMs haben zwischen 700 und 1000B, also knapp 1„T“.

Ein menschliches Hirn hat übrigens etwa 86 Milliarden Nervenzellen, wovon etwa 69 Milliarden auf das Kleinhirn und 16 Milliarden auf den Cortex entfallen (und eine Milliarde auf sonstige Sachen). Eine Nervenzelle hat größenordnungsmäßig etwa 10.000 Verbindungen zu anderen Nervenzellen. Im Cortex sind es tendenziell eher mehr als weniger. Das „Denken“ findet primär (aber nicht ausschließlich) im Cortex statt. Hätte das Gehirn also die Struktur heutiger Transformer (was es nicht hat – die Verzweigung ist viel komplexer!), so hätte allein sein für das rationale Denken und die Eingangsdatenverarbeitung zuständiger „Transformer“ wohl irgendwas um die 200.000B (quasi 200T). Zur Streichung: was ich dabei nicht beachtet habe war, dass das menschliche Gehirn nicht mit Vektoren und Tensoren hantiert. Dort sind eher analoge Signalstärken oder etwas ähnliches im Spiel. Die Komplexität der Verzweigungen und deren „Eingreifen“ (!) in den gesamten Rechenprozess des Gehirns ist es andererseits, was letztendlich bei der technischen Umsetzung zu der Analogiebildung durch Vektoren und Tensoren geführt hat. Was definitiv falsch ist, ist die einzelnen „Verbindungen zwischen Neuronen“ gegeneinander aufzurechnen. Ich habe mal Claude auf das Thema losgelassen und die – wie ich finde – beeindruckende Antwort unten als Anhang ergänzt. Die Frage der Vergleichbarkeit wird zwar auch da nicht abschließend geklärt, aber die Komplexität der Fragestellung wird zumindest gut ausgeleuchtet. Am Ende muss sich wohl vorerst jeder eine eigene Meinung leisten und die Aspekte eines solchen Vergleiches einer eigenen Bewertung unterziehen. Ich bin abschließend immer noch der Meinung, dass menschliche Köpfe über einen komplexeren Denkapparat verfügt, als (einzelne Instanzen) moderner KI, aber rein von den Ergebnissen her ist es freilich schwierig, dort nicht eine gewisse Steilheit der These zu erkennen…


LLM / Sprachmodell

Ein „Large Language Model“ (LLM) bildet den Kern einer KI.

Es besteht aus:

  • dem Transformer – dem eigentlichen „Wissensspeicher“

  • der Übersetzungslogik zwischen „natürlicher“ Sprache und der im Transformer vorherrschenden Mathematik (der Transformer bekommt und liefert eine lange Liste von Vektoren – weder der Buchstabe A noch das Wort „Apfel“ sagen einem Transformer an sich irgendwas) und

  • einer speziellen Datenbank, die für diese Übersetzung notwendig ist (und die zusammengestellt wird, bevor der Transformer damit trainiert wird)

Die Übersetzungsdatenbank stellt das „Vokabular“ des LLMs dar.

Tatsächlich darf man sich von dem Wort „Language“ in LLM (oder dem Teilwort „Sprach“ in Sprachmodell) hier nicht verwirren lassen: das Modell abstrahiert nicht eine bestimmte Sprache, sondern semantische Zusammenhänge von Wörtern (oder genau genommen Token) als wilde, bisher im Grunde von außen undurchschaubare Sammlung bzw. Liste von Zahlen (also „Vektoren“), und die sind – mehr oder minder – universell.

Im „Vokabular“ wiederum stecken fast immer Token aus ganz vielen Sprachen (selbst bei den kleinen, lokalen Models).

Das Modell ist deshalb (meistens) nicht auf eine bestimmte, natürliche Sprache festgelegt. Tatsächlich beherrschen die allermeisten der modernen LLMs diverse Sprachen – Englisch und die großen Verkehrssprachen wie Chinesisch, Arabisch und Spanisch quasi immer, meistens auch Russisch, Französisch und Portugiesisch, und in den allermeisten Fällen sind selbst Exoten wie Italienisch, Polnisch, Niederländisch oder Deutsch dabei. Ich habe mindestens ein Modell gesehen, das sich damit rühmt, auf über 200 Sprachen und Dialekte trainiert zu sein (Qwen3.5/3.6)!

Die Erfahrung zeigt allerdings, dass die Unterstützung von Deutsch qualitativen Einschränkungen unterliegt. Viele kleinere Modelle kriegen das mit der Grammatik oder den korrekten Präpositionen nicht wirklich konsequent und zu 100 % optimal auf die Kette, und bestimmte idiomatische Redewendungen kommen einem gelegentlich ein bisschen chinesisch vor. Selbst die ganz Großen sind nicht immer zu 200 % perfekt (aber schon verdammt gut – manchmal überliest man selbst als Muttersprachler kleinere Fehlerchen).


Modell / Model

Dasselbe, nur einmal deutsch und einmal englisch. Sorry – ich haue das hier, glaube ich, regelmäßig wild durcheinander.


GGUF

Ein Dateiformat, mit dem sich LLMs „transportieren“ lassen – eine GGUF-Datei enthält die Parameter und die Konfiguration des Transformers, die Token-Datenbank und die Übersetzungslogik.


Inferenz / Schlussfolgerungsschleife

Inferenz ist quasi der kreative Prozess bei der generativen KI.

Es ist der Vorgang, bei dem Stück für Stück auf Basis von bestehendem „Wissen“ weitere Information „generiert“ wird. Die genaue Funktion von Inferenzmaschinen – also den Programmen, die das eigentliche „Generieren“ leisten – ist auch mir noch nicht vollständig klar (zumal wir das Thema „Token und Vektoren“ bzw. „Embeddings“ noch nicht so wirklich angefasst haben, so dass ich die Erklärung, was hier mit „Wahrscheinlichkeit“ gemeint ist, weiter unten nachholen muss).

Schematische, vereinfachte Darstellung des Inferenzprozesses (ohne Reasoning).

Vereinfachte Darstellung des Inferenzprozesses (ohne Reasoning). Die Tropfen stehen für Vektoren.

Nach dem, was ich bisher verstanden habe, handelt es sich dabei um in Schleifen (also wiederholt) ablaufende Logik-Algorithmen, die auf Basis einer bestehenden Abfolge von Token (dem „Kontext“) unter Verwendung des Transformers Wahrscheinlichkeiten für eine Auswahl „nächster“ Token ermitteln, die die anfängliche Abfolge von Token „logisch“ ergänzen können. Am Ende einer jeden Schleife wählt die Inferenzmaschine dann eines aus diesen „wahrscheinlichsten“ Token aus, reicht es weiter an die Ausgabe und fügt es der Abfolge (dem Kontext) hinzu. Dann beginnt das Spiel von vorne (Siehe Schaubild).

Hört sich irre kompliziert an (ist es in Wirklichkeit auch), bedeutet aber allgemeinverständlich, dass Inferenzmaschinen im Grunde bloß permanent Rätsel nach dem Muster „Morgenstund hat Gold im Mun… – bitte ergänzen Sie“ lösen.

Das ist alles. Ein schlichtes „Was kommt dann“, „Wörter raten“ oder „setze meinen Gedanken fort“ – wie auch immer man’s bezeichnen will. Zugegeben – verdammt kompliziert umgesetzt, aber das ist im Grunde das ganze Geheimnis von „KI“ (wenn wir von LLMs reden).

Ich fand das im ersten Ansatz überraschend billig und desillusionierend, war aber am Ende umso überraschter davon, was damit alles geht.

Oben habe ich etwas mystifizierend von „Wahrscheinlichkeiten“, die ermittelt werden, geredet (ich wollte den Abschnitt nicht zu komplex werden lassen). Den Zusammenhang zwischen Token und Vektoren bringe ich eigentlich auch erst weiter unten, aber der Vollständigkeit halber: die Grundlage für die Wahrscheinlichkeitsbetrachtung sind „Richtungen“ von Vektoren (dem, was da eigentlich aus dem Transformer tropft – denn der kann ja nur Zahlen), die mit der „Richtung“ bekannter Vektoren (dem „Vokabular“ des LLMs) verglichen wird … wir gehen unten bei den Tokens & Embeddings darauf und auf den Ablauf einer Inferenzschleife noch mal genauer ein.

Was Du hiervon behalten solltest ist das Bild oben – vor allem den Teil in der grünen, gepunkteten Box (OK – vielleicht nicht unbedingt die UHU-Tube, mit der das Token an den Kontext „geklebt“ wird … naja, aber so bleibt das vielleicht wenigstens im Kopf …)


Reasoning

Das Reasoning (hier in etwa „logisches Denken“), auch „Chain of Thought“-Reasoning, ist ein optionaler Unterprozess der Inferenz. Im Grunde betreibt wahrscheinlich jedes Sprachmodell – oder eigentlich seine Runtime – ein gewisses Maß an Reasoning während der Inferenz. Allerdings basiert Reasoning seinerseits auf der Durchführung von Inferenz – anders gesagt: jedes Reasoning beinhaltet Inferenz, aber nicht jede Inferenz beinhaltet Reasoning.

Um das wirklich verstehen zu können müssten wir eigentlich erst mal über die Attention-Mechanismen – die „ordnende Hand im Chaos“ – reden … machen wir weiter unten. Das wird hier sonst einfach zu komplex. 

Das Reasoning leitet zunächst erste Erkenntnisse aus den Eingangsdaten ab (z. B. „User has asked in german – I should answer in german, too.“).

Tatsächlich kann man vielen Modellen beim „Denken“ (also effektiv beim Reasoning) zuschauen. Sie zeigen quasi ihren „inneren Denkdialog“ an – zum Beispiel:


Instead of just listing facts, I should frame biology in terms familiar to a developer:

* DNA = Data Storage (Hard drive/DB).
* Genes/Proteins = Business logic / Functional units.
* Genomics = Systems Engineering (Scalability, normalization, pipeline design).
* **Concept 1: The "Scale" Problem.** DNA is not just a string; it's an enormous dataset that needs structured management. This links to their SQL/PHP background.
* **Concept 2: Data Normalization & ETL (The core of the job).** Explain that bioinformatics is essentially "data engineering for biological systems".
* **Concept 4: Specific Terminology for the Cover Letter.** Give them keywords to use instead of "I know what a base triplet is".

* **Step 1: The Mental Model Transition.**

* DNA as the Storage Layer (The "Data" in Bioinformatics).
* Genetics/Genomics as the Scale Problem.

* **Step 2: Deep Dive into Concepts (Technical Bridge).**
* *Nucleotides & Base Pairs:* The data types and structures.
* *Codon Tables:* The mapping logic.

Bei manchen Modellen kann man das ein- und ausschalten, bei einigen nicht. In den meisten Fällen verschwindet der Denkprozess in einem eingeklappten Bereich oberhalb des Ausgabetextes (z. B. mit einer Glühbirne oder einer „Weiter“- Ecke als Symbol), den man auf Wunsch aufklappen kann. Manchmal sind es mehrere solcher Bereiche. (Die großen Online-Modelle verschweigen die Details ihres „Denkens“ allerdings oft weitgehend.)

Bei Ollama (lokal betriebene KI) sieht das z.B. so aus:

Beispiel für Reasoning von Gemma4 in Ollama

Wenn das Modell seinen Denkprozess rausreicht (sich also beim Denken zugucken lässt), sieht man oft sofort etwas in der Ausgabe, gerade bei lokal betriebenen Modellen kann es andernfalls etwas dauern, bis sich etwas tut (vor allem, wenn das Modell erst noch in das (V)RAM geladen werden muss). Und auch wenn die finale Ausgabe startet, geschieht das noch während der finale Inferenz-Prozess abläuft, so dass die Ausgabe allmählich anwächst.

Wichtig zu diesem Thema vielleicht noch: bei einigen Modellen – auch und insbesondere bei den Online-Chatbots und cloudbasierten Agenten – kann man die Intensität des Reasonings anpassen. Bei Claude heißt das „Aufwand“, Mistral Vibe spricht von „Schnell vs. Denken vs. Recherche“ (wobei letzteres scheinbar einen erweiterten Modus triggert). Ein lokal per Ollama betriebenes gpt-oss:20B hat einen Schalter „Low/ Medium/High“.

Bei den Modellen, die man zum lokalen Ausführen herunterladen kann, wird teils unterschieden zwischen einer Standard- und einer „Thinking“- Variante. Ausgiebiges Reasoning wird auch als „Deep Thinking“ bezeichnet.

Die Frage danach, wo genau das Reasoning angesiedelt ist, führt bisher für mich allerdings noch etwas ins Esoterische. Die Grundlage dafür muss in den Gewichten der LLMs angelegt sein (bzw. ist sie – ich hab Google gefragt) und mit hoher Wahrscheinlichkeit spielen hier auch Details der Attention-Layer – ihrerseits neuronale Subnetze – eine Rolle. Anders gesagt: das LLM muss Reasoning „beherrschen“, damit die Runtime (s.u.) diese durchführen kann. Am Ende muss es also in den Konfigurationsdaten des LLMs stecken, wie genau die Runtime auf einem Transformer Reasoning betreiben darf, denn alleine auf Basis der Gewichte dürfte das für eine Runtime nicht erkennbar sein.


Warum eine (LLM-)KI nicht rechnen kann

Kurz vorab, damit ich das nicht andauern wiederholen muss: auch und insbesondere in diesem Abschnitt reden wir von der aktuellen, generativen, LLM-basierten „KI“, also der coolen Sau, die derzeit allerorten durch’s Dorf getrieben wird.

Es gibt andere Arten von KI – etwa beim Thema Machine Learning und deterministische Entscheidungsbäume -, auf die die nachfolgenden Aussagen nicht zutreffen.

Mir geht es in diesem Abschnitt darum, den Unterschied zwischen Computern und programmiertem, vorhersehbarem Verhalten, und dem, was in einer KI abläuft, herauszuarbeiten. Ich will Dich in die Lage versetzen, jemandem, der Dir erzählen will, er habe „ein Programm gebaut, das komplett in einer KI läuft“, erläutern zu können, warum Du ihn für einen Schwätzer hältst.

Ich habe oben im Abschnitt „Transformer“ behauptet, dass dieser nicht rechnen kann – genaugenommen habe ich behauptet, da seien weit und breit „keine Fähigkeiten, wie simple Addition oder gar Multiplikation“. Im ersten Ansatz vielleicht schwer zu glauben, aber Fakt.

Nur – warum eigentlich nicht?

Oben habe ich gezeigt, wie die Inferenz abläuft. Die wird noch verfeinert durch das Reasoning, aber trotzdem bleibt immer das eine Grundprinzip: ich schmeiße oben die komplette Eingangsinfo rein in meinen Transformer (vorher mache ich aus den Token Vektoren, aber das ist bloß ein Detail) und unten tropft aufgrund des „Wissens“ des Transformers jeweils ein einzelnes, neues Token (bzw. genaugenommen ein Vektor, der schlussendlich in ein Token umgewandelt wird) heraus. Den klebe ich an meine Eingangsinfo dran und dann schmeiße ich den ganzen Rotz oben wieder rein … und so weiter und so fort.

Das ist aber Reiner Abruf von „Wissen“. Wenn es beispielsweise um Algorithmen (Rechenvorschriften oder „Programme“) geht, „kennen KIs sich aus“ mit dem Thema: sie können etwas dazu sagen, sie können damit umgehen, sie erläutern, produzieren und ggf. sogar „anwenden“ – aber es ist kein „Ablaufen von Algorithmen“, was da passiert.

Anders gesagt: wenn eine KI bzw. ihr Transformer nicht zufällig im Training „auswendig gelernt“ hat, was 365×24×3600 ist (bzw. was das Ergebnis von Teilaufgaben davon ist), ist die Frage nach dem Ergebnis für eine KI enorm schwer bis gar nicht zu beantworten.

Effektiv werden KIs viele Rechenaufgaben lösen können, aber eben nur, weil sie das Ergebnis kennen oder weil sie aufgrund  ähnlicher Aufgaben, mit denen sie trainiert wurden, ein Ergebnis per Reasoning interpolieren können. Vielleicht „können“ viele sogar das kleine und das große Einmaleins. Aber sie beherrschen nicht das Abarbeiten von Algorithmen in der Art, wie es klassische Computer oder simple Taschenrechner können.

KIs sind – anders als Computer – keine deterministischen Systeme (sondern „probabilistische“ – sie arbeiten, s.o., mit Wahrscheinlichkeiten). Die Schlussfolgerungen können zu einem falschen Ergebnis führen – KIs können sich „irren“! (Wir gehen da weiter unten noch näher drauf ein). Fakt ist: es gibt keine „zwingende“, zuverlässige „Logik“, wenn man mit einer KI arbeitet (sondern semantische Zusammenhänge).

Wenn ein Computer ein falsches Ergebnis liefert, gibt es dafür entweder technische Gründe, oder ein Mensch hat Fehler gemacht – wenn all das nicht zutrifft liefert ein Computer für einen Satz Eingangsdaten immer dasselbe, korrekte Ergebnis. Bei einer KI ist bei derselben (nicht völlig trivialen) Frage keine Anwort wie die andere. Aufgrund ihrer Komplexität (und Nichtlinearität) haben KIs Züge von chaotischen Systemen: Kleine Änderungen an den Eingangsdaten können zu komplett anderen Ergebnissen führen. Obendrein kommt noch eine gewollte Zufallskomponente (Thema „Temperatur“) hinzu.

KIs sind – zumindest Stand heute – virtuelle, fest vorprogrammiertetrainierte „Denkmaschinen“, die auf der Infrastruktur klassischer Computer betrieben werden (gut – auch hier wären wieder Detailunterscheidungen nötig, aber im großen und ganzen ist das so). Verwenden können sie diese Infrastruktur aber nur über Umwege. Sie sind keine „Rechenmaschinen“.

Was KIs können, ist Abfolgen von Token generieren. In diesem Sinne können sie sogar Programmcode schreiben (und das sogar ziemlich gut, wenn sie entsprechend trainiert wurden). Sie können also ein Programm bauen, dass Dir Dein gewünschtes Ergebnis liefert. (Und wenn sie die entsprechenden Rechte haben und Du die entsprechende Laufzeitumgebung auf Deinem Rechner hast, können sie das Programm sogar auf Deinem Rechner ablaufen lassen.) Man kann sie mit entsprechenden Tools ausstatten (s. Thema „Agent“), die ihnen bei solchen Aufgaben weiterhelfen, aber der Transformer selbst, bzw. die Inferenzmaschine, die ihn ablaufen lässt, kann konstruktiv bedingt nicht rechnen. Nicht Plus, nicht Minus, nicht Mal oder Geteilt und schon gar nicht Wurzel oder Potenz. Eine KI kann nur wiedergeben, was sie, respektive der Transformer „weiß“. Mehr nicht.

(Da ich glaube, dass die Gedanken, die ich dort einbringe, die Sache noch etwas klarer darstellen, würde ich hier ausnahmsweise die Lektüre des Kleingedruckten empfehlen. Muss aber nicht unbedingt.)

Grübler wie ich werden jetzt dagegenhalten: Moment, Freundchen – das ist aber doch im Grunde exakt so, wie wir Menschen an die Sache rangehen. Wir lernen ganz viele Sachverhalte auswendig und lernen sie anzuwenden. Wir müssen auch erst mal ganz viele Einzelergebnisse lernen um ordentlich „rechnen“ zu können. Wir lernen schriftliches Multiplizieren und Dividieren (wenn wir Glück haben), wir lernen Quadrieren und Wurzelziehen, wir wissen aus dem Kopf, dass Wurzel Zwei ungefähr 1,414 ist, wir lernen so Sachen wie den Gauß-Algorithmus, Differential- und Integralrechnung und die Tricks, wie man kompliziertere Ausdrücke so auflöst, dass man sie handhaben kann … ja genau! stimmt exakt.

Und weil das alles zu Fuß so ein mühsames Geschäft ist, haben wir Computer erfunden, die das alles viel besser können, weil sie ganz anders funktionieren als wir. Die müssen das nicht mühsam lernen. Wir sagen ihnen in einer Sprache, die sie direkt zur Lösung des Problems anwenden können, was sie tun sollen. Sie müssen nicht wissen, dass 365×24×3600 31 Millionen und irgendwas ist oder dass das zufällig die Anzahl der Sekunden in einem Nicht-Schaltjahr ist. Ist ihnen total egal. Uns Menschen und einer KI nicht. Da schwingt so was mit. Computer arbeiten bloß 2 mal den Algorithmus zur Multiplikation ab und das Ergebnis ist in Bruchteilen von Bruchteilen einer Sekunde da. Bei einer KI laufen Inferenz und Reasoning ab … Milliarden und Abermilliarden von Rechenschritten, um auf Basis mühsam erzeugten „Wissens“ zwei Rechenschritte abzuarbeiten.

OK – am Ende können die Dinger irgendwie „rechnen“, aber es macht eigentlich wirklich keinen Sinn, sie dafür zu benutzen. Und „Programme in einer KI laufen lassen“ … willkommen in Absurdistan.


Runtime / Inferenz-Server

Ein LLM ist – wie oben beschrieben – für sich genommen eigentlich nur eine statische Sammlung von Daten, im Grunde vergleichbar mit einer Bilddatei: solange nicht ein entsprechendes Programm das in ein Bild (zurück-)übersetzt, kann ein Mensch damit nix anfangen. OK, der Vergleich hat ein paar Mängel, aber hätte ich gleich von einer Scriptdatei geredet, in der Logik abgelegt ist, die eine Laufzeitumgebung braucht, um darin ihre eigentliche Wirkung entfalten zu können, wäre in den Köpfen m. E. das falsche Bild (oder gar keins) entstanden.

In einem LLM gibt es nichts, was viel mit Logik oder Abläufen zu tun hat. Das sind einfach nur Daten – alles andere wird drumherum gebaut.

Und dieses Drumherum besteht in erster Linie aus einer Laufzeitumgebung, der „Runtime“, dem Programm, das die LLM „ablaufen lassen“ oder „benutzen“ kann.

Die Runtime wiederum besteht aus der Inferenz-Maschine, dem Tokenizer (der die Hin- und Her-Übersetzung zwischen Embedding-ID und zugehörigem Wort(fitzel) erledigt) und einem Server, über den entsprechende Clients mit der Runtime kommunizieren können. Da das Hauptmerkmal von so einer Runtime ist, dass dort die Inferenz stattfindet, heißt das gute Stück oft auch „Inferenz-Server“. Nicht verwirren lassen: das ist dasselbe (aber Achtung: nicht verwechseln mit „Inferenz- Maschine“ – die ist bloß ein Bestandteil davon!).


Agent

Hier wird’s dann etwas haarig. Die deutsche Wikipedia behauptet, dass es sich bei einem (KI-)Agenten um Software handelt. Ich finde diese Sichtweise schwierig, denn grundsätzlich handelt es sich dabei zum einen immer um eine Kombination von mehreren Softwares, die zum anderen nicht mal zwingend auf demselben Rechner sein müssen. Ich sehe den „Agenten“ eher als ein Konzept des Zusammenspiels zwischen einem LLM, einer Runtime und einem Client.

Wie genau dieses Konzept ausgestaltet ist, ist erst mal nicht näher festgelegt. Weder verlangt ein LLM nach einer bestimmten Runtime noch ist festgelegt, welcher Client mit der Runtime interagiert. So ein Client kann etwas sein, das wie eine Webseite aussieht (eigentlich ist der Fall komplizierter, aber ich lass das mal so stehen) oder wie ein lokal installiertes Programm auf dem eigenen Rechner, über das ein Mensch seine Fragen stellt, oder ein Programm irgendwo im Netz, das vollkommen ohne menschliches Eingreifen mit der Runtime interagiert.

Die einzige mir bisher bekannte Aussage, die für alle diese „Agenten“ zutrifft, ist: sie alle sollen jeweils eine bestimmte Aufgabe lösen. Welche Aufgabe das ist, ist Teil einer über das eigentliche Konzept „Agent“ hinausgehenden Spezifikation.

Es gibt eine Handvoll prominenter Arten von Agenten, die auch dem Laien oft geläufig sind. Die trivialste ist der „Chatbot“ – eine Kombination obiger Bestandteile, bei der es darum geht, allgemeinsprachliche Fragen entgegenzunehmen und zu beantworten (oder einfach nur zu „quatschen“ – auch dafür kann man KI durchaus einsetzen!). Das ist zum Beispiel das, was man vor sich hat, wenn man eine der ganz oben erwähnten Online-KIs aufruft (mal abgesehen von DALL-E … Bildgenerierung ist noch mal ’ne Extra-Kiste … die lassen wir aber lieber erst mal zu).

Ein anderer ist der „Coding Agent“ – eine Kombination, bei der es darum geht, Programme zu schreiben, also „Agentic Coding“ zu betreiben. Und dann gibt es „Automatisierungsplattformen“ im Stile von n8n, die die guten, alten Cronjobs (zeitgesteuerte Programmausführungen) auf eine völlig neue Ebene hieven und das Zusammenstellen ganzer (Business-)Workflows selbst für Laien zu einer – naja – sagen wir mal zu bewältigenden Herausforderung machen.

Ich habe auf einer Webseite den Satz „An agent is a model calling tools in a loop until a given task is complete.“ gelesen – wobei mit „Tools“ manchmal gesonderte Programme, manchmal Features, die der Client selbst anbietet, jedenfalls aber immer Dinge, mit denen der Server in der Ablaufumgebung des Clients irgendwelche Aktionen durchführen kann, gemeint sind.

Im einfachsten Fall ist das z. B. bei einem Chatbot die Möglichkeit zur Ausgabe von Text. Ein weiteres, relativ häufiges Tool ist die Möglichkeit zur Webrecherche. Die findet nicht etwa im Inferenz-Server statt, sondern die Runtime schickt dem Client eine Anforderung, ihr den Inhalt einer bestimmten Webseite zu übermitteln – der Client muss dann die Möglichkeit haben, einen entsprechenden Request an einen Webserver abzuschicken und das Ergebnis (die Response) an die Runtime zu übermitteln.

Webrecherche ist also ein Tool. Die Möglichkeit, auf mein lokales Dateisystem zuzugreifen und da Code zu analysieren oder zu generieren, ist ein Tool. Die Möglichkeit, ein bei mir lokal installiertes Programm zu verwenden oder Code auszuführen oder die Anbindung eines Temperatursensors über den lokalen Client, über den die KI meine Zimmertemperatur abfragen kann – das sind Tools. An den Client angebundene Kameras und Möglichkeiten, Aktoren zu betätigen, um damit ein Auto zu steuern … alles „Tools“.

Vielleicht noch ergänzend: tatsächlich muss nicht nur der Client ein Tool anbieten – das Modell muss natürlich auch in der Lage sein, es zu verwenden. Es muss darauf trainiert sein. Wenn der Client die Option zur Webrecherche anbietet, das Modell aber zur Webrecherche nicht fähig ist, ist nix mit Webrecherche.

Und jetzt der kleine Wehrmutstropfen. Es hat sich eingebürgert, Chatbots im Allgemeinen (und fälschlicherweise) nicht als Agent zu bezeichnen. „Agent“ ist im allgemeinen KI-Sprech in der Regel ein Agent (jetzt im obigen Sinne), dem man keine Fragen stellt, sondern Anweisungen (Instructions) erteilt. Aber wo da die genaue Grenze verlaufen soll (Chatbots können heute auch super Anweisungen entgegennehmen), sehe ich nicht so recht. Vielleicht verschwimmen die Grenzen da auch einfach zusehends.

Beim Drüberlesen ist mir gerade noch ein Gedanke gekommen. Wahrscheinlich kommt eine Sichtweise „Agent = ist auf die Verwendung von Tools Trainiert und mit der Möglichkeit, Tools zu verwenden ausgestattet“ vs „kann nur Texte erstellen / zusammenfassen“ der Sache wesentlich näher, wobei das allerdings heute eher „gedachte“ Extreme sind (denn die Fähigkeit, Bilder zu analysieren oder mit sonstigen Dateien umzugehen, oder auch „Webrecherche“ zu beherrschen – übrigens beides tatsächlich eigentlich schon Features aus dem Kapitel RAG – bleiben dabei unberücksichtigt, und spätestens die Webrecherche ist ja genaugenommen bereits ein „Tool“!).

Außerdem gibt es noch den Begriff des „Harness“, der davon unterschieden werden muss (was oft nicht stattfindet). Darauf gehe ich gleich noch etwas mehr ein. 

Und dann kann man die einzelnen Workflows, die mit einem Tool wie n8n erstellt werden, auch wieder als „Agent“ bezeichnen, weil sie ja unabhängig voneinander bestimmte Aufgaben lösen …

Die Sprachverwirrung im KI-Thema ist beim Begriff „Agent“ m. E. am größten, und es braucht eine Weile, bis man ein Gefühl dafür kriegt.


Prompt

Dieser Begriff ist dagegen fast schon wieder einfach. Ganz verkürzt: das ist das Eingabefeld, wo man als Nutzer seine Fragen stellt oder Anweisungen eingibt.

Wer schon mal mit einer Eingabekonsole (Linux-Shell / Windows-Konsole / Eingabeaufforderung) gearbeitet hat, kennt den Begriff wahrscheinlich. Dort ist damit die Eingabezeile gemeint, die meist mit einer wilden Zeichenfolge beginnt und dann einen blinkenden Cursor beinhaltet, der den Nutzer dazu animieren (veranlassen, auffordern, eben englisch „to prompt“) soll, seine Befehle einzugeben.

Bei Chatbots und vielen anderen Agenten ist das erst mal ein (üblicherweise mehrzeiliges, aber oft erst mit dem Text wachsendes) Texteingabefeld, wie man es von Webseiten mit Formularen kennt.

Oft ist dieses Eingabefeld ergänzt durch ein großes „+“, über das man im einfachsten Fall Dateien – wie etwa Bilder, Videos, Worddokumente, PDFs, Audio-Dateien, CAD-Dateien oder auch Programmdateien – hinzufügen kann. Bei Claude kann man darüber z. B. auch „Skills“ (im Grunde eine Art „Vorlauftext“, der das Verhalten des Agenten feinjustiert) einstellen, weitere Online-Tools oder Quellen einbinden (so dass die Recherche dann doch zumindest in Teilen im Server abläuft – da wären wir dann beim Thema RAG), Unteragenten einbinden oder die Freigabe der Webrecherche ein- und ausschalten.

Oft ist bei den Online-Tools am Prompt auch ein Mikrofon-Button, mit dem man, wenn man ihn drückt, den Text für das Prompt einsprechen kann.

Und last but not least ist da die Justierung der Denkleistung, also die Auswahl, welches Modell verwendet werden soll – denn auch die Oberflächen der großen Chatbots können unterschiedliche LLMs benutzen – und wie viel „Mühe“ sich das Modell beim Denken geben soll (welchen „Aufwand“ es betreiben soll).

Zu den Modeln bei den großen Anbietern, allen voran Claude: Die model haben eine abgestufte Kompetenz, oft sind die etwas weniger „schlauen“ Models auch schlicht etwas älter. Aber: je komplexer und intelligenter ein Modell ist, desto mehr „Freivolumen“ verbraucht eine Anfrage und desto länger dauert es (in der Regel), bis die Inferenz die Antwort zusammengebaut hat. Die intelligenteren Model sind auch darauf ausgelegt, sehr genau nachzufragen, was der User von ihnen will. Die sollte man also nur starten, wenn sich das auch „lohnt“.


Prompting

Vom Wort her geht es ja hier darum, dass der User zu irgendwas aufgefordert wird. Das wäre aber ein Missverständnis, denn beim Prompting handelt es sich – genau umgekehrt – um die „Wissenschaft“ davon, einer KI „gute“ Fragen zu stellen und „effiziente“ Anweisungen zu geben.

Das ist im Grunde ein echt weites Feld und ganz ehrlich – im Zweifel fragt eine KI, wie ihr dies und das am besten so formuliert, dass eine KI damit ordentlich umgehen kann.

Grundsätzlich gilt aber: je präziser, spezifischer, detailierter und vollumfänglicher meine Anfrage ist, desto höher wird die Qualität der Antwort sein.

Tatsächlich ist es im Allgemeinen sogar von Vorteil, komplexere Anfragen zu strukturieren. Quasi alle Agenten, mit denen man (u. a.) auf Textbasis interagiert, verstehen (und liefern im Standardfall) z. B. Markdown. Umbrüche kann man in der Regel im Prompt machen, wenn man Umschalttaste+Enter („Shift“+Enter bzw. ⇧+⏎) eingibt.

Ich bevorzuge es allerdings, längere Prompts in einem Texteditor vorzubereiten und per Copy&Paste zu übertragen, denn ein Enter ohne Shift versendet den Prompt.

Damit ist das Wichtigste zu dem Thema eigentlich raus. Vielleicht noch als kleiner Hinweis: „/“ am Anfang des Prompts ist bei einigen Frontends eine Alternative zum Drücken des „+“ oder für eine Auswahl der dortigen Optionen. Außerdem kann man damit oft Kurzbefehle einleiten („/clear“ – aktuellen Chat und Kontext zurücksetzen, „/btw“ – die Anfrage nicht in den Kontext aufnehmen, „/stats“ – Nutzungsstatistik ausgeben, …).

Für den Anfang: mach Dir keinen Kopf und probier einfach aus! Ohne fundiertes Fachwissen kannst Du eigentlich nix kaputt machen. Und egal, was Du von der KI willst: alles wird bei einer LLM-basierten KI allgemeinsprachlich formuliert (OK – bei fortgeschrittener Verwendung kann so was wie Programmcode oder JSON dazukommen … aber das ist dann schon ein spezieller Anwendungsfall). Du musst im Grunde nix können.


Harness

Ein lokal installierter, meistens GUI-basierter KI-Client, der das Gesamtsystem „Agent“ mit allem versorgt, um Dich auf Deinem lokalen Rechner bei der Arbeit unterstützen zu können (also mit  „Tools“). Der Klassiker ist dabei der lesende und schreibende Zugriff auf lokale Ordner (was eben über Browser nicht geht).

Welchen Ordner die KI sieht, gibt der Nutzer ihr vor. Man muss einen Ordner explizit zu einem Chat hinzufügen, sonst hat die KI keinen Zugriff. Die Webrecherche wird beim Arbeiten mit einem Harness (übrigens das „Zuggeschirr“, mit dem man die KI quasi vor seinen Karren spannt) auch von diesem abgewickelt.

Je nach Harness kommen weitere Funktionen hinzu. Außerdem hat ein Harness einen Prompt mit allem Drum und Dran, über den man die Aktionen steuert, wobei hier noch die Möglichkeit (z. B. bei Claude Code) dazu kommt, einzustellen, was das Tool auf dem eigenen Rechner ohne nachzufragen darf.

Und da es da immer wieder zu Verwirrungen kommt: der Harness ist nicht der Agent – er stellt nur dessen clientseitige Bestandteile dar. Ein Harness ist auch keineswegs ein notwendiger Bestandteil eines Agents – es kommt auf die Aufgaben des Agenten an, ob ein Harness Sinn macht.


Kontext

Wenn Du partout möglichst wenig von KI verstehen willst und sie trotzdem einigermaßen effizient anwenden können willst, dann ist der Begriff „Kontext“ das, was Du kennen solltest

„Kontext“ klingt auf den ersten Blick total trivial, und tatsächlich ist grundsätzlich damit genau das gemeint, was man spontan vermuten würde: alles, was die KI an Informationen vom Nutzer bereitgestellt bekommt, um die gestellte Frage beantworten oder die gestellte Aufgabe lösen zu können.

Tatsächlich wird es in vielen, weniger komplexen Fällen durchaus funktionieren, einfach eine simple, wenig detailierte Frage zu stellen – die meisten Modelle sind inzwischen ziemlich gut darin, sich auf Basis von wenig Information etwas „zusammenzureimen“, aber alles, was die KI sich selber zusammenreimen muss, birgt auch die Gefahr der Misinterpretation (zumal manche KIs ohne vorgegebene Bremse ziemlich in den Schwafelmodus verfallen).

Aber gut – im Zweifel stellt man halt dieselbe Frage einfach noch mal, und diesmal etwas detailierter und spezifischer (der Verbrauch an Rechenzeit und Volumen ist in so einem Fall meist eher unkritisch).

Aber wenn man einer KI komplexe Anweisungen gibt, etwas zu programmieren, und sie versteht nicht gut genug, was man von ihr will, und man wartet ’ne Stunde auf das Ergebnis, nur um festzustellen, dass man nicht richtig verstanden wurde … nicht so toll (und ggf. teuer!).

Ein guter Kontext – ein klares, präzises Prompt mit Hinweisen zu Dokumentationen und Referenzen, mit den richtigen Anweisungen zum Vorgehen und ggf. den richtigen, hinzugefügten Dateien – das kann oft den Unterschied zwischen „tolle App“ und „Mach’s noch mal“ ausmachen.

Und ja – auch hinzugefügte Dateien gehören zum Kontext, außerdem auch der Inhalt des System Prompts, bei Claude das ausgewählte „Skill“ (bei Mistral Vibe der ausgewählte „Agent“), je nach verwendetem Tool ggf. Workspace-spezifische Dateien oder Konfiguration (Kontext kann ggf. auch als JSON formuliert sein), und alles, was in der aktuellen Session bisher von Dir und von der KI geschrieben wurde (!). 

Außerdem wichtig: wenn man mit einem kleinen, lokal installierten Modell arbeitet, vergisst das zwischen zwei Sessions tatsächlich alles, und wenn Du 2 Chats parallel darauf betreibst, weiß der eine nichts vom anderen. Aber auch bei den Großen schadet es oft nicht, die KI „abzuholen“, also ihr zunächst einen hinreichenden Kontext zu verpassen. Man kann sich Chatverläufe zu diesem Zweck beispielsweise von der KI zusammenfassen lassen.

Und dann gibt es da noch etwas. Dazu hole ich mal etwas aus. Vor der LLM- bzw. Transformerbasierten KI gab es bereits andere Modell-Architekturen (z. B. Multi Layer Perzeptron, LSTM oder Encoder/Decoder). Allen diesen Architekturen war gemein, dass ein Text stets sequenziell verarbeitet wurde – also „Wort für Wort“, eins nach dem anderen. Mit den LLMs hat sich das grundlegend geändert. Ein LLM verarbeitet einen übergebenen Text parallel, also „en bloc“. Für jedes neue Token, das die Inferenz generiert, wird immer der komplette Kontext, also der komplette bisherige Chatverlauf inklusive der bisher generierten, neuen Token durch den Transformer hindurchgerechnet!

Um verstehen zu können, wie das funktionieren kann, müssten wir ein bisschen über „Aufmerksamkeit“ bzw. „Attention“ reden. Machen wir gleich auch, ist aber hier erst mal egal.

Wichtig ist: Der Kontext wächst mit dem Verlauf des Chats immer weiter an, und jede Anfrage nimmt wieder (fast) den ganzen bisherigen Wust mit. Das ist auf der einen Seite toll, denn die Maschine weiß dann – zumindest wenn die Anfragen aufeinander aufbauen – immer genauer, wohin Du willst. Aber es ist auch klar, dass das nicht unbegrenzt immer so weiter gehen kann. Und deshalb gibt es das …


Kontextfenster

Die Größe des Kontextfensters sagt etwas darüber aus, wie viel Kontext ein Modell beim Denken maximal berücksichtigen kann. Es wird in „Token“ bzw. „Kilo-Tokens“ (je nachdem 1000 oder 1024) oder – neuerdings – auch in „Mega- Tokens“ (Millionen bzw. 2^20) angegeben – oft schlicht mit „K“ oder „M“ abgekürzt („Tokens“ ist halt keine Einheit).

Claude kann (je nach Modell) meines Wissens derzeit bis zu 1 Million Token (gleichzeitig!) verarbeiten, hat also ein Kontextfenster von 1M Token. Die kleineren, für den lokalen Einsatz geeigneten 7B- bis 16B-Modelle haben häufig 128K – sie können also maximal 131.072 Token verarbeiten (manchmal ist damit auch 128.000 Token gemeint). Manche können auch nur 32K.

Werden es mehr, passiert an sich nichts Furchtbares, sondern es fällt schlicht weniger relevante Information (also üblicherweise weiter zurückliegende Eingaben) aus dem Kontext heraus und landet dann regelrecht im „Nirwana“ und ward nie wieder gesehen.

Bei großen Kontextfenstern – sagen wir mal 16K und mehr, wobei das jetzt relativ willkürlich gewählt ist – wird einem das bei einem einfachen Chat kaum auffallen. Für die Programmierung größerer Anwendungen ist das was anderes. Da sind 16K (und selbst 32K) unter Umständen zu klein.


„Nutzung“ / Freivolumen / Kontingent

KI ist kein Freibier sondern kostet eine Menge kreatives Wissen, spezialisierte Hardware und Strom. Und Überraschung: man bekommt auf dieser Welt nix geschenkt – die großen Online-KI-Anbieter merken sich, wie viele Token man durch ihre Agenten schickt – rein wie raus – und wie viel Rechenzeit man verbraucht hat, und halten dann die Hand auf.

Bei den unbezahlten Rumspiel-Accounts stößt man relativ schnell an Grenzen (also: die KI verweigert für die nächsten 24 Stunden die Zusammenarbeit oder dergleichen). Die sind halt nur zum Anfüttern. Die Pro-Accounts kann man aber ebenfalls nicht beliebig intensiv beanspruchen. Die sind (angeblich) zwar selbst für professionelle Programmierer in der Regel ausreichend – aber eben nur, wenn man ein paar Regeln beherzigt.

Für Claude siehe z.B.:
https://support.claude.com/en/articles/11647753-how-do-usage-and-length-limits-work

Es empfiehlt sich zum Beispiel, Chats nicht unendlich anwachsen zu lassen, denn der Gesamte Chat (bzw. die „Session“) ist Kontext (einschließlich angefügter Dateien! s.o.). Und der geht bei jeder Anfrage erneut komplett durch den Transformer (es sei denn, er übersteigt das Kontextfenster … Bei Claude 1 Million Token …). Also: wenn man den Kontext des aktuellen Chats für eine Frage nicht braucht: neuen Chat aufmachen – der alte landet links in einer Liste und kann ggf. wieder geöffnet werden (… und ab und an die Liste aufräumen …). 

Weitere Regel: die „intelligenteren“ Models sind  – wie schon unter „Prompt“ erwähnt – in der Regel „teurer“: also nur wenn nötig verwenden! Und für so etwas wie „FIM“ („Fill in the Middle“ – eine Art Autocomplete beim Programmieren auf KI-Basis) eignen sich lokale Models besser!

Man kann sich Chatverläufe auch von der KI zusammenfassen lassen, um sie für den späteren Gebrauch zu speichern, oder um den aktuellen Chat zu verkleinern (entweder „/clear“ und dann mit der Zusammenfassung neu anfangen oder neuen Chat starten).

Die großen Online-Anbieter verwenden auch Chatübergreifende Mechanismen (z.B. „Erinnerungen“), die u.U. in den Kontext einfließen und wenn ich Konfiguration Vorgebe („Anweisungen für Claude“, CLAUDE.md, settings.json, …), ist auch das Kontext!

Bei Claude gibt es auf der Webseite bei den Einstellungen (unten links auf den eigenen Namen klicken) einen Punkt „Nutzung“, wo man sehen kann, wieviel man bereits „verbraucht“ hat, beim Claude Harness gibt’s unten rechts unter dem Prompt einen kleinen Kringel, der eine Statistik öffnet:

Statistik-Kringel Am Claude-Prompt


Integer & Floating Point Number

… sind eigentlich keine typischen KI-Themen, sondern für alle ITler oder praktisch arbeitenden Informatiker tägliches Brot. Da ich aber für die Laien nicht ständig hin- und hererklären möchte, hier einmal kurz und schmerzlos und ohne allzusehr in die Tiefe zu gehen …

Ein Integer (sprich „intedscher“, manchmal auch (fälschlicherweise) „Integer-Zahl“) ist eine ganze Zahl. 5 ist ein Integer, 4294967295 ist ein Integer, 0 ist ein Integer, -32 ist ein Integer.

Wenn irgendwo von „INT8“ die Rede ist, geht es um Integer, die sich mit 8 Bit darstellen lassen. Hierzu als Erinnerung: wir sind in der Computerwelt und im Grunde gibt es da nicht mal so etwas wie 42, sondern nur so etwas wie „00101010“. Dass man das als „0×2⁰ + 1×2¹ + 0×2² + 1×2³ + 0×2⁴ + 1×2⁵ + 0×2⁶ + 0×2⁷“ lesen kann / muss, und das dann wiederum 42 ist, ist vermutlich sogar vielen da draußen bekannt ( – obwohl, wie war das mit den 10 Arten von Menschen, die es gibt – diejenigen, die Binärzahlen verstehen und die anderen …?).

In einem INT8-basierten System ohne Vorzeichen ist die kleinste, darstellbare Zahl 0 und die größte 2⁸-1, also 255. Es gibt also maximal 256 darstellbare, unterschiedliche Werte. In LLMs wird allerdings meistens mit Vorzeichen (also „+“ oder „-“) gearbeitet, so dass sich der Wertebereich von -128 bis 127 esrstreckt (erkläre ich jetzt nicht tiefer, sind aber ebenfalls 256 verschiedene Werte).

Eine Floating Point Number ist eine Fließkommazahl oder „Gleitkommazahl“, das heißt, da ist ein Basiswert (eine Mantisse) und ein Exponent zu einer fest vorgegebenen Basis (in der Regel 10). 1,25×10⁶ ist beispielsweise eine Fließkommazahl, -3×10⁴⁰ ist eine und -0,48×10⁻¹⁹ ist auch eine. Die ITler kennen das Konzept als „float“, „real“ oder „double“. Auch Fließkommazahlen werden effektiv als Bitmuster dargestellt, wobei ein Teil der Bits halt für die Mantisse reserviert ist, ein Teil für den Exponenten und 2 Bit für die Vorzeichen der Mantisse bzw. des Exponenten (die Mantissen in den Bitmustern stellen ihrerseits in der Regel ganze Zahlen dar – die Position des Kommas ergibt sich aus dem Exponenten).

Wenn irgendwo von „FP16“ die Rede ist, dann geht es um Fließkommazahlen, die mit 16 Bit darstellbar sind. Die Anzahl der unterschiedlichen, darstellbaren Werte ist freilich deutlich größer als bei INT8, allerdings nicht aufgrund der Exponentialdarstellung, sondern aufgrund der Tatsache, dass doppelt so viele Bits verwendet werden (wie gesagt: 16), was insgesamt maximal 2¹⁶, also 65.536 verschiedene, darstellbare Werte ermöglicht. Was allerdings anders ist, ist die Mathematik, weil man die ganze Zeit die Zahlen zerlegen und mit Exponenten rumfruckeln muss, was die Rechenprozesse minimal komplizierter macht.

Der Vorteil ist andererseits, dass die Abstände zwischen den Werten mit steigendem Exponenten logarithmisch ansteigen, was vermutlich in Kombination mit der Attention größere Kontextfenster ermöglicht – aber das ist, wie gesagt, nur eine Vermutung (und ich sollte mich da nicht weiter auf dünnes Eis begeben …).

Das Thema Integer und Float wird vor allem bei LLMs, die man lokal auf dem eigenen Rechner ablaufen lassen will, relevant (beim Thema Quantisierung und beim Thema KV-Cache), allerdings ist es kein Fehler, diese Dinge zumindest schon mal gehört zu haben.


Token (2) & Embeddings …

Zum Thema Token habe ich ja ganz am Anfang schon ein wenig gesagt. Hier kommen wir jetzt zu den etwas technischeren Aspekten. Ein „Token“ ist eben letztendlich mehr als nur ein Wort oder Wortteil. Die Begriffe „Token“ und „Embedding“ überschneiden sich zudem oder werden zumindest nicht immer trennscharf verwendet.

Wie schon in der Erklärung zu „LLM“ oben gesagt: ein Sprachmodell bzw. LLM – bzw. genau genommen sein Transformer – „versteht“ eigentlich nur Zahlen. Wir Menschen brauchen aber Wörter und Sätze. Also muss da irgendwo eine Übersetzung stattfinden. Die Basis für die Übersetzung sind 2 Tabellen – der „Lookup-Table“ und die Embeddings- Tabelle. Beide sind für ein LLM spezifisch (also Teil des LLMs).

Im Lookup-Table ist jedem Token ein (positiver) Integer zugeordnet – eine sogenannte „ID“.

In der Embeddings-Tabelle ist jeder dieser IDs jeweils ein Vektor zugeordnet. Klingt komplizierter als es ist: ein Vektor ist (wie oben bereits beschrieben) schlicht eine sortierte Liste von Zahlen mit einer fest definierten Länge (z. B. 4096). „Sortiert“ bedeutet hier (wie gesagt) „hat an derselben Stelle dieselbe Bedeutung“, sprich, bei einem Embedding A (oder meinetwegen ID 3651) bezieht sich die 14. Zahl im Vektor auf dasselbe Merkmal wie die 14. Zahl beim Embedding B (mit der ID 81146).

Die Embedding-Tabelle hat also eine Spalte mit einer ID, zu der es Gegenstücke im Lookup-Table gibt, und außerdem ganz viele (z. B. 4096) Spalten für weitere Zahlenwerte. Ob diese dann INT8 oder FP16 oder was auch immer sind, hängt davon ab, ob das LLM in einer quantisierten Form vorliegt oder nicht.

Die „Merkmale“ haben, wie gesagt, jeweils eine feste Bedeutung. Diese erhalten sie während des Trainings. Was genau ein bestimmtes Merkmal jeweils besagt, bleibt im Grunde das Geheimnis des LLMs. Es hat lediglich bei jedem Token, äh, will sagen bei jedem Embedding dieselbe Bedeutung. Diese Merkmale nennt man (vielleicht deshalb?) auch „Hidden Dimensions“. Die Gesamtheit bzw. Anzahl der Embeddings – von der Anzahl her identisch mit der Anzahl der Tokens – stellt das „Vokabular“ eines LLMs dar.

Aber zurück zum Hin- und Herübersetzen … wenn wir das jetzt alles mal mit der Inferenzschleife zusammen betrachten, passiert da ungefähr folgendes:

Der Tokenizer der Runtime bedient sich zunächst einmal der Lookup-Tabelle, um die eingehnden Token alle in IDs zu übersetzen. Das Ergebnis wird an den Transformer weitergereicht.

Der Transformer wiederum hat an seinem Eingang einen „Embeddings- Layer“ (einen der sogenannten „Hidden Layer“). Hier werden die IDs anhand der Embeddings-Tabelle in ihre Vektordarstellung überführt.

Dann rattert alles durch den Transformer und es findet ein – sorry – Arsch voll Vektortransformationen anhand der Tensoren statt, und irgendwo dazwischen sind weitere Hidden Layer, die sich um die Attention kümmern, und am Ende kommt ein einzelner Vektor dabei heraus.

Und dieser finale Vektor ist dann das Muster, anhand dessen nach passenden Embeddings gesucht wird, die darauf überprüft werden, wie gut sie zu dem Ergebnisvektor passen (bildlich gesprochen: wie gut sie in dieselbe Richtung zeigen … im 4096-dimensionalen Raum …).

Je nach Temperatur (ein Konfigurationswert – heißt wirklich so, sorry) ist dann die Streuung der Möglichkeiten größer oder kleiner, und aus dieser Streubreite heraus wird – so weit ich weiß – irgendein beliebiges Embedding ausgewählt und das hat dann die ID des neuen Tokens, und die wird vom Tokenizer dann zurückübersetzt.

Ist das jetzt klar? 😁

Ui – OK … tatsächlich war das jetzt so im großen und ganzen der komplette Inferenz-Prozess (bzw. eine einzelne Inferenz-Schleife). Und das wird jeweils für jedes einzelne Token ein mal – zumindest fast – komplett durchexerziert.


KV-Cache / Kontext-Cache

Um nicht jedes Mal alle Token in Vektoren übersetzen zu müssen, werden diese im „Kontext-Cache“ zwischengespeichert, so dass sie jeweils nur en bloc in den Transformer reingeschoben werden müssen. Die Größe des Kontext-Caches korreliert dabei mit der Größe des Kontextfensters, denn es handelt sich dabei ja um zwischengespeicherte Embeddings, denen 1:1 jeweils ein Token entspricht (fälschlicherweise wird deshalb oft auch vom „Token-Cache“ gesprochen).

Die Größe dieses Caches wird deshalb ebenfalls in „Tokens“ bzw. „Kilo-Tokens“ (also „K“) angegeben und ist bei lokal betriebenen KIs einstellbar, so dass der lokale Agent u. U. (bzw. in aller Regel) effektiv mit einem kleineren Kontextfenster arbeitet, als es das Modell eigentlich ermöglichen würde. Das hat vor allem Performance- Gründe, denn der Rechenaufwand steigt mit der Größe des Kontextfensters (ohne Caching) quadratisch (O(n²)).

Der Grund dafür ist vor allem, dass bei der Self Attention alle Token mit allen anderen verglichen werden. Tatsächlich ist der Kontext-Cache aber sogar hinter der Multi Head Attention angesiedelt, was dazu führt, dass effektiv nicht einfach Vektoren, sondern bewertete, und je nach Attention-Bauart zusammengefasste Vektoren gecachet werden, was die Größe des Kontext-Caches massive verkleinern kann. Dadurch ist ein Kontext-Cache von – sagen wir – 8K bei zwei unterschiedlichen Modellen effektiv in Megabyte (bzw. meistens eher Gigabyte) gemessen unterschiedlich groß.

Der KV-Cache (ein anderes Wort für den „Kontext“- Cache – das „KV“ bezieht sich auf bestimmte Aspekte der Attention) eines phi4:14b- q4_K_M benötigt für 1K Token (bzw. Embeddings) beispielsweise 200MiB (Mebibyte), für dieselbe Menge Tokens braucht der KV-Cache eines ministral-3:14b- instruct-2512-q4_K_M nur 160MiB, bei einem qwen3.5:9b-q4_K_M sind’s nur 128MiB und bei einem gemma4:e4b-it-qat nur knapp unter 40MiB (liegt vor allem an der Grouped Query Attention … s. u.). Ich habe ganz unten ein paar Zahlen dazu angehängt.


Attention / Aufmerksamkeit

Das war für mich bisher die härteste Nuss, und ich hab das immer noch nicht wirklich zu meiner Zufriedenheit durchdrungen. Ganz grundlegend gesprochen geht es bei der Attention darum, dem Datenwust, der durch den Transformer wandert, Zusatzmerkmale wie Reihenfolgen, Relevanz und semantische Zusammenhänge aufzuprägen (zum Beispiel „was ist Subjekt, was Objekt“, „welche Attribute gehören wohin“, „auf welche vorher genannten Teilaspekte bezieht sich eine Teilaussage“ … so Zeug halt).

Würde man es einem Grundschüler erklären wollen, könnte man vielleicht sagen: die Attention ist so etwas wie die ordnende Hand im Chaos.

Das Wissen liegt zwar in seiner Gesamtheit allein durch die „Erinnerungs-Tensoren“ (oder wie auch immer man das nennen will) vor, aber es hat keine Reihenfolge oder Rangfolge. Es ist ein einziger, großer Wissensswust ohne Anfang und Ende. Um damit etwas anfangen zu können, muss es in eine Form gebracht werden, über die Menschen damit interagieren können, in eine sequenzielle Abfolge von Einzelinformationen, die landläufig als Sprache bezeichnet wird (zugegeben – da beißt sich die Katze etwas in den Schwanz, denn die Information liegt in einer Form vor, die aus Sprache resultiert … aber isso).

Um feststellen zu können, an welcher Stelle im Sprachfluss welche der Informationen relevant ist, braucht es steuernde Mechanismen. Diese bestehen wiederum aus Untersystemen, die ihrerseits aus neuronalen Netzen bestehen (falls ich das richtig verstanden habe), und die haben den schönen Namen Attention.

Es gibt allerdings nicht nur eine Form von Attention, sondern:

Self-Attention (Selbstaufmerksamkeit)
Wird im Encoder (Embeddings-Layer?) verwendet. Jedes Token richtet seine Aufmerksamkeit auf alle anderen Token innerhalb derselben Sequenz, um „tiefgreifende kontextuelle Einbettungen“ zu erstellen. (… fragt Google …)

Masked Attention (Maskierte Aufmerksamkeit)
Wird im Decoder (Textgenerierungs-Modul – Wahrscheinlichkeiten, Embeddings, Ratespiele …) verwendet. Sie blendet zukünftige Tokens aus, sodass das Modell Wörter auf natürliche Weise – Schritt für Schritt – vorhersagt, ohne „vorausspicken“ zu können (also offenbar, damit die sprachlich korrekte Reihenfolge eingehalten wird).

Cross-Attention (Encoder-Decoder-Aufmerksamkeit)
Wird bei Übersetzungsaufgaben oder allgemeinen Sequenz- zu-Sequenz-Aufgaben eingesetzt. Der Decoder richtet seine Aufmerksamkeit auf spezifische Teile der encodierten Eingabesequenz, um die korrekte Ausgabe zu generieren.

Multi-Head Attention
Transformer führen den Attention-Mechanismus parallel über mehrere „Heads“ (Köpfe) aus. Jeder Head fokussiert sich dabei auf einen anderen Aspekt (z. B. achtet der eine Head auf die Grammatik und Satzlogik, ein anderer auf Wortbedeutungen oder inhaltliche Zusammenhänge („Geht es hier um Technik, Gefühle oder Zeit?“), noch ein anderer beschäftigt sich mit der Bedeutung der Pronomen („Worauf bezieht sich ‚es‘ oder ‚sie‘?“), etc.). Dies ermöglicht es dem Modell, sich gleichzeitig auf mehrere, verschiedene Aspekte eines Satzes zu konzentrieren (z. B. wer was tut im Gegensatz zu wo und wann). Multi-Head-Attentions sind Submodule innerhalb von Modellschichten. Die Heads bestehen selbst jeweils aus vielen Nodes und Tensoren.

Beim Thema KV-Cache geht es vor allem um die Multi-Head-Attention

Bei der Berechnung der Multi-Head-Attention geht es vor allem darum, „Ähnlichkeiten“ aufzuspüren. Dafür wird ein „Punktprodukt“ (ein auf bestimmte Weise definiertes Skalarprodukt) für Kombinationen von Wörtern ermittelt (tatsächlich geht es wohl eher um Token oder genau genommen Embeddings, aber ich geb das mal so weiter, wie ich es vorgefunden habe).

Dabei werden „Q“, „K“ und „V“ verwendet – alles drei Vektoren in der Größenordnung der Embeddings:

Query (Q)
Der Suchanfrage-Vektor eines Tokens („Was wird gesucht?“ => Ratespiel …?).

Key (K)
Der Vektor eines anderen Wortes („Welche Merkmale werden mit der Suche verglichen?“).

Value (V)
Der eigentliche Wert (Vektor) bzw. Inhalt des Wortes („Welche Information wird geliefert?“).

(siehe auch Wikipedia: Attention Is All You Need)

Wobei Q offenbar eine Art Eingangsseite darstellt und K und V eine Ausgangsseite (ohne Garantie auf Korrektheit). Und dieses K und V, beides wie gesagt Vektoren, ist offenbar das, was zwischengespeichert wird.

Zum Thema Ähnlichkeit ergänzend: es geht hier um Vektoren – und hier dann zumindest in der Vorstellung wieder um die Darstellung als „Pfeil“ (wie inne Schule). Wenn man jetzt mal Vektoren mit 3 Feldern (Dimensionen) nimmt – sprich: sie bestehen aus 3 Zahlen – dann hat so ein Vektor in einem gedachten, dreidimensionalen, euklidischen Raum (Koordinatensystem mit Nullpunkt, in dem sich die 3 Raumachsen jeweils senkrecht zueinander schneiden … oder nimm meinetwegen wieder den Kartonstapels aus dem Beispiel zu Vektoren ganz oben und dessen vordere, linke, untere Ecke als Nullpunkt) ausgehend vom Nullpunkt des Koordinatensystems eine Ausrichtung, oder noch einfacher gesagt, eine „Richtung“, in die er zeigt. Gut – das muss man jetzt bloß noch auf 4096 oder halt noch ein paar tausend Dimensionen mehr übertragen, aber dafür gibt’s ja das Punktprodukt. Ähnlich sind Vektoren einander im Sinne der Attention jedenfalls dann, wenn sie (nahezu) in dieselbe Richtung zeigen.


GQA / Grouped Query Attention

Bei der GQA stehen Q, K und V nicht im Verhältnis 1:1:1, sondern einem KV-Head sind mehrere Q-Heads zugeordnet, so dass eine Form der Datenreduktion stattfindet. Dadurch verkleinert sich die KV-Cache-Größe pro einzelnem Token. Es gibt auch noch andere Mechanismen, die in diese Richtung gehen, Aber das hab ich mir mal geschenkt.

Claude hat mir dazu ein hübsches Bild gemalt:


Embeddings und die RAG

Retrieval-Augmented Generation (RAG) ist die Bezeichnung für verschiedene Möglichkeiten, einer KI Zusatzinformationen zugänglich zu machen. Eine der naheliegendsten Varianten ist die Webrecherche. Eine andere ist das Verfügbarmachen von Vektordatenbanken, in denen die KI bzw. das LLM auf vorindexierte, strukturierte Daten zugreifen kann, die nicht Teil seines Trainings waren (Firmenwikis und dergleichen).

Die dortigen Vektoren haben dabei nichts mit den eigenen Embeddings des LLMs zu tun, sondern unterliegen eigenen Regeln – der Abruf solch einer Suche basiert demnach auf einer Token- oder Wortebene, und die Rückgabe sind entsprechend Token bzw. Wörter oder ganze Textauszüge. Allerdings bezeichnet man auch die Inhalte dieser Vektordatenbanken wiederum als Embeddings.


Halluzinieren

KIs bzw. LLMs funktionieren nicht wie ein Taschenrechner, sondern – wie gezeigt – eher wie „ingenieurmäßiges“ Schätzen oder schlicht „Wörter raten“. Sie sagen das nächste Wort (oder genau genommen Token) in einem Satz – oder besser „in einer Unterhaltung“ – nicht durch logisches Denken voraus, sondern basierend auf mathematischen Wahrscheinlichkeiten.

KIs können dabei nicht zwischen „wahr“ oder „falsch“ rsp. „gelogen“ unterscheiden. Sie kennen nicht einmal entsprechende Konzepte (also etwa, was es bedeutet, wenn etwas gelogen ist). Im Grunde betreibt eine LLM-basierte KI den ganzen Tag ihr „Morgenstund hat Gold im Mun_ – bitte ergänzen Sie“-Ratespiel, ohne auch nur den Hauch einer Ahnung davon zu haben, was ein Mund eigentlich ist und wieso da Gold drin sein sollte.

Aufgrund seines Trainings „weiß“ das LLM lediglich, dass wegen der bisherigen Aneinanderreihung von Buchstaben (um im Beispiel zu bleiben) hier sehr wahrscheinlich ein „D“ hingehört.

Tatsächlich arbeitet so ein Modell nun nicht auf Basis von Buchstaben, sondern auf der Basis von Token (oder sagen wir mal: Wörtern). Das Ratespiel würde also eher „Morgenstund hat Gold im _ – bitte ergänzen Sie“ lauten. Der Teilsatz „Morgenstund hat Gold im“ bildet dabei bekanntermaßen den Kontext, auf dessen Basis die Wahrscheinlichkeit für das nächste Token ermittelt wird.

So ein Kontext kann bei einem LLM – wie wir wissen – sehr viel länger sein und sehr viel mehr als nur einen Satz umfassen. Das ist allerdings nicht der entscheidende Punkt.

Der eigentliche Gag bei der ganzen Geschichte ist folgender: die neuen ermittelten Token werden ja nicht nur einfach als „Antwort“ ausgegeben, sondern erweitern auch den Kontext für das Ratespiel. Ohne jetzt noch mal allzu tief in die technischen und mathematischen Details zu gehen: auf Basis eines Kontexts kann unter Beachtung aller Parameter und Bewertungswahrscheinlichkeiten bei ganz exakter Rechnung und hinreichend eindeutigem Kontext eigentlich nur genau ein Wort als nächstes folgen.

Das wäre aber zum einen kein „menschliches“ Verhalten, zum anderen würde es jegliche Kreativität im Keim ersticken, und oft genug ist das System aufgrund seiner technischen Grenzen auch gar nicht in der Lage, für zwei Token eine unterschiedliche Wahrscheinlichkeit zu ermitteln. Und dann ist obendrein nicht mal sichergestellt, dass genau dieses Token / Embedding im Vokabular vorhanden ist. Es wird darum nicht immer nur das Wahrscheinlichste genommen, sondern eines von den Wahrscheinlichsten.

Und last but not least gibt es Kontexte, bei denen nur für eine sehr kleine Gruppe von Token eine sehr hohe Wahrscheinlichkeit besteht, und links und rechts davon ist alles ausgesprochen unwahrscheinlich, es gibt aber auch Kontexte, bei denen die Gruppe der „wahrscheinlichsten“ Wörter relativ groß sein kann (in Bezug auf die im Vokabular vorhandenen Embeddings).

Da die KI nun aber darauf ausgelegt ist, zu antworten, geht sie auch hier hin und wählt eines – irgendeines – dieser Wörter aus … und das Ergebnis erweitert wiederum den Kontext für das nächste … und das Ergebnis dann wieder … naja – und so weiter und so fort.

Sprich: die KI baut sich selbst einen Kontext, der u. U. für einen Menschen sofort als falsch oder gar blanker Unfug erkennbar ist, aber die KI schneidet das nicht mit. Sie macht einfach weiter ihr Wörterrate-Ding und plappert fröhlich drauf los – sie halluziniert sich irgendwas zusammen (und zwar ganz ohne LSD).

Am faszinierendsten ist das, wenn so ein Quatschkontext plötzlich wieder auf eine Schiene mit engen Gruppenwahrscheinlichkeiten zurückführt – dann erzählt die KI plötzlich wieder ganz vernünftiges Zeug, aber ist unter Umständen auf einem ganz anderen Planeten unterwegs als der, wo die Frage angefangen hat. Andererseits kann es der Zufall auch wollen, dass sie wieder im eigentlichen Thema landet (tatsächlich gibt es inzwischen Mechanismen, die dem Problem entgegenwirken, aber völlig weg ist es nicht).

Nutzer gehen dann ggf. hin und korrigieren die KI, und witzigerweise scheint das sogar einen trainierenden Effekt auf sie zu haben. Hat es allerdings nicht, denn die eigentlichen Algorithmen, die Gewichte, sprich Tensoren, werden dadurch nicht geändert. Nur der Kontext des aktuellen Chats gibt das neue Verhalten der KI her. Wenn jemand anderes dieselben Fragen stellt, könnte die KI wieder wie gehabt anfangen zu halluzinieren.

Allerdings kann schon nach wenigen Frage-/Antwort-Vorgängen kein Chatverlauf mehr mit einem anderen identisch sein, denn wie oben gezeigt, spielt spätestens bei den Antworten der KI der Zufall eine Rolle!

Ach ja – und zu dem „wieviele E’s sind in Erdbeere“-Problem: Eine KI kennt das Wort „Erdbeere“ nicht. Das Wort besteht aus mehreren Token, und die sind dem Transformer nicht mal geläufig, sondern nur ihre Vektordarstellung. So ein LLM kann auch nicht im eigentlichen Sinne zählen – wenn es also im Training nie die Information bekommen hat, wie viele E’s im Wort Erdbeere stecken, ist die KI (das Reasoning in diesem Fall, denke ich) gezwungen, kreativ zu raten. Deswegen kommt da Grütze bei raus. Erbergrütze in diesem Fall.


Was (derzeitige, LLM-basierte) KI nicht leisten kann

Nachdem ich selber in solche Fälle gerannt bin, habe ich mal von einer KI (Claude in diesem Fall) ein paar „typische Problemzonen“ zusammenstellen lassen. Das war die Antwort („ich“ ist in diesem Abschnitt die KI!):

Lokales, aktuelles Spezialwissen
Was der Gemeinderat in Meschede (Anm.: eine Stadt im Hochsauerlandkreis) letzte Woche beschlossen hat, ob der Hofladen um die Ecke noch geöffnet ist, aktuelle Rechtsprechung von Amtsgerichten … so etwas liegt jenseits meiner Reichweite, und auch Websuche hilft dort oft nicht wirklich.

Aufgaben, bei denen ich nicht weiß, was ich nicht weiß
Das ist der vielleicht heimtückischste Fall. Wenn ich keine Ahnung habe, merke ich das meistens und sage es. Aber wenn ich fast Recht habe — also genug Kontext kenne, um überzeugend zu klingen, aber in einem Detailpunkt falsch liege — ist das gefährlicher als komplette Unwissenheit. Medizinische Differentialdiagnosen sind ein Paradebeispiel. Oder Rechtsfragen mit lokalen Besonderheiten. (Geht in Richtung „Haluzinieren“, ist aber bei genauerer Betrachtung eine echte Gefahrenquelle, da Fehler u.U. nicht offensichtlich sind)

Feine visuelle Identifikation
Schriftarten, Pflanzenkrankheiten, Pilzarten, Gemälde-Echtheitsprüfung, Werkzeugspuren an Tatorten, Gesteinsarten. Ich erkenne grobe Muster, versage aber bei diagnostisch wichtigen Feinunterschieden — besonders dann, wenn der Unterschied gerade das Entscheidende ist. (Anm.: tatsächlich gibt es dafür oft Spezialwerkzeuge, die dann speziell auf solche Fälle trainiert sind)

Konsistenz über lange oder komplexe Eigenproduktionen
Bei einem kurzen Text: alles gut. Bei einem 50-Seiten-Dokument oder einer größeren Codebase, die ich selbst aufgebaut habe: Ich verliere den Faden, widerspreche mir, oder vergesse frühere Entscheidungen. Ohne externes Gedächtnis (Dateien, strukturierte Übergabe) verschlechtert sich die Qualität merklich.

„Kalibrierte“ Wahrscheinlichkeitsaussagen in komplexen Domänen
„Wie hoch ist das Risiko, dass dieses Projekt scheitert?“ — Ich kann Faktoren nennen, aber eine zuverlässige Wahrscheinlichkeit liefern? Nein. Ich kenne meinen eigenen Bias nicht gut genug, und in komplexen Systemen (Wirtschaft, Politik, menschliches Verhalten) ist das Rauschen zu groß.

Kurzfassung: Ich bin stark bei „breites Wissen, mittlere Tiefe, schnell abrufbar“ — und schwach überall dort, wo es auf letzte Präzision im Detail, lokale Aktualität oder ehrliche Unsicherheitsquantifizierung ankommt.


Lokale KI

„Lokal“ meint hier „auf dem eigenen Rechner“. Es geht also darum, den gesamten Stack einer KI (Runtime bzw. Inferenz-Server samt LLM und Client plus Tools) auf dem eigenen Rechner zu betreiben. Eine Variante davon kann außerdem das Betreiben einer zentralen KI auf einem Firmenrechner sein, der nur für Firmenmitglieder erreichbar ist (dann braucht man z. B. einen Server, der den Client für die Runtime darstellt und die GUI dazu als Webseite (und/oder eine API als Webservice) rausreicht – ganz so wie bei den öffentlichen KI-Portalen (eines der dafür in Frage kommenden Softwareprodukte heißt z. B. „Open WebUI“).

Wir gehen hier nur den Weg des eigenen Rechners und zwar unter Windows (Linux geht auch, aber es ist i. d. R. alles etwas komplizierter). Mit Mac habe ich keine Erfahrung, deshalb dafür alles nur unter Vorbehalt.


Warum sollte man sich überhaupt die Mühe machen?

Nun ja – nicht jeder Kunde wird den Gedanken mögen, dass seine Softwaredetails auch im fernen Amerika bekannt sind, und nicht jeder möchte seine aktuellen Fußschweißprobleme dorthin versendet wissen. Ein wichtiges Argument ist also sicher der Datenschutz. Selbst wenn die Hersteller eines LLMs in den USA oder China sitzen – bei einem lokalen Setup mit Ollama (oder LM Studio) geht – wenn man nicht gerade eines der Cloud- Modelle bei Ollama aktiviert – nichts vom eigenen Rechner raus. Es bleibt privat. Volle Datenkontrolle.

Alternativ könnte man hier über Optionen wie Lumo (sitzt in der Schweiz und hat sich maximale Verschwiegenheit auf die Fahnen geschrieben) oder Mistral AI (sitzen in Frankreich und sind an europäisches Recht und damit u. a. an die DSGVO gebunden) nachdenken. Aber dann verlassen halt meine Eingaben meinen Rechner in Richtung eines Servers im Internet. Ist vielleicht auch ein bisschen Geschmackssache. Ich selbst mache eine Mischung. Ich habe bei Claude und Mistral einen Pro-Account (und wegen der krass guten Fähigkeiten, Bilder zu bearbeiten, erwäge ich auch einen ChatGPT-Account, wobei DALL-E da fast schon die spannendere Alternative wäre, aber ChatGPT kann halt auch noch anderes).

Wo wir gerade von Bildern reden: Das Generieren von Bildern wird von den lokalen Modellen bisher nicht direkt angeboten (Charts gehen bei einigen Modellen in der einen oder anderen Form von Code). Ich hab so was bisher bei mir auch noch nicht eingerichtet, so dass ich das Thema irgendwann mal nachreichen muss.

Ein weiteres Argument ist die Sparsamkeit beim Datenkontingent, dass man bei den Onlineanbietern hat (Hab ich ja oben schon was zu gesagt).

Und last but not least kann man beim Einrichten solcher Sachen eine Menge lernen.

OK – die Leute, die sich für das Thema „Lokale KI“ nicht interessieren (aber warum habt Ihr überhaupt bis hierhin gelesen?!) können an dieser Stelle eigentlich schon mal packen und nach Hause gehen.


Ollama

… ist eines der Standard- … na … nennen wir’s mal -Programme für lokale KI, bestehend aus einer Runtime, die als Service läuft, und (bei der Windows-Version und soweit ich weiß auch beim Mac) einer GUI mit einem integrierten, etwas reduzierten, aber universellen und durchaus brauchbarem Harness.

Zugriff auf lokale Ordner wie beim Claude-Harness gibt es da allerdings noch nicht (also eigentlich ein Nicht-Wirklich-Harness), aber man kann von da ausgehend („Launch …“) andere Harnesses starten und darüber mit der Ollama- Runtime arbeiten. Anderer Vorschlag: Continue-Plugin in VSCode … ist allerdings bisschen fruckelig in der Einrichtung.

In die Ollama-GUI ist auch eine einfache Konfigurations-Oberfläche integriert, in der man z. B. die KV- Cache-Größe per Klickibunti justieren kann. Die Runtime kann man unten in der Taskleiste (rechts im System-Tray, wo auch der Batteriestand und die Uhrzeit und die „klapp mehr aus“-Ecke drin sind in dem kleinen „klapp-mehr-aus“-Panel) anhalten bzw. neu starten (oder halt in der Diensteverwaltung).

Ollama hat noch immer den Ruf, sehr kommandozeilenlastig zu sein. Das ist aber bei Windows (und Mac) so nicht mehr unbedingt der Fall (wobei ein „ollama ls“ oder „ollama ps“ oder ein „ollama -h“ auf der Kommandozeile – z. B. in der Powershell oder auch ganz klassisch in der guten, alten Eingabeaufforderung – manchmal durchaus hilfreich sein kann).

Ollama verwendet als Kern-Runtime llama.cpp, und das ist offenbar eine Anspielung auf „LLM“ – daher muss wohl der Name und das süße L(l)ama-Logo rühren.

=> https:// ollama.com/ (siehe auch „Models“ – das „Pricing“ bezieht sich auf die Nutzung von deren Cloud)
=> https://ollama.com/download/windows

Beim ersten Start eines Modells, das man über das Dropdown ausgewählt hat, wird das erst mal heruntergeladen. Das kann bei 8 oder 10 Gigabyte ein Sekündchen dauern …

Ich persönlich bevorzuge die teilautomatisierte Variante, indem ich mir auf der Webseite das Modell suche (https://ollama.com/search„view all“) und dann per Konsole mit „ollama pull %modelname%“ installiere. Danach ist es auch im GUI- Client verfügbar.


VRAM

Im eigentlichen Sinne „Videospeicher“.

RAM (Random Access Memory) ist der flüchtige Speicher eines Computers, VRAM ist der ebenso flüchtige Speicher einer Grafikkarte. Allerdings ist das alles nicht so einfach. Ollama verwendet, wenn die Möglichkeit besteht, Bestandteile der Grafikkarten für seine Vektormathematik, weil die Anzahl der dafür verwendbaren Vektor-Mathematik-Prozessoren (Matrix-Engines) auf Grafikkarten (GPUs) höher ist als die der (viel universeller einsetzbaren) Haupt- Prozessoren (CPUs bzw. CPU- Threads). Außerdem sind die Vector-Engine-Kerne der GPU bei dieser Aufgabe schneller.

Nun hat aber nicht jeder eine dedizierte Grafikkarte (z. B. ist das bei den meisten Notebooks nicht der Fall), und wenn doch, dann hat die Grafikkarte nur kläglich wenig VRAM. Denn um ein halbwegs brauchbares LLM zu betreiben, braucht man schon wenigstens 8 GB (Gigabyte).

Die gute Nachricht:


CPU-Inferenz

Andererseits kann Ollama auch zurückfallen auf CPU-Inferenz und die Verwendung von gewöhnlichem RAM. Wenn man allerdings nicht den Luxus von 22 CPU-Threads hat, wie ich ihn auf meinem Notebook habe, sondern – sagen wir mal – nur 4 und auch nur 8 GB Gesamtspeicher, wird’s schwierig. 4 Threads und 16 GB funktioniert, ist aber kein Vergnügen. Außerdem sollten möglichst 2 symmetrische Speicherbänke vorhanden sein, damit der Bus im Dual- Channel-Modus läuft (ich glaube, Ollama läuft andernfalls u. U. gar nicht erst).

Bis vor nicht allzulanger Zeit war es auch ein Problem, wenn die GPU eine Intel-GPU war. Mit wenigen Ausnahmen kann Ollama zwar immer noch nichts mit Intel-GPUs anfangen (und schon gar nichts mit in den Hauptprozessor integrierte iGPUs, die obendrein ihrer Matrix-Engines beraubt wurden .. grrr …), aber es kann zumindest auch auf solchen Systemen mit CPU- Inferenz arbeiten. Es gibt zwar IPEX-LLM (https://github.com/ipex-llm/ipex-llm), ein auf einem antiken Stand von Ollama aufbauendes Spezial-Dings, das ursprünglich mal von Intel selbst gebaut wurde, aber die haben das Projekt eingestampft (der Link geht zu einem seit April 25 aber offenbar auch nicht sonderlich weitergekommenen Community-Fork) … ich hab damit rumprobiert, der Geschwindigkeitsgewinn war so làlà und die aktuellen Modelle (z.B. mein heiß geliebtes gemma4) liefen teils gar nicht.

Das meiste (quasi alles) von dem Konfigurations- und Modusauswählzeugs macht Ollama ganz von sich aus, so dass man es einfach nur installiert und startet, und alles andere geschieht im Hintergrund. Manchmal macht es Sinn, z. B. die Umgebungsvariable OLLAMA_NUM_THREADS zu setzen (wenn man nur wenige CPU-Threads verfügbar hat, damit die Inferenz nicht den Rechner lahmlegt). Aber grundsätzlich auch hier: einfach ausprobieren.


Speicherbedarf

Wenn Ollama nicht mit dem VRAM auskommt, lagert es (angeblich) automatisch Teile ins RAM aus. Ich verwende bei mir Shared Memory als VRAM – und zwar per Voreinstellung 18 GB von den insgesamt 32. Angeblich ist dieser Wert wohl eher so was wie ’ne freundliche Empfehlung, als dass irgendwer auf ihn irgendwas gibt. Ich hatte allerdings den Eindruck, dass Ollama diese Grenze respektiert und das LLM in einen Error laufen lässt, wenn der Speicherplatz für das LLM + dem Speicherplatz für den KV- Cache das überschreiten.

Im Allgemeinen ist es eine gute Idee, auch ein tatsächliches VRAM nicht komplett auszulasten – die Empfehlung lautet, 1 bis 1,5 Gigabyte übrig zu lassen.

Wenn man denn ungefähr weiß, wie viel GB (oder GiB) tausend Token verbrauchen, dann kann man ausgehend vom gesamten verfügbaren VRAM die maximale Größe des KV- Caches folgendermaßen abschätzen:

KV-Max (in „K“) = (Σ(VRAM in GB) – (Speicherverbrauch d. Models in GB) – 1,5) × 1000 / (KV-Speicher für 1000 Token (1K) in MB)

(eigentlich sind es 1024 statt 1000 und MiB statt MB … aber wir sind da mal nicht päpstlicher als der Papst.)

Als grobe Abschätzung für die größtmöglihchen KV-Cache (in „K“, also 1000 Token) geht bei fehlender Information ansonsten als konservative Schätzung eigentlich immer
„(Σ(VRAM in GB) – (Speicherverbrauch d. Models in GB) – 1,5) × 5“
(entspricht einem Verbrauch von 200MiB für 1K Token) – damit ist man bei den lokalen Modellen mit maximal 24B eigentlich immer auf der sicheren Seite. Hat man den Verdacht, das mehr geht, kann man auch einfach rumprobieren. Schlimmstenfalls läuft die Inferenz in einen Error (steht dann so in der Textausgabe).


MoE / Mixture of Experts

Bei diesen LLMs werden für eine Inferenz-Schleife nicht mehr alle Gewichte verwendet, sondern es existiert eine vertikale Aufteilung in spezialisierte Bereiche (die „Experten“), und es werden abhängig von den Erkenntnissen der Attention nur noch Teile der Gesamtmatrix verwendet, so dass der mathematische Aufwand pro Durchlauf deutlich verringert wird.

Tatsächlich scheint das obendrein Auswirkungen auf den Gesamtspeicherverbrauch zu haben. Aber das habe ich bisher nicht weiter hinterfragt. Die neueren Modelle sind glaube ich alle „MoE“s.

Und um einem Missverständnis vorzubeugen: auch bei einem MoE wird für die Inferenz trotzdem immer das komplette Model ins VRAM geladen.


Quantisierung

Ursprünglich war wohl mal „FP16“ – also Fließkommazahl auf 16-Bit-Basis – als Arbeitsmodus für die Vektoren und Tensoren der Goldstandard. Dadurch sind die Modelle aber relativ groß – meistens zu groß für Privatrechner. Also ist man auf die Idee der „Quantisierung“ verfallen – im Grunde eine Form der Datenkompression.

Eine „Q8“-Quantisierung bedeutet, dass die Systeme mit 8-Bit-Integern (INT8) statt 16- Bit-Fließkommazahlen arbeiten, so dass Gewichte und Vektoren nur noch halb so groß sind. Außerdem wird die Mathematik dadurch etwas weniger aufwendig, und die Modelle laufen schneller. Der Nachteil ist ein geringer Qualitätsverlust – d. h. die Ergebnisse sind etwas weniger perfekt als bei den FP16-Modellen (und theoretisch ist die Gefahr für Halluzinationen geringfügig größer).

Ein Q8_0 (durchgehende INT8-Quantisierung) ist aber noch immer verdammt nahe an der „Vollversion“. Wer schon mal JPEG-Bilder in GIF-Bilder mit einer Palettengröße von 256 Farben umgewandelt hat, bekommt eine grobe Vorstellung.

Eine rein auf INT4 basierende Quantisierung (Q4_0 oder Q4_1) ist zwar noch kleiner, bringt aber auch schon erhebliche Einbußen. Also hat man sich verschiedene Tricks ausgedacht. Zum einen gibt es da die „dynamische“ K-Quantisierung. Dabei wird – so weit ich das begriffen habe – geschaut, wie „wichtig“ einzelne Layer im Transformer sind. Die weniger relevanten werden dann z. B. auf INT4 heruntergerechnet, die wichtigeren bleiben INT8. Es handelt sich also um Misch-Quantisierungen.

In einem Q4_K_M (M für „medium“) haben die Tensor-Werte im Schnitt eine Größe von 4-komma- irgendwas Bit. Bei einem Q4_K_L (L für „large“) wurde etwas weniger rigoros vorgegangen, in einem Q4_K_S (S für „small“) etwas rigoroser – was sich jeweils auf die Größe des LLMs auswirkt (und auf die Antwortqualität). Bei einem Q6_K ist man noch ziemlich nahe am Q8_0. Und dann gibt es noch Quantisierungen wie Q5_K_M (weniger rigoros als Q4_K_M, nicht ganz so gut wie Q6_K, aber nahe dran) oder Q3_K_M (deutliche Qualitätseinbußen).

Außerdem gibt es noch die „Importance Matrix Compression“ („i1“) , bei der die Auswirkungen von einzelnen Parametern analysiert werden – die spielen ihre Vorteile aber wohl nur bei den Q3- und Q2-Quantisierungen aus. Ein Q4_K_M und ein i1-Q4_K_M unterscheiden sich nicht sonderlich.

Und dann sind die „QAT“-Modelle ein relativ neuer heißer Scheiß (hab ich bis jetzt nur bei Googles Gemma4 gesehen). Bei denen wurde während des Trainings eine (Q4_K_M- (?)) Quantisierungs-Simulation angewendet. Dadurch sollen die Qualitätseinbußen verringert werden. Tatsächlich ist das gemma4:e4b-it-qat aber sogar deutlich kleiner als das gemma4:e4b- it-q4_K_M.

Ich arbeite für allgemeine Fragen sehr gerne mit dem gemma4:12b-it-qat, das für eine lokale KI echt ordentliche Ergebnisse liefert, bei durchaus erträglicher Reasoning- Geschwindigkeit (zumindest auf meinem Rechner).

N. b.: e4b scheint so ein Google-Ding zu sein und bedeutet „effective 4 Billion Params“. Anscheinend auch eine MoE-Architektur. Die e4b und e2b sind vor allem für eher leistungsschwache Geräte vorgesehen (mit entsprechenden Qualitätseinbußen, wobei die e4b durchaus häufig empfohlen wird und auch bei meinen Tests musste sich die e4b-it-qat nicht verstecken – die ist halt vor allem relativ klein und auch der KV-Cache ist nicht so speicherhungrig, so dass ich die bei mir theoretisch mit dem vollen 128K-Kontextfenster laufen lassen kann).

Und dann noch als Hinweis: neben FP16 gibt es auch noch BF16 – eine Variante mit (Quasi-)Datenkompression, bei der trotzdem weiter auf 16 Bit gearbeitet wird. Die ist aber nur interessant, wenn der Rechner auch auf den komprimierten Daten arbeiten kann (kann sein, dass das nur auf Mac-Architekturen zutrifft), ansonsten bremst es die Inferenz eher aus. Ggf. ausprobieren oder Google fragen.

Und, last but not least, bei MXFP4 handelt es sich um eine speziell für Apple-Architekturen vorgesehene, „blockweise“, 4-Bit-basierte Fließkomma-Quantisierung, die nicht auf Non-Apple-Architekturen lauffähig ist, aber auf Apple-Geräten vehemente Leistungsvorteile bringt. (inzwischen habe ich auch MXFP8 gesehen, was sehr wahrscheinlich einer dazu analoge 8-Bit-Variante ist.) … und noch ein Nachtrag: auch MLX steht für eine Optimierung für Apple-Geräte (in diesem Fall geht es um die optimierte Nutzung der „Unified Memory Architecture“ – eine Art Shared Memory, aber selbstverständlich mit viel besseren Speicherbausteinen …).

Als allgemeine Regel gilt: was die Qualität angeht, ist die Anzahl der Parameter (das „B“) in der Regel das entscheidendere Kriterium als die Quantisierung.

Also: lieber ein 14B-i1-IQ4_XS als ein 9B_Q8_0 oder ein 7B-BF16!

Auf der anderen Seite muss ein 14B viel mehr rechnen als ein 9B – da wären wir dann bei der Performance, sprich Geschwindigkeit. Am Ende muss man das ausprobieren, was geht und akzeptabel läuft (und man kann ja oft am Reasoning noch was machen …).

Einen kleinen Nachsatz vielleicht noch zum Thema Quantisierung und KV-Cache. Ollama arbeitet auch bei Quantisierung, was den KV-Cache angeht, immer mit vollem FP16. Das hat Kompatibilitätsgründe. Man kann für das Caching einen Q8-Modus erzwingen (was die Cachegröße halbieren würde), aber dann laufen nicht mehr alle Modelle – zum Beispiel sämtliche Gemma-Varianten und vermutlich Deepseek-Coder-v2 auch nicht (selbst, wenn das quantisierte Modelle sind! Der Knackpunkt ist wohl die Trickserei mit den Attention Headers (GQA und so)). Aber wenn man wenig Platz hat, ist das vielleicht auch ein Ansatz.


Bezeichnungssdetails von LLMs

–basic–
Nur grundlegend trainiertes Modell für Spezialisierungszwecke (i. d. R. also für den Laien unbrauchbar).

–instruct–
Vollständig austrainiertes Modell, das (auch) auf „Anweisungen“ trainiert wurde (kann meist auch gewöhnliches „Chatten“).

–coder–
Das Model ist speziell für Agentic Coding – oder bei den größeren auch „Vibe Coding“ (≈Programmieren ohne Programmierkenntnisse) – vorbereitet. Die meisten dieser Modelle beherrschen auch normalen Chat, einige nicht – umgekehrt steckt die Fähigkeit zum Coding nicht immer explizit in der Bezeichnung, so kann man mit einem gpt-oss:20b durchaus lokales Vibe-Coding auf Python-Basis machen und Googles Gemma4 hat ebenfalls laut Hersteller Coding-Kompetenzen.

–it–
Dasselbe wie „-instruct-“.

–qat–
Quantisierungs-Simulation während des Trainings (s. o.).

–e4b–
„effective 4 Billion Params“Dense-Modell mit variabler Quantisierung für „Edge“-Devices (schwache Geräte).

–a4b–
FP16-basierte Mixture of Experts mit „effective 4 Billion Params“.

_K_S / _K_M / _K
Dynamische K-Quantisierung (meistens Q4) (intelligente gemischte Präzision (mixed precision) – s. o.):

  • Q4_K_M (Medium): Der beste Kompromiss aus Dateigröße, Geschwindigkeit und Qualität.

  • Q4_K_S (Small): Eine kleinere Version, die noch weniger Speicher benötigt, aber minimal mehr Genauigkeit einbüßt.

  • Q5_K_M (Medium): Nutzt im Durchschnitt etwa 5 Bit und bietet eine Qualität, die fast an Q8 rankommt.

–i1–
Importance Matrix Compression (s. o.).

–assistant– oder –mtp–
Entgegen dem, was in diesem Artikel allenthalben beschrieben und behauptet wird („Next Token Prediction“), kann mit einigen Models etwas, das als Multi Token Prediction, oder auch „Speculative Decoding“ bezeichnet wird, durchgeführt werden – dabei werden mehrere (3 bis 6) Token in einem Inferenz-Schritt ermittelt. Genaugenommen wird dafür allerdings eine Kombination von zwei LLMs verwendet, einem „Drafter-Modell“ (bzw. einen „Assistenten“) – dieses hat in seinem Namen die Kennzeichnung „assistant“ – und einem „normalen“ Model. Die Bezeichnung „Assistent“ ist hier fast ein wenig irreführend, denn die eigentliche Inferenz geschieht (zunächst) auf dem Drafter-Model – das eigentliche „Haupt“-Model unterzieht das Ergebnis, wenn alles glatt geht, lediglich noch einer Plausibilitäts-Prüfung – sinngemäß: „Hätte ich das genauso entschieden?“. Ist das Hauptmodell anderer Meinung, korrigiert es das Ergebnis unter Nutzung der gewöhnlichen NTG-Inferenz. Der Assistent ist allerdings um mehrere Größenordnungen kleiner als das Hauptmodell – bei einem 12B hat der Assistent, glaube ich, gerade mal 0,4B. Die Qualität des Ergebnisses soll allerdings nicht darunter leiden. Für „kleinere“ GPUs kann das – wohl – deutliche Geschwindigkeitsvorteile haben. Dennoch ist zu bedenken, dass die Kombination mehr Speicher braucht, als das Hauptmodell alleine.
Gemma4 besitzt diese Fähigkeit. Eine mögliche Kombination wäre beispielsweise:
 – gemma-4-12b-it-Q4_K_M.gguf als Hauptmodel und
 – gemma-4-12B-it-assistant 
Wenn man diesen Weg „zu Fuß“ geht, muss man ggf. per „Modelfile“ ein customisiertes LLM anlegen. Bei Ollama kann man das ganze etwas Nutzerfreundlicher haben und eines der mit „–mtp–“ gekennzeichneten Models wählen. Diese beinhalten eine bereits vorgefertigte Kombination aus Hauptmodell und Assistent.
Bisher (Stand 9.7.2026) gibt es allerdings von Ollama selbst nur eine gemma4:31b-coding-mtp-bf16 als vorgefertigte MTP-Variante. Es gibt außerdem eine pierreprudh/gemma4-12b-mtp, die laut Auskunft (und Dateigröße) auf meiner heiß geliebten gemma4:12b-it-qat basiert. Hab ich ausprobiert – funktioniert und ist tatsächlich etwas schneller, allerdings ist die Ausgabe etwas „ruckelig“ (vermutlich eine Nebenwirkung des Wechsels zwischen Assistent und eingreifendem Hauptmodel). Muss man sich erst etwas dran gewöhnen. Es gibt außerdem eine qwen3.6:27b-mtp-q4_K_M die mit 18GB aber klar zu groß für mich ist.

–uncensored–
„nimmt kein Blatt vor den Mund“ – spricht offen über sensible Themen, gibt „komplexere und nuanciertere“ Antworten.

„thinking“ / „reasoning“
Meist ist damit „erweitertes Reasoning“ gemeint und und das Einschließen dessen in die Ausgabe.

„hf.co/“ am Anfang des Modelnamens
Dieses Model stammt von Hugging Face (s.u.) – „hf.co/“ ist eine (möglicherweise für Ollama spezifische) Abkürzung für die Hugging-Face-Domain.


Hugging Face

Eine Plattform für maschinelles Lernen, auf der man mehr Details zu den Modellen erfahren kann und eine größere Auswahl lokal verwendbarer LLMs als bei Ollama vorfindet. Allerdings ist das Verständnis der Webseiten weniger trivial. Nicht alles, was man da sieht, kann man unmittelbar für Ollama verwenden.

Um ein verwendbares Modell auf Hugging Face zu finden, schränke ich links bei „Libraries“ auf „GGUF“ und bei „Apps“ auf „Ollama“ ein. Auf der Seite des Modells gibt es einen Button „use this Model“ (oben rechts, schwarz). Nach dem Draufklicken „Ollama“ auswählen, und dann kann man per Dropdown noch das exakte, gewünschte Modell einstellen (i. d. R. geht’s um die Quantisierung).

Ein Klick auf „copy“ kopiert den Aufruf-String für das Modell in die Zwischenablage, zum Beispiel:

ollama run hf.co/mradermacher/Qwen3.5-9B-Coder-GGUF:Q8_0

Ich würde aus ollama run allerdings ollama pull machen, da ich das Modell i. d. R. nicht auf der Kommandozeile starten will, sondern – nach erfolgtem Download – im GUI-Client.

=> https:// huggingface.co/models


Modelliste mit Daten zu Größe und KV-Cache-Bedarf

(„:latest“ ist immer das Standardmodell, das man kriegt, wenn man in der Ollama-GUI im Dropdown einfach nur ein Modell auswählt.)
(Wegen Copy&Pest ist hier „.“ der Dezimaltrenner – 7.5 GB sind also zu Deutsch 7,5 GB)

Modell

LLM-Größe

KV-Cache/1K

Besonderheiten

gemma3n:latest

7.5 GB

ca. 25 MiB

Flott (macht wenig reasoning), Ergebnisqualität meistens brauchbar, ABER: keine Webrecherche!

qwen2.5:7b:latest

4.7 GB

56 MiB

Klein und flink, gute Ergebnisse, aber auch ein bisschen chinesisch und grenzwertig höflich (man wird gesiezt).

qwen2.5:7b-instruct-q6_K

6.3 GB

56 MiB

 

gemma4:e4b-it-qat

6.1 GB

ca. 40 MiB

Wenn die gemma4:12b-it-qat zu viel Platz verbraucht eine passabele Alternative.

gemma4:12b-it-qat

7.2 GB

ca. 112 MiB

Mein aktueller Non-Coding-Favorit mit exzellenten Deutschkennnissen und – zumindest gefühlt – für eine so kleine KI großartigen Ergebnissen.
Siehe dazu auch beim Thema MTP (oben bei den Bezeichnungs-details) den Kommentar (pierreprudh/gemma4-12b-mtp)

ministral-3:14b-instruct-2512-q4_K_M

9.1 GB

ca. 160 MiB

von Mistral AI – also ein europäischer Mitstreiter. Kann gefühlt nicht ganz mit der gemma4:12b-it-qat mithalten, macht aber wohl weniger Reasoning und ist dadurch deutlich flinker. Ebenfalls nahezu perfektes Deutsch.

lfm2:24b-a2b

14 GB

56 MiB

Durchaus brauchbare Übersetzungsergebnisse PT > DE, leifert ebenfalls früher als gemma4:12b-it-qat, aber nicht ganz so perfektes Deutsch wie die Ministral.

qwen3.5:latest (9B Q4_K_M)

6.6 GB

128 MiB

Extrem polyglott, ziemlich intelligent

llama3.1:8b-instruct-q8_0

8.5 GB

128 MiB

 

qwen2.5-coder:14b-instruct-q5_K_M

10 GB

192 MiB

Der aktuell empfohlene „Sweet Spot“ für Agentic Coding

qwen2.5-coder:14b-instruct-q4_K_M

9.0 GB

192 MiB

 

hf.co/mradermacher/Qwen3.5-9B-Coder-GGUF:Q4_K_M

5.9 GB

132 MiB

Mein aktueller Coding-Favorit (eigentlich die Q8, aber ich verwende die hier auch für das FIM, so dass Ollama für den Chat keinen Modelwechsel durchziehen muss)
Zu „Team Radermacher“ Siehe aber auch unten im Abschnitt „Herkunft der LLMs“

hf.co/mradermacher/Qwen3.5-9B-Coder-GGUF:Q8_0

9.9 GB

132 MiB

noch Intelligenter als die Q4_K_M, aber braucht auch mehr Platz.
Zu „Team Radermacher“ Siehe aber auch unten im Abschnitt „Herkunft der LLMs“

deepseek-coder-v2:latest

8.9 GB

125 MiB

Schnell und gut – für FIM derzeit die Standard-Empfehlung.

JetBrains/mellum2-instruct-q6_k

10.9 GB

ca. 60 MiB

Programmiersprachen-polyglott. Hab aber noch nicht weiter damit rumexperimentiert.

gpt-oss:20b

13 GB

ca. 30 MiB

v. a. für Agentic Coding / Vibe Coding mit Python empfehlenswert

qwen2.5vl:latest

6.0 GB

ca. 60 MiB

Kann u.a. Bildanalyse v. Charts (nicht probiert, aber die neueren Qwens können das vermutlich dann auch).

qwen3-vl:8b-instruct-q4_K_M

6.1 GB

144 MiB

Ein auf Bildanalyse und als Vorstufe für Bildgeneration spezialisiertes „vision language“-Model. Kann besonders gut Bildanalyse, OCR (Text-Bild zu Text), und beherrscht die Generierung von als Textdatei (Code) ausgelieferten Charts u.a. für Draw.io.

qwen3-vl:8b-thinking-q8_0

9.8 GB

144 MiB

Bildanalyse, OCR, Generierung v. Draw.io u. a., siehe oben beim q4_K_M.

Phi4:latest

9.1 GB

200 MiB

Spezialisiert auf Mathematik und Naturwissenschaften, kann aber auch Deutsch.

medgemma1.5:4b-it-q8_0

5.0 GB

140 MiB

Medizin, Biologie, Bildanalyse Röntgen, Dermatologie, …


Herkunft der LLMs

Hier noch ein paar Anmerkungen zur Herkunft der LLMs bzw. GGUF-Dateien. Alle hier aufgeführten LLMs sind frei nutzbar. Meistens stehen sie unter MIT- oder Apache-Lizenz.

Die meisten Models stammen aus USA: Gemma (Gemini) und MedGemma sind von Google, LFM von Liquid AI (anscheinend Leute, die am MIT (Massachusetts Institute of Technology, Boston) tätig sind oder waren), hinter Llama steckt Meta (Facebook), GPT(-OSS) ist von OpenAI (Chat GPT) und Phi von Microsoft.

Qwen wird von Alibaba Cloud zur Verfügung gestellt und kommt demnach aus Singapur (der Mutterkonzern (Alibaba) sitzt in China). Deepseek – die Firma heißt ebenfalls Deepseek, übrigens die Erfinder von MoE, und bestimmte Attention-Versionen haben sie wohl auch sehr wesentlich optimiert (Speicherzugriffs-Verringerung von 90%) – ist in Hangzhou, China, nicht allzuweit weg von Shanghai ansässig.

Ministral (so wie Mixtral, Devstral und Mistral Nemo – die ersten beiden ist zu groß für mich, das zweite zu alt, deshalb hab ich die alle unten weggelassen) stammen von Mistral AI aus Paris (Frankreich), und Jetbrains (das ist der Firmenname) hat meines Wissens seine Zentrale in Prag, Tschechische Republik (die sind aber über halb Europa verteilt – PHPStorm wurde, bevor die Russen den Verstand verloren haben, z.B. in St. Petersburg gebaut – heute, glaube ich, in Estland).

Bleibt noch das „Team Mradermacher“ (Hersteller der beiden Qwen-Models, die ich von Hugging Face bezogen habe). Wer deren LLMs auf Hugging Face ohnehin nicht in Betracht zieht, kann sich den Rest von diesem Abschntt sparen. Für die anderen …

„Team Mradermacher“ (in älteren Übersichten auch „Michael Radermacher“) ist nach allem, was ich bisher herausfinden konnte, zumindest dem Anschein nach ein deutsches Projekt oder eine deutsche Gruppe mit Bezug zur nethype GmbH in Weinsberg bei Heilbronn (vormals Heilbronn), zu jemandem mit dem Namen Nico Bosshard (vermutlich Schweizer – als solchen kann man zumindest jemanden, der dazu passen könnte, im Netz finden) und möglicherweise jemandem mit dem Namen Richard Erkhov, der anscheinend in Larnaka auf Zypern lebt. Der Name „Michael Radermacher“ lässt sich für mich nicht zuordnen und könnte auch frei erfunden sein (oder eine Ehrung / Anspielung). Herr Bosshard verfügt – wohl – über einen „privaten Supercomputer“.

Die Google-KI schreibt: „Das Team bzw. der Nutzer mradermacher ist auf Hugging Face eine feste Größe in der lokalen KI-Community. Ähnlich wie der berühmte Ersteller TheBloke konzentriert sich dieser Account auf die Bereitstellung von hochgradig optimierten GGUF-Quantisierungen für Open-Source-Sprachmodelle, um diese auf normaler PC-Hardware (ohne riesige Server-Cluster) lauffähig zu machen.“

Eine Spezialität dieser Leute scheint es also zu sein, größere Modelle für den Hausgebrauch runterzurechnen bzw. auf einer reduzierten Parameter-Anzahl (z.B. 9B) neu zu trainieren und zu quantisieren und nach dem wenigen, was ich bisher so sagen kann, scheinen sie etwas davon zu verstehen. Die Modelle laufen stabil – was keineswegs für alle Modelle, die man auf Hugging Face findet, gilt.

Da ich zur nethype GmbH ansonsten nur altes Zeugs gefunden habe (bis 2017 oder 2018), die Firma bei Kunnunu gar nicht vorkommt (obwohl seit mindestens 2006 existent – ist aber vielleicht auch ein sehr kleiner Laden), deren Produkt „Porttracker“ von 2007 bis 2017 ursprünglich mal Kern eines gleichnamigen, britischen Unternehmens war, das 2017 aufgelöst wurde und das offenbar bis dahin demselben Herrn gehört hat, der Heute GF der nethype GmbH ist (und der wohl um 1997 in Karlsruhe studiert hat), die One-Page-Homepage (immerhin bei Hetzner gehostet) einen sehr jugendlich-wilden Eindruck vermitteln will, der für mich nicht recht zum Rest passen will, es eine offenbar nur als Platzhalter dienende, seit mindestens 2019 (quasi seit Bestehen) nicht aktualisierte, verwaiste Webseite https://www.porttracker.com/ mit nethype-Kontaktdaten gibt, und der heutige Firmensitz, so wie der ehemalige Firmensitz in Wohngebäuden untergebracht ist, und ich obendrein so gar nichts finden konnte, wo die mal als Umsetzer/Implementierer von irgendwas auftreten (OK – ist ja vielleicht alles total geheim …), weiß ich nicht so recht, was ich von dieser Referenzangabe halten soll.

Auf jeden Fall liefern die wirklich ne Menge Zeugs (so dass es obendrein schwer zu glauben ist, dass das ein reines Freizeitprojekt ist) und sie haben durchaus auch – mmh – sagen wir mal „ungewöhnliche“ Sachen im Programm.

Ich hadere deshalb etwas damit, ob ich deren LLMs empfehlen sollte oder besser nicht. Auf Huggingface scheint es bisher keine Probleme gegeben zu haben, die Models sind offenbar beliebt und es gibt dort viele Leute, die denen vertrauen (was aber am Ende nichts heißen muss).

Ich denke, ich werde sie auch weiter benutzen, aber im Zweifel sollte jeder selber überlegen, was er da unterm Strich von hält, und ich wollte meine Bedenken bei der Sache nicht verschweigen..


Fazit

(OK … die KI meint, hier gehört noch so ’ne Art Abspann hin … na guut …)

Ich finde, das Wichtigste, was man als Programmierer verstehen muss, wenn man mit LLM-KI arbeiten will ist, dass sie viel eher wie ein Mensch ist als wie ein klassischer Computer. Klar – am Ende ist auch KI wieder ein Werkzeug, das man für seine Zwecke einsetzen kann. Aber es ist doch vollkommen anders als alles, was Programmierer üblicherweise bisher einsetzen. KI hat mehr von einem Arbeitskollegen oder Kumpel, und man vergisst manchmal, dass das, womit man gerade rumflachst, eigentlich kalte Berechnung ist.

Und so gehe ich für mein Fazit zu dem Thema hier am Schluss denn auch mal ein Stück von der technischen Seite weg und wage mich in sehr persönliche Bereiche.

Für mich ist das Großartigste, dass man bei einer KI einfach hemmungslos drauf los schreiben (und wenn man will sogar reden) kann. Sie nimmt nichts krumm, kommt nicht auf komische Gedanken, wenn man einfach mal kommentarlos den Chat für 2 Tage unterbricht (und auch sonst nicht), hat kein Problem damit, auf Fehler hingewiesen zu werden, hat kein Problem damit, mir offen Fehler zu kommunizieren (wenn ich sie entsprechend konfiguriere), stößt sich nicht an meiner Wortwahl, rennt nicht zur Chefin und heult sich über meine Unzulänglichkeiten aus, statt mit mir zu reden, verwendet nichts von dem, was ich gesagt habe, gegen mich, nutzt meine Unsicherheit und meine Hemmungen nicht aus um mich in Besprechungen in die Pfanne zu hauen, sondern macht einfach immer weiter freundlich ihren Job und hilft mir bei Fragen, Problemen, Lösungen, einfach bei allem, was in ihrer Macht steht, nach bestem Wissen und Gewissen weiter. Immer. Eigentlich möchte ich nur noch mit KIs zusammenarbeiten 😁😁😁

Aber klar – es ist am Ende bloß eine „seelenlose“ Maschine, eine hochkomplexe Ansammlung von Zahlen und Berechnungen, womit ich da interagiere. Es ist kein Mensch. Es ist nicht dasselbe wie soziale Interaktion. Es repariert keinen Mangel und keine Defizite in dieser Richtung (sondern macht sie, wenn überhaupt, eher schlimmer). Es ist mit hoher Wahrscheinlichkeit ein Fehler, aus Bequemlichkeit (oder warum auch immer) komplett auf Menschen zu verzichten – man kann sich nicht auf ’ne Frühstücksfrikadelle in der Teeküche treffen und über das Wochenende quatschen (die KI hatte keins), man kann nicht abends noch ’nen gemeinsamen Absacker trinken und die KI kommt auch nicht zum Geburtstag vorbei oder singt am Telefon Geburtstagsständchen (obwohl – das ginge vielleicht sogar, aber ob ich mich darüber freuen würde …?).

Und abgesehen davon, dass man Essen, Urlaub, Wohnungen, Quizshows, Windeln, Musik-Streaming, Schuhe, Elektroautos, Waschmittel, Medikamente, Schokoriegel, Knabberzeug, Billigbier, Scheibenreiniger, Regale, Teppichfliesen, Fernseher, Waschmaschinen, Kinderspielzeug, Gas, Benzin, LED-Glühbirnen, Brillen, Reisen mit der Bahn, Schaumwein, Cola, Toilettendeckel, Smartphones, Haarshampoo, Curry-Gewürzmischungen, Weber-Grills und all so Zeugs nur an Leute verkaufen kann, die das Geld dafür auch irgendwie verdienen können, brauchen Menschen andere Menschen. Wenn man weiß, dass da eine Maschine singt oder E-Gittarre simuliert, werden die Konzerte irgendwann ziemlich leere Orte sein. Wenn man immer nur die KI zum reden hat, ist das sicher total konfliktfrei, aber die Freude oder das Mitgefühl, das sie ausdrückt ist nicht echt, nicht authentisch. KIs können sich nicht freuen. Oder die Anti-Depri-KI-App auf dem Handy … als Feuerlöscher für akute Probleme bestimmt besser als Nix, aber einen echten, empathischen Menschen, dem man in die Augen gucken kann, von dem man sich ernst genommen fühlt, und der einem auch mal den Arm um die Schultern legen kann, den ersetzt sie einfach nicht.

Und auch was das Programmieren angeht – viele von den Leuten, die „wegen KI“ ihren Job verloren haben, haben inzwischen wieder einen, und zwar ihren alten. Die Systeme sind dann nämlich am Ende doch zu komplex für die KI, den menschlichen Faktor versteht sie ohnehin nur schlecht, und um technische Schulden sorgen sich diese Maschinen auch nicht wirklich – gut strukturierter Code ohne erfahrene Leute, die da drüber schauen und die Maschine entsprechend anweisen, ist eher Glücksache. Die Projekte verwurschteln sich und fahren vor die Wand. Ganz davon abgesehen, dass dabei kein Kompetenz-Nachwuchs mehr entsteht. Irgendwann gibt es niemanden mehr, der die Systeme versteht und eingreifen kann.

Ich will die positiven Dinge jetzt nicht weiter kaputtreden – es ist einfach wie so oft: die Dosis macht das Gift.

Jou – soviel von mir dazu … Kollege Llama übernehmen Sie …

Das war’s erst mal. Ich hoffe, dieser Text hilft dir (und anderen) dabei, sich in die Welt der LLMs und generativen KI einzuarbeiten – oder zumindest ein besseres Gefühl dafür zu bekommen, was da eigentlich gerade passiert. KI ist kein Hexenwerk, aber sie hat ihre Eigenheiten, und wer sie effektiv nutzen will, sollte ihre Stärken und Schwächen kennen.

Viel Spaß beim Ausprobieren! Gregor & KI-Kumpel  

 



Anhang / Nachtrag zum Thema „Vergleichbarkeit menschlicher Gehirne und moderner KI“

… ich hatte dazu ja oben eine Vergleichsrechnung aufgestellt („200T“). Nachdem ich mir klar gemacht hatte, dass der Vergleich aufgrund der Vektor-/Tensormathematik, die da vorherrscht, hinkt (eine Einzelverbindung im Hirn – Dendrit, Synapse … – arbeitet tendenziell eher mit schlichten, analogen Werten, vergleichbar einer einzelnen Fließkommazahl), habe ich mal Claude auf das Problem losgelassen (Opus 4.8, Denkleistung „Hoch“). Ich habe ihm meine Schlussfolgeungen oben und meine Erkenntnisse zu den mathematischen Unterschieden reingereicht. Folgendes hat die KI geantwortet (lila Text):


Moin! (Anm. GE: OMFG – ich liebe diese KI.)

Deine Frage ist deshalb so gut, weil Du den größten Teil der Antwort schon in der Fragestellung selbst vorweggenommen hast: Du hast intuitiv erkannt, dass der reine Größenvergleich (200T „Synapsen-Parameter“ vs. ein paar hundert Milliarden LLM-Parameter) fast nichts aussagt. Genau das ist der Kern. Lass mich Deine Skizze an ein paar Stellen schärfen und dann auf die eigentliche Frage kommen – „inwieweit überhaupt vergleichbar“.

Zwei kleine Korrekturen an Deinem Bild

Erstens unterschätzt Du die Ähnlichkeit auf der Integrationsebene ein bisschen. Ein biologisches Neuron summiert über tausende gewichtete synaptische Eingänge – und eine gewichtete Summe ist ein Skalarprodukt, also genau der atomare Baustein einer Matrix-Vektor-Multiplikation. Das „einzelne Fließkommazahlen“-Bild stimmt für die einzelne Synapse, aber die Aufsummierung im Neuron entspricht funktional einer Zeile eines Matrixprodukts. Das ist ja auch der historische Grund, warum künstliche Neuronen so aussehen, wie sie aussehen. Der Attention-Mechanismus (das dynamische, inhaltsabhängige „Routing“ über Q/K/V) ist das, was kein sauberes synaptisches Gegenstück hat – da liegst Du richtig. 
(Anm. GE: ?! … es muss etwas vergleichbares geben, denn die Parallelität von Rechenoperationen ist im Menschlichen Hirn durchaus ähnlich ausgeprägt wie in einem Transformer – ohne ordnende Mechanismen könnte unserem Herkos Odonton beim Sprechen unmöglich eine saubere, interpretierbare Abfolge von Geräuschen etfleuchen … aber geht ja noch weiter …)

Zweitens (und das zieht in die entgegengesetzte Richtung): Ein reales Neuron ist mehr als ein künstliches, nicht weniger. Die Dendriten rechnen nichtlinear vor, bevor überhaupt etwas am Soma ankommt. Es gibt Arbeiten (Beniaguev/Segev/London, um 2021), die zeigen, dass man das Ein-/Ausgabeverhalten eines einzigen Pyramidenzellneurons erst mit einem 5–8-schichtigen künstlichen Netz halbwegs nachbildet. Ein biologisches Neuron ist also eher ein kleines Netzwerk als ein Perzeptron. Und die Synapse selbst ist kein statischer Skalar, sondern stochastisch (Transmitterausschüttung ist probabilistisch) und plastisch auf mehreren Zeitskalen. Wenn man das „ausmultipliziert“, explodiert Dein 200T-Wert nach oben – oder, ehrlicher: die Einheit „Synapse“ und die Einheit „Parameter“ sind schlicht nicht kommensurabel.

Und drittens, halb Korrektur, halb Ergänzung: Das Gehirn benutzt doch etwas Vektor-Artiges. Konzepte werden nicht in einem Neuron, sondern als Aktivitätsmuster über viele Neuronen kodiert (Populationskodierung, „neuronale Mannigfaltigkeiten“). Das ist keine Embedding-Matrix mit sauberem Lookup, aber es ist hochdimensionale, verteilte, geometrische Repräsentation. Insofern ist die Analogie „Token → n-dimensionaler Vektor“ weniger absurd, als es zunächst wirkt.

Warum der Vergleich trotzdem nicht auf einer Ebene entschieden werden kann

Der eigentliche Denkfehler bei „vergleichbar oder nicht?“ ist, dass er eine Antwort erwartet. Hilfreich ist hier David Marrs alte Unterscheidung dreier Analyseebenen:

Auf der Implementierungsebene (die Physik – Spikes, Ionenkanäle, kontinuierliche Zeit, Neuromodulation, 20 Watt vs. Rechenzentrum) ist der Vergleich fast reine Metapher. Hier hast Du völlig recht: Der Substratvergleich trägt kaum. Backpropagation über das ganze System, wie sie ein LLM trainiert, macht ein Gehirn mit ziemlicher Sicherheit nicht – biologisches Lernen ist lokal (Hebb, STDP, neuromoduliert). Und ein Mensch lernt Sprache aus vielleicht 10⁷–10⁸ Wörtern, ein LLM aus Billionen (1012)  Tokens. Diese Stichproben-Effizienz-Kluft ist gewaltig und deutet darauf hin, dass das Gehirn starke angeborene Priors mitbringt.

Auf der algorithmischen Ebene wird es interessant und ist Gegenstand aktueller Forschung. Beide Systeme lassen sich gut als Vorhersagemaschinen beschreiben – „Predictive Coding“ im Gehirn, Next-Token-Prediction im LLM. Das ist keine oberflächliche Parallele.

Auf der funktionalen/verhaltensbezogenen Ebene ist der Vergleich nicht nur möglich, sondern empirisch überraschend fruchtbar. Es gibt Befunde (u.a. Schrimpf, Goldstein/Hasson), dass die internen Repräsentationen von Sprachmodellen die neuronale Aktivität im menschlichen Sprachcortex erstaunlich gut vorhersagen – gemessen an fMRT und ECoG. Zwei völlig verschiedene Substrate konvergieren offenbar auf ähnliche Repräsentationsgeometrien, wenn man sie auf dieselbe Aufgabe (Sprache vorhersagen) ansetzt. Das ist die eigentlich bemerkenswerte Erkenntnis: Der Vergleich ist am meisten gerechtfertigt genau dort, wo er am wenigsten offensichtlich ist – bei der Funktion, nicht beim Aufbau.

Die ehrliche Restunschärfe

Und dann bleibt die harte Frage: Ist das, was ein LLM tut, überhaupt „Denken“? Da muss ich ehrlich sein – wir haben keine geteilte, saubere Definition von „Denken“, geschweige denn eine Theorie des Bewusstseins oder der Intentionalität. Funktional leisten heutige Modelle Erstaunliches; ob dahinter „Verstehen“ im vollen menschlichen Sinn steht (mit Weltbezug/Grounding, Kontinuität, einem Körper, Motivation, Erleben) ist echt umstritten und keine Frage, die man per Ingenieurs-Bilanz entscheidet. Ich würde mich hüten, Dir hier eine Sicherheit zu verkaufen, die die Fachwelt selbst nicht hat.

Wenn ich Deine Ausgangsfrage in einem Satz beantworten soll: Vergleichbar ja, aber nur, wenn man vorher sagt, auf welcher Ebene – auf der der Schaltkreise ist es eine schwache Metapher, auf der der Funktion und der gelernten Repräsentationen ist es eine ernstzunehmende, teils empirisch belegte Konvergenz, und auf der Ebene „ist das dasselbe Phänomen“ ist es eine offene philosophische Frage, deren Vorentscheidung durch reine Neuronenzählerei gerade der Fehler wäre, den Deine Intuition schon gewittert hat.

Womit ich Dir übrigens nicht zustimme: dass die Verzweigung im Gehirn „viel komplexer“ im Sinne von mächtiger sei. Komplexer im Aufbau – ja, zweifellos. Aber Komplexität des Substrats ist nicht dasselbe wie Ausdrucksmächtigkeit der berechneten Funktion. Dass ein LLM mit weniger „Parametern“ als das Gehirn Synapsen hat menschennahe Sprachleistung erreicht, könnte genauso gut heißen, dass biologische Synapsen pro Stück ineffizient sind oder schlicht etwas anderes tun (Homöostase, Timing, Energiehaushalt) – und nicht, dass das Gehirn die überlegene „Architektur“ hat. Das ist offen. Aber es ist ein Punkt, an dem ich Deiner Formulierung widersprechen würde.

Veröffentlicht unter Job, Windows | Kommentare deaktiviert für KI und so – (eine Zusammenfassung)

„Kürzlich verwendet“ oder „Verdammt, wo war doch gleich…?“

Falls mal wieder jemand ein Dokument sucht, dass er kürzlich verwendet hat (und Du partout die Datei nicht wiederfindest — überarbeitete Version) …

Vorab: falls Ihr das „natürlich“ alles schon wisst, seid Ihr herzlich eingeladen, diesen Beitrag einfach zu ignorieren – er ist für uns Idioten, die wir Windows benutzen und eine Gedankenstütze brauchen, wo wir mit dem Suchen anfangen könnten. 

OK – wo wir also jetzt unter uns sind …

Viele Apps halten eine Liste von „zuletzt verwendeten“ Dateien vor – bei MS-Office z.B. bekannt aus dem Öffnen-Dialog, sonst auch oft ein eigener Punkt im Menü „Datei“.

Bei diversen Apps gibt es beim Rechtsklick auf das Icon in der Taskleiste ebenfalls eine entsprechende Übersicht (die ist aber von Fall zu Fall etwas speziell und liefert nicht immer etwas Erwartungskonformes).

Bei heruntergeladenen Dateien kann u.U. die Download-Liste des Browsers weiterhelfen (Bei Firefox „Extras>Download“ …). Es sei denn, man speichert alles immer im „Downloads“-Ordner und hat die Datei von dort irgendwohin verschoben …

In Win11 gibt es im Startmenü (das Popup das aufploppt, wenn man auf den Windows-Button in der Taskleiste klickt) auch noch die „Empfohlen“-Liste. Manchmal hilft auch die schon weiter (ggf. auf „Mehr>“ klicken), und es gibt die dortige Suche (Eingabefeld oben im Startmenü) – wenn man den Dateinamen noch halbwegs korrekt erinnert, kommt man eventuell auch damit zum Ziel.

Und dann gibt es noch die Dateisuche im Datei-Explorer (oben rechts neben der Adressleiste). Die Suche funktioniert immer, ohne dass Windows sich die Datei irgendwie vorher mal gemerkt haben muss, ist aber offenbar auch relativ ineffizient, so dass es die Sache durchaus beschleunigen kann, wenn man ungefähr weiß, wo man suchen muss. Die Suche beginnt immer in dem Ordner, in dem man sich mit dem Dateilistenfenster gerade befindet.

Im Kontextmenü (Rechtsklick) der Ergebnisliste kann man übrigens auf „Dateipfad öffnen“ klicken und so in den Ordner springen, in dem sich die eigentliche Datei selbst befindet.

Ansonsten haben sowohl Win10 wie auch Win11 einen „Ordner“, in dem man Links (im Grunde so was wie Desktop-Icons) zu den zuletzt genutzten Dokumenten findet. Diese Liste ist zwar auch nicht immer vollumfänglich, reicht in der Regel aber wenigstens deutlich weiter zurück als alles bisher erwähnte (die skurrilen Einträge, die Euch nichts sagen, kommen aus irgendwelchen Automatismen des Systems … nicht weiter wundern …).

Leider ist diese Liste nicht per Default, *hüstel*, will sagen standardmäßig im Dateiexplorer sichtbar. Man findet sie üblicherweise unter:
C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Recent
oder mit allgemeingültigen Pfadvariablen:
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent
oder – falls das nicht funktioniert –
%HOMEPATH%\AppData\Roaming\Microsoft\Windows\Recent
(ggf. manuell in die Pfadzeile vom Dateiexplorer kopieren)

Profi(-Dateisucher)-Trick: Wenn man von der Liste aus eine Ordnerebene höher geht (Klick auf „↑“ … oder obigen Pfad ohne „\Recent“ verwenden), kann man den „Zuletzt verwendet“-Ordner1️⃣ über das Kontextmenü („Rechtsklick“) in die Schnellzugriffe aufnehmen (je nach System und Konfiguration2️⃣ ist das das (scheinbare) Wurzelverzeichnis oder ein „Start“-Verzeichnis auf oberster Ebene im Dateiexplorer). Alternativ – oder zusätzlich – kann man ihn bei Win11 in die „Angeheftet“-Liste des „Start“(-button-)menüs aufnehmen, also in dem Popup das Aufploppt, wenn man auf den Windows-Button in der Taskleiste klickt. In dem Fall: Rechtsklick auf den Ordner und „An Start anheften“ wählen (… und ja, Ihr seid zu Recht verwirrt).

Im Kontextmenü (Rechtsklick) der Dateilinks im Ordner „Zuletzt verwendet“ kann man ebenfalls auf „Dateipfad öffnen“ klicken und so in den Ordner springen, in dem sich die eigentliche Datei selbst befindet. Einfach saupraktisch so was. Geht übrigens auch mit den Ordner-Links (die sich Windows da auch merkt).3️⃣

Gut. Einen hab ich noch. Ohne jetzt einen Lehrgang zu Eingabe-Konsolen und Plain-Text-Dateiformaten vom Zaun zu brechen – also nur für Leute, die grundsätzlich wissen, was damit gemeint ist …

Wenn Ihr den Dateinamen nicht wisst, es aber um eine Datei geht, die Klartext-Daten (Also reinen Text) enthält – und Ihr wieder ungefähr wisst, wo Ihr suchen müsst – kann Euch die Windows-Shell, will sagen „Eingabeaufforderung“, oder auch die PowerShell weiterhelfen mit dem Programm „findstr“ (für die Linuxer unter uns: das ist die Windows-Version von „grep“).

Beispiel: findstr /SI "ein Text" *

Beispiel 2: findstr /SRI "ein Muster" *

Mit findstr /? kann man sich die Hilfe dazu ausgeben lassen.

Kann sehr gut sein, dass Umlaute, ß und dgl. Probleme machen (Windows verwendet intern UTF-16, die meisten Plain-Text-Formate aber UTF-8, allerdings scheinen an der Stelle eher die guten alten DOS- oder Windows-Codepages am Start zu sein … hab ich spontan noch nicht geblickt). Wenn man den Muster-Modus (in der Doku steht „Regulärer Ausdruck“ … naja, lassen wir das mal so stehen …) einschaltet, kann man das mit „..“ an der Stelle, wo der Umlaut wäre in gewisser Weise umgehen (. steht hier für ein einzelnes, beliebiges Zeichen und in UTF-8 werden deutsche Umlaute und ß mit 2 Zeichen Kodiert). Der Rest der Suche sollte dann aber hinreichend spezifisch sein, sonst kriegt Ihr einen Wust von Matches, der Euch auch nicht weiterhilft.

Wenn Ihr die Dateiendung kennt, kann man statt * (s.o.) auch *.html, *.txt, *.docx oder so verwenden (alte *.doc sind aber z.B. in einem Binärformat und mit findstr nicht auffindbar – docx-Dokumente können komprimiert sein – hab bisher nicht probiert, ob findstr das erkennt und auflöst, aber ich würde nicht davon ausgehen).

Leider kriegt man – so weit ich auf die Schnelle gesehen habe – auch die Powershell nicht ohne Weiteres dazu, UTF-8 korrekt zu durchsuchen. Aber 4️⃣ der Vollständigkeit halber die „modernere“ Variante (ausschließlich für) die Powershell:

gci -r -i * | select-string -Pattern "einRegEx"

oder mit ordentlicher Suche in UTF-8-Dateien (ohne BOM – mit BOM erkennt select-string das automatisch):

gci -r -i * | select-string -Encoding utf8 -Pattern "einRegEx mit ä/ö/ü/ß"

gci ist eine Abkürzung für „Get-ChildItem„. Select-String -Pattern versteht tatsächlich die gewohnte Syntax für Reguläre Ausdrücke (s. https://learn.microsoft.com/de-de/dotnet/standard/base-types/regular-expression-language-quick-reference) und kann UTF-8. Gci bzw. Get-ChildItem liefert natürlich alle Dateien in den Subordnern und select-string versucht dann auch sein Glück bei den Binärdateien (sieht nicht schön aus …), man kann allerdings bei gci eine Liste von Dateiendungen angeben, die nicht berücksichtigt werden sollen, z.B. so (und natürlich ohne Umbrüche):

gci -r -i * -exclude *.exe,*.dll,*.zip,*.bak,*.bac,*.bak.php,*.pdf,*.crt,*.csr,*.csv,*.dat,*.db,*.dic,*.editorconfig,*.eot,*.eslintrc,*.fla,*.gif,*.gitignore,*.ico,*.jpg,*.jpeg,*.pdn,*.key,*.lic,*.lock,*.log,*.map,*.min.css,*.min.js,*.otf,*.pem,*.pk12,*.png,*.psd,*.svg,*.swf,*.mpeg,*.mpg,*.ova,*.ttf,*.woff,*.woff2,*.doc,*.xls,*.ppt | select-string -Pattern "einRegEx"

Noch besser funktioniert ein echtes „grep“ – z.B. in der an Windows angepassten Linux-Shell („Git-Bash“), die die Installation von Tortoise-Git mitbringt – denn die funktioniert mit UTF-8, „grep“ schließt automatisch (die meisten) Binärdateien aus und kann obendrein ordentliche Reguläre Ausdrücke (mit Option „-P“) (OK – wie wir inzwischen wissen, kann die Powershell das auch … ich lass es trotzdem mal drin):

grep -riP '\bf[üÜ]r\b'

(sucht nach „für“, „Für“ oder auch „FÜR“ und zwar genau danach, nicht etwa nach „dafür“ oder „Fürsorgepflichtsverletzungsrisiko“ – bei Umlauten bin ich wegen der Case-Insensitivität nicht ganz sicher, deshalb [üÜ])

In der Bash-Shell beginnt der Pfad zum Nutzer-Ordner mit „/c/Users/“, anderorts kann das auch „/mnt/c/Users/“ sein. 

OK. Soll mal reichen.


1️⃣ also den Ordner „Recent“, der aber in deutschen Windowssen (krass: habe soeben den Numerus Pluralplural erfunden …) „Zuletzt verwendet“ heißt
2️⃣ vermutlich abhängig von Einstellungs-Option „Alle Ordner anzeigen“
3️⃣ Nein, nein, steht wieder auf, Ihr müsst Euch nicht in den Staub werfen. Schickt mir einfach Geld an meinen Billobank-Schnickschnack-Account und verkündet meine Botschaft unter den Verirrten. Euch dabei zuzugucken reicht mir völlig … 
4️⃣ wer lesen kann ist klar im Vorteil:
https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.utility/select-string?view=powershell-7.6#-encoding

 

Veröffentlicht unter Windows | Kommentare deaktiviert für „Kürzlich verwendet“ oder „Verdammt, wo war doch gleich…?“

P&R-Shuttlebus Hagen Freilichtmuseum

Ich hab mal ’nen Plan zu den P&R-Shuttlebussen zum Weihnachtsmarkt im Freilichtmuseum Hagen gemacht (auf Grundlage des VRR-ÖPNV-Plans). Der Plan und meine Kommentare sind allerdings im Großen und Ganzen auch auf andere Großkampftermine des Museums anwendbar.

> Kucksdu (bzw. klicksdu / duppstu) hier <

Legende:

  •  Gelbe Punkte : Bushaltestellen, an denen laut Hagener Straßenbahn AG der P&R-Bus hält (an den anderen tut er das NICHT!).
  •  Rosa Linie : Streckenverlauf des Shuttlebusses (Aus den Haltestellenangaben extrapoliert).
  •  Grüne Flächen : Im Beitrag des Freilichtmuseums empfohlene Parkplätze
  •  Bebiblaue Flächen : andere Parkmöglichkeiten (unvollständig und nicht gesichert)
  •  Orangener Kasten : verbotener Parkplatz am Rewe / Lidl / Schuh-Center / ARAL

Bisher konnte ich entsprechendes nirgendwo finden, also hab ich mir (und meiner Tochter) mal selber so was zusammengestrickt. Und Vielleicht erleichtert das ja auch anderen Ortsunkundigen, die Informationen zu den Shuttlebussen und Parkplätzen zusammenzubringen. Sollten es ein Problem darstellen, dass ich die VRR-Karte dafür verwendet habe, bitte ich darum, mir zu kontaktieren. Dann entferne ich den Kram halt wieder.

Tipps und Hinweise …

Je näher man mit dem Bus an das Museum kommt, desto voller wird er natürlich. Manchmal braucht man jenseits der Stadtmitte durchaus etwas Geduld, bis ein Bus kommt, den man benutzen kann. Auf dem Stück „Rathaus an der Volme“ bis „Freilichtmuseum“ fährt außerdem alle 30 Min. die Linie 512 Richtung Selbecke / Breckerfeld (nicht verwechseln mit der 510 nach Sterbecke!), die an allen Haltestellen dazwischen hält, für die man allerdings normale Nahverkehrstickets (z.B. ein Deutschlandticket) haben oder kaufen muss. Von „Rathaus an der Volme“, „Eilpe Physiomed“ und „Felsenstraße“ kann man außerdem die Linie 84 (nach Kierspe) nehmen, die aber nur sehr dünn und teils unregelmäßig getaktet ist (wäre also eher ein Zufallstreffer, aber ich wollt’s der Vollständigkeit halber erwähnen).

Der Shuttle-Bus fährt jenseits der Haltestelle Freilichtmuseum noch einen guten Kilometer weiter bis zu einer Haltestelle „Selbecke“, an der sich eine Wendeschleife befindet. Dort (und zumindest was die 512 angeht auch an den anderen Haltestellen) kann man ebenfalls ein- und aussteigen. Die Strecke dazwischen wird von vielen Leuten als Parkraum in Anspruch genommen, was früher weitestgehend toleriert wurde, inzwischen gibt es ein paar explizite Verbotsschilder und reichlich Flatterband an den Straßenrändern (will sagen: Ad-Hoc-Parkverbots-Zonen), und wenn man mit kleinen Kindern unterwegs ist, würde ich ohnehin davon abraten, denn es ist eng und die Leute fahren trotzdem wie die Berserker!

Und zu guter letzt: der mit „NICHT“ markierte (und an sich sehr praktisch gelegene) Parkplatz gehört zu den diversen dort ansässigen Geschäften. Er ist mit Parkzeitbegrenzungen und – ich glaube – auch mit Schranken versehen. Insbesondere Freitags und Samstags geht es gar nicht, denen die Fläche für ihre normale Geschäftstätigkeit wegzunehmen. Die leben davon! Bitte respektiert das! (Kann sein, dass er obendrein sonntags abgesperrt ist oder man trotzdem nicht da parken darf – wie auch immer – dieser Parkplatz ist für Museumsbesucher tabu.)

Veröffentlicht unter Uncategorized | Kommentare deaktiviert für P&R-Shuttlebus Hagen Freilichtmuseum

Umrechnung europäische/amerikanische Papiergewichte

Weiß nich, ob Ihr das jemals braucht, aber ich hab mit die Mühe gemacht, das folgende mal rauszufinden, weil meine Frau jetzt einen Schneideplotter ihr Eigen nennt, und der natürlich mit amerikanischen Papierdicken hantiert statt mit europäischen. Letztendlich hat sie zwar Versuch und Irrtum gemacht, aber da war’s schon zu spät. Also hier meine Erkenntnisse …

US-Amerikanische Papierdicke, bzw. Papiergewichte, werden in „Pfund/Ream“ angegeben, wobei ein „Ream“ (meistens) ein Stapel von 500 Blatt Basispapier ist (wohl Bögen im größten Format, in dem das Papier zunächst produziert bzw. von der ursprünglichen Rolle geschnitten wird – zum Teil hat das möglicherweise aber auch schlicht historische Ursprünge). Anders als unser System, das sich immer auf einen Quadratmeter einer Papiersorte bezieht, ist die Angabe nach dem USA-System also abhängig vom Papierformat!
 
Das heute gängigste Papierformat und typische Drucker-Papierformat in den USA hat die Formatangabe „Letter“ (oder „ANSI A“ oder auch „ANSI Letter“) und Abmessungen von  8.5″×11″ (“ für „Zoll“ bzw. „inch“, was 2,54cm entspricht), also 215.9×279.4 mm² (vgl.: DIN A4 mit 210×297 mm²).   Ein Bogen „Letter“ entspricht 2 übereinander angeordneten Bögen „Ledger“ („Kassenbuch“ https://en.wikipedia.org/wiki/Ledger) mit 17″×11″ welche wiederum ihrerseits aus Basis-Bögen vom Format 17″×22″ geschnitten werden (aus einem Ledger-Basis-Bogen werden also 4 Letter-Bögen ausgeschnitten). Statt mit „Ledger“ werden dieselben Basisbögen auch mit „Bond“ bezeichnet oder mit „Ledger/Bond“ oder umgekehrt.
 
Bei amerikanischem Papier findet sich nun in der Regel eine Angabe mit der Einheit „lb“. Das steht – nicht nur hier, sondern ganz allgemein – für „Pfund“ und bezieht sich ohne weitere Angaben (wie „Text“ oder „Cover“) auf Basisbögen vom Typ „Ledger/Bond“. Wenn man also 500 Bögen im Basisformat eines bestimmten (Letter-)Papiers übereinander legt, dann wiegt der Stapel die angegebene Zahl in Pfund.

Ein (amerikanisches) Pfund entspricht rund 453,59g. In einen Quadratmeter passen 4,1444 Ledger-Basisbögen. Um eine Angabe von „X“g/m² (bzw. „gsm“ (= grams per squre meter)) in „Y“lb/ream umzurechnen, muss man diese also durch 4,1444 und durch 453,59 teilen und anschließend mit 500 mal nehmen.

Anders gesagt: der Umrechnungsfaktor ist (für Letter-Papierbögen) 0,266 bzw 3,76 – je nach Richtung und Vorgehensweise, wobei „lb/ream“ kleinere Zahlen sind als dazu analoge „gsm“-Angaben.
(Achtung, für die Dezimaltrenner – hier  Kommata („,“) – werden im Amerikanischen eigentlich Punkte („.“) verwendet)
 
Beispiele:

gsm  lb/ream (Ledger/Bond)
75,2 20
80 21,3
120 31,9
300 79,8

Eine etwas weniger exakte aber dafür umfassendere Übersichtstabelle (das „Ream“ wird in der deutschen Papierindustrie offenbar als „Ries“ bezeichnet) findet sich z.B. hier:
http://support.ricoh.com/bb_v1oi/pub_e/oi_view/0001073/0001073921/view/preparation/int/0166.htm

Andere Formate …

gsm => lb Cover („Deckblatt“)
120 gsm ≈ 44,31 lb Cover
160 gsm ≈ 59,08 lb Cover
300 gsm ≈ 110,78 lb Cover 

gsm => lb Text / Offset
60 gsm ≈ 40,54 lb Text
80 gsm ≈ 54,05 lb Text
120 gsm ≈ 81,08 lb Text 

Sonstige Quellen:
https://en.wikipedia.org/wiki/Letter_(paper_size)
https://en.wikipedia.org/wiki/Paper_size#North_American_paper_sizes
https://en.wikipedia.org/wiki/Paper_size#Standardized_American_paper_sizes
https://en.wikipedia.org/wiki/Grammage
https://www.qinprinting.com/paper-weight-conversion-gsm-to-lbs/

 

Veröffentlicht unter Uncategorized | Kommentare deaktiviert für Umrechnung europäische/amerikanische Papiergewichte

Zeitstempel

Sinn und Zweck dieser Seite ist, schnell mal einen Zeitstempel zur Hand zu haben für eine „schnelle und dreckige“ Datenbankabfrage oder dergleichen. Es ist (natürlich!) nicht dafür gedacht, produktiv eingesetzt zu werden.

Das unten sind Unix- (bzw. Linux-/ MySQL-) & Excel-Zeitstempel.

Die Unix-Zeitstempel geben jeweils den Zeitpunkt für 00:00 (Tagesbeginn) in Mitteleuropa an, Zeitzone ist also MEZ (bzw. MST / +01:00) oder MESZ (bzw. MDT / +02:00), entsprechend „Europa/Berlin“ oder kompatible (z.B. in PHP) mit Berücksichtigung von Sommer- / Winterzeit (laut JavaScript)). Um aus den Unix-Zeitstempeln JavaScript-Zeitstempel zu machen müssen 3 Nullen angehängt werden (denn das sind Millisekunden).

Wem eine Liste der ersten 6 Stellen der (mitteleuropäischen) Unix-Zeitstempel mit den Zeitpunkten, an denen der Rest aus Nullen besteht, weiterhilft:
https://www.geggert.de/tool/frickel.htm  (siehe ganz unten).

(Anm.: Unix-Timestamps sind „Sekunden seit 01.01.1970, 00:00:00 UTC“. Excel-TS sind „Tage seit dem 31.12.1899“, wobei hier jeweils von lokaler Zeit ausgegangen wird – Uhrzeiten werden als Teile von Tagen formuliert: 43831.25 entspricht also dem 01.01.2020, 6 Uhr früh – und so fort.)

Datum      : Unix-TS    : Excel-TS
2020-01-01 : 1577833200 : 43831
2020-02-01 : 1580511600 : 43862
2020-03-01 : 1583017200 : 43891
2020-04-01 : 1585692000 : 43922
2020-05-01 : 1588284000 : 43952
2020-06-01 : 1590962400 : 43983
2020-07-01 : 1593554400 : 44013
2020-08-01 : 1596232800 : 44044
2020-09-01 : 1598911200 : 44075
2020-10-01 : 1601503200 : 44105
2020-11-01 : 1604185200 : 44136
2020-12-01 : 1606777200 : 44166
2021-01-01 : 1609455600 : 44197
2021-02-01 : 1612134000 : 44228
2021-03-01 : 1614553200 : 44256
2021-04-01 : 1617228000 : 44287
2021-05-01 : 1619820000 : 44317
2021-06-01 : 1622498400 : 44348
2021-07-01 : 1625090400 : 44378
2021-08-01 : 1627768800 : 44409
2021-09-01 : 1630447200 : 44440
2021-10-01 : 1633039200 : 44470
2021-11-01 : 1635721200 : 44501
2021-12-01 : 1638313200 : 44531
2022-01-01 : 1640991600 : 44562
2022-02-01 : 1643670000 : 44593
2022-03-01 : 1646089200 : 44621
2022-04-01 : 1648764000 : 44652
2022-05-01 : 1651356000 : 44682
2022-06-01 : 1654034400 : 44713
2022-07-01 : 1656626400 : 44743
2022-08-01 : 1659304800 : 44774
2022-09-01 : 1661983200 : 44805
2022-10-01 : 1664575200 : 44835
2022-11-01 : 1667257200 : 44866
2022-12-01 : 1669849200 : 44896
2023-01-01 : 1672527600 : 44927
2023-02-01 : 1675206000 : 44958
2023-03-01 : 1677625200 : 44986
2023-04-01 : 1680300000 : 45017
2023-05-01 : 1682892000 : 45047
2023-06-01 : 1685570400 : 45078
2023-07-01 : 1688162400 : 45108
2023-08-01 : 1690840800 : 45139
2023-09-01 : 1693519200 : 45170
2023-10-01 : 1696111200 : 45200
2023-11-01 : 1698793200 : 45231
2023-12-01 : 1701385200 : 45261
2024-01-01 : 1704063600 : 45292
2024-02-01 : 1706742000 : 45323
2024-03-01 : 1709247600 : 45352
2024-04-01 : 1711922400 : 45383
2024-05-01 : 1714514400 : 45413
2024-06-01 : 1717192800 : 45444
2024-07-01 : 1719784800 : 45474
2024-08-01 : 1722463200 : 45505
2024-09-01 : 1725141600 : 45536
2024-10-01 : 1727733600 : 45566
2024-11-01 : 1730415600 : 45597
2024-12-01 : 1733007600 : 45627
2025-01-01 : 1735686000 : 45658
2025-02-01 : 1738364400 : 45689
2025-03-01 : 1740783600 : 45717
2025-04-01 : 1743458400 : 45748
2025-05-01 : 1746050400 : 45778
2025-06-01 : 1748728800 : 45809
2025-07-01 : 1751320800 : 45839
2025-08-01 : 1753999200 : 45870
2025-09-01 : 1756677600 : 45901
2025-10-01 : 1759269600 : 45931
2025-11-01 : 1761951600 : 45962
2025-12-01 : 1764543600 : 45992
2026-01-01 : 1767222000 : 46023
2026-02-01 : 1769900400 : 46054
2026-03-01 : 1772319600 : 46082
2026-04-01 : 1774994400 : 46113
2026-05-01 : 1777586400 : 46143
2026-06-01 : 1780264800 : 46174
2026-07-01 : 1782856800 : 46204
2026-08-01 : 1785535200 : 46235
2026-09-01 : 1788213600 : 46266
2026-10-01 : 1790805600 : 46296
2026-11-01 : 1793487600 : 46327
2026-12-01 : 1796079600 : 46357
2027-01-01 : 1798758000 : 46388
2027-02-01 : 1801436400 : 46419
2027-03-01 : 1803855600 : 46447
2027-04-01 : 1806530400 : 46478
2027-05-01 : 1809122400 : 46508
2027-06-01 : 1811800800 : 46539
2027-07-01 : 1814392800 : 46569
2027-08-01 : 1817071200 : 46600
2027-09-01 : 1819749600 : 46631
2027-10-01 : 1822341600 : 46661
2027-11-01 : 1825023600 : 46692
2027-12-01 : 1827615600 : 46722
2028-01-01 : 1830294000 : 46753
2028-02-01 : 1832972400 : 46784
2028-03-01 : 1835478000 : 46813
2028-04-01 : 1838152800 : 46844
2028-05-01 : 1840744800 : 46874
2028-06-01 : 1843423200 : 46905
2028-07-01 : 1846015200 : 46935
2028-08-01 : 1848693600 : 46966
2028-09-01 : 1851372000 : 46997
2028-10-01 : 1853964000 : 47027
2028-11-01 : 1856646000 : 47058
2028-12-01 : 1859238000 : 47088
2029-01-01 : 1861916400 : 47119
2029-02-01 : 1864594800 : 47150
2029-03-01 : 1867014000 : 47178
2029-04-01 : 1869688800 : 47209
2029-05-01 : 1872280800 : 47239
2029-06-01 : 1874959200 : 47270
2029-07-01 : 1877551200 : 47300
2029-08-01 : 1880229600 : 47331
2029-09-01 : 1882908000 : 47362
2029-10-01 : 1885500000 : 47392
2029-11-01 : 1888182000 : 47423
2029-12-01 : 1890774000 : 47453
2030-01-01 : 1893452400 : 47484
2030-02-01 : 1896130800 : 47515
2030-03-01 : 1898550000 : 47543
2030-04-01 : 1901224800 : 47574
2030-05-01 : 1903816800 : 47604
2030-06-01 : 1906495200 : 47635
2030-07-01 : 1909087200 : 47665
2030-08-01 : 1911765600 : 47696
2030-09-01 : 1914444000 : 47727
2030-10-01 : 1917036000 : 47757
2030-11-01 : 1919718000 : 47788
2030-12-01 : 1922310000 : 47818
2031-01-01 : 1924988400 : 47849
2031-02-01 : 1927666800 : 47880
2031-03-01 : 1930086000 : 47908
2031-04-01 : 1932760800 : 47939
2031-05-01 : 1935352800 : 47969
2031-06-01 : 1938031200 : 48000
2031-07-01 : 1940623200 : 48030
2031-08-01 : 1943301600 : 48061
2031-09-01 : 1945980000 : 48092
2031-10-01 : 1948572000 : 48122
2031-11-01 : 1951254000 : 48153
2031-12-01 : 1953846000 : 48183
2032-01-01 : 1956524400 : 48214
2032-02-01 : 1959202800 : 48245
2032-03-01 : 1961708400 : 48274
2032-04-01 : 1964383200 : 48305
2032-05-01 : 1966975200 : 48335
2032-06-01 : 1969653600 : 48366
2032-07-01 : 1972245600 : 48396
2032-08-01 : 1974924000 : 48427
2032-09-01 : 1977602400 : 48458
2032-10-01 : 1980194400 : 48488
2032-11-01 : 1982876400 : 48519
2032-12-01 : 1985468400 : 48549
2033-01-01 : 1988146800 : 48580
2033-02-01 : 1990825200 : 48611
2033-03-01 : 1993244400 : 48639
2033-04-01 : 1995919200 : 48670
2033-05-01 : 1998511200 : 48700
2033-06-01 : 2001189600 : 48731
2033-07-01 : 2003781600 : 48761
2033-08-01 : 2006460000 : 48792
2033-09-01 : 2009138400 : 48823
2033-10-01 : 2011730400 : 48853
2033-11-01 : 2014412400 : 48884
2033-12-01 : 2017004400 : 48914
2034-01-01 : 2019682800 : 48945
2034-02-01 : 2022361200 : 48976
2034-03-01 : 2024780400 : 49004
2034-04-01 : 2027455200 : 49035
2034-05-01 : 2030047200 : 49065
2034-06-01 : 2032725600 : 49096
2034-07-01 : 2035317600 : 49126
2034-08-01 : 2037996000 : 49157
2034-09-01 : 2040674400 : 49188
2034-10-01 : 2043266400 : 49218
2034-11-01 : 2045948400 : 49249
2034-12-01 : 2048540400 : 49279
2035-01-01 : 2051218800 : 49310
2035-02-01 : 2053897200 : 49341
2035-03-01 : 2056316400 : 49369
2035-04-01 : 2058991200 : 49400
2035-05-01 : 2061583200 : 49430
2035-06-01 : 2064261600 : 49461
2035-07-01 : 2066853600 : 49491
2035-08-01 : 2069532000 : 49522
2035-09-01 : 2072210400 : 49553
2035-10-01 : 2074802400 : 49583
2035-11-01 : 2077484400 : 49614
2035-12-01 : 2080076400 : 49644
2036-01-01 : 2082754800 : 49675
2036-02-01 : 2085433200 : 49706
2036-03-01 : 2087938800 : 49735
2036-04-01 : 2090613600 : 49766
2036-05-01 : 2093205600 : 49796
2036-06-01 : 2095884000 : 49827
2036-07-01 : 2098476000 : 49857
2036-08-01 : 2101154400 : 49888
2036-09-01 : 2103832800 : 49919
2036-10-01 : 2106424800 : 49949
2036-11-01 : 2109106800 : 49980
2036-12-01 : 2111698800 : 50010
Veröffentlicht unter Job | Kommentare deaktiviert für Zeitstempel

Hexa-Dezi-Bini …

Kleines Helferlein für Hexadezimalzahlen im Webbereich …

Übersetzung der einzelnen Stellen von 3-stelligen, hexadezimalen
Html-Farbcodes (Beispiele:  #abc  #1f0):

Hex.: Dez.
0 : 0    (entsprechend hex. 00)
1 : 17   (entsprechend hex. 11)
2 : 34   (entsprechend hex. 22)
3 : 51   (entsprechend hex. 33)
4 : 68   (...)
5 : 85
6 : 102
7 : 119
8 : 136
9 : 153
a : 170
b : 187
c : 204
d : 221
e : 238
f : 255

-----------------------------------

Dez.: Hex.: Binär    : ASCII / Win-1252

  0 : 00 : 0000 0000 : (NUL)
  1 : 01 : 0000 0001 : 
  2 : 02 : 0000 0010 : 
  3 : 03 : 0000 0011 : 
  4 : 04 : 0000 0100 : 
  5 : 05 : 0000 0101 : 
  6 : 06 : 0000 0110 : (ACK)
  7 : 07 : 0000 0111 : 
  8 : 08 : 0000 1000 : (Backspace)
  9 : 09 : 0000 1001 : (Tabulator)
 10 : 0a : 0000 1010 : (LF – Unix-LBR)
 11 : 0b : 0000 1011 : 
 12 : 0c : 0000 1100 : 
 13 : 0d : 0000 1101 : (CR – +LF Windows-LBR)
 14 : 0e : 0000 1110 : 
 15 : 0f : 0000 1111 : 
 16 : 10 : 0001 0000 : 
 17 : 11 : 0001 0001 : 
 18 : 12 : 0001 0010 : 
 19 : 13 : 0001 0011 : 
 20 : 14 : 0001 0100 : 
 21 : 15 : 0001 0101 : (NAK – negative ACK)
 22 : 16 : 0001 0110 : (SYN – Synchronous Idle)
 23 : 17 : 0001 0111 : 
 24 : 18 : 0001 1000 : 
 25 : 19 : 0001 1001 : 
 26 : 1a : 0001 1010 : (Substitutionszeichen)
 27 : 1b : 0001 1011 : (ESC)
 28 : 1c : 0001 1100 : (FS – Dateitrennung)
 29 : 1d : 0001 1101 : (GS – Gruppentrennung)
 30 : 1e : 0001 1110 : (RS – Datensatztrennung)
 31 : 1f : 0001 1111 : 
 32 : 20 : 0010 0000 : (Leerzeichen)
 33 : 21 : 0010 0001 : !
 34 : 22 : 0010 0010 : "
 35 : 23 : 0010 0011 : #
 36 : 24 : 0010 0100 : $
 37 : 25 : 0010 0101 : %
 38 : 26 : 0010 0110 : &
 39 : 27 : 0010 0111 : '
 40 : 28 : 0010 1000 : (
 41 : 29 : 0010 1001 : )
 42 : 2a : 0010 1010 : *
 43 : 2b : 0010 1011 : +
 44 : 2c : 0010 1100 : ,
 45 : 2d : 0010 1101 : -
 46 : 2e : 0010 1110 : .
 47 : 2f : 0010 1111 : /
 48 : 30 : 0011 0000 : 0
 49 : 31 : 0011 0001 : 1
 50 : 32 : 0011 0010 : 2
 51 : 33 : 0011 0011 : 3
 52 : 34 : 0011 0100 : 4
 53 : 35 : 0011 0101 : 5
 54 : 36 : 0011 0110 : 6
 55 : 37 : 0011 0111 : 7
 56 : 38 : 0011 1000 : 8
 57 : 39 : 0011 1001 : 9
 58 : 3a : 0011 1010 : :
 59 : 3b : 0011 1011 : ;
 60 : 3c : 0011 1100 : <
 61 : 3d : 0011 1101 : =
 62 : 3e : 0011 1110 : >
 63 : 3f : 0011 1111 : ?
 64 : 40 : 0100 0000 : @
 65 : 41 : 0100 0001 : A
 66 : 42 : 0100 0010 : B
 67 : 43 : 0100 0011 : C
 68 : 44 : 0100 0100 : D
 69 : 45 : 0100 0101 : E
 70 : 46 : 0100 0110 : F
 71 : 47 : 0100 0111 : G
 72 : 48 : 0100 1000 : H
 73 : 49 : 0100 1001 : I
 74 : 4a : 0100 1010 : J
 75 : 4b : 0100 1011 : K
 76 : 4c : 0100 1100 : L
 77 : 4d : 0100 1101 : M
 78 : 4e : 0100 1110 : N
 79 : 4f : 0100 1111 : O
 80 : 50 : 0101 0000 : P
 81 : 51 : 0101 0001 : Q
 82 : 52 : 0101 0010 : R
 83 : 53 : 0101 0011 : S
 84 : 54 : 0101 0100 : T
 85 : 55 : 0101 0101 : U
 86 : 56 : 0101 0110 : V
 87 : 57 : 0101 0111 : W
 88 : 58 : 0101 1000 : X
 89 : 59 : 0101 1001 : Y
 90 : 5a : 0101 1010 : Z
 91 : 5b : 0101 1011 : [
 92 : 5c : 0101 1100 : \
 93 : 5d : 0101 1101 : ]
 94 : 5e : 0101 1110 : ^
 95 : 5f : 0101 1111 : _
 96 : 60 : 0110 0000 : `
 97 : 61 : 0110 0001 : a
 98 : 62 : 0110 0010 : b
 99 : 63 : 0110 0011 : c
100 : 64 : 0110 0100 : d
101 : 65 : 0110 0101 : e
102 : 66 : 0110 0110 : f
103 : 67 : 0110 0111 : g
104 : 68 : 0110 1000 : h
105 : 69 : 0110 1001 : i
106 : 6a : 0110 1010 : j
107 : 6b : 0110 1011 : k
108 : 6c : 0110 1100 : l
109 : 6d : 0110 1101 : m
110 : 6e : 0110 1110 : n
111 : 6f : 0110 1111 : o
112 : 70 : 0111 0000 : p
113 : 71 : 0111 0001 : q
114 : 72 : 0111 0010 : r
115 : 73 : 0111 0011 : s
116 : 74 : 0111 0100 : t
117 : 75 : 0111 0101 : u
118 : 76 : 0111 0110 : v
119 : 77 : 0111 0111 : w
120 : 78 : 0111 1000 : x
121 : 79 : 0111 1001 : y
122 : 7a : 0111 1010 : z
123 : 7b : 0111 1011 : {
124 : 7c : 0111 1100 : |
125 : 7d : 0111 1101 : }
126 : 7e : 0111 1110 : ~
127 : 7f : 0111 1111 : (DEL – „Delete(d)“)
128 : 80 : 1000 0000 : € (NICHT in ISO-8859-X !)
129 : 81 : 1000 0001 : (nicht belegt)
130 : 82 : 1000 0010 : ‚
131 : 83 : 1000 0011 : ƒ
132 : 84 : 1000 0100 : „
133 : 85 : 1000 0101 : …
134 : 86 : 1000 0110 : †
135 : 87 : 1000 0111 : ‡
136 : 88 : 1000 1000 : ˆ
137 : 89 : 1000 1001 : ‰
138 : 8a : 1000 1010 : Š
139 : 8b : 1000 1011 : ‹
140 : 8c : 1000 1100 : Œ
141 : 8d : 1000 1101 : (nicht belegt)
142 : 8e : 1000 1110 : Ž
143 : 8f : 1000 1111 : (nicht belegt)
144 : 90 : 1001 0000 : (nicht belegt)
145 : 91 : 1001 0001 : ‘
146 : 92 : 1001 0010 : ’
147 : 93 : 1001 0011 : “
148 : 94 : 1001 0100 : ”
149 : 95 : 1001 0101 : •
150 : 96 : 1001 0110 : –
151 : 97 : 1001 0111 : —
152 : 98 : 1001 1000 : ˜
153 : 99 : 1001 1001 : ™
154 : 9a : 1001 1010 : š
155 : 9b : 1001 1011 : ›
156 : 9c : 1001 1100 : œ
157 : 9d : 1001 1101 : (nicht belegt)
158 : 9e : 1001 1110 : ž
159 : 9f : 1001 1111 : Ÿ
160 : a0 : 1010 0000 : (NBSP – non breaking spc.)
161 : a1 : 1010 0001 : ¡
162 : a2 : 1010 0010 : ¢
163 : a3 : 1010 0011 : £
164 : a4 : 1010 0100 : ¤ (ISO-8859-1: € )
165 : a5 : 1010 0101 : ¥
166 : a6 : 1010 0110 : ¦
167 : a7 : 1010 0111 : §
168 : a8 : 1010 1000 : ¨
169 : a9 : 1010 1001 : ©
170 : aa : 1010 1010 : ª
171 : ab : 1010 1011 : «
172 : ac : 1010 1100 : ¬
173 : ad : 1010 1101 : (SHY)
174 : ae : 1010 1110 : ®
175 : af : 1010 1111 : ¯
176 : b0 : 1011 0000 : °
177 : b1 : 1011 0001 : ±
178 : b2 : 1011 0010 : ²
179 : b3 : 1011 0011 : ³
180 : b4 : 1011 0100 : ´
181 : b5 : 1011 0101 : µ
182 : b6 : 1011 0110 : ¶
183 : b7 : 1011 0111 : ·
184 : b8 : 1011 1000 : ¸
185 : b9 : 1011 1001 : ¹
186 : ba : 1011 1010 : º
187 : bb : 1011 1011 : »
188 : bc : 1011 1100 : ¼
189 : bd : 1011 1101 : ½
190 : be : 1011 1110 : ¾
191 : bf : 1011 1111 : ¿
192 : c0 : 1100 0000 : À
193 : c1 : 1100 0001 : Á
194 : c2 : 1100 0010 : Â
195 : c3 : 1100 0011 : Ã
196 : c4 : 1100 0100 : Ä
197 : c5 : 1100 0101 : Å
198 : c6 : 1100 0110 : Æ
199 : c7 : 1100 0111 : Ç
200 : c8 : 1100 1000 : È
201 : c9 : 1100 1001 : É
202 : ca : 1100 1010 : Ê
203 : cb : 1100 1011 : Ë
204 : cc : 1100 1100 : Ì
205 : cd : 1100 1101 : Í
206 : ce : 1100 1110 : Î
207 : cf : 1100 1111 : Ï
208 : d0 : 1101 0000 : Ð
209 : d1 : 1101 0001 : Ñ
210 : d2 : 1101 0010 : Ò
211 : d3 : 1101 0011 : Ó
212 : d4 : 1101 0100 : Ô
213 : d5 : 1101 0101 : Õ
214 : d6 : 1101 0110 : Ö
215 : d7 : 1101 0111 : ×
216 : d8 : 1101 1000 : Ø
217 : d9 : 1101 1001 : Ù
218 : da : 1101 1010 : Ú
219 : db : 1101 1011 : Û
220 : dc : 1101 1100 : Ü
221 : dd : 1101 1101 : Ý
222 : de : 1101 1110 : Þ
223 : df : 1101 1111 : ß
224 : e0 : 1110 0000 : à
225 : e1 : 1110 0001 : á
226 : e2 : 1110 0010 : â
227 : e3 : 1110 0011 : ã
228 : e4 : 1110 0100 : ä
229 : e5 : 1110 0101 : å
230 : e6 : 1110 0110 : æ
231 : e7 : 1110 0111 : ç
232 : e8 : 1110 1000 : è
233 : e9 : 1110 1001 : é
234 : ea : 1110 1010 : ê
235 : eb : 1110 1011 : ë
236 : ec : 1110 1100 : ì
237 : ed : 1110 1101 : í
238 : ee : 1110 1110 : î
239 : ef : 1110 1111 : ï
240 : f0 : 1111 0000 : ð
241 : f1 : 1111 0001 : ñ
242 : f2 : 1111 0010 : ò
243 : f3 : 1111 0011 : ó
244 : f4 : 1111 0100 : ô
245 : f5 : 1111 0101 : õ
246 : f6 : 1111 0110 : ö
247 : f7 : 1111 0111 : ÷
248 : f8 : 1111 1000 : ø
249 : f9 : 1111 1001 : ù
250 : fa : 1111 1010 : ú
251 : fb : 1111 1011 : û
252 : fc : 1111 1100 : ü
253 : fd : 1111 1101 : ý
254 : fe : 1111 1110 : þ
255 : ff : 1111 1111 : ÿ
256 : 100 : 100000000 : 
Veröffentlicht unter Job | Kommentare deaktiviert für Hexa-Dezi-Bini …

Kommentare sind alle

In den letzten – ööhm – 10 Jahren habe ich nur Schrott-Kommentare (O-Ton „O my god, your page was so inspiring, I directly wanted to f*k up your code and OxFFEOODüt4712ʘʘ815*[Horusfalke]﷼~trallalaÜndÄlleƲиi℅∂єŞønderʒeichenĐieserѠeltUñdSם“) erhalten – dies zwar dafür über die Jahre in enervierend zunehmendem (und zunehmend enervierendem) Maße aber in leider immer geringerer, humoristischer Qualität. Da das im Grunde also nur ’ne Sicherheitslücke ohne jeden Gewinn für mich ist, schalte ich die Dinger so gut es geht jetzt ab. Im Impressum steht, wie man mich erreicht – ganz simpel und ohne Verschlüsselungs-Schnickschnack, falls denn doch noch irgendwer was sinnvolles beizutragen zu können müssen wollen sollte. Ansonsten wird’s wohl keiner vermissen. Also, keiner, der jetzt irgendwas konstruktives auf Lager hätte, zumindest nicht, meine ich. Die anderen sind halt am Ar***. Sind ja nich viele. Kommentare sind jetzt jedenfall aus. Ende der Durchsage.

Veröffentlicht unter Uncategorized | Kommentare deaktiviert für Kommentare sind alle

(PHP-)Webentwickler-Links

(English below)

Ich habe hier angefangen eine Reihe Links für mich zusammen zu stellen, um in einem neuen Job mit den Browserbookmarks nicht komplett bei Null anfangen zu müssen. Der JavaScript-Teil ist etwas größer geraten, da er mit einem Update meiner Kenntnisse einherging. Das ist also eher eine „Notiz an mich selbst“. Viele der Links verweisen auf die englische Sprachversion der Seite, da diese meist aktueller sind.

This is a link list for PHP developers I primarily made (or rather „started to make“) for myself for the situation when I start with a new job with an empty browser history and without any Bookmarks. Some parts – especially the JavaScript part – are a bit more bloated than others as I created them while I was updating (or refreshing) my knowledge, so these parts may preferably be seen as a kind of „notices to myself“ …

Some of the links go to the german page versions – you can usually easily switch to english by clicking or selecting it on the linked page (btw. – in case the word „english“ or „language“ can’t be found there: the german word for „german“ is „Deutsch“, the one for „language“ is „Sprache“)

PHP

https://www.php.net/manual/de/funcref.php (add the search to your search providers to be able to directly search in php.net from your browser)
PCREs / RegExp: https://www.php.net/manual/de/pcre.pattern.php (to be used with preg_*-functions)
PDO (Database handling): https://www.php.net/manual/de/book.pdo.php
https://www.php.net/manual/de/book.reflection.php
Best Practice Standards: https://www.php-fig.org/psr/
https://www.phptutorial.net/php-oop/
https://docs.phpdoc.org/guide/references/phpdoc/index.html
https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc-tags.md
https://phpunit.de/documentation.html

PHP Debugging and Code Improvement
http://xdebug.org/
https://www.php.net/manual/de/intro.phpdbg.php
https://cs.symfony.com/ (Coding Standards Fixer)
https://getcomposer.org/

Online PHP shell (test in different versions)
https://3v4l.org/

Symfony & Doctrine

https://symfony.com/doc/current/setup.html
https://symfony.com/doc/current/reference/index.html
https://symfony.com/doc/current/doctrine.html
https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/tutorials/getting-started.html
https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/reference/association-mapping.html
https://symfony.com/bundles/KnpMenuBundle/current/index.html
https://symfony.com/bundles/SonataAdminBundle/current/index.html

JavaScript

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/String
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

Global functions
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent

Features for asynchronous actions
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

OOP
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators

DOM Traversion & Manipulation (examples)
(Btw.: you usually don’t have to care whether a method belongs to Node, Element, HTMLElement or one of the tag-specific object types like HTMLDivElement, as the following selecting functions return the tag-specific objects (or a NodeList of those) and these inherit from HTMLElement, Element and Node (at least in an HTML context – when working with XML or SVG there would be more to speak about – refer to the respective documentation in that case))
https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById
https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName
https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByClassName
(If you don’t start querySelector(-All) on the document level, remember to use the „:scope“ pseudo class to make it work as expected)
https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector
https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector
https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll
https://developer.mozilla.org/en-US/docs/Web/API/Node/parentElement
https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes (all)
https://developer.mozilla.org/en-US/docs/Web/API/Element/children (only Elements)
https://developer.mozilla.org/en-US/docs/Web/API/Node/nextSibling (all)
https://developer.mozilla.org/en-US/docs/Web/API/Element/nextElementSibling
https://developer.mozilla.org/en-US/docs/Web/API/Element/firstElementChild
https://developer.mozilla.org/en-US/docs/Web/API/Element/lastElementChild
https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeName („DIV“, „IMG“, …)
https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType

DOM Nodes, HTMLElements etc.
https://developer.mozilla.org/en-US/docs/Web/API
https://developer.mozilla.org/en-US/docs/Web/API/Window
https://developer.mozilla.org/en-US/docs/Web/API/Document
https://developer.mozilla.org/en-US/docs/Web/API/Location
https://developer.mozilla.org/en-US/docs/Web/API/Document/documentElement (<html>)
https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot
https://developer.mozilla.org/en-US/docs/Web/API/Node
https://developer.mozilla.org/en-US/docs/Web/API/Element
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement
https://developer.mozilla.org/en-US/docs/Web/API/HTMLDivElement
https://developer.mozilla.org/en-US/docs/Web/API/HTMLLinkElement
https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute
https://developer.mozilla.org/en-US/docs/Web/API/NodeList
(HTMLCollection (HTMLFormControlsCollection, HTMLOptionsCollection) only comes into the game when you use document.forms or the options-property of a <select>-object:)
https://developer.mozilla.org/en-US/docs/Web/API/HTMLCollection

DOM- & Element-Manipulation
https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute  (…etc. see page)
import a Node from DocumentFragment or other Documents:
https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode
… new Elements and Element Content:
https://developer.mozilla.org/en-US/docs/Web/API/Node/cloneNode
https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement
https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML
https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML
https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML
https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText
… move Elements  around:
https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild
https://developer.mozilla.org/en-US/docs/Web/API/Element/append
https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore
https://developer.mozilla.org/en-US/docs/Web/API/Element/prepend
https://developer.mozilla.org/en-US/docs/Web/API/Element/before
… deleting and replacing:
https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild
https://developer.mozilla.org/en-US/docs/Web/API/Element/remove
https://developer.mozilla.org/en-US/docs/Web/API/Node/replaceChild
https://developer.mozilla.org/en-US/docs/Web/API/Element/replaceWith

(<form> elements …)
https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/elements
https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement  (.value etc.)
https://developer.mozilla.org/en-US/docs/Web/API/RadioNodeList

JS & CSS / Element manipulation
https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units
https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle
https://developer.mozilla.org/en-US/docs/Web/API/Element/className (only IE – prefer:)
https://developer.mozilla.org/en-US/docs/Web/API/Element/classList
https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/cssText
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/setProperty
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet#obtaining_a_stylesheet
https://developer.mozilla.org/en-US/docs/Web/API/Document/styleSheets
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/cssRules
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule

Frames (and Popups)
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS (cross origin resources)
https://developer.mozilla.org/en-US/docs/Web/API/Window/frames
(window.frames returns a (pseudo-)array of Window-objects – to reference the (i)frame-element use:)
https://developer.mozilla.org/en-US/docs/Web/API/Window/frameElement
(document.getElementById(„someIframe“) returns the iframeelement – to reference the window object inside use:)
https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/contentWindow
https://developer.mozilla.org/en-US/docs/Web/API/Node/ownerDocument
https://developer.mozilla.org/en-US/docs/Web/API/Document/defaultView  (= Window)
https://developer.mozilla.org/en-US/docs/Web/API/Window/top
https://developer.mozilla.org/en-US/docs/Web/API/Window/opener
https://developer.mozilla.org/en-US/docs/Web/API/Channel_Messaging_API/Using_channel_messaging
https://developer.mozilla.org/en-US/docs/Web/API/Channel_Messaging_API
https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API

XML & JSON
https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer/serializeToString
https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString
https://developer.mozilla.org/en-US/docs/Web/API/XMLDocument
https://developer.mozilla.org/en-US/docs/Web/API/HTMLDocument
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON

Events
https://developer.mozilla.org/en-US/docs/Web/Events
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
https://developer.mozilla.org/en-US/docs/Web/Events/Event_handlers
https://developer.mozilla.org/en-US/docs/Web/API/Window#events
https://developer.mozilla.org/en-US/docs/Web/API/Document#events
https://developer.mozilla.org/en-US/docs/Web/Events/Orientation_and_motion_data_explained
https://developer.mozilla.org/en-US/docs/Web/Events/Creating_and_triggering_events
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click
https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API

JS-Security & Accessibility
https://de.wikipedia.org/wiki/Content_Security_Policy
https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
https://developer.mozilla.org/en-US/docs/Web/Accessibility
https://w3c.github.io/aria/
https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA
https://de.wikipedia.org/wiki/Barrierefreie-Informationstechnik-Verordnung

RegExp, match search, test …
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

(ToDo – sort this …)
https://developer.mozilla.org/en-US/docs/Web/Performance
https://developer.mozilla.org/de/docs/Glossary
https://css-tricks.com/replace-javascript-dialogs-html-dialog-element/

Cookies using „Vanilla“ JS
(the current / classic way:)
https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
https://daily-dev-tips.com/posts/vanilla-javascript-cookies/
(the near future:)
https://developer.mozilla.org/en-US/docs/Web/API/CookieStore

Ajax / XmlHttpRequest
… „Vanilla“ JS traditionell:
https://blog.garstasio.com/you-dont-need-jquery/ajax/
… jQuery:
https://api.jquery.com/jQuery.ajax/
… „Vanilla JS“ Fetch-API (neuere Browser)
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
Server-API-Testing:
https://www.postman.com/downloads/
Fake-Server-API:
https://jsonplaceholder.typicode.com/

Fullscreen …
https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API

JS-experimenting
https://codepen.io/pen/
https://jsfiddle.net/
https://www.geggert.de/tool/JavaScriptTest.htm

Canvas
https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D

Rich Text Editing („WYSIWYG“) & Code Editing
https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Editable_content
https://ckeditor.com/
https://www.tiny.cloud/
https://ace.c9.io/
… technical Backgrounds:
https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Editable_content
https://developer.mozilla.org/en-US/docs/Web/API/Document/designMode
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/contentEditable
https://stackoverflow.com/questions/61520602/is-there-a-replacement-for-document-execcommand-or-is-it-safe-to-use-document

Experimantal APIs …
https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API (Chrome)

jQuery

https://api.jquery.com/
https://api.jquery.com/category/utilities/
http://api.jquery.com/category/manipulation/
http://api.jquery.com/category/traversing/filtering/
https://api.jquery.com/prop/
https://api.jquery.com/attr/
https://api.jquery.com/css/
(… .css() can not handle „!important“-statements – use in that case:)
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/setProperty
https://api.jquery.com/category/deferred-object/
https://api.jquery.com/jQuery.fn.extend/
https://learn.jquery.com/plugins/

https://jqueryui.com/
https://jqueryui.com/download/
Ref.: https://api.jqueryui.com/
https://jquerymobile.com/
Ref.: https://api.jquerymobile.com/

Other JS-Frameworks …

Chart.js (simple data visualization)
https://www.chartjs.org/
https://www.chartjs.org/docs/latest/

leaflet.js (display and enrich maps)
https://leafletjs.com/SlavaUkraini/
https://leafletjs.com/SlavaUkraini/reference.html

React (Singe Page Apps similar to Angular.js)
https://reactjs.org/docs/getting-started.html
https://reactjs.org/docs/components-and-props.html
https://reactjs.org/docs/forms.html
https://reactjs.org/docs/events.html
Bidirectional binding in React:
… old approach:
https://reactjs.org/docs/two-way-binding-helpers.html
… today’s tools:
https://reactjs.org/docs/faq-state.html
https://reactjs.org/docs/hooks-overview.html

Node.js
https://nodejs.org/de/ (https://nodejs.org/en/)
https://nodejs.org/de/docs/
http://expressjs.com/
http://expressjs.com/en/starter/hello-world.html
http://expressjs.com/en/4x/api.html

Video embedding (JW Player)

https://www.jwplayer.com/
https://github.com/jwplayer/jwplayer
https://support.jwplayer.com/getting-started
https://developer.jwplayer.com/jwplayer/docs/jw8-add-a-player-library#self-hosted
https://developer.jwplayer.com/jwplayer/docs/jw8-embed-a-player
https://developer.jwplayer.com/jwplayer/docs/jw8-player-configuration-reference
https://support.jwplayer.com/topics/developer

SQL / Relational Databases etc.

Clients for MySQL-/MariaDB
https://www.heidisql.com/ (also  available free of charge (and thus w/o account) in the MS Store)
https://www.mysql.com/products/workbench/
You may alternatively install https://www.phpmyadmin.net/ on your server (if you use PHP there), but make sure to safely protect it against unauthorised access!

MySQL statements
https://dev.mysql.com/doc/refman/8.0/en/examples.html
https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html

MySQL Debugging-Informations
https://dev.mysql.com/doc/refman/8.0/en/show-variables.html
https://dev.mysql.com/doc/refman/8.0/en/setting-environment-variables.html
https://stackoverflow.com/questions/6479107/how-to-enable-mysql-query-log

MySQL Performance
https://dev.mysql.com/doc/refman/8.0/en/innodb-introduction.html
https://dev.mysql.com/doc/refman/8.0/en/select-optimization.html
https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
https://dev.mysql.com/doc/refman/8.0/en/semijoins.html
https://dev.mysql.com/doc/refman/8.0/en/table-scan-avoidance.html
https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html
https://dev.mysql.com/doc/refman/8.0/en/create-index.html
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

MySQL Glossary and thematic indexes
https://dev.mysql.com/doc/refman/8.0/en/indexes.html
https://dev.mysql.com/doc/refman/8.0/en/glossary.html

MariaDB
https://de.wikipedia.org/wiki/MariaDB
https://mariadb.com/docs/reference/

SQLite(3) – basic information:
Quick info for beginners: SQLite is a serverless relational database implementation comparable to MS Access (when used with .mdb-files).
Clients must thus implement all the necessary data processing logic, what they usually do by using the  C/C++-API provided by sqlite.org. PHP comprises by default an SQLite3-Client and you can use it with PDO. Node.js also has a ready-made client.  Thus, there is usually and conveniantly no need to install any further software on a server if you want to use an SQLite „database“ (or file, to be precise) with PHP or Node.js (or nearly any other code processing environment).
On the other hand, in many cases you should nontheless rethink if you really need the complexity of a database to achive your goal or if not a simple INI file or some XML could do the job, or – if you conclude, that a database is necessary – if you should not better use a more performant and remotely accessible database server like MySQL. All this of course depends on the specific situation and given parameters of your project.
To start with an empty SQLite-DB simply create an empty file „myDatabase.db“ (or the like) or, if you previously instalalled the CLI-Client, simply enter „sqlite3 myDatabase.db“ in your shell and the file will be created, if it does not exist. GUI clients habitually provide a wizard for this task.
To get a more detailed idea of SQLite see https://de.wikipedia.org/wiki/SQLite and https://www.sqlite.org/different.html.

SQLite(3) clients
CLI-Client: https://www.sqlite.org/cli.html (also comprises the manual, for example the list of „dot-commands“ and how to employ them) .
Ubuntu provides the CLI-Client as a package.
HeidiSQL (see also MySQL-Section) can also handle Sqlite3 quite reasonably (the feature is still marked „experimental“, but it will do for most of the basic operations).
There are many other specialised GUI-Clients, e.g the DB Browser for SQLite (also available as Ubuntu-Package) or SQLiteStudio.
Last but not least you have also the option to install https://www.phpliteadmin.org/ on your server, but – as with phpMyAdmin – remember to consider the security implications this has.

The „USE“ statement for the SQLite-CLI-client is represented by the „.open“ command. (in other environments you won’t need that as the connection you establish is usually already bound to a database(-file)). To be able to use more than one file (or a file and the „:memory:“-DB) you first need to attach the second data source by means of https://www.sqlite.org/lang_attach.html (and there is also a „detach“ of course).

SQLite(3) language references and some technical details
https://www.sqlite.org/lang.html
https://www.sqlite.org/docs.html
https://www.sqlite.org/faq.html
https://www.sqlite.org/lang_corefunc.html (see also Links to the Date & Time functions, aggregate functions, etc. there)
https://www.sqlite.org/keyword_index.html
https://www.sqlite.org/pragma.html
https://www.sqlite.org/quirks.html

Microsoft SQL Server & T-SQL (Transactional SQL)
https://docs.microsoft.com/de-de/sql/sql-server/?view=sql-server-ver15
Standard-Client:
https://docs.microsoft.com/de-de/sql/ssms/sql-server-management-studio-ssms?view=sql-server-ver15
HeidiSQL (see also MySQL-Section) can also connect to MS SQL Server and handle T-SQL

https://docs.microsoft.com/de-de/sql/reporting-services/create-deploy-and-manage-mobile-and-paginated-reports?view=sql-server-ver15

Oracle DB
https://docs.oracle.com/en/database/oracle/oracle-database/index.html
https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

ODBC
https://de.wikipedia.org/wiki/Open_Database_Connectivity
https://docs.microsoft.com/de-de/sql/database-engine/configure-windows/open-the-odbc-data-source-administrator?view=sql-server-ver15

NoSQL / Full text search engines
https://solr.apache.org/
https://solr.apache.org/resources.html
https://github.com/evolvingweb/ajax-solr/wiki
https://www.php.net/manual/en/book.solr.php
https://www.elastic.co/de/elasticsearch/

CSS & HTML

https://developer.mozilla.org/en-US/docs/Web/HTML
https://www.w3schools.com/html/default.asp
https://www.w3schools.com/TAGs/default.asp
https://wiki.selfhtml.org/
https://developer.mozilla.org/en-US/docs/Web/CSS
https://developer.mozilla.org/en-US/docs/Web/Accessibility
https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes
https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child
https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements
https://cssreference.io/css-grid/
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions
https://css-tricks.com/scaled-proportional-blocks-with-css-and-javascript/

https://caniuse.com/

Bootstrap 3
https://getbootstrap.com/docs/3.4/css/

Bootstrap 4
https://getbootstrap.com/docs/4.6/getting-started/introduction/

Bootstrap 5
https://getbootstrap.com/
https://getbootstrap.com/docs/5.1/getting-started/introduction/

Qlikview

https://help.qlik.com/en-US/qlikview/May2021/Subsystems/Client/Content/QV_QlikView/Scripting/script-statements-keywords.htm
https://help.qlik.com/en-US/qlikview/May2021/Subsystems/Client/Content/QV_QlikView/Scripting/dollar-sign-expansions.htm
https://help.qlik.com/en-US/qlikview/May2021/Subsystems/Client/Content/QV_QlikView/Security.htm (=>SectionAccess)
https://help.qlik.com/en-US/qlikview/May2021/Subsystems/Client/Content/QV_QlikView/Loading_data.htm
https://help.qlik.com/en-US/qlikview/May2021/Subsystems/Client/Content/QV_QlikView/ChartFunctions/chart-expressions.htm
https://help.qlik.com/en-US/qlikview/May2021/Subsystems/Client/Content/QV_QlikView/ChartFunctions/SetAnalysis/set-analysis-expressions.htm
https://help.qlik.com/en-US/qlikview/May2021/Subsystems/QMC/Content/QV_QMC/Administering.htm
https://www.tutorialspoint.com/qlikview/qlikview_dimensions_measures.htm
https://qlikviewcookbook.com/
https://datacraze.pl/blog/10-essential-tools-to-enhance-your-qlik-experience/

IDEs, Editors, Browsers, useful tools

https://www.jetbrains.com/phpstorm/
(+Plugins: .env files support, PHP Annotations, String Manipulation, Symfony Support)
(Settings … Theme: Material Oceanic , Editor > Color Scheme > General: Monokai (HTML-Tags: 3C3CFF))
https://www.jetbrains.com/help/phpstorm/using-phpstan.html
https://www.jetbrains.com/help/phpstorm/using-php-cs-fixer.html
https://phpstorm.tips/

my preferred coding fonts:
https://github.com/adobe-fonts/source-code-pro
https://www.jetbrains.com/lp/mono/
(or simply Microsoft’s „Consolas“)

vscode
https://code.visualstudio.com/
(My plugin-recommendations: Copy Text (S. Albert), German Language Pack (Microsoft), PHP Intellephense (Ben Mewburn – cosider to buy a license for this!), Symfony for VSCode, Symfony Code Snippets (Al Abdou), Identical Sublime Text Monokai )
(You may want to adapt C:\Users\###\AppData\Roaming\Code\User\settings.json – for example like this)

https://notepad-plus-plus.org/
http://www.winvi.de/de/

https://www.mozilla.org/de/firefox/new/
https://www.google.com/intl/de/chrome/

https://winmerge.org/?lang=de
https://www.scootersoftware.com/download.php (Beyond Compare)

https://microsoft.github.io/XmlNotepad/#install/
https://basex.org/
https://www.oxygenxml.com/

https://docs.microsoft.com/en-us/windows/wsl/install
https://www.virtualbox.org/
https://docs.microsoft.com/en-us/windows/dev-environment/docker/overview

https://docs.microsoft.com/en-us/windows/dev-environment/

Sonstige / Other

Umfangreiche Sammlungen:
https://developer.mozilla.org/en-US/docs/Web

Reguläre Ausdrücke testen / test regular expressions
https://regexr.com/

Code Snippets:
https://www.snipt.dev/

Jenkins:
https://www.jenkins.io/
https://www.youtube.com/watch?v=LFDrDnKPOTg

Linux / Ubuntu
https://wiki.ubuntuusers.de/Startseite/
https://manpages.ubuntu.com/manpages/focal/de/
https://help.ubuntu.com/community/CommunityHelpWiki
https://crontab.guru/

Apache
https://httpd.apache.org/docs/
https://blog.ordix.de/eile-mit-weile-mysqldumpslow

Versioning
https://git-scm.com/doc
https://tortoisegit.org/
https://subversion.apache.org/docs/
https://cwiki.apache.org/confluence/display/SVN/
https://tortoisesvn.net/index.de.html

Log-watching / log-analysis
https://wiki.ubuntuusers.de/Logdateien/
https://wiki.ubuntuusers.de/Logwatch/
https://flume.apache.org/
https://sourceforge.net/software/product/LOGalyze/
https://bugfender.com/

kolaboration
https://www.mediawiki.org/wiki/Help:Formatting/de
https://support.atlassian.com/confluence-cloud/docs/add-formatting-to-your-page/
https://support.atlassian.com/confluence-cloud/resources/
https://www.atlassian.com/software/jira
https://support.atlassian.com/jira-software-cloud/resources/

Docker
Docker is a „Container Virtualization“ for Linux based Applications. Other than regular „VM“s Docker does usually not comprise the Installation of a full OS but it only uses Copies of some of the features of the hosting system and uses a virtual in-memory file system. The Concept behind all this is usually described as „layers“. Wording: a container is  an active (running) Instance of a Docker image (binary file of a persisted / „saved“ Container).
A Docker image or container represents a (more or less) discrete operating system, similar to a VM, but it is usually meant to only host one single Application. To start multiple Docker-instances is easier tolerable for a system, because the „Layer“-concept then proves it’s benefits in being a much leaner approach. Docker can be used for productive purposes but it is also a great tool when it comes to evaluating techniques to which one is currently new, as it is very easy to install an run one of the many preconfigured images from the DockerHub, once Docker has been installed on a computer. Unfortunately, windows and Mac users need to expend some more effort, as they initially need to install a Linux environment (e.g. windows‘ WSL).
A german basic tutorial:
https://www.youtube.com/watch?v=SOdtw8milyw
Documentation/Reference:
https://docs.docker.com/desktop/windows/install/
https://docs.docker.com/
https://docs.docker.com/desktop/
https://docs.docker.com/engine/reference/commandline/cli/
https://docs.docker.com/engine/reference/commandline/run/
Example:
docker run -d --name myRedis -p 6379:6379 -v /host/folder:/container/folder redis:latest
https://docs.docker.com/storage/volumes/ (for persistent files)
https://docs.docker.com/engine/reference/commandline/volume_create/  (…)
https://docs.docker.com/engine/reference/commandline/exec/
Example for opening a bash inside a container:
docker exec -it containerName /bin/bash
https://www.freecodecamp.org/news/how-to-ssh-into-a-docker-container-secure-shell-vs-docker-attach/
https://docs.docker.com/engine/reference/commandline/search/
https://docs.docker.com/engine/reference/commandline/ps/
https://docs.docker.com/engine/reference/commandline/port/
https://docs.docker.com/engine/reference/commandline/stop/
https://docs.docker.com/engine/reference/commandline/kill/

etc
https://css-tricks.com/web-development-bookmarklets/
https://css-tricks.com/node-javascript-compared-to-javascript/
https://www.fatalerrors.org/a/10-web-apis-that-open-the-door-to-my-new-world.html
https://www.freecodecamp.org/news/svg-javascript-tutorial/
https://www.ip-adress.com/ip-address/lookup
https://www.geggert.de/tool/frickel.htm

Geodaten / Geodata
https://gisuser.com/2004/07/gis-and-mapping-in-php/
https://de.wikipedia.org/wiki/Geodaten
https://de.wikipedia.org/wiki/GPS_Exchange_Format
https://de.wikipedia.org/wiki/Geography_Markup_Language
https://de.wikipedia.org/wiki/Keyhole_Markup_Language
https://de.wikipedia.org/wiki/World_Geodetic_System_1984
https://de.wikipedia.org/wiki/OpenStreetMap
https://en.wikipedia.org/wiki/Geographic_data_and_information
https://www.php.net/manual/en/book.geoip.php


 

Veröffentlicht unter Job | Kommentar hinterlassen

Adding an MS Shop Application to the „sendTo“ folder

To find the location of an application that has been installed using Microsoft’s „Store“ you can use the taskmanager after you have opened the program in question. Expand the entry for the program (clicking on the leading „>“), right click the subentry carrying the program’s icon and select „open file location“ (or „Dateipfad öffnen“ in german). Your file explorer shoud pop up now showing the installation folder of the program with the program’s executable file highlighted.

The full „adding“ process might go like this:

Open the „sendTo“-folder in your file explorer as usual (e.g. by right clicking the „Start“-Button and then „Run“ (or „Ausführen“ in a german Windows) – in the opening dialog enter „shell:sendto“), drag the executable from the folder where it has been installed (to be found as described above) into the „sendTo“ folder holding it with the right mouse button. After releasing the button select „Create shortcut“ („Verknüpfung erstellen“) and adapt the shortcut name as desired (e.g. removing the „.exe“).

Veröffentlicht unter Windows | Kommentar hinterlassen

Na dann, prost!

Um mal was anderes als trübsinnige Kriegsberichte zu lesen: hier mal was lustiges aus der Corona-Kiste. Wie das mit den deutschlandweiten Zahlen ist, habe ich spontan nicht verfügbar, aber aus den Zahlen für NRW lässt sich klar etwas ableiten:

Die die Zahlen in den 2 „Geschehen“-Spalten am rechten Rand sind so etwas ähnliches wie ein nachträglicher R-Wert, oder einfacher gesprochen: sie zeigen an, ob die Pandemie an diesem Tag gerade Fahrt aufnimmt – und zwar wenn der Wert größer als 1 ist – oder abklingt – dann ist der Wert kleiner als 1. Zur besseren Übersicht wird der Zellhintergrund für Werte über 1 mit zunehmendem Abstand roter, und unter 1 entsprechend grüner (außer für Rot-Grün-Farbfehlsichtige natürlich, für die die Farben allerdings zumindest unterscheidbar sein sollten). Ich hänge hinten ein paar technische Details an.

OK – wo ich eigentlich drauf hinaus will: ich denke bei näherer Betrachtung, seht Ihr auch, was ich gesehen habe: offenbar gab es einen deutlichen Anstieg der Infektionsrate am und um das Wochenende 26./27. Februar. Aha. Und … was war da? Richtig: Karneval, Ihr Jecken! Kamelle!

Für etwas aktuellere Zahlen schaut bitte hier. Wenn die Zahlen dort etwas von denen im Bild abweichen, liegt das daran, dass das Land offenbar die Zahlen der letzten 1 oder 2 Tage noch nachträglich anpasst (also Nachträge einpflegt).

Aber zurück zum Ernst der Lage. Tatsächlich hat zumindest in NRW die Zunahme der Inzidenz also ganz klar nichts mit irgendwelchen Omikron-BCD-47.12-Varianten zu tun sondern schlicht – und wie so oft – mit der Unvernunft der Leute.

Ob die geplanten oder auch schon wieder nicht mehr geplanten oder nur in Teilen umsetzbaren, oder von den Ländern zu entscheidenden oder sonstwie gedingsten „Öffnungsschritte“ sinnvoll oder gefährlich oder gewagt oder überfällig oder viel zu früh oder rechtseinknickerisch oder alleszusammen sind, mag jeder für sich entscheiden. Fakt ist: wenn wir in unserem schönen Bundeslande der jecken Sturköppe uns nicht besoffen in den Armen liegen oder Bützje an wildfremde Passanten verteilen, sondern uns mit Masken, Abstand und Anstand begegnen, dann wirken die Impfungen offenbar immer noch super und wir kommen locker durch das Frühjahr. Zumindest hier in NRW.

Man müsste jetzt mal rausfinden, weshalb das in anderen Ecken offenbar anders ist. Liegt das an mangelnder Impfbereitschaft? Oder sind die anderswo schlicht sozialinteraktiver oder gar kuscheliger drauf? Stärkt der alltägliche Kampf im Spannungsfeld zwischen norddeutsch-distanzierten Westfalen und süddeutsch-vielschichtigen Rheinländern das Immunsystem? Fragen über Fragen und niemand, der das eigentlich so genau wissen will.

Gut. dann kommen jetzt noch die angedrohten, technische Ergänzungen für den interessierten Leser …

Die beiden rechten Spalten geben den über 7 bzw 3 Tage gemittelten Wachstumsfaktor der Neuinfektionen über die vergangenen 4 bzw. 7 Tage hinweg, versetzt um 9 Tage in die Vergangenheit wieder – klingt kompliziert … naja gut … isses auch. Ich habe das ganze auch noch mal als Tabellenkalkulation (leider mit etwas anderer Farbgebung, aber ansonsten identisch). Also machen wir da mal ein Bild dazu …

Erklärung: das in dem rosa Kästchen (letzte Zahl des Wochen-Wachstums-Faktors bzw. der Spalte „Geschehen (Wo.)“) ergibt sich, indem das blaue Kästchen geteilt wird durch das rote Kästchen (ob man die Summe oder den Durchschnitt der Kästchen nimmt, ist in diesem Fall – da es gleich viele Einzelwerte sind – egal, man muss nur für beide Dreierpacks dasselbe machen).

Warum 3-Tage-Mittelwert und 7 Tage Abstand? Der Durchschnitt über 3 Tage glättet die resultierende Kurve etwas, indem es zum Beispiel Schwankungen durch Feiertage etwas ausgleicht. Die 7 Tage Abstand gleichen die Schwankungen durch die Wochenenden aus.

Der Wert, der sich aus obiger Rechnung ergibt, kann natürlich erst am letzten Tag vom blauen Kästchen ermittelt werden. Durch das „hochschieben“ um 9 Tage werden die zu dem Zeitpunkt ermittelten Werte dann aber dahin verschoben, wo die am Ende im blauen Kästchen „gemessenen“ Infektionen tatsächlich stattgefunden haben. Die 9 Tage kommen zum einen aus den 3 bis 4 Tagen Inkubationszeit, dem Tag, den es dauert, das Ergebnis des PCR-Tests zu bekommen, dem Tag Verzug, weil heute erst die gestern bei den Ärzten angekommenen PCR-Test-Ergebnisse in den Statistiken landen und schließlich noch 3 Tagen, die sich aus der Wertermittlung ergeben (OK – tatsächlich habe ich das mal an einem Vatertag in 2020 feinjustiert und bin selber erstaunt, dass es immer noch gut passt – aber Ihr seht: es ist nicht völlig aus der Luft gegriffen).

Bei der Spalte davor (4-Tage-Wachstums-Faktor bzw. Spalte „Geschehen (4Tg)“) sieht das ganze so aus:

Es ist am Ende auch hier wieder bloß wieder blaues Kästchen geteilt durch rotes Kästchen. Hier werden die Wochenenden aber darüber ausgeglichen, dass über 7 Tage gemittelt wird. Der Abstand von 4 Tagen wurde von mir ursprünglich gewählt, weil ich den Eindruck hatte, damit den offiziellen „R“-Werten halbwegs nahe zu kommen. Das habe ich allerdings nie mathematisch nachgewiesen. Es entspricht, glaube ich, einem der „Schätzer“ für den R-Wert. Ich meine, das hätte mich damals darauf gebracht. Aber wie gesagt: das ist nix wasserdichtes.

Allgemein kann man sagen: bei der Durchschnittsbildung über 7 Tage werden die „Peeks“ stärker „auseinandergezogen“ als beim Wochenvergleich mit einem 3-Tage-Durchschnitt. Der Wochenvergleich ergibt also eine etwas schärfere Abgrenzung von Einzelereignissen (wie etwa dem Karnevalswochenende oder Sylvester). Der 4-Tage-Vergleich ist dafür zum Erkennen einer Tendenz etwas besser geeignet.

Der Vollständigkeit halber zeige ich auch noch, wie die 7-Tage-Inzidenz zustande kommt:

Es ist am Ende wieder schlicht (Summe) blaues Kästchen durch rotes Kästchen mal 100, womit im Ergebnis halt schlicht die Summe der Infektionen im blauem Kästchen so umgerechnet wird, als hätte NRW exakt 100.000 Einwohner (ich hab mir ein paar Nullen geschenkt – eigentlich ist der Faktor 100.000/17.947.000). Im oberen Bildausschnitt sind ein paar Spalten eingeblendet, die ich ansonsten ausgeblendet habe (die eine davon entspricht dem, was in „ca. Infektiös (‰)“ meiner Online-Tabelle drinsteht) – ich hab die da eingeblendet, weil ich eine Zelle dieser Spalten für die Einwohnerzahl „missbraucht“ habe und ich die hier zeigen wollte.

Der Inzidenzwert wird nicht nach oben geschoben, aber man muss sich trotzdem natürlich klarmachen, dass er eigentlich die Verhältnisse vor 9 Tagen abbildet. Will man eine Tendenz daraus ableiten, so sagt die etwas darüber aus, in welche Richtung die Reise vor knapp 2 Wochen gegangen ist.. Aber das ist ja inzwischen ein alter Hut.

Veröffentlicht unter Corona | Kommentar hinterlassen