Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 18 Min.

MongoDB und LLMs in .NET

Wer KI-Funktionalität in bestehende .NET-Anwendungen integrieren will, ohne das Backend neu zu erfinden, braucht dafür das Zusammenspiel aus Daten, Logik und Kontext.
© dotnetpro
Wenn moderne KI auf echte Produktivsysteme trifft, sind pragmatische Lösungen gefragt. Denn wer mit LLMs wie GPT arbeitet, merkt schnell: Ohne passende Datenbasis bleiben viele Potenziale ungenutzt. Genau hier spielt Mongo­DB seine Stärken aus – besonders in Kombination mit .NET.Die dokumentenbasierte Datenbank erlaubt es, unstrukturierte Texte, Metadaten und Embeddings flexibel zu verwalten – und das skalierbar, performant und ohne Schema-Fesseln. Noch besser: Mit Atlas Vector Search wird MongoDB zum Vektor-Store für semantische Suchen – ein idealer Baustein für das RAG-Prinzip (Retrieval Augmented Genera­tion). In diesem Artikel zeigen wir, warum MongoDB und .NET so gut harmonieren, wie man beide im KI-Kontext einsetzt und wie sich smarte Anwendungen – vom intelligenten Chatbot bis zur Wissensdatenbank – effizient umsetzen lassen.

Wenn Sprache Daten braucht

Große Sprachmodelle wie GPT-4 beeindrucken durch ihr sprachliches Können und ihre breite Wissensbasis. Doch wer Large-Language-Modelle produktiv in Anwendungen inte­griert, merkt schnell: Ihr Wissen ist nicht unendlich – und vor allem nicht aktuell. Sie können allgemeine Fragen beantworten, aber sobald es um spezifische Informationen, interne Prozesse oder aktuelle Inhalte geht, stoßen sie an Grenzen. Die Lösung? Man versorgt sie mit zusätzlichem Kontext – zum Beispiel aus einer eigenen Wissensdatenbank.Hier kommt die Retrieval Augmented Generation (RAG) ins Spiel: Statt dem LLM einfach eine Frage zu stellen, wird zunächst in einer externen Wissensbasis nach passenden Inhalten gesucht. Diese Inhalte – häufig Textdokumente, FAQ-Einträge oder Support-Tickets – übergibt man dem Modell dann zusammen mit der Frage. Das LLM generiert auf dieser Grundlage eine Antwort, die sprachlich elegant und gleichzeitig ­inhaltlich korrekt ist. Es verbindet damit das Beste aus zwei Welten: generative Fähigkeiten und faktische Genauigkeit.Doch wie findet man die passenden Inhalte zur jeweiligen Frage? Klassische Schlüsselwortsuchen (zum Beispiel SQLs LIKE oder einfache Volltextsuchen) reichen nicht aus – sie sind zu starr und erkennen keine inhaltliche Nähe. Wenn ein Nutzer etwa fragt: „Wie kann ich mein Kennwort ändern?“, sollen auch Dokumente gefunden werden, in denen von „Passwort zurücksetzen“ die Rede ist. Semantisch passt das perfekt – aber textuell gibt es kaum Übereinstimmung.Die Lösung liegt in der semantischen Suche auf Basis von Vektoren. Dabei wird jeder Text (zum Beispiel eine Benutzerfrage oder ein Supportartikel) durch ein Embedding-Modell in einen Vektor im hochdimensionalen Raum übersetzt. Ähnliche Inhalte erzeugen ähnliche Vektoren. Für jede neue Anfrage berechnet man ebenfalls ein Vektor-Embedding – und sucht dann im Datenbestand nach den „nächsten Nachbarn“. Das ist deutlich leistungsfähiger als einfache Keyword-Suche, denn es berücksichtigt Bedeutung statt nur Formulierung.Damit dieser Ansatz funktioniert, braucht es eine Vektordatenbank, die Millionen solcher Vektoren effizient speichern, indizieren und durchsuchen kann – inklusive Filtermöglichkeiten nach Metadaten, Sprache, Datum oder Kategorie. Die Wahl des Vektorspeichers entscheidet maßgeblich darüber, wie leistungsfähig und wartbar eine KI-Anwendung wird. Und genau hier setzt MongoDB an.

MongoDB als idealer Vektorspeicher für KI-Apps

Stellt euch vor, ihr entwickelt einen Support-Chatbot für eine fiktive Maschine, nennen wir ihn den „ACME Kernfusions-Apparat“. Eine hochkomplexe Maschine mit einem ebenso komplexen Handbuch: Anleitungen zur Kalibrierung, Fehlercodes, Wartungsschritte, Sicherheitshinweise – alles muss verfügbar sein, wenn ein Techniker eine Frage stellt wie: „Wie ersetze ich die Plasmadüse bei Fehlermeldung 317-B?“Damit der KI-gestützte Chatbot sinnvolle Antworten liefern kann, muss er dieses Wissen nicht nur speichern, sondern auch semantisch durchsuchen können. Klassische Datenbanken können zwar nach Keywords suchen, aber nicht nach Bedeutung. Genau dafür braucht es Vektorspeicher, also eine semantisch durchsuchbare Repräsentation der eigenen Inhalte.Viele Teams greifen hier zu spezialisierten Vektor-Datenbanken wie Pinecone, Weaviate oder FAISS. Diese sind leistungsfähig, bringen aber einen Haken mit: Sie sind Silos. Man muss die Daten dort separat pflegen, synchronisieren, neben dem eigentlichen „operational store“ – der zum Beispiel Userdaten, Logs oder Metainformationen in einer anderen DB speichert. Änderungen im Handbuch? Neue Sprache? Metadaten-Update? Das alles muss in zwei Systemen synchron gehalten werden – fehleranfällig und komplex.MongoDB geht einen anderen Weg: Mit Atlas Vector Search kann ein Entwickler in einem bestehenden Mongo­DB-Dokument (und damit auch in einer bestehenden Datenbank) einfach ein Feld für die Vektoren/Embeddings hin­zu­fügen – und dann auf dieses Feld einen speziellen Index vom Typ Vector-Search definieren. Dieser Index funktioniert wie gewohnt: Er wird über das gewünschte Feld gelegt (zum Beispiel embedding) und ermöglicht darauf semantische Ähnlichkeitssuchen nach dem Prinzip: „Finde die Dokumente, ­deren Vektor am nächsten an diesem hier liegt.“Ein zugehöriges Dokument könnte daher so aussehen:

{
  <span class="hljs-attr">"title"</span>: <span class="hljs-string">"Plasmadüse austauschen"</span>,
  <span class="hljs-attr">"category"</span>: <span class="hljs-string">"Wartung"</span>,
  <span class="hljs-attr">"content"</span>: <span class="hljs-string">"Schalten Sie den Apparat aus und öffnen </span>
<span class="hljs-string">    Sie die Sicherungsklappe..."</span>,
  <span class="hljs-attr">"embedding"</span>: [<span class="hljs-number">0.812</span>, <span class="hljs-number">0.591</span>, <span class="hljs-number">0.443</span>, ...],
  <span class="hljs-attr">"language"</span>: <span class="hljs-string">"de"</span>,
  <span class="hljs-attr">"createdAt"</span>: <span class="hljs-string">"2024-01-15"</span>
} 
Der Index wird auf das Feld embedding gelegt – und ab diesem Moment kann man mit einer einzigen Abfrage ähnliche Inhalte finden, zum Beispiel zu einer Nutzerfrage wie: „Wie baue ich die Düse aus?“ Das ist nicht nur schneller umgesetzt als mit Pinecone oder Weaviate, sondern auch einfacher zu pflegen: Ein Datenspeicher, ein Index, ein System.Dazu kommt: MongoDB erlaubt uns zusätzlich, diese Vektor-Suche mit klassischen Filtern zu kombinieren. Man kann zum Beispiel sagen: „Gib mir die drei Dokumente, die dem Embedding am ähnlichsten sind – aber nur aus der Kategorie ‚Wartung‘, in deutscher Sprache und neuer als 2023.“ Diese hybriden Abfragen – semantisch plus strukturiert – sind ein echter Vorteil gegenüber reinen Vektor-Datenbanken.

Mehr als nur Vektoren: MongoDB plus .NET als KI-Datenplattform

Viele .NET-Entwickler kennen MongoDB vor allem als performante Alternative zu relationalen Datenbanken – gerade wenn es um flexible oder unstrukturierte Daten geht. Doch MongoDB ist weit mehr als ein Dokumentenspeicher – es ist eine Plattform, die natürlich mit KI-Anwendungsfällen mitwächst. Das zeigt sich besonders, wenn man mit C# arbeitet.Stellen wir uns also vor, wir haben eine Anwendung, in der Einträge in Handbüchern bereits umgesetzt sind. Es gibt vielleicht sogar ein Benutzer- und Rechtemanagement, ähnlich einem Content-Management-System. Unsere Handbuch-Einträge könnten dann als C#-Klasse wie folgt aussehen:

<span class="hljs-keyword">using</span> MongoDB.Bson;
<span class="hljs-keyword">using</span> MongoDB.Bson.Serialization.Attributes;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">ManualEntry</span>
{
  [BsonId]
  [BsonRepresentation(BsonType.ObjectId)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Id { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"title"</span>)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Title { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"content"</span>)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Content { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
} 
Um nun Embeddings als Vektoren zu speichern, können wir auf eine einfache Erweiterung unserer Klasse zurückgreifen. Diese werden als float[] gespeichert – was aus Sicht eines
.NET-Entwicklers nahezu ideal ist. Es muss nicht selbst ein MongoDB-eigener Typ eingeführt oder per Custom Serializer abgebildet werden, und auch Hilfsklassen aus Drittbibliotheken braucht man nicht zu bemühen.Wenn Sie beispielsweise mit dem OpenAI-API arbeiten und ein Text-Embedding erzeugen, erhalten Sie direkt ein float[], das sich ohne Umwege in die MongoDB-Dokumente schreiben lässt – typisiert, verständlich, sicher. Das macht nicht nur die Integration unkompliziert, sondern erleichtert auch die Weiterverarbeitung, etwa beim Debugging oder in automatisierten Tests. Die beiden Welten – Vektorraum und typisierte C#-Anwendung – greifen hier nahtlos ineinander.Die Klasse könnte also wie folgt erweitert werden:

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">ManualEntry</span>
{
  [BsonId]
  [BsonRepresentation(BsonType.ObjectId)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Id { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"title"</span>)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Title { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"content"</span>)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Content { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"embedding"</span>)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">float</span>[] Embedding { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"tags"</span>)]
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>[] Tags { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"gridFsId"</span>)]
  <span class="hljs-keyword">public</span> ObjectId GridFsId { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
  [BsonElement(<span class="hljs-string">"createdAt"</span>)]
  [BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
  <span class="hljs-keyword">public</span> DateTime CreatedAt { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; } = 
    DateTime.UtcNow;
} 
Neben dem Embedding-Feld, in dem wir später unsere Vektoren speichern möchten, wurden auch weitere Metadaten hinzugefügt – auf diese kommen wir später zu sprechen.Damit wir also nun diese neue Spalte nutzen können, müssen wir nach Erstellung einen passenden Index hinzufügen. Hierfür gibt es aktuell noch keine Lösung (zum Beispiel über Attribute) im MongoDB-SDK für .NET. Hier müssen wir auf einen manuell ausgeführten Befehl zurückgreifen oder die entsprechenden MongoDB-UI-Tools verwenden.

{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"embedding_index"</span>,
  <span class="hljs-attr">"definition"</span>: {
    <span class="hljs-attr">"mappings"</span>: {
      <span class="hljs-attr">"dynamic"</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">"fields"</span>: {
        <span class="hljs-attr">"embedding"</span>: {
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"vector"</span>,
          <span class="hljs-attr">"numDimensions"</span>: <span class="hljs-number">1536</span>,
          <span class="hljs-attr">"similarity"</span>: <span class="hljs-string">"cosine"</span>
        }
      }
    }
  }
} 
Dieser Befehl, ausgeführt in unserer dazugehörigen Collec­tion, erstellt den Index für das Feld embedding. Als Typ wird vector angegeben, und die Anzahl an Dimensionen beträgt 1536. Diese Zahl leitet sich aus dem verwendeten Large-Language-Modell für die Erstellung der Embeddings ab, das uns Ergebnisse in einer gewissen Länge zurückgibt. Während OpenAIs Embedding-Modelle 1536 Dimensionen zurückgeben, kann Metas Llama je nach Konfiguration und Version zwischen 4096 und 8192 Dimen­sionen zurückliefern. Wichtig ist hierbei also, zu prüfen, welches Modell man verwendet und wie viele Dimensio­nen im Vektorraum genutzt werden. Diese müssen in exakt der richtigen Größe angegeben werden.Mit diesem Index wird Ihre Collection nun suchfähig für ­semantische Anfragen und bleibt gleichzeitig voll in dem typisierten .NET eingebettet.

Vom PDF zur semantischen Suche: MongoDBs GridFS für KI nutzen

Viele Unternehmen verfügen über wertvolle Daten – allerdings nicht in Form strukturierter Tabellen, sondern als PDFs, Word-Dokumente, Handbücher oder E-Mail-Anhänge. Gerade bei KI-Anwendungen mit Sprachmodellen ist der Wunsch groß, diese Inhalte nutzbar zu machen: für semantische Suche, intelligente Chatbots oder automatisierte Dokumenta­tion. Doch wie geht man damit um, wenn das Ausgangs­material binär vorliegt?MongoDB bietet die Möglichkeit, diese Dokumente direkt in der Datenbank abzulegen – über das eingebaute Dateisystem-Feature GridFS. Es wurde entwickelt, um große Binärdateien effizient in MongoDB zu speichern und in Teilstücken zu verwalten. Statt Dokumente extern in einem Blob-Store oder Dateiserver zu speichern, liegen sie an einem Ort – zusammen mit den Metadaten, Textauszügen und Embeddings.

<span class="hljs-keyword">var</span> bucket = <span class="hljs-keyword">new</span> GridFSBucket(database);
<span class="hljs-keyword">await</span> bucket.UploadFromBytesAsync(
  <span class="hljs-string">"acme_manual_de_v1.pdf"</span>, pdfBytes); 
Mit diesen zwei Zeilen lassen sich Binärdaten wie unser Handbuch, das wir als pdfBytes eingelesen haben, im Handumdrehen im MongoDB-eigenen GridFS-Store speichern. Die neu erstellte Objekt-ID könnte man später dafür verwenden, die Quelle in unserer bestehenden ManualEntry-Klasse GridFsId zu setzen.So entsteht eine saubere Trennung: Die Binärdaten bleiben in GridFS, die semantisch relevanten Inhalte sind sofort abfragbar. Später können Sie semantische Suchen durchführen, basierend auf dem Inhalt – und bei Bedarf den Original-PDF-Anhang wieder ausliefern, etwa als Download oder zur Einsicht.Wieder wird der große Vorteil dieser Architektur ersichtlich: Sie speichern Quelldaten, Text, Kontext und Embedding zentral in MongoDB. Es ist kein externer Blob-Store nötig, keine Synchronisation zwischen Speichersystem und Datenbank. Das erleichtert nicht nur die Entwicklung, sondern schafft auch konsistente Abläufe für Berechtigungen, Backup, Logging und Replikation – alles innerhalb einer Plattform.

Von unstrukturiert über Rohtexte hin zu Vektoren

Bevor ein Large Language Model überhaupt seine Stärken ausspielen kann, muss es etwas geliefert bekommen, mit dem es arbeiten kann: Text. Und genau hier beginnt oft eine unterschätzte, aber essenzielle Herausforderung – denn viele der relevanten Informationen liegen in Formaten vor, die für ein Sprachmodell zunächst unzugänglich sind. PDFs, Word-Dokumente, technische Handbücher oder interne Präsenta­tionen enthalten zwar Wissen – aber nicht in einer Form, die sich semantisch erschließen lässt.Gerade im .NET-Umfeld, wo zahlreiche Unternehmen auf bewährte Office-Formate setzen, ist die Konvertierung dieser Inhalte in lesbaren, gut strukturierten Text ein kritischer Prozess. Die Zielsetzung ist dabei nie einfach nur „alles irgendwie auslesen“, sondern gezielt das zu extrahieren, was später als Kontext für ein LLM relevant sein kann. Kapitelüberschriften, semantische Gliederung, Tabelleninhalte oder auch technische Parameter müssen erhalten bleiben – oder zumindest so interpretiert werden, dass daraus nützliche Informationen werden.Im praktischen Projektalltag zeigt sich hier schnell, wie wichtig passende Tools sind. Während Python-Ökosysteme mit Libraries wie LangChain oder LlamaIndex längst umfassende Pipelines bieten – inklusive Parsern für PDFs, Markdown, HTML, E-Mails und mehr –, gibt es im .NET-Bereich bislang nur Teilstücke. Zwar existiert ein inoffizieller Port von LangChain für .NET, dieser ist jedoch noch experimentell und bei Weitem nicht so modular oder vollständig wie sein Vorbild. Der Großteil der Arbeit in .NET-Projekten besteht daher heute noch aus der gezielten Auswahl und Kombination spezialisierter Komponenten.Bibliotheken wie PdfPig oder TikaOnDotNet ermöglichen solide Textextraktion, insbesondere bei einfachen Layouts oder linearen Dokumenten. Wer es strukturierter braucht, greift oft zu kommerziellen Lösungen, die auch Formatierungen, Tabellen oder visuelle Layoutmerkmale berücksichtigen. In allen Fällen gilt jedoch: Der Kontext der späteren ­KI-Nutzung sollte die Extraktion leiten. Wer beispielsweise einen Chatbot plant, benötigt andere Strukturen als jemand, der FAQ-artige Antworten generieren will. Die Art der Zielanwendung beeinflusst also schon die Art und Weise, wie Texte aus Quellen gewonnen werden.Zudem zeigt die Erfahrung: Die beste Textextraktion ist wertlos, wenn nicht verstanden wird, was aus den Quelldaten entfernt wurde – oder eben nicht. Fußnoten, Marginalien, eingebettete Objekte oder OCR-Texte aus gescannten Dokumenten können kritische Informationen enthalten. Hier braucht es nicht nur gute Parser, sondern auch eine manuelle oder automatische Qualitätssicherung – etwa durch Heuristiken, Checksummen oder Strukturvergleiche.Wer diesen ersten Schritt gewissenhaft durchführt, legt das Fundament für eine funktionierende KI-Anwendung. Denn das Modell kann nur mit dem arbeiten, was es bekommt, und je klarer, strukturierter und semantisch relevanter der extrahierte Text ist, desto besser wird die spätere Antwortqualität. LLMs sind keine Magier. Sie sind leistungsfähig, aber abhängig von sauber aufbereitetem Input. Und genau hier trennt sich im Alltag die Spielerei vom Produktiveinsatz.

Viel Text ist nicht gleich besser

Ein Sprachmodell wie GPT kann viel – aber nicht alles auf einmal. Große Kontexte mit mehreren Tausend Tokens sind zwar technisch möglich, dennoch bleibt die Aufnahmefähigkeit eines LLM begrenzt. Wer versucht, ein ganzes Handbuch in einer einzigen Anfrage zu verarbeiten, wird schnell enttäuscht: Die Reaktionszeit steigt, die semantische Genauigkeit sinkt und Halluzinationen nehmen zu.Das Problem liegt nicht im Modell, sondern in der fehlenden Struktur. LLMs brauchen konzentrierten Kontext – kompakte, thematisch zusammenhängende Informationseinheiten, auf die sie sich bei der Generierung stützen können. Lange Texte müssen in kleinere Abschnitte aufgeteilt werden – nicht blind, sondern sinnvoll. Ein Fließtext braucht andere Trennkriterien als Quellcode, eine tabellarische Anleitung eine andere Behandlung als ein erzählender Erfahrungsbericht.Im .NET-Umfeld wurde diese Herausforderung lange Zeit mit selbst gebauten Routinen gelöst: einfache String-Splits nach Satzzeichen, harte Abschnittsgrenzen oder heuristische Chunking-Logik. Doch mit dem zunehmenden Fokus auf LLM-Integration entstehen auch im Microsoft-Ökosystem neue Werkzeuge, die genau hier ansetzen.Ein prominentes Beispiel ist Semantic Kernel, das Open-Source-KI-Framework von Microsoft. Es erlaubt nicht nur die Orchestrierung von Prompts und Modellen, sondern bringt auch Tools mit, um Texte automatisch in sogenannte Chunks zu zerlegen. Dabei berücksichtigt das Framework sowohl die Zeichen- oder Satzlängen als auch semantische Trennpunkte. Besonders spannend: Die Schnittstellen des Semantic Kernel lassen sich problemlos mit MongoDB kombinieren. Texte, die in der Datenbank liegen – etwa in GridFS oder als Content-Feld eines Dokuments –, können direkt geladen, segmentiert und für die spätere Verarbeitung vorbereitet werden.Ein solcher Segmentierungsprozess kann zum Beispiel dafür sorgen, dass eine Anleitung zur Wartung unserer fiktiven Maschine in sinnvolle Abschnitte aufgeteilt wird: Ein Chunk behandelt nur einzelne Absätze (oder Sätze) über die Düse, ein anderer nur über den Kühlkreislauf, ein dritter widmet sich den einzelnen Sicherheitshinweisen. Das Ergebnis sind kleinere Einheiten, die jeweils in einen Embedding-Vektor übersetzt und gezielt über Vektorsuche wiedergefunden werden können – klar, übersichtlich und vor allem modellkompatibel.Ein gutes Split-Konzept ist daher nicht nur ein technisches Detail, sondern ein strategischer Baustein: Es entscheidet darüber, wie präzise ein LLM später antwortet – und wie effi­zient Sie Ihre Datenbasis nutzen können. Besonders in Kombination mit MongoDB als Vector Store ergibt sich so ein ­intelligentes System aus gespeicherten Textabschnitten, semantisch indiziert, kontextsensitiv abrufbar. Bereit für jede LLM-Anfrage, die mehr will als nur ein paar Schlagwörter.

Lesen, Splitten und Embedden nach MongoDB

Sobald ein Textabschnitt bereitsteht, lässt sich dieser direkt in einen semantischen Vektor überführen – etwa mithilfe des OpenAI Embedding API. Die Integration in ein .NET-System funktioniert dabei erstaunlich geradlinig. Alles, was Sie benötigen, ist ein API-Key, den vorbereiteten Textinput sowie das OpenAI SDK, das über NuGet installierbar ist. Für die Embeddings wird das Modell text-embedding-ada-002 verwendet, das auch mit der Dimensionsgröße unseres zuvor erstellten Vektor-Index übereinstimmt.

<span class="hljs-keyword">using</span> <span class="hljs-type">OpenAI</span>;
<span class="hljs-keyword">using</span> <span class="hljs-type">OpenAI</span>.<span class="hljs-type">Embeddings</span>;
<span class="hljs-keyword">var</span> apiKey = <span class="hljs-string">"..."</span>; // <span class="hljs-type">Sicher</span> speichern, zum <span class="hljs-type">Beispiel</span> 
                    // über <span class="hljs-type">Secret</span> <span class="hljs-type">Store</span>
<span class="hljs-type">var</span> openAiClient = new <span class="hljs-type">OpenAIClient</span>(apiKey);
<span class="hljs-keyword">var</span> inputText = <span class="hljs-string">"Im Falle eines kritischen Fehlers muss </span>
<span class="hljs-string">  der Hauptschalter aktiviert werden."</span>; 
  //<span class="hljs-type">Text</span> aus dem <span class="hljs-type">Text</span>-<span class="hljs-type">Chunker</span>
<span class="hljs-type">var</span> <span class="hljs-literal">result</span> = await 
    openAiClient.<span class="hljs-type">EmbeddingsEndpoint</span>.<span class="hljs-type">CreateEmbeddingAsync</span>(
  inputText,
  model: <span class="hljs-string">"text-embedding-ada-002"</span>
);
<span class="hljs-keyword">var</span> embedding = <span class="hljs-literal">result</span>.<span class="hljs-type">Data</span>[<span class="hljs-number">0</span>].<span class="hljs-type">Embedding</span>.<span class="hljs-type">ToArray</span>(); 
Die zurückgelieferte Variable embedding kann also so an ­unser MongoDB-Dokument übergeben werden.

var <span class="hljs-attr">manualEntry</span> = new ManualEntry
{
  <span class="hljs-attr">Title</span> = <span class="hljs-string">"Notfallabschaltung"</span>,
  <span class="hljs-attr">Content</span> = inputText,
  <span class="hljs-attr">Embedding</span> = embedding,
  <span class="hljs-attr">GridFsId</span> = gridFsId
};
var <span class="hljs-attr">collection</span> = 
  database.GetCollection&lt;ManualEntry&gt;(<span class="hljs-string">"manual_entries"</span>);
await collection.InsertOneAsync(manualEntry); 
Dadurch haben wir nun ein neues Dokument geschaffen, das die Referenz auf das ursprüngliche Dokument (PDF) als GridFsId mitliefert, einen – in unserem Fall statischen – Titel verwendet sowie den Textschnipsel als Content und die dazugehörigen Embeddings nutzt. So entsteht für jeden Schnipsel ein neues Dokument, das wir dann über die Vektorensuche passend finden können.Ziel ist es, bei der Suche nach Informationen nicht das gesamte Dokument als Informationsbasis an das LLM zu übermitteln, sondern nur die dazugehörigen kleineren Informa­tions-Schnipsel.

Danach folgt: Abfragen

Sprachmodelle sind auf Kontext angewiesen. Und dieser Kontext will gefunden werden – präzise, performant und semantisch sinnvoll. Hier kommt die Vektorsuche in MongoDB ins Spiel: Ein einmal gespeicherter Embedding-Vektor lässt sich über einen vektorbasierten Index effizient durchsuchen – und das direkt mit dem offiziellen .NET SDK.Das Beispiel in Listing 1 zeigt, wie Sie einen freien Suchtext (in diesem Fall über die Konsoleneingabe) entgegennehmen, daraus ein Embedding generieren (zum Beispiel mit OpenAI) und anschließend über MongoDB Atlas die fünf ähnlichsten Texte zurückgeben. Ideal etwa für eine Kommandozeilen-Anwendung zur schnellen Wissensrecherche.
Listing 1: Abfrage zur Wissensrecherche
Console.WriteLine(&lt;span class="hljs-string"&gt;"Geben Sie Ihre Frage ein:"&lt;/span&gt;);&lt;br/&gt;&lt;span class="hljs-built_in"&gt;var&lt;/span&gt; queryText = Console.ReadLine();&lt;br/&gt;// Schritt &lt;span class="hljs-number"&gt;1&lt;/span&gt;: Embedding erzeugen&lt;br/&gt;var embeddingResult =  &lt;br/&gt;    await openAiClient.EmbeddingsEndpoint.&lt;br/&gt;    CreateEmbeddingAsync(&lt;br/&gt;  queryText,&lt;br/&gt;  model: &lt;span class="hljs-string"&gt;"text-embedding-ada-002"&lt;/span&gt;&lt;br/&gt;);&lt;br/&gt;&lt;span class="hljs-built_in"&gt;var&lt;/span&gt; queryEmbedding = &lt;br/&gt;  embeddingResult.Data[&lt;span class="hljs-number"&gt;0&lt;/span&gt;].Embedding.ToArray();&lt;br/&gt;// Schritt &lt;span class="hljs-number"&gt;2&lt;/span&gt;: Vektor-Suche &lt;span class="hljs-keyword"&gt;in&lt;/span&gt; MongoDB (Atlas Vector // Search Aggregation)&lt;br/&gt;&lt;span class="hljs-built_in"&gt;var&lt;/span&gt; pipeline = &lt;span class="hljs-built_in"&gt;new&lt;/span&gt; BsonDocument[]&lt;br/&gt;{&lt;br/&gt;  &lt;span class="hljs-built_in"&gt;new&lt;/span&gt; BsonDocument(&lt;span class="hljs-string"&gt;"$vectorSearch"&lt;/span&gt;, &lt;span class="hljs-built_in"&gt;new&lt;/span&gt; BsonDocument&lt;br/&gt;  {&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"index"&lt;/span&gt;, &lt;span class="hljs-string"&gt;"embedding_index"&lt;/span&gt; }, // Name des &lt;br/&gt;      // Vector-Index &lt;span class="hljs-keyword"&gt;in&lt;/span&gt; MongoDB&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"queryVector"&lt;/span&gt;, &lt;br/&gt;      &lt;span class="hljs-built_in"&gt;new&lt;/span&gt; BsonArray(queryEmbedding) },&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"path"&lt;/span&gt;, &lt;span class="hljs-string"&gt;"embedding"&lt;/span&gt; },&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"numCandidates"&lt;/span&gt;, &lt;span class="hljs-number"&gt;100&lt;/span&gt; },&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"limit"&lt;/span&gt;, &lt;span class="hljs-number"&gt;5&lt;/span&gt; },&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"similarity"&lt;/span&gt;, &lt;span class="hljs-string"&gt;"cosine"&lt;/span&gt; }&lt;br/&gt;  }),&lt;br/&gt;  &lt;span class="hljs-built_in"&gt;new&lt;/span&gt; BsonDocument(&lt;span class="hljs-string"&gt;"$project"&lt;/span&gt;, &lt;span class="hljs-built_in"&gt;new&lt;/span&gt; BsonDocument&lt;br/&gt;  {&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"_id"&lt;/span&gt;, &lt;span class="hljs-number"&gt;0&lt;/span&gt; },&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"title"&lt;/span&gt;, &lt;span class="hljs-number"&gt;1&lt;/span&gt; },&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"content"&lt;/span&gt;, &lt;span class="hljs-number"&gt;1&lt;/span&gt; },&lt;br/&gt;    { &lt;span class="hljs-string"&gt;"score"&lt;/span&gt;, &lt;span class="hljs-built_in"&gt;new&lt;/span&gt; BsonDocument(&lt;br/&gt;      &lt;span class="hljs-string"&gt;"$meta"&lt;/span&gt;, &lt;span class="hljs-string"&gt;"vectorSearchScore"&lt;/span&gt;) }&lt;br/&gt;  })&lt;br/&gt;};&lt;br/&gt;&lt;span class="hljs-built_in"&gt;var&lt;/span&gt; results = await collection.Aggregate&amp;lt;&lt;br/&gt;  BsonDocument&amp;gt;(pipeline).ToListAsync();&lt;br/&gt;// Schritt &lt;span class="hljs-number"&gt;3&lt;/span&gt;: Ausgabe der ähnlichsten Inhalte&lt;br/&gt;Console.WriteLine(&lt;span class="hljs-string"&gt;"\nTop 5 passende Inhalte:"&lt;/span&gt;);&lt;br/&gt;foreach (&lt;span class="hljs-built_in"&gt;var&lt;/span&gt; doc &lt;span class="hljs-keyword"&gt;in&lt;/span&gt; results)&lt;br/&gt;{&lt;br/&gt;  &lt;span class="hljs-built_in"&gt;var&lt;/span&gt; &lt;span class="hljs-built_in"&gt;title&lt;/span&gt; = doc.GetValue(&lt;span class="hljs-string"&gt;"title"&lt;/span&gt;, &lt;span class="hljs-string"&gt;""&lt;/span&gt;).AsString;&lt;br/&gt;  &lt;span class="hljs-built_in"&gt;var&lt;/span&gt; &lt;span class="hljs-built_in"&gt;content&lt;/span&gt; = doc.GetValue(&lt;span class="hljs-string"&gt;"content"&lt;/span&gt;, &lt;span class="hljs-string"&gt;""&lt;/span&gt;).AsString;&lt;br/&gt;  &lt;span class="hljs-built_in"&gt;var&lt;/span&gt; score = doc.GetValue(&lt;span class="hljs-string"&gt;"score"&lt;/span&gt;, BsonNull.Value).&lt;br/&gt;    ToString();&lt;br/&gt;  Console.WriteLine($&lt;span class="hljs-string"&gt;"\n--- {title} &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;    ---\n{content}\n(Relevanzscore: {score})"&lt;/span&gt;);&lt;br/&gt;} 
Der Ablauf der Suche gestaltet sich wie folgt:
  • Der Benutzer gibt über die Konsole eine Frage ein.
  • Diese Frage wird per OpenAI SDK in ein Embedding (float[]) übersetzt.
  • MongoDB wird mit diesem Vektor abgefragt – der Vektor-Index liefert die ähnlichsten Dokumente.
  • Der Textinhalt dieser Dokumente wird gesammelt und ausgegeben.
In diesem Fall wird auf Basis des Suchtextes ein Embedding generiert und mittels einer MongoDB-Aggregation der Vector-Search-Index durchsucht und danach mit dem Titel und dem Text-Snippet aus dem ursprünglichen Dokument angereichert. Ebenso wird der vectorSearchScore hinzugefügt, der einen Wert zwischen 0 und 1 aufweist. Vereinfacht gesagt: Je höher, desto ähnlicher ist die Suchanfrage zum durchsuchten Text-Snippet.Gerade für interne Tools, Chatbots oder interaktive Assistenzsysteme ist diese Form der Abfrage ideal: Sie geben eine Frage ein, das System findet relevante Inhalte, das LLM nutzt sie als Kontext. So entsteht echtes semantisches Arbeiten – mit MongoDB als Wissensspeicher im Rücken.

Vektoren und Wissen in Prompts verwenden

Nachdem wir mithilfe eines LLM Wissen im Sinne unseres Dokuments als Embedding/Vektoren gespeichert haben und nun in der Lage sind, diese Informationen abzurufen, gehen wir in die nächste Stufe: Das Wissen in LLMs verwenden.MongoDB übernimmt in diesem Setup die Rolle des zentralen Datenlagers. Es speichert sowohl strukturierte Metadaten als auch unstrukturierte Inhalte – etwa Fließtexte, technische Anleitungen oder Support-Dokumente – und zusätzlich die semantischen Embeddings, die eine vektorbasierte Suche ermöglichen. Die Datenhaltung ist dabei bewusst generisch: Ein Eintrag enthält Titel, Inhalt, Quelle, Embedding, Timestamp – aber keine spezialisierte LLM-Logik. Das erlaubt maximale Wiederverwendbarkeit für unterschiedliche Szenarien.Auf Applikationsebene kümmert sich .NET Core um die Orchestrierung: Texte einlesen, Embeddings erzeugen, Kontext aus MongoDB holen, Prompts formulieren und das Ergebnis mit dem Modell verarbeiten. Dieser Teil ist oft spezifisch für den jeweiligen Use Case. Ob Sie einen Chatbot bauen, ein FAQ-System oder ein intelligentes Autorentool – entscheidend ist, wie Sie mit den Texten und Suchergebnissen umgehen.Der vielleicht wichtigste Aspekt ist: Nicht jeder Fund aus der Vektor-Suche ist automatisch Kontext. Die Anwendung muss entscheiden, wie viele Textabschnitte verwendet werden, ob diese inhaltlich konsistent sind, ob es Wiederholungen gibt – und in welcher Form sie dem Sprachmodell präsentiert werden. Hierin steckt viel Logik, und genau hier zeigen sich die Stärken des .NET-Stacks: Klarer Code, ­typisierte Strukturen, flexible Templates.In diesem Beispiel verwenden wir ein einfaches Text-Template, um einen Prompt via OpenAI-API abzusetzen.

var userQuestion = "Wo finde ich den Hauptschalter?";
var contextChunks = results // Die BsonDocuments aus der 
    // Vektor-Suche
  .Select(doc =&gt; doc.GetValue("content", "").AsString)
  .ToList();
var contextBlock = string.Join("\n---\n", 
  contextChunks);
var finalPrompt = $@"
Sie sind ein technischer Assistent für den ACME 
  Kernfusions-Apparat.
Beantworten Sie die folgende Frage **ausschließlich** 
  basierend auf dem bereitgestellten Wissen.
Wissen:
{contextBlock}
Frage:
{userQuestion}
Antwort:"; 
Nachfolgend können wir diesen finalPrompt als Anfrage an unser LLM nutzen. Wichtig: Dies ist äußerst rudimentär. Kriterien wie Tonalität, Rollenverständnis oder gar Regeln, was zu beantworten ist oder eben nicht, sind hier nicht aufgeführt.

var chatRequest = new ChatRequest(
  new[]
  {
    new ChatMessage(ChatRole.System, "Sie beantworten 
      technische Fragen basierend auf bereitgestellten 
      Dokumenten."),
    new ChatMessage(ChatRole.User, finalPrompt)
  },
  model: "gpt-4"
);
var chatResponse = await openAiClient.ChatEndpoint.
  GetCompletionAsync(chatRequest);
Console.WriteLine("\nAntwort:\n" + 
  chatResponse.FirstChoice.Message.Content); 
Spätestens hier dürfte klar sein: In unserem Beispiel ist Open­AI/GPT „nur“ unser Gesprächspartner. Das Kontextwissen kommt aber vollständig aus unserer MongoDB-Datenbank und den entsprechenden Vektoren.Wir können hier die Suche nach geeigneten Informationen noch viel weiter aufziehen. Das ist auch genau das, was wir in KI-Projekten, die wir mit unseren Kunden umsetzen, zwingend tun müssen. Welche Informationen sind wichtig? Gibt es eine zweite Möglichkeit, wie zum Beispiel den Text-Index von MongoDB, um die Suchergebnisse vorab oder nachfolgend einzugrenzen? Gibt es vielleicht andere strukturierte ­Informationen, die wir nutzen können, und so weiter. Daher kann es sich empfehlen, Eigenschaften wie Tags zu hinterlegen oder auch durch ein LLM generieren zu lassen, um anhand einzelner Stichpunkte bessere Ergebnisse zu erzielen.

Und das Ganze im Microsoft-Universum?

Ja, wir müssen über Vendor-Lock-ins sprechen. Insbesondere in der aktuellen Zeit. Daher empfehle ich im Grunde, sich so generisch wie möglich aufzustellen, um einzelne Komponenten bei Bedarf einfach austauschen zu können. Der wichtigste Teil daran ist jedoch „wie möglich“: Diese Grundsituation ist nicht jedem möglich, und einige Unternehmen und Dienstleister sind nun mal aus unterschiedlichen Gründen an Microsoft gebunden. Sei es aus Lizenz- oder aus Partner-Gründen.Im Microsoft-Ökosystem entsteht derzeit eine Architekturplattform, die Unternehmen erlaubt, KI-Anwendungen produktiv, sicher und skalierbar umzusetzen – ohne fragmentierte Infrastruktur. Im Zentrum steht dabei das Zusammenspiel von drei Bausteinen: Azure OpenAI, MongoDB Atlas auf ­Azure und das Semantic Kernel Framework von Microsoft. Was früher aus einzelnen Tools manuell zusammengeführt wurde, ist heute als integrierbares System verfügbar.Azure OpenAI stellt GPT-Modelle wie gpt-4, gpt-35-turbo oder text-embedding-ada-002 als vollständig gemanagte Dienste bereit – inklusive Zugriffskontrolle über Azure ­Active Directory, Auditierung, Netzwerkisolation und Regionenauswahl. Damit lassen sich leistungsfähige LLM-Funktionali­täten direkt im eigenen Azure-Mandanten einsetzen, ohne die Daten jemals in externe Systeme zu schicken.Gleichzeitig ist MongoDB Atlas als nativer Azure-Dienst verfügbar. Über den Azure Marketplace lässt sich ein Mongo­DB-Cluster in wenigen Minuten in einer beliebigen Azure-Region aufsetzen. Die Abrechnung läuft über das Azure-­Konto, die Integration in Azure-Netzwerke, Monitoring und Security-Mechanismen (zum Beispiel Azure Key Vault oder Private Link) ist vollständig möglich. Damit wird Mongo­DB nicht als „externe NoSQL-Datenbank“, sondern als Erster-Klasse-Plattformbestandteil innerhalb Azure nutzbar.In dieser Kombination übernimmt MongoDB die Speicherung und semantische Aufbereitung der Daten: Dokumente, Metadaten, Embeddings – zentral, strukturiert und suchfähig. Azure OpenAI liefert daraufhin das Modell, das aus diesen Inhalten intelligente Antworten generiert. Dazwischen steht Semantic Kernel, Microsofts leichtgewichtiges Orchestrierungs-Framework, das klassische C#-Logik mit LLM-Funktionalitäten verbindet. Semantic Kernel bietet native Unterstützung für OpenAI und Azure OpenAI – und in Verbindung mit MongoDB sogar einen dedizierten Memory-Provider für Vektor-Suchen.Das Ergebnis: Entwickler können Anwendungen bauen, in denen GPT-Antworten auf Basis firmeneigener Inhalte generiert werden – gespeichert und semantisch indiziert in Mongo­DB, orchestriert über Semantic Kernel, ausgeliefert über Azu­re-Infrastruktur. Und das alles innerhalb eines konsistenten ­Sicherheits- und Identitätsmodells, ohne Integrationsbrüche.Für Organisationen, die bereits auf Azure setzen, ist das ein strategischer Vorteil: Sie können KI dort betreiben, wo auch ihre Daten, Anwendungen und Richtlinien leben. Und mit MongoDB und OpenAI als offizielle Azure-Partner wird aus Einzeltechnologien eine produktionsreife Plattform.

KI als Evolution im bestehenden Projekt

Stellen Sie sich vor, Sie betreiben bereits ein CMS oder ein internes FAQ-System auf Basis von .NET Core – vielleicht mit einer SQL-Datenbank, einem klassischen Admin-Interface und einem API zur Inhaltsbereitstellung. Diese Systeme erfüllen ihren Zweck, doch mit dem Aufkommen von LLMs und semantischer Suche wächst der Wunsch, Inhalte intelligenter zugänglich zu machen: etwa über Chatbots, semantische Suchfunktionen oder kontextabhängige Antwortvorschläge.Statt nun das gesamte System neu aufzusetzen, lässt sich der bestehende Stack schrittweise erweitern. Und genau hier spielt MongoDB seine Stärken aus. Denn anders als bei einer rela­tionalen Datenbank muss das bestehende Datenschema nicht vollständig neu gedacht werden – neue Felder wie Embeddings, thematische Tags oder Verarbeitungshistorien lassen sich einfach in das bestehende Dokumentmodell ergänzen.Einen FAQ-Eintrag etwa, der bisher in einer SQL-Tabelle oder einem JSON-Blob gespeichert wurde, speichert Mongo­DB als Dokument und erweitert ihn mit einem semantischen Vektor – ohne dass sich die ursprüngliche Inhaltsstruktur ändert. Das bestehende .NET-API bleibt erhalten, wird aber um eine neue Abfragelogik ergänzt: etwa einen Endpoint, der eine Nutzerfrage entgegennimmt, ein Embedding erzeugt oder MongoDBs Vector Store abfragt und passende Inhalte liefert.Das System bleibt in seiner Bedienung identisch – Admins pflegen Inhalte wie bisher, aber unter der Haube wächst das System zu einem echten KI-gestützten Backend heran. Auch die Integration mit Azure-Diensten ist nahtlos möglich: Die OpenAI-Modelle laufen direkt in der Cloud, MongoDB Atlas wird als Dienst in Azure betrieben, und bestehende Authentifizierung oder Monitoring bleiben intakt.So wird aus einem etablierten System keine Altlast, sondern ein Ausgangspunkt für echte Innovation – mit überschaubarem Aufwand und maximaler Wirkung.

Fazit: KI-Anwendungen erfordern mehr als eine ­technische Ansammlung von Komponenten

Die Umsetzung von KI-Anwendungen ist längst nicht mehr nur eine Frage der Technologie, sondern eine Frage der Architektur, des Verständnisses von Daten und der intelligenten Orchestrierung. Unternehmen, die heute auf LLMs setzen, benötigen mehr als nur ein Modell und ein API-Token. Sie müssen entscheiden, welche Informationen bereitgestellt werden, wie diese aufbereitet, gespeichert, durchsucht und kontrolliert verwendet werden. Ein Chatbot etwa, der technische Antworten liefern soll, benötigt nicht nur Zugriff auf passende Inhalte, sondern muss auch verstehen, welchen Kontext er verwenden darf – und welchen nicht. Wer hier rein auf Technologiekomponenten setzt, ohne das Zusammenspiel zu durchdringen, riskiert unpräzise Antworten, schlechte Nutzererfahrung oder schlicht nicht reproduzierbares Verhalten. Die Herausforderung ist heute: Wie bringe ich die richtigen Komponenten so zusammen, dass sie gemeinsam ein robustes System ergeben? Und genau hier müssen Architektur, Datenstrategie und KI-Kompetenz zusammenlaufen.MongoDB war lange Zeit ein Werkzeug für Entwickler, die schnelle Flexibilität suchten – heute ist es ein strategischer Baustein in modernen, verteilten KI-Systemen. Die enge Partnerschaft mit Microsoft und die tiefe Integration in Azure ­(inklusive Bereitstellung über den Marketplace, Support für Private Link, Azure AD und Atlas Vector Search) zeigen deutlich, dass MongoDB aus dem Spezialistenstatus herausgewachsen ist. Unternehmen aus Industrie, Gesundheitswesen, Finanzen oder SaaS bauen heute auf MongoDB, weil es nicht nur skaliert, sondern sich nahtlos in bestehende Cloud-Infrastrukturen einfügt. Die Fähigkeit, klassische Dokumente, strukturierte Daten und Vektorinformationen in ­einer Plattform zu vereinen, macht MongoDB zur idealen Daten­basis für KI-Projekte – nicht als reiner Speicher, sondern als aktiver Bestandteil intelligenter Architekturen.

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Bausteine guter Architektur - Entwurf und Entwicklung wartbarer Softwaresysteme, Teil 2
Code sauberer gestalten anhand von wenigen Patterns und Grundhaltungen.
6 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige