Connect with us

Entwicklung & Code

Die Produktwerker: Conversational AI – die Beziehung Mensch-Maschine gestalten


Was zeichnet gute Conversational AI eigentlich aus? Welche Prinzipen braucht es für eine gezielte Gestaltung? Darüber unterhalten sich Dominique Winter und Oliver Winter in dieser Folge des Podcasts. Sie klären, wie sich digitale Produkte verändern, wenn Sprache zur primären Schnittstelle wird. Denn sobald man sich mit Systemen unterhält, entsteht etwas, das weit über Funktion hinausgeht: Beziehung. Und diese will gestaltet sein.


Product Owner AI Day, Online-Konferenz am 6. November 2025

Product Owner AI Day, Online-Konferenz am 6. November 2025

(Bild: ipopba/stock.adobe.com)

Der Product Owner AI Day von iX und dpunkt.verlag zeigt dir am 6. November 2025, wie du als Product Owner, Product Managerin oder mit deinem Team KI konkret in deine Arbeit integrieren kannst – von der Discovery bis zum Rollout. Tickets sind zum Frühbucherpreis erhältlich.

Conversational AI ist dabei nicht einfach ein neues Interface. Sie bringt einen neuen Faktor in die Produktentwicklung. Früher waren digitale Produkte vor allem Werkzeuge – heute können sie zu Gesprächspartnern werden. Das verändert Erwartungen, Erleben und Verantwortung bei der Gestaltung. Wer mit Chatbots, Sprachassistenten oder GPT-Integration arbeitet, muss mehr tun als ein paar gute Prompts schreiben. Es geht um Haltung, Verhalten und Beziehung.

Doch dann stellt sich die Frage: Welche Rolle soll die Conversational AI im Produkt einnehmen? Ist sie ein einmaliger Helfer oder ein persönlicher Assistent? Entsteht eine flüchtige Begegnung oder eine langfristige Interaktion? Und wie spiegelt sich das in Sprache, Ton, Humor oder Autonomie wider? Dominique beschreibt, wie Werte und Prinzipien einer Organisation sich konkret in Conversational AI übersetzen lassen – über Tonalität, Reaktionen, Grenzen und Masterprompts.

Interessant ist dabei auch die Rückkopplung Mensch-Maschine, bei dem eine Conversational AI „lernt“, was Nutzerinnen und Nutzer wollen oder brauchen. Lernen ist dabei aber nicht nur Sache der Maschine, sondern auch die Teams hinter dem Produkt müssen beobachten, reflektieren und nachschärfen. Denn User geben Feedback – implizit, durch Nutzung, Sprache, Abbrüche oder Überraschung. Diese Rückmeldungen gilt es ernst zu nehmen. Wer sie ignoriert, verschenkt Entwicklungspotenzial.

Gleichzeitig braucht es Verantwortung. Technisch ist vieles möglich – doch nicht alles sinnvoll. Dark Patterns funktionieren auch in Sprachinterfaces. Doch wer Beziehung aufbauen will, braucht Vertrauen. Und wer Vertrauen will, muss Haltung zeigen. Auch das ist Teil von Conversational AI: ethische Klarheit, bewusste Gestaltung, respektvoller Umgang.

  • Dominique verweist einmal auf die Podcastfolge zum Decision Stack. Dabei bezieht er sich auf die Abhängigkeit von Unternehmenswerten und den Werten, die das Produkt zum Ausdruck bringt.
  • Oliver erwähnt die Folge der „Sendung mit der Maus„, die in sehr einfacher Form vermittelt, was wir heutzutage unter KI verstehen. Auch für Erwachsene sehenswert.

Die aktuelle Ausgabe des Podcasts steht auch im Blog der Produktwerker bereit: „Designprinzipien für Conversational AI„.


(mai)



Source link

Weiterlesen
Kommentar schreiben

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Entwicklung & Code

Datenparallele Typen in C++26: ein Beispiel aus der Praxis


Nachdem ich in meinem letzten Artikel Neuerungen in C++26: Datenparallele Typen (SIMD) eine theoretische Einführung in das neue Feature von C++ 26 gegeben habe, möchte ich heute mit einem praktischen Beispiel fortfahren.


Rainer Grimm

Rainer Grimm

Rainer Grimm ist seit vielen Jahren als Softwarearchitekt, Team- und Schulungsleiter tätig. Er schreibt gerne Artikel zu den Programmiersprachen C++, Python und Haskell, spricht aber auch gerne und häufig auf Fachkonferenzen. Auf seinem Blog Modernes C++ beschäftigt er sich intensiv mit seiner Leidenschaft C++.

Das folgende Einführungsbeispiel stammt aus der experimentellen Implementierung der SIMD-Bibliothek. Diese Funktionalität wurde unter dem Namen „Data-parallel types (SIMD)“ vollständig in den Entwurf für C++ 26 übernommen. Um das Programm auf den C++ 26-Standard zu portieren, sollte es ausreichen, den Header durch und den Namespace std::experimental durch std::datapar zu ersetzen.


#include 
#include 
#include 
namespace stdx = std::experimental;
 
void println(std::string_view name, auto const& a)
{
    std::cout << name << „: “;
    for (std::size_t i{}; i != std::size(a); ++i)
        
std::cout << a[i] << ‚ ‘;
    std::cout << ‚\n‘;
}
 
template
stdx::simd my_abs(stdx::simd x)
{
    where(x < 0, x) = -x;
    return x;
}
 
int main()
{
    const stdx::native_simd a = 1;
    println(„a“, a);
 
    const stdx::native_simd b([](int i) { return i - 2; });
    println(„b“, b);
     
const auto c = a + b;
    println(„c“, c);
 
const auto d = my_abs(c);
println(‚d‘, d);
 
const auto e = d * d;
println(„e“, e);
     
const auto inner_product = stdx::reduce(e);
    std::cout << „inner product: “ << inner_product << ‚\n‘;
 
const stdx::fixed_size_simd x([](int i) { return i; });
println(„x“, x);
    
println(„cos²(x) + sin²(x)“, stdx::pow(stdx::cos(x), 2) + stdx::pow(stdx::sin(x), 2));
}


Bevor ich mit dem Programm fortfahre, möchte ich die Ausgabe vorstellen.


Screenshot der Ausgabe

Screenshot der Ausgabe

Ausgabe des Beispielcodes

(Bild: Screenshot (Rainer Grimm))

Zuerst möchte ich mich den Funktionen println und my_abs widmen. println gibt den Namen und den Inhalt eines SIMD-Vektors aus und durchläuft dabei dessen Elemente. my_abs berechnet den Absolutwert jedes Elements in einem SIMD-Vektor mit Ganzzahlen und verwendet dabei where, um negative Werte bedingt zu negieren. Deutlich interessanter ist die main-Funktion.

Bei dem SIMD-Vektor a wird jedes Element auf 1 gesetzt, hingegen wird bei dem SIMD-Vektor b dank der Lambda-Funktion jedes Element so initialisiert, dass dieses seinen Index minus 2 besitzt. Dabei kommen per Default durch const stdx::native_simd SSE2-Instruktionen zum Einsatz. Diese SIMD-Vektoren sind 128 Bit groß.

Nun beginnt die Arithmetik. Vektor c ist die elementweise Summe von a und b, d ist der elementweise absolute Wert von c und der Vektor e ist das elementweise Quadrat von d. Zuletzt kommt stdx::reduce(e) zum Einsatz. Dabei wird der Vektor e auf seine Summe reduziert.

Besonders interessant ist der Ausdruck const stdx::fixed_size_simd x([](int i) { return i; }). Durch ihn wird der SIMD-Vektor x mit 16 long-double-Werten von 0 bis 15 initialisiert. Das ist möglich, wenn die Hardware hinreichend modern ist und AVX-252 unterstützt, beispielsweise mit Intels Xeon-Phi- oder AMDs Zen-4-Architektur.

Ähnlich interessant ist die Zeile println("cos²(x) + sin²(x)", stdx::pow(stdx::cos(x), 2) + stdx::pow(stdx::sin(x), 2)). Sie berechnet cos²(x) + sin²(x) für jedes Element, was aufgrund der trigonometrischen Identität des Pythagoras für alle Elemente 1 ist. Es gilt, dass alle Funktionen in außer den speziellen mathematischen Funktionen für simd überladen sind. Dies sind zum Beispiel die grundlegenden Funktionen wie abs, min oder max. Aber auch zum Beispiel exponentielle, trigonometrische, hyperbolische, Potenz- oder Gamma-Funktionen lassen sich direkt auf SIMD Vektor anwenden.

Nun möchte ich noch auf die Breite des Datentyps simd genauer eingehen.

Die Breite des Datentyps native_simd wird durch die Implementierung zur Compile-Zeit bestimmt. Im Gegensatz dazu gibt der Entwickler die Breite des Datentyps fixed_size_simd vor.

Das Klassen-Template simd besitzt folgende Deklaration:


template< class T, class Abi = simd_abi::compatible >
class simd;


Dabei steht T für den Elementtyp, der nicht bool sein kann. Durch den Abi-Tag wird die Anzahl der Elemente und deren Speicher bestimmt.

Zu diesem Klassen-Template gibt es zwei Aliase:


template< class T, int N >
using fixed_size_simd = std::experimental::simd>;
template< class T >
using native_simd = std::experimental::simd>;


Folgende ABI-Tags stehen zur Verfügung:

  • scalar: Speicherung eines einzelnen Elements
  • fixed_size: Speicherung einer bestimmten Anzahl von Elementen
  • compatible: gewährleistet ABI-Kompatibilität
  • native: am effizientesten
  • max_fixed_size: maximale Anzahl von Elementen, die garantiert von fixed_size unterstützt werden

Nach diesem ersten Beispiel zu datenparallelen Typen möchte ich im nächsten Artikel genauer auf deren Funktionalität eingehen.


(rme)



Source link

Weiterlesen

Entwicklung & Code

IT-Personalbedarf wird mehr und mehr aus dem Ausland gedeckt


Im vergangenen Jahr waren in Deutschland rund 1,52 Millionen Menschen in Informatik- sowie Informations- und Kommunikationstechnologieberufen beschäftigt. Dies entspricht einem Anstieg um vier Prozent gegenüber dem Vorjahr, wie die Bundesagentur für Arbeit in Nürnberg mitteilt.

Das Wachstum basiere vor allem auf einem Anstieg der sozialversicherungspflichtigen Beschäftigung, die seit dem Jahr 2014 um rund 70 Prozent beziehungsweise 463.000 Personen zugenommen habe. Ausländische Fachkräfte spielten dabei eine immer bedeutendere Rolle. Im Jahr 2024 hatten rund 165.000 Beschäftigte in IKT-Berufen keine deutsche Staatsangehörigkeit. Damit habe ihr Anteil bei 15 Prozent aller sozialversicherungspflichtig Beschäftigten in diesem Bereich gelegen.

Besonders deutlich sei der Zuwachs bei Personen aus Indien, der Türkei, Russland, der Ukraine sowie aus den acht Haupt-Asylherkunftsländern. Insgesamt rund 15.000 der ausländischen IKT-Beschäftigten besaßen im Jahr 2024 eine dieser Staatsangehörigkeiten, vor allem aus dem Iran (5.000), Pakistan (4.000) und Syrien (3.000).

Trotz des Beschäftigungswachstums sei die Zahl der neu gemeldeten Stellen im Jahr 2024 auf rund 44.000 zurückgegangen, ein Minus von 24 Prozent im Vergleich zum Vorjahr. Gründe seien die konjunkturelle Schwäche sowie ein struktureller Wandel in der Branche.

Besonders in der Softwareentwicklung bestünden weiterhin Fachkräfteengpässe. „Berufe in der Informations- und Kommunikationstechnologie entwickeln sich rasant, was hohe Anpassungsfähigkeit und kontinuierliche Weiterbildung erfordert“, betonte die Vorstandsvorsitzende der Bundesagentur, Andrea Nahles. Insbesondere im Bereich der Künstlichen Intelligenz sei ein sehr dynamischer Fortschritt zu beobachten.

Nahles betont zudem die Bedeutung einer stärkeren Beteiligung von Frauen: Der Anteil weiblicher Beschäftigter in der IKT liegt derzeit bei nur 18 Prozent. Auch im Bereich Ausbildung und Studium wächst die Zahl der Nachwuchskräfte. So waren im Studienjahr 2023/2024 etwa 258.000 Studierende im Bereich Informatik eingeschrieben – ein Zuwachs von 42 Prozent seit 2013. Der Frauenanteil stieg leicht auf 22 Prozent.


(mho)



Source link

Weiterlesen

Entwicklung & Code

Neu in .NET 9.0 [27]: Erweiterter Zugriff über Wrapper-Klassen


Der Zugriff auf nicht-öffentliche Mitglieder einer Klasse über eine Wrapper-Klasse („Accessor“), die [UnsafeAccessorAttribute] nutzt, wurde in .NET 8.0 eingeführt.


Der Dotnet-Doktor – Holger Schwichtenberg

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Nun funktioniert das auch mit generischen Parametern:


using System.Runtime.CompilerServices;
 
namespace NET9_Console.FCL90_UnsafeAccessor;
/// Der Zugriff auf nicht-öffentliche Mitglieder einer Klasse über eine Wrapper-Klasse, die [UnsafeAccessorAttribute] nutzt, wurde in .NET 8.0 eingeführt. Neu in .NET 9.0: Nun funktioniert dies auch mit generischen Parametern.
 
/// 
/// Eine Klasse mit zwei privaten Mitgliedern, die wir über UnsafeAccessorAttribute von Außen nutzen wollen
/// 
/// 
public class Printer
{
 private T _data = default;
 private void Print(PreTextType preText) { CUI.Green(preText.ToString()); Console.WriteLine(_data.ToString()); }
 public override string ToString()
 {
  return "Data=" + (_data?.ToString() ?? "(leer)");
 }
}
 
/// 
/// Accessor für Printer, um auf private Mitglieder zugreifen zu können
/// 
class PrinterAccessor
{
 [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_data")] // Zugriff auf das private Feld
 public extern static ref T GetSetPrivateField(Printer p);
 
 [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "Print")] // Zugriff auf die private Methode
 public extern static void CallPrivatePrint(Printer p, PreTextType preText);
}
 
/// 
class Client
{
 public void Run()
 {
  CUI.Demo(nameof(FCL90_UnsafeAccessor));
 
  CUI.H2("Erzeuge das Objekt mit den privaten Mitgliedern");
  Printer printer = new Printer();
  Console.WriteLine("Vorher:\n" + printer.ToString());
 
  // Zugriff auf das Objekt via Accessor
  CUI.H2("Setzen eines privaten Feldes");
  ref Consultant data = ref PrinterAccessor.GetSetPrivateField(printer);
  data = new Consultant() { ID = 42, FullName = "Dr. Holger Schwichtenberg", PersonalWebsite = "www.dotnet-doktor.de", Address = new Address() { City = "Essen" }, Languages = ["C#", "VB.NET", "JavaScript/TypeScript"] };
  CUI.Success("Wert für Private Field gesetzt!");
  Console.WriteLine("Kontrolle über Zugriff auf das öffentliche ToString():\n" + printer.ToString());
 
  // Methode aufrufen
  CUI.H2("Aufruf einer privaten Methode mit generischen Parametern: CallPrivatePrint()");
  PrinterAccessor.CallPrivatePrint(printer, "Sie werden beraten von:");
 }
}



Ausgabe des Listings

Ausgabe des Listings

Die Ausgabe des Listings zeigt den Zugriff über die Wrapper-Klasse.

(Bild: Screenshot (Holger Schwichtenberg))


(rme)



Source link

Weiterlesen

Beliebt