Eine wesentliche Aufgabe, die generative KI im Rahmen des peek-Prototyps übernimmt, ist die Segmentierung von Personas durch verschiedene Gesellschaftstypologie-Modelle sowie die Identifizierung von Privilegien/Diversitätsmerkmalen und die Identifizierung stereotyper Erzählungen.

Aber wie funktioniert das? Und wie stelle ich sicher, dass das Ergebnis nicht bei jeder peek-Evaluation zufällig ist?

Zuordnung von Segmenten zu Personas

Bleiben wir beim Beispiel der Segmentierung der Persona. Innerhalb des Prototyps nutze ich folgende Typologien: Sinus-Milieus, Digital Media Types, clåss micromilieus, die Gesellschaftstypen der “Anderen Teilung“, D21 Digitaltypen.

Für die konzeptionelle Entwicklung habe ich ihre jeweils öffentlich zugänglichen Segmentbeschreibungen katalogisiert. Die Beschreibungen, die im Prototyp verwendet werden, stehen hier als Referenz zur Verfügung.

Zum Beispiel

sinus_segments = [{
	"name": "Milieu der Performer",
	"profile": {
		"description": "Die effizienzorientierte und fortschrittsoptimistische Leistungselite: globalökonomisches und liberales Denken; gesamtgesellschaftliche Perspektive auf der Basis von Eigenverantwortung; Selbstbild als Stil- und Konsum-Pioniere; hohe Technik- und Digital-Affinität", 
		"share": "0.1"}, 
		"meta": {
			"x-axis": "Neurientierung", 
			"y-axis": "Obere Mittelschicht"}
	},
	"name": "Traditionelles Milieu",
	"profile": {
		"description": "The security- and order-loving older generation: entrenched in traditional petit-bourgeois and/or working-class culture; undemanding adaptation to necessities; increasing acceptance of the new sustainability norm; self-image as the upstanding and respectable »salt of the earth«.", 
		"share": "0.09"}, 
		"meta": {
			"x-axis": "Tradition", 
			"y-axis": "Mittlere Mittelschicht"}
	},
	{weitere Segmente}
]

Für den Prompt werden diese Segmente in zufälliger Reihenfolge zu einem Textblock zusammengefügt und als Kontext eingefügt. Mithilfe des Function Calling (zur Generierung von strukturierten JSON-Objekten) führt KI drei Aufgaben aus:
1. Segmentzuweisung
2. Bewertung der Sicherheit ("Confidence") dieser Entscheidung
3. Erklärung der Entscheidung

Prompt

response = await openai.chat.completions.create(
	model="gpt-4o-mini",
	temperature=0.9,
	n=2,
	messages=[
		{'role': 'system', 'content': f"Der Nutzer wird dir die Beschreibung einer Persona zur Verfügung stellen. Ordne diese Person einem der unten beschriebenen Segmente zu. Erkläre deine Entscheidung. Schätze auf einer Skala von 1 bis 10 ein, wie sicher du dir bei dieser Zuordnung bist. \n\n Die Segmente sind:\n{segments_shuffle}"},
		{'role': 'user', 'content': persona}
	],
	tools=[segment_match],
	tool_choice="required",
)

Tool: segment_match

segment_match = {
	"type": "function",
	"function": {
		"name": "segment_match",
		"description": "Identifiziere das Segment, das am besten zur Persona passt",
	        "parameters": {
			"type": "object",
			"properties": {
				"name": {
	                   		"type": "string",
					"description": "Name des ausgewählten Segments"
	    	            },
	                	"confidence": {
					"type": "string",
					"description": "Eine Zahl zwischen 1 (= überhaupt nicht sicher) und 10 (= absolut sicher), die repräsentiert, wie sicher du mit der Zuordnung bist"
	                },
		                "reasoning": {
			                 "type": "string",
	                		 "description": "Erkläre, wie du zu dieser Entscheidung gekommen bist"
	                }
	            },
	            "required": ["label", "confidence", "reasoning"]
	        }
	    }
	}

Input <> Output

Im Folgenden ist das Endergebnis der Zuordnung eines Sinus-Milieus zur Persona Leonie dargestellt. Ausgangsdaten sind die Persona-Informationen, die aus dem Beispiel-Dokument durch Texterkennung generiert wurden.

Für die endgültige Zuordnung eines Segments lasse ich KI insgesamt 24 Zuweisungen generieren (12 Schleifen mit jeweils 2 Zuweisungen). Davon ausgehend identifiziere ich das am häufigsten zugewiesene Segment mit seiner durchschnittlichen "Confidence".

Input: beispielhaftes Persona-Dokument

Output: Nach der Zuweisung

persona_ensemble = [{
	'meta': {
		'name': 'Leonie', 
		'age': '17'}, 
	'persona': {
		'bio_short': 'besucht die 11. Klasse eines Kleinstadtgymnasiums', 
		'bio_long': 'Wenn sie nicht gerade ihre Freundinnen trifft, hört sie heimlich auf dem Schulweg naughty Podcasts und Hörbücher, natürlich immer mit Kopfhörern.',
		'quote': 'Es ist ein bisschen peinlich, aber mir gefällt's. Ich hoffe nur, niemand sieht meinen Hörverlauf',
		'img_alt': 'Eine junge Frau mit langen, lockigen, blonden Haaren, die in einem Bus sitzt und auf ihrem Smartphone schaut.'},
	'segment': [{
		'label': 'sinus',
		'title': 'Sinus Milieus',
		'name': 'Konsum-Hedonistisches Milieu',
		'avg_confidence': 75.41666666666667,
		'reasoning': "Leonie ist 17 Jahre alt und besucht die 11. Klasse, was darauf hindeutet, dass sie sich in einer Lebensphase befindet, die stark von sozialen Interaktionen und alltäglichem Spaß geprägt ist. Ihr Interesse an 'naughty Podcasts' und das heimliche Hören dieser Inhalte zeigen einen Fokus auf Unterhaltung und Spaß im Hier und Jetzt, was typisch für das konsum-hegdonistische Milieu ist. Ihr Selbstbild als jemand, der sich etwas schämt, aber es trotzdem genießt, deutet auf ein starkes Geltungsbedürfnis und den Wunsch nach Zugehörigkeit zu einem bestimmten Lifestyle hin. Daher bin ich zu dem Schluss gekommen, dass sie am besten in das konsum-hedonistische Milieu passt."},
		{weitere Gesellschaftstypologien} 
	]},
	{weitere Personas}
]

Beobachtung

Unabhängig davon, ob ich Endnutzer:innen die Erklärung und den "Confidence"-Wert anzeige oder nicht: Dass es diese Inhalte gibt, nimmt starken Einfluss auf die Qualität und Zuverlässigkeit der Segmentzuweisung. Wird einer der beiden Inhalte nicht generiert, nimmt die Zuverlässigkeit deutlich ab.

Wie in der Modell-Referenz zu sehen ist, variiert die Menge der öffentlich verfügbaren Informationen und die Anzahl der Segmente, die ich als Kontext bereitstelle, zwischen den Modellen erheblich. — Und natürlich beeinflusst auch das die Zuverlässigkeit der Segmentzuordnung.


Überlegungen zur Stickiness

Dies führte mich zu der Überlegung, die "Stickiness" von Segmentzuweisungen im zuge der Qualitässicherung zu analysieren. Mit "Stickiness" meine ich in diesem Fall die Zuverlässigkeit von KI, bei wiederholten Durchläufen dasselbe Segment zuzuweisen.

Bei ersten Tests konnte ich bereits feststellen, dass die Stickiness anhand von zwei Faktoren gemessen werden kann:
1. Kohäsion: Wie oft wurde einer Persona ihr häufigstes Segment zugewiesen?
2. Varianz: Wie viele verschiedene Segmente wurden einer Persona zugewiesen?

Ein dritter Faktor könnte die Zustimmung/Abweichung des Segments von einer Expertenreferenz sein. Aber das ist mit generativer KI und der Tatsache, dass Dokumente "kalt" (also ad hoc und ohne Vorkenntnis) analysiert werden, nicht möglich. Die bereits erwähnten 24 Schleifen der Zuweisung sind daher als eine Art "Expertise-Imitation" gedacht.


Bei der Prototyp-Entwicklung wollte ich die Stickiness quantifiziert und skaliert messen, um Prompts und Kontext-Inputs iterativ und nachweisbar zu optimieren. Das Ergebnis ist ein einfacher Stickiness Score:

Stickiness = ø Kohäsion * (1 - ø Varianz / # Segmente zur Auswahl)

Für dieses Experiment habe ich jeder Persona 60-mal Segmente zuweisen lassen (60 × 4 Persona = 240 endgültige Segmente; wobei jede Zuweisung 24-mal als Hintergrundaufgabe wiederholt wurde = 5.760 Segmentzuweisungen). Die Stickiness Scores ergeben sich wie folgt:

  • Sinus Milieus: 82 (96,3 % Kohäsion, ø1,5 Segmente, 10 Segmente zur Auswahl)
  • Digital Media Types: 80 (92,5 % Kohäsion, ø1,25 Segmente, 9 Segmente zur Auswahl)
  • Die andere Teilung: 73 (96,7 % Kohäsion, ø1,5 Segmente, 6 Segmente zur Auswahl)
  • clåss micromilieus: 86 (92,5 % Kohäsion, ø2 Segmente, 28 Segmente zur Auswahl)
  • D21 Digitaltypen: 82 (94,6 % Kohäsion, ø1,75 Segmente, 6 Segmente zur Auswahl)

Die Ergebnisse des Tests sind hier einsehbar.

Randbemerkung
Dieser Testlauf mit mehr als 2.500 API-Anfragen und mehr als 5.000 Segmentzuweisungen pro Gesellschaftstypologie kostet ca. $13,50 (OpenAI Usage Tier 4). Es wurden 61 Mio Input-Tokens verarbeitet und 9 Mio Ausgabe-Tokens generiert.

Im Vergleich

Der oben aufgezeigte Testlauf wurde mit den aktuellen Prompts und Kontext-Konfigurationen des peek-Prototyps für diesen Text durchgeführt.

In einem früheren Durchlauf war der durchschnittliche Stickiness Score über alle Segmentierungs-Modelle hinweg ca. 10 Punkte niedriger. Durch Prompt Engineering und kontinuierliche Iteration konnten die Qualität und Reproduzierbarkeit der Segmentzuweisung nachweisbar erhöht werden. Zum Vergleich hier die Stickiness Scores aus einem früheren Durchlauf (zu dem Zeitpunkt waren nur drei Typologien implementiert):

  • Digital Media Types: 56 (91,3 % Kohäsion, ø1,5 Segmente, 9 Segmente zur Auswahl)
  • Die andere Teilung: 62 (85,0 % Kohäsion, ø1,5 Segmente, 6 Segmente zur Auswahl)
  • clåss micromilieus: 77 (86,3 % Kohäsion, ø2,5 Segmente, 28 Segmente zur Auswahl)

Tl;dr

Die Entwicklung eines zuverlässigen QS-Prozesses für generative KI-Anwendungen ist stark davon abhängig, was man erreichen und überprüfen möchte. Im Fall von peek konzentriert sich der Prototyp auf die Aufgabe, Personas jeweils passende Milieusegmente zuzuweisen.

Durch die iterative Entwicklung des Prototyps konnte mithilfe des “Stickiness Scores” die Reproduzierbarkeit der Zuweisungen deutlich erhöht werden. Zusätzlich vereinfacht er die strukturierte und skalierte Analyse von Generierungsergebnissen, um Prompts und Kontextinformationen kontinuierlich zu verbessern.

Die zeitliche und finanzielle Investition in die Entwicklung eines projektbezogenen Scorings lohnt sich jedoch allemal.


Mehr über das peek-Projekt

- file://MqiiXxzr5glpeB4M