Conținut cu AI în Wordpress Conținut cu AI în Wordpress

Conținut cu AI în WordPress

În acest articol vom discuta despre generarea de conținut cu AI în website-urile WordPress. Tentația de a automatiza totul este mare, dar trebuie să ținem cont de câteva aspecte esențiale.

1. Introducere

La o simplă căutare pe Google a temenilor „generate content with AI” am găsit numeroase pagini sunt pline de reclame la platforme care fac acest lucru de la cap la coadă.

Problema este cu adevărat gravă pentru că se estimează ca 57% din conținutul text de pe internet este generat în întregime sau tradus prin algoritmi AI. Ce mai este real? Ce mai este corect? Cât suntem de manipulați având în vedere că AI-ul a depășit sfera divertismentului și acum intră puternic peste tot, inclusiv în învâțământ? Cum se va putea dezvolta AI-ul pe mai departe ținând cont că pentru antrenare AI-ul folosește date disponibile în surse publice și private sau seturi de date sintetice.

Dacă o greșeală este introdusă intenționat sau nu într-un algoritm el o va perpetua la nesfărșit.

Mai există câteva aspecte care țin de felul cum sunt construite sistemele AI generative. Răspunsurile lor sunt predictive – respectiv cel mai bun răspuns posibil la instrucțiunea / promptul dat. Dacă sisteme de corecție nu funcționează sau promptul este greșit, modelul LLM va începe să halucineze înventând informații care nu sunt reale, doar pentru a fi pe placul utilizatorului. De asemenea, modelele AI folosesc doar datele care sunt puse la dispoziția lor în momentul antrenării, astfel încât nu cunosc detaliile mai recente.

Ca analogie, imaginați-vă un model AI precum un copil care tocmai a terminat clasa a 4-a. El a fost învâțat la școală unele lucruri, dar nu are capacitatea de a stoca 1:1 informația, ci doar o corelează. El nu are voință proprie, ci doar răspunde la comenzile noastre.

Dacă îl vom pune să spună tabla înmulțirii el va folosi regulile învâțate deja: 3×3 este 3 + 3 +3 =9, fâră a înțelege semnificația termenilor folosiți.

Dacă îl vom pune să spună cine este Ștefan cel Mare el va căuta informații legate de personalități istorice și va răspunde cu ele, dar dacă îl vom întreba cum trâiau oamenii pe timpul lui Ștefan cel Mare și el nu a fost învâțat despre transformările societâților în timp, el va presupune că acei oameni trăiau cam ca acum – și să ofere informații greșite.

Un alt aspect important este fereastra de context de care dispune modelul LLM. Aceasta se referă la un număr de tokeni – ideea principală – pe care modelul o păstrează și în jurul câreia generează răspunsul. E foarte posibil ca uneori tema subiectului să depășească această fereastră de context și modelul sâ înceapă să discute alte subiecte nerelevante utilizatorului.

Modelele AI nu sunt egale cu oamenii în prezent, nu reacționează ca oamenii și vor da răspunsuri în funcție doar de cunoștințele pe care le au și de instrucțiuni.

2. Soluții pentru generarea de conținut corect cu ajutorul AI-ului.

Concluzia trasă după aceste elemente introductive este că pentru a obține un conținut corect și coerent va trebui să nu ne bazăm doar pe întrebări și răspunsuri, ci să punem la dispoziția modelelor AI generative informații relevante la subiectul despre care dorim să scrie.

RAG (retrieval-augmented generation) este o gamă de tehnice generative care au scopul de a crește acuratețea și corectitudinea modelelor AI prin folosirea unor surse de date externe modelului. Cu alte cuvinte, sursele de informații externe completează înformațiile generale cu care modelul AI a fost antrenat.

Imaginați-vâ în exemplul anterior, câ înainte să întrebăm modelul LLM despre viața oamenilor din anii 1480 i-am pune la dispoziție 10 cârți, din care 6 sunt tratate istorice și 4 sunt romane de aventuri care se axează pe personaje și interacțiunle acestora cu lumea imaginată de autori.

Modelul LLM va putea dispune atât de informații reale (tratatele istorice), cât și de informații fictive cu viziuni diferite (romanele de aventuri), dar și de informațiile cu care a fost antrenat și va putea genera un răspuns concludent și unul generalist.

Atenție, multe platforme permit încărcarea de surse externe, dar de cele mai multe ori nu oferă și RAG ci doar o câutare vectorizată a informației.

Pentru a fi mai expliciți continuăm exemplul de mai sus.

Sursa externă (un document Word de exemplu) conține următoarele fraze:

Moldova era un stat întins, dar densitatea populației era mică, astfel că sunt cronicari care scriu că puteai merge zile întregi prin păduri, fără să vezi vreun om. Unele estimări arată că Moldova avea 400.000 de locuitori în timpul lui Ștefan cel Mare, iar Cetatea Albă (Akkermann) era cel mai mare oraș, cu 10.000 de locuitori. Turcii au cucerit-o la 1484, cu consecințe economice dure pentru Moldova.

Oamenii de rând locuiau cu siguranță și în bordeie semi-îngropate, iar viața nu era ușoară, mai ales iarna, când băteau vânturile reci din est. Existau cu siguranță o mulțime de locuințe de suprafață, în general cu două încăperi, cu pereți căptușiți cu bârne. Cei mai avuți aveau sobe frumoase și colorate, adevărate opere de artă.

Modelele AI nu înțeleg cuvintele, ele le tokenizează – le transformă în vectori (de complexități diferite).

Un prim avantaj este evident la căutare, iar dacă generarea se face doar pe căutare, modelul ar putea concluziona câ viața oamenilor pe timpul lui Ștefan cel Mare se desfășura în orașul Cetatea Albă.

Dacă folosim RAG, datele sunt prelucrate și vom genera întrebări posibile la care modelul va avea răspunsuri certe:

Ce populație avea Moldova?
Ce densitatea a populației avea Moldova?
Ce orașe existau în Moldova?
Cetatea Alba era în Moldova?
Ce suprafața avea Moldova?
......

Aceste întrebări vor primi răspunsuri din sursele externe sau interne, și răspunsurile vor fi vectorizate și folosite la generarea textului final. E ca și cum copilul AI s-ar pregăti temeinic pentru extemporalul de la școală și chiar ar înțelege sensul lucrurilor învâtate.

Pe lângă RAG, o altă strategie este împărțirea subiectului în bucâți mai mici, pornind de la un cuprins, iar apoi fiecare idee tratată separat, astfel încât contextul modelului LLM să fie cât mai focusat pe problemă. Desigur nu putem face acest lucru direct cu modelul LLM, dar putem folosi aplicații precum LongWritter care au fost concepute special pentru acest lucru.

3. Utilizarea conținutului automat în WordPress

Unele estimări plasează peste 50% din conținutul informațiilor de pe internet pe website-uri construite pe WordPress. Acest lucru se datorează în principal structurii modulare și a ușurinței de utilizare a WordPress.

De obicei găsești pluginuri pentru orice dorești. și de cele mai multe ori acestea sunt gratuite. Însă cu cât adaugi mai multe pluginuri, cu atât riști ca serverul pe care rulează website-ul să fie mai încârcat, prin request-uri neoptimizate. Un alt risc major este și lipsa controlul adecvat asupra acestor pluginuri pentru câ nimeni nu garantează calitatea codului (inclusiv la pluginurile plătite).

Pentru integrarea AI în website vom avea nevoie de:

  • https://ai.google.dev/pricingun furnizor de AI precum Mistral, Anthropic, Gemini, OpenAI, Meta etc;
  • un model AI disponibil prin API public sau local precum Mistral Nemo sau Large, Claude Sonet, LLama 3.1, Qwen, ChatGPT etc;
  • o sursă de comeni in WordPress care poate fi un plugin sau o extensie Chome;
  • un endpoint de executare a comenzii care poate fi pluginul WordPress sau un sistem de automatizare precum N8N sau Make;
  • acțiunea de actualizare a informațiilor pe baza răspunsului generat de AI, în cadrul WordPress-ului (prin plugin sau WP REST API).

Există foarte multe modalități de implementare, cu avantaje și dezavantaje.

Pluginurile publice se bazează în general pe ChatGPT și ignoră celelalte modele AI care sunt chiar mai bune.. Desigur modelele OpenAi sunt performante (unele destul de costisitoare), dar pluginurile îți oferă posibiltăți limitate de control asupra comportamentului modelului. Un plugin customizat, ar putea să rezolve aceste probleme.

În exemplul nostru nu vom utiliza pluginuri, ci o extensie Chrome care nu va încârca serverul inutil. Această extensie Chrome va genera o fereastră de tip popup in WordPress, în meniul de administrare, va primi comenzi de la utilizator și va fi legată de platforma N8N care va automatiza toată interacțiunea cu AI-ul.

Din N8N vom seta furnizorul de AI, modelul de AI și vom stabili cum să arate răspunsul generat.

Toate acțiunile din N8N pot fi incluse într-un endpoint PHP intern sau extern website-ului, dar N8N permite o configurare no-code utiliă și non-programatorilor și o reprezentare vizuală a întregului circuit al informației.

În exemplul actual nu am folosit RAG, dar este evident câ putem programa acest lucru fără nici un fel de probleme dacă dorim.

3.1. Codarea extensiei Chrome

Putem coda o extensie cde browser simplă care conține un textarea în care utilizatorul introduce subiectul și un buton de generează conținut. Extensia va fi afișată pe paginile de tip post.

La apăsarea butonului de generare, extensia va prelua promptul și îl va trimite unui endpoint N8N care îl va prelucra prin AI. Textul prelucrat se va întoarce înapoi în extensie. Apoi extensia va câuta următorul bloc de tip paragraf și îl va completa cu textul primit.

Extensiile de broswer se compun din mai multe fișiere în funție de complexitate, din care manifest.json e cel care setează care sunt fișierele de acțiune și descrierea extensiei,

iar content.js este fișierul javascript care conține codul efectiv care pune lucrurile în mișcare.

Un exemplu de cod este următorul (țineți cont că articolul nu își propune să prezinte o aplicație completă, ci doar tratează o rezolvare simplă a temei).

manifest.js

{
    "manifest_version": 3,
    "name": "Wordpress Generare continut",
    "version": "1.0",
    "description": "Genereaza continut in WordPress prin AI",
    "permissions": ["activeTab", "scripting"], 
    "host_permissions": [
        "https://ai-romania.ro/*"
    ],
    "background": {
        "service_worker": "background.js"
      },
    "content_scripts": [
      {
        "matches": ["*://*/*/wp-admin/post-new.php*", "*://*/*/wp-admin/post.php*"],
        "js": ["content.js"],
        "css": ["styles.css"]
      }
    ],
    "action": {
      "default_popup": "popup.html"
    }
  }

content.js

function addImageGenerationElements() {
    if (document.getElementById('wp-generate-content')) {
      return; // Elements already added
    }
  
    // Create container
    const container = document.createElement('div');
    container.id = 'wp-generate-content';
    container.style.position = 'fixed';
    container.style.bottom = '450px';
    container.style.left = '20px';
    container.style.width = '250px';
    container.style.zIndex = '9999';
  
    // Create textarea
    const textarea = document.createElement('textarea');
    textarea.placeholder = 'prompt';
    textarea.id = 'wp-generate-content-prompt';
    textarea.style.width = '250px';
    textarea.style.height = '350px';

    // Create button
    const button = document.createElement('button');
    button.textContent = 'Generare content';
    button.id = 'wp-generate-content-button';
    button.style.width = '250px';

    // Create span
    const span = document.createElement('span');
    span.id = 'wp_generate_content_span';
    span.textContent = 'Continutul este generat';
    span.style.display = 'none';
    span.style.width = '250px'; 
  
    // Append elements to container
    container.appendChild(textarea);
    container.appendChild(button);
    container.appendChild(span);

    // Append container to body
    document.body.appendChild(container);
  
    // Add event listener to button
    button.addEventListener('click', function() {
        const prompt = textarea.value;
        var token = "SCdjfSDFJSD9876543210";
        if (prompt ) {
            const url = `XXXXXXXXXXX?prompt=${encodeURIComponent(prompt)}`;      
            wp_generate_content_span.style.display = 'block';
            setTimeout(() => wp_generate_content_span.style.display = 'none', 3000);

            fetch(url)
                .then(response => {
                    if (!response.ok) {
                        throw new Error("HTTP error " + response.status);
                    }     
                    
                    // Examine the text in the response
                    response.text().then(function(data) {
                        
                        // Find the p tag with attribute role="document"
                        const documentElement = document.querySelector('p[role="document"]');
    
                        // Check if the element exists
                        if (documentElement) {
                            // Add data as text to the element
                            documentElement.textContent = data;
                        } else {
                            console.error('Element with role="document" not found');
                        }

                        console.log(data);
                    });
                });
         }
     });
}
  
// Run the function when the DOM is fully loaded
if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', addImageGenerationElements);
} else {
    addImageGenerationElements();
 }
  
 addImageGenerationElements();

XXXXXXXXXXX este adresa endpointului N8N

3.2. Codarea fluxului N8N

Un foarte scurt exemplu al configurării fluxului N8N este următorul:

Avem următoarele noduri:

  • Webhook și Respond webhook sunt nodurile care definesc adresa endpoint a fluxului și modul de răspuns;
  • Edit fields este un nod care poate fi folosit la validarea promptului (curâțarea elementelor nedorite);
  • Basic LLM Chain este un nod care folosește furnizorul Misttral și în mod particular modelul LLM Mistral Nemo;

Iată cum am instruit modelul să prelucreze promptul:

Write a short article in romanian language of 200 tokens about the topic  {{ $json.prompt }}. Use a non technical language. Set 3-4 main headline. Use the next example as template:

Example:
-----

Cuprins

1. Prima idee principala
2. A doua idee principala
3. A treia idee principala
4. Concluzii

!. Prima idee principala
continut prima idee principala - 4-5 paragrafe

2. A doua idee principala
continut a doua idee principala - 4-5 paragrafe

3. A treia idee principala
continut a treia idee principala - 4-5 paragrafe

4. Concluzii
concluzii finale 2 paragrafe

Așadar i-am spus că va primit o tema în variabila prompt și i-am cerut să scrie un articol de 200 de tokeni care să înceapă cu un cuprins și să conțină informațiile în jurul a 3 idei principale. La sfărșit articolul trebuie să se termine cu concluzii.

3.3. Testare de generare continut cu AI

În pagina de articol nou avem noua fereastă în stanga ecranului (imaginea din dreapta este pagina de editare WordPress):

Am stabil un prompt cu o temă generală:

Despre importana somnului de minim 7 ore pe noapte

În imaginiea din stânga se vede că modelul AI începe să prelucreze promptul.

Textul generat de Mistral Nemo este:

 **Despre importanța somnului de minim 7 ore pe noapte**

**Cuprins**

1. De ce este important să dormiți suficient?
2. Ce se întâmplă dacă nu dormiți suficient?
3. Cum puteți îmbunătăți calitatea somnului?
4. Concluzii

**1. De ce este important să dormiți suficient?**

Dormirea este esențială pentru bună sănătate și funcționarea corectă a organismului. Un somn de minim 7 ore pe noapte vă poate ajuta să vă simțiți mai energici, mai alert și mai concentrati pe timpul zilei. În plus, somnul suficient vă poate ajuta să mențineți un sistem imunitar sănătos și să preveniți bolile.

**2. Ce se întâmplă dacă nu dormiți suficient?**

Dacă nu dormiți suficient, puteți suferi de oboseală, iritabilitate și dificultăți de concentrare. În plus, lipsa somnului suficient poate duce la probleme de sănătate, cum ar fi obezitate, diabet și boli de cord. De asemenea, puteți fi mai predispus la accidentări, deoarece oboseala vă poate face să fiți mai distractibil.

**3. Cum puteți îmbunătăți calitatea somnului?**

Pentru a îmbunătăți calitatea somnului, puteți încerca următoarele strategii:

* Mâncați o alimentație sănătoasă și echilibrată
* Evitați cafeina și alcoolul în ultimele ore ale zilei
* Crearea unui program de somn regulat, mergând la pat și trezindu-vă la același orar fiecărei nopți
* Crearea unui mediu de somn relaxant, cu o cameră fresca, întunecată și liniștită

**4. Concluzii**

În concluzie, somnul suficient este esențial pentru sănătatea și binele vostru. Dormirea de minim 7 ore pe noapte vă poate ajuta să vă simțițiți mai energici și mai alert, să mențineți un sistem imunitar sănătos și să preveniți bolile. Pentru a îmbunătăți calitatea somnului, puteți încerca strategii simple, cum ar fi mâncați o alimentație sănătoasă și crearea unui mediu de somn relaxant.

După cum se observă, modelul LLM a respectat șablonul cerut. Desigur textul mai departe ar trebui stilizat și completat, iar acest lucru se poate face și automat (cerând modelului generarea textului formatat HTML).

De asemenea, intr-un articol anterior am prezentat o extensie care poate integra un generator de imagini în WordPress, deci practic acum avem pregătit un flux aproape automatizat de generare a unui articol.

3.4. Generare complet automată

Fără să intrăm acum în detalii, putem să punem în aplicare un website complet automatizat, cu următoarele etape:

  • Se poate seta un flux N8N care zilnic prin Perplexity API să extragă un top 6 idei pe o anumită temă și să le salveze într-o tabelă (de ex. google drive);
  • Cele 6 idei vor fi analizate automat prin alt flux N8N de un model LLM (de ex. ChatGPT) care va alege cea mai bună idee pentru scrierea unui articol;
  • Un al treilea flux N8N va primi ideea articolului și conform unui șablon va scrie articolul cu ajutorul unui model LLM – de exmplu cu Claude de la Anthropic;
  • Un al patrulea flux N8N va genera o imagine reprezenativă prin FLUX API;
  • Articolul va fi adăugat în website prin WP REST API împreună cu imaginea reprezentativă;
  • În final, un alt flux N8N va posta articolul pe diferite platforme de socializare.

Această schemă simplă nu necesită intervenția umană decât pentru configurarea setărilor inițiale.

Automatizare completă a generării conținutului website-urilor WordPress
Automatizare completă a generării conținutului website-urilor WordPress

3.5. Optimizări

N8N este o platformă ușor de utilizat chiar și pentru cei care nu știu codare, dar ea poate fi înlocuită desigur cu scripturi incluse direct în pluginuri WordPress.

Elementele de programare a execuțiilor scriputilor pot fi stabilite prin cron-uri. Prelucrarea făcută prin AI poate fi apelată prin curl sau python.

Putem elimina și cheltuielile legate de utilizarea API-urilor publice pentru modelele LLM folosind modele instalte pe calculatorul local (împrună cu o placă graficâ adecvată).

Modele precum Mistral Nemo, LLama3.1, Gemma2, Qwen2.5 sunt disponibile în regim open-source și nu necesită resurese extraordinare pentru a rula (în variantele de 8-22B).

4. Concluzii

Tehnologia permite în câțiva pași simplu automatizarea completă a unor tipuri de website-uri. Personal eu sunt împotriva scrierii de articole prin AI generativ pentru câ dispare complet elementul de originalitate și viziune proprie.

Dar sunt suficiente exemple în care automatizarea e mult mai potrivită. Un magazin de tip eshop poate să foloseasca AI -ul pentru a identifica produsele de la un furnizor și de a le importa în mod automat, făcând inclusiv traducerea tuturor materialelor de prezentare în limba română.

Sau cazuri în care pe un website se prezintă o sinteză a unor informații publice – de exemplu se pot prelua știrile zilei în mod automat și folosi un model AI care să facă un rezumat al celor mai importante informații.

Însă calitatea articolelor este dată de un conținut original și nu repetiv sau care să aducă o noua perspectivă / o nouă abordare a temei studiate.

Într-un articol viitor voi prezenta integrarea metodelor RAG și a altor tehnici care permit segmentarea temelor în subteme și chiar folosirea mai multor modele AI pentru generarea textului corespunzător.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *