<

Classificazione di relazione tra post types tramite intelligenza artificiale

Ultima modifica: 25 Maggio 2026

Questo snippet serve come base di lavoro pre costruita per lavorare con il Gpci framework e operazioni di massa su posts basate su intelligenza artificiale. Ci sono svariati approcci che sarebbe possibile prendere, questo è uno di quelli che dovrebbe essere più semplice da capire e riutilizzare in altri contesti.

Condizioni correnti

  • svariati esercizi (post type esercizio) con tags assegnati
  • i tags rappresentano schemi grammaticali di cui in seguito sono state create pagine descrittive (post type schema-grammaticale)

Da fare

  • assegnare relazione (id esercizio-a-schema) a ogni esercizio verso uno o più schemi grammaticali
  • rimuovere i tags migrati
  • gli schemi grammaticali corretti saranno valutati da OpenAI tramite api php

Creare conversazione

La prima cosa da fare è creare una conversazione vuota che conterrà il ruolo dell'AI e gli schemi grammaticali:

  1. creare una nuova azione ajax (azione a chiamata) dalla pagina impostazioni dedicata
  2. utilizzare il seguente codice php:
$response = AiAction( $action='create_conversation', $ai=[ 'provider'=>'OpenAI', 'api_key'=>'stringa_api_key' ], $args=[ 'body'=>[ 'metadata'=>[ 'topic'=> 'Schemi grammaticali' ] ] ] );
return $response;
  1. eseguire utilizzando il pulsante
  2. copiare l'id conversazione e salvarlo da qualche parte (documento o campo pagina impostazioni, ecc...)

Assegnare il ruolo

La seconda cosa da fare è assegnare il ruolo all'AI per dare un contesto di base sul suo ruolo:

  1. eliminare le istruzioni php precedenti oppure creare una nuova azione ajax (azione a chiamata)
  2. utilizzare il seguente codice php:
$input_content = [];
$input_content[]=[ 'type' => 'input_text', 'text' => 'Sei un insegnante di grammatica italiana. Questi che ti allego sono tutti schemi grammaticali di grammatica italiana. Ti dirò in seguito cosa fare in base a questi schemi. Rispondi solo OK se hai capito.' ];

$body = [
	//'model' => 'gpt-5.4-mini',
	'conversation' => 'id_conversazione',
	'input' => [
		[
			'role' => 'system',
			'content' => $input_content
		]
	]
];

$response = AiAction( $action='create_response', $ai=[ 'provider'=>'OpenAI', 'api_key'=>'stringa_api_key' ], $args=[ 'body'=>$body ] );

//la risposta dovrebbe essere solo OK ma poco importa ancora
  1. eseguire utilizzando il pulsante

Inviare gli schemi grammaticali

La terza cosa da fare è inviare tutti gli schemi grammaticali (sono circa 40 quindi tutti insieme non è un problema). L idea qui è inviare gli schemi per usarli come base dati, quindi le istruzioni non saranno specificate qui ma in seguito. In questo modo la base dati sarà aggiornabile inviando nuovi schemi cambiando semplicemente i parametri della query inoltre sarà possibile effettuare più azioni sulla base dati anche decise in seguito.

  1. creare una nuova azione ajax (azione da query) e configurare con:
    post_type: schema_grammaticale
    post_status: published
    paginazione: -1 (oppure un po per volta aiutandosi con offset se si preferisce fare qualche prova prima)
  2. utilizzare il seguente codice php:
$ID = get_the_ID();
$title = get_the_title( $ID );
$excerpt = get_the_excerpt( $ID );
$content = get_post( $ID )->post_content;
$content = GetField( "content,$ID" );  //converte già i blocchi gutenberg a html
$content = HtmlAction( $action='convert_to_text_readable', $content, [ 'query'=>'*' ] );

$text = "Schema ID: $ID\n";
$text.="Titolo: $title\n";
$text.="Descrizione: $excerpt\n";
$text.="Contenuto:\n";
$text.="$content";

$input_content = [];
$input_content[]=[
	'type' => 'input_text',
	'text'=>$text
];
$input_content[]=[ 'type'=>'input_text', 'text'=>'Rispondi solo OK.' ];

$body = [
	'conversation' => 'id_conversazione',
	'input' => [
		[
			'role' => 'user',
			'content' => $input_content
		]
	]
];

$response = AiAction( $action='create_response', $ai=[ 'provider'=>'OpenAI', 'api_key'=>'stringa_api_key' ], $args=[ 'body'=>$body ] );
return "Inviato schema: $title";
  1. eseguire utilizzando il pulsante

Dovrebbero ritornare i titoli di tutti gli schemi inviati.

Collegare esercizi agli schemi grammaticali

Ora rimane solo l'ìimpostazione della relazione tra i 2 post types ma invece di dovere decidere noi ogni esercizio faremo decidere all'intelligenza artificiale tutto quello che riuscirà a fare. L'idea qui è inviare un esercizio per volta ma non verrà memorizzato nella conversazione degli schemi cosi sarà possibile tenere questa query separata dal resto per qualsiasi azione futura e per poter ripetere questa ad ogni nuono esercizio.

  1. creare una nuova azione ajax (azione da query) e configurare con:
    post_type: esercizio
    post_status: published
    paginazione: 50 ma si puo salire cambierà solo il tempo di attesa
  2. utilizzare il seguente codice php:
$ID = get_the_ID();
$title = get_the_title();

$guida_esercizio = GetField( 'guida-esercizio' ) ?? '';

//questo blocco  personalizzato solo per questo contesto per inviare l esercizio da compilare e la versione con soluzione
$content = GetField( 'content' );
$content_da_compilare = HtmlAction( $action='convert_to_text_readable', $content, [ 'query'=>'*' ] );
$content = preg_replace(  '/<input\b[^>]*\bdata-soluzione\s*=\s*["\']([^"\']*)["\'][^>]*>/i', '$1', $content );
$content_con_soluzioni = HtmlAction( $action='convert_to_text_readable', $content, [ 'query'=>'*' ] );

$input_content = [];
$input_content[]=[
	'type' => 'input_text',
	'text' => "Task:
scegli lo schema grammaticale più appropriato per questo esercizio usando gli schemi disponibili nel contesto.

Criteri di scelta, in ordine di priorità:
1. Titolo dello schema
2. Guida esercizio
3. Contenuto dello schema

Output consentito:
- solo l'ID esatto dello schema, esempio: 6952
- oppure esattamente: NO

Non scrivere altro."
];
$input_content[]=[
	'type' => 'input_text',
	'text' => "Esercizio:
- titolo esercizio: $title
- guida esercizio: $guida_esercizio
- contenuto esercizio da compilare:
$content_da_compilare

- contenuto esercizio con soluzioni:
$content_con_soluzioni"
];

$body = [
	'conversation' => 'id_conversazione',
	'store' => false,  //indispensabile affinche alla conversazione non vengano aggiunti gli esercizi
	'input' => [
		[
			'role' => 'user',
			'content' => $input_content
		]
	]
];

$response = AiAction( $action='create_response', $ai=[ 'provider'=>'OpenAI', 'api_key'=>'stringa_api_key' ], $args=[ 'body' =>$body, ] );
$response_text = $response['output'][0]['content'][0]['text'] ?? null;

$titolo_schema_impostato = '';
if( is_numeric( $response_text ) ){
	$id_schema = (int)$response_text;
	PostAction( 'add_relationship', [ 'relationship_id'=>'esercizio-a-schema', 'from'=>$ID, 'to'=>$id_schema, 'from_to'=>true ] );
	$titolo_schema_impostato = get_the_title($id_schema) ?? 'nessuno';
}
$response = [ 'titolo_esercizio'=>$title, 'id_esercizio'=>$ID, 'id_schema_impostato'=>$response_text, 'titolo_schema_impostato'=>$titolo_schema_impostato ];
return $response;

Note e conclusioni

Il risultato in questo caso è stato piuttosto soddisfacente, ho comunque dovuto eseguire invii multipli in quanto l'AI al primo invio non riusciva a classificare tutti gli esercizi. Dopo altri tentativi man mano è riuscita a classificare quasi tutto...la ragione? Non ne sono sicuro: gli invii sono stati fatti separatamente ma con chiamate ajax praticamente simultanee; forse inviando esercizi simili molto vicini il risultato migliora per il contesto e forse allungando la distanza delle chiamate ajax potrebbe anche. In tutti i casi come aiuto è stato sicuramente buono (e può fare risparmiare molto tempo) e come pattern dovrebbe essere piuttosto semplice e comprensibile per essere adattato ad altre situazioni. A questo punto si potrebbe far collegare automaticamente a tutti i nuovi esercizi lo schema che l'AI ritiene più idoneo tramite un hook di salvataggio oppure ogni tot tempo, ma questo farà parte piuttosto di un altro pattern.