← Back
spletni programerumetna inteligencaAIspletni razvojprihodnostLLMs

Spletni programer z umetno inteligenco: kako umetna inteligenca transformira razvoj

Odkrijte, kako umetna inteligenca transformira delo spletnega programerja. Primeri uporabe, novi stack, priložnosti in prihodnost razvoja z AI.

Jordi Morillo·25 de febrero de 2026·13 min

Spletni programer z umetno inteligenco: kako umetna inteligenca transformira razvoj

Umetna inteligenca ne bo zamenjala spletnega programerja. Vendar pa bo spletni programer, ki uporablja AI, zamenjal tistega, ki je ne uporablja.

Leta 2026 je generativna AI radikalno transformirala način, kako razvijamo spletne aplikacije. Od asistentov za kodo do popolnih aplikacij z inteligentnimi zmogljivostmi je AI že sveprisotna.

V tem članku bom raziskal, kako AI spreminja vlogo spletnega programerja, katere nove veščine zahteva, primere iz resničnega sveta, ki jih že implementiram, in kam se usmerjamo.

AI kot soavtor razvoja

Prva posledica: AI kot asistent za programiranje.

GitHub Copilot in alternative

Kako funkcionirajo:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Napišeš komentar ali podpis funkcije&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// function calculateShippingCost(<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// In Copilot predlaga popolno implementacijo:<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>calculateShippingCost<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>weight<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>number<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>destination<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>shippingMethod<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>standard<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span> | <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>express<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span> | <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>overnight<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>): <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>number<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> baseRate = shippingMethod === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>standard<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : shippingMethod === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>express<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>12<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>25<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> weightRate = weight * <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0.5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> destinationMultiplier = 
    destination === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>national<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : destination === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>europe<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> ? <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>1.5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> 
    : <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>2.5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>return<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> (baseRate + weightRate) * destinationMultiplier
}

Vpliv na produktivnost:

Glede na mojo izkušnjo z GitHub Copilotom:

  • +30-40% hitrost pri kodi boilerplate
  • +50% hitrost pri enotskih testih
  • +25% hitrost pri pogostih funkcijah

Vendar: Zahteva kritičen pregled. Copilot predlaga, ti odločaš.

Trenutne alternative:

  • GitHub Copilot: Najbolj zrel, perfektna integracija VSCode
  • Amazon CodeWhisperer: Brezplačen za posamično uporabo
  • Tabnine: Poudarek na zasebnosti
  • Codeium: Alternativa odprtokodna

Moja dnevna uporaba:

  • Boilerplate: sprejemam ~80% predlogov
  • Poslovna logika: sprejemam ~30-40%
  • Testi: sprejemam ~60-70%
  • Dokumentacija: sprejemam ~50%

Prihranjena časa: ~15-20 ur/teden

ChatGPT in Claude kot tehnični svetovalci

Več kot samo avtomatski dokončevanje, LLMs kot svetovalci:

Primeri dnevne uporabe:

  1. Kompleksno odpravljanje napak

    • Prilepim napako + kontekst
    • LLM predlaga verjetne vzroke
    • Prihranim: 30min-2h na težko napako
  2. Arhitektura in vzorci

    • "Kako strukturirati sistem obvestil v realnem času?"
    • Prejmem možnosti: WebSockets, SSE, polling
    • S prednostmi/slabostmi vsake
  3. Optimizacija kode

    • Prilepim počasno funkcijo
    • LLM predlaga izboljšave zmogljivosti
    • Preveri s primerjalno analizo
  4. Dokumentacija

    • Ustvari JSDoc iz kode
    • Napiši popolne README datoteke
    • Ustvari vodniče za uporabnike

Pomembne omejitve:

⚠️ LLMs alucinirajo:

  • Izmislijo API-je, ki ne obstajajo
  • Napačno citirajajo dokumentacijo
  • Mešajo različice knjižnic

Zlato pravilo: Vedno preverite predloge, še posebej v produkciji.

Moj delovni proces:

  1. Posvetuj se LLM za ideje/možnosti
  2. Preveri v uradni dokumentaciji
  3. Temeljito testiraj pred integracijo

Spletne aplikacije z AI zmogljivostmi

Druga posledica: AI znotraj aplikacij.

Inteligentni chatboti

Chatboti so se razvili iz togih skriptov v kontekstne asistente:

Prej (2020):

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Chatbot s stavkom if/else&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>procesarMensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>mensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>if<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> (mensaje.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;includes&lt;<span class="hljs-regexp">/span&gt;(&lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;horario&amp;#x27;&lt;/</span>span&gt;)) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>return<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>Abrimos de 9 a 18h<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  }
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">if</span>&lt;<span class="hljs-regexp">/span&gt; (mensaje.&lt;span class=&quot;hljs-title function_&quot;&gt;includes&lt;/</span>span&gt;(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>precio<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>)) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>return<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>Nuestros precios empiezan en 100€<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  }
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;No entiendo tu pregunta&amp;#x27;&lt;/</span>span&gt;
}

Sedaj (2026):

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Chatbot z GPT-4 in RAG&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>chat_models&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { loadQAChain } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>chains&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>procesarMensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>mensaje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>historial<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Message<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>[]
<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> llm = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>modelName<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>gpt-4<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>temperature<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0.3<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Poiskaliver relevantne informacije v znanjski bazi&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> context = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> vectorStore.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;similaritySearch&lt;<span class="hljs-regexp">/span&gt;(mensaje, &lt;span class=&quot;hljs-number&quot;&gt;3&lt;/</span>span&gt;)
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Generiraj kontekstni odgovor&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> response = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;call&lt;/span&gt;({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>question<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: mensaje,
    context,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>chat_history<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: historial
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;<span class="hljs-regexp">/span&gt; response.&lt;span class=&quot;hljs-property&quot;&gt;text&lt;/</span>span&gt;
}

Razlika:

  • Prej: Odgovori samo na točno programirana vprašanja
  • Sedaj: Razume namero, konsultira znanje, naravno odgovori

Sem implementiral chatbote z AI za:

  • Strežba 24/7: Rešitev 70-80% vprašanj
  • Tehnična podpora: Iskanje v dokumentaciji
  • Conversacijska prodaja: Priporočila proizvodov
  • Vpeljevanje uporabnikov: Interaktivni vodnik

Stroški razvoja:

  • Tradicionalni chatbot: 2-3 tedne, omejene funkcionalnosti
  • Chatbot z AI: 1-2 tedna, veliko večje zmogljivosti

Sistemi RAG za znanje podjetja

RAG (Retrieval Augmented Generation) = LLM + tvoje zasebne informacije

Tipična arhitektura:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// 1. Indeksiranje poslovne dokumentacije&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAIEmbeddings<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>embeddings&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Chroma<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>vectorstores&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>indexarDocumentos<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>docs<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Document<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>[]<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> embeddings = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAIEmbeddings<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>()
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">const</span>&lt;<span class="hljs-regexp">/span&gt; vectorStore = &lt;span class=&quot;hljs-keyword&quot;&gt;await&lt;/</span>span&gt; <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Chroma<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;fromDocuments&lt;/span&gt;(
    docs,
    embeddings,
    { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>collectionName<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>empresa-docs<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> }
  )
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; vectorStore
}

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// 2. Preveri s kontekstom&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>preguntarDocumentos<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>pregunta<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>,
  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>vectorStore<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Chroma<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> llm = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({ <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>modelName<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>gpt-4<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Poiskaliver relevantne dokumente&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> docsRelevantes = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> vectorStore
    .&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;similaritySearch&lt;<span class="hljs-regexp">/span&gt;(pregunta, &lt;span class=&quot;hljs-number&quot;&gt;4&lt;/</span>span&gt;)
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// LLM odgovori na podlagi dejanskih dokumentov&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>loadQAChain<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(llm)
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">const</span>&lt;<span class="hljs-regexp">/span&gt; response = &lt;span class=&quot;hljs-keyword&quot;&gt;await&lt;/</span>span&gt; chain.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;call&lt;/span&gt;({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>input_documents<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: docsRelevantes,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>question<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: pregunta
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>odgovor<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: response.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;text&lt;/span&gt;,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>viri<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: docsRelevantes.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;map&lt;<span class="hljs-regexp">/span&gt;(&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-params&quot;&gt;d&lt;/</span>span&gt; =&amp;gt;&lt;<span class="hljs-regexp">/span&gt; d.&lt;span class=&quot;hljs-property&quot;&gt;metadata&lt;/</span>span&gt;.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;source&lt;/span&gt;)
  }
}

Primeri iz resničnega sveta, ki jih implementiram:

  1. Vprašanja o politiki podjetja

    • "Kakšna je naša politika vrnitve za digitalne proizvode?"
    • Sistem išče v dokumentih, LLM generiira odgovor
    • Vključuje citate iz izvirnih dokumentov
  2. Tehnična podpora s priročniki

    • "Kako konfigurirati integracijo s Stripe?"
    • Konsultira notranjo dokumentacijo
    • Prilagojeni odgovor korak za korakom
  3. Knowledge base za ekipe

    • "Kako se nameščamo v produkcijo?"
    • Išče v wikiju, runbookih, zaprtih napakah
    • Odgovori s posodobljenim postopkom
  4. Analiza pravnih dokumentov

    • "Kaj pravi pogodba o SLA?"
    • Ekstrahira relevantne klavzule
    • Povzame v jasnem jeziku

Prednosti v primerjavi s tradicionalnim iskanjem:

  • Iskanje: Vrne dokumente, ti prebereš in ekstraheš
  • RAG: Vrne neposreden odgovor s stvarmi

Moji projekti sistemov RAG: 10.000-25.000€ glede na obseg dokumentov in integracij.

Avtonomni agenti

Naslednja raven: sistemi, ki delujejo, ne le odgovarjajo.

Primer: Agent za raziskavo trga

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; langchain.agents &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; initialize_agent, Tool
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; langchain.llms &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; OpenAI

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Definiraj orodja, ki jih lahko agent uporabi&lt;/span&gt;</span>
tools = [
    Tool(
        name=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Google Search&amp;quot;&lt;/span&gt;,
        func=google_search,
        description=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Iskanje posodobljenih informacij na internetu&amp;quot;&lt;/span&gt;
    ),
    Tool(
        name=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Web Scraper&amp;quot;&lt;/span&gt;,
        func=scrape_website,
        description=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Ekstrahira vsebino iz URL-ja&amp;quot;&lt;/span&gt;
    ),
    Tool(
        name=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Database Query&amp;quot;&lt;/span&gt;,
        func=query_database,
        description=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Prosi bazo podatkov konkurentov&amp;quot;&lt;/span&gt;
    )
]

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Inicijalizacija agenta&lt;/span&gt;</span>
agent = initialize_agent(
    tools,
    OpenAI(model=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;gpt-<span class="hljs-number">4</span>&amp;quot;&lt;/span&gt;),
    agent=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;zero-shot-react-description&amp;quot;&lt;/span&gt;
)

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Izvedi kompleksno nalogo&lt;/span&gt;</span>
result = agent.run(
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Istražite cene konkurentov za proizvod X &amp;quot;&lt;/span&gt;
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;na slovenskem trgu, generirajte primerjalno poročilo&amp;quot;&lt;/span&gt;
)

Agent:

  1. Planira, katera orodja uporabiti
  2. Izvedi iskanja v Googlu
  3. Ekstrahira cene s spletnih mest konkurentov
  4. Prosi zgodovino v bazi podatkov
  5. Generiira primerjalno poročilo

Tutto avtonomno.

Poslovne primere:

  • Raziskava konkurence: Cene, funkcionalnosti, ocene
  • Spremljanje blagovne znamke: Omembe, čustva
  • Analiza trendov: Kaj iščejo uporabniki
  • Due diligence: Raziskava dobaviteljev/partnerjev
  • Raziskava vsebine: Trending teme, ključne besede

Sem razvil agente AI za:

  • Avtomatiziramo raziskavo trga (prihranim 20h/teden človeških)
  • Spremljam omembe blagovne znamke 24/7
  • Analiziram povratne informacije strank v realnem času

Analiza in generiranje vsebine

Naravna obdelava jezika uporabljena:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Avtomatska klasifikacija vstopnic za podporo&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;openai&amp;#x27;&lt;/</span>span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>klasificaTicket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>vsebina<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;</span>string<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> completion = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> openai.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;chat&lt;<span class="hljs-regexp">/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;completions&lt;/</span>span&gt;.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;create&lt;/span&gt;({
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>model<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>gpt-4<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>messages<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: [
      {
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>role<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>system<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>content<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span>`Klasificiraj vstopnice v kategorije:
          - bug_critico
          - bug_menor
          - solicitud_feature
          - pregunta_uso
          - queja_comercial
          
          Odgovori samo s kategorijo.`<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
      },
      {
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>role<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>user<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
        <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>content<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: vsebina
      }
    ],
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>temperature<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
  })
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;<span class="hljs-regexp">/span&gt; completion.&lt;span class=&quot;hljs-property&quot;&gt;choices&lt;/</span>span&gt;[<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>0<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>].&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;message&lt;<span class="hljs-regexp">/span&gt;.&lt;span class=&quot;hljs-property&quot;&gt;content&lt;/</span>span&gt;
}

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Uporaba v cevovodu podpore&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>async<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>function<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>procesarTicket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>ticket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>Ticket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> categoria = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>klasificaTicket<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(ticket.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-property&quot;</span>&gt;vsebina&lt;/span&gt;)
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Avtomatsko usmeriti&lt;/span&gt;</span>
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>if<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> (categoria === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>bug_critico<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>obvestiEkipoUrgente<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(ticket)
  } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">else</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/</span>span&gt; (categoria === <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>pregunta_uso<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>) {
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;</span>poskusiSamodejniOdgovor<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(ticket)
  }
  
  &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">await</span>&lt;<span class="hljs-regexp">/span&gt; ticket.&lt;span class=&quot;hljs-title function_&quot;&gt;update&lt;/</span>span&gt;({ categoria })
}

Drugi primeri, ki jih implementiram:

  • Analiza čustev v ocenah/komentarjih
  • Ekstrakcija entitet (imena, datumi, omenjeni proizvodi)
  • Avtomatski povzetek dolgih dokumentov
  • Prevod z ohranjanjem tehnične konteksta
  • Generiranje opisov proizvodov za SEO

Celoten portfolio rešitev NLP.

Računalniški vid za spletne aplikacije

Vizualna inteligenca integrirana:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; openai &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; OpenAI

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Analiza slik z GPT-4 Vision&lt;/span&gt;</span>
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">def</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;analizar_imagen&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;imagen_url: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;&lt;/span&gt;) -&amp;gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">dict</span>&lt;/span&gt;:
    response = client.chat.completions.create(
        model=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;gpt-<span class="hljs-number">4</span>-vision-preview&amp;quot;&lt;/span&gt;,
        messages=[
            {
                &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;user&amp;quot;&lt;/span&gt;,
                &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: [
                    {
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;<span class="hljs-built_in">type</span>&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;text&amp;quot;&lt;/span&gt;,
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;text&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Podrobno opiši to sliko&amp;quot;&lt;/span&gt;
                    },
                    {
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;<span class="hljs-built_in">type</span>&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;image_url&amp;quot;&lt;/span&gt;,
                        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;image_url&amp;quot;&lt;/span&gt;: {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;url&amp;quot;&lt;/span&gt;: imagen_url}
                    }
                ]
            }
        ]
    )
    
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; response.choices[&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;<span class="hljs-number">0</span>&lt;/span&gt;].message.content

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Primeri uporabe&lt;/span&gt;</span>
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">def</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;moderacion_contenido&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;imagen_url: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;&lt;/span&gt;) -&amp;gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">bool</span>&lt;/span&gt;:
    descripcion = analizar_imagen(imagen_url)
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Odkrij neprimerno vsebino&lt;/span&gt;</span>
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">not</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">any</span>&lt;/span&gt;(word &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">in</span>&lt;/span&gt; descripcion.lower() 
                   &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">for</span>&lt;/span&gt; word &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">in</span>&lt;/span&gt; [&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;<span class="hljs-comment">#x27;nasilje&amp;#x27;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;golo&amp;#x27;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;neprimerno&amp;#x27;&lt;/span&gt;])</span>

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">def</span>&lt;/span&gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;categorizarProducto&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-params&quot;</span>&gt;imagen_url: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;&lt;/span&gt;) -&amp;gt; &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">str</span>&lt;/span&gt;:
    descripcion = analizar_imagen(imagen_url)
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Avtomatska klasifikacija&lt;/span&gt;</span>
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># (oblačila, elektronika, dom, itd.)&lt;/span&gt;</span>
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">return</span>&lt;/span&gt; clasificarPorDescripcion(descripcion)

Primeri iz resničnega življenja:

  1. Ecommerce

    • Avtomatska kategorija naloženih proizvodov
    • Odkrivanje kakovosti fotografij
    • Iskanje po vizualni podobnosti
  2. Moderacija vsebine

    • Avtomatski filter neprimerne slike
    • Odkrivanje vizualnega spama
    • Preverjanje smernic skupnosti
  3. Dostopnost

    • Samodejno generiraj alt besedilo za slike
    • Opiši vizualno vsebino za bralce zaslona
  4. Kontrola kakovosti

    • Odkrivanje okvarjenih proizvodov na fotografijah
    • Preverjanje pravilnega pakovanja
    • Potrjevanje inštalacij

Celoten portfolio: rešitve Computer Vision.

Nove veščine spletnega programerja

Za izkoriščanje AI potrebuje spletni programer nove veščine:

1. Prompt Engineering

Zmožnost komuniciranja z LLMs je kritična:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Slab prompt (nedosledni rezultati)&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> prompt = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;quot;</span>Povzemi ta tekst<span class="hljs-symbol">&amp;quot;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Dober prompt (dosledni rezultati)<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> prompt = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span>`
Povzemi naslednji tekst v točno 3 ključne točke.
Vsaka točka mora:
- Biti popolna stavek
- Imeti največ 20 besed
- Začeti z <span class="hljs-symbol">&amp;quot;</span><span class="hljs-symbol">&amp;quot;</span>

Tekst:
<span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-subst&quot;</span>&gt;</span>${tekst}<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>

Povzetek:
`<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>

Tehnike, ki jih mora poznati vsak spletni programer:

  • Few-shot learning: Podaj primere input/output
  • Chain-of-thought: Prosi za utemeljitev korak za korakom
  • Role prompting: "Deluj kot strokovnjak za X"
  • Constraints: Specifikacija oblike, dolžine, stila
  • Temperature tuning: Nadzor ustvarjalnosti vs doslednosti

2. Vector Databases

Delo z embeddingi in semantičnim iskanjem:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;<span class="hljs-regexp">/span&gt; { &lt;span class=&quot;hljs-title class_&quot;&gt;OpenAIEmbeddings&lt;/</span>span&gt; } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>embeddings&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>PineconeStore<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>vectorstores&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Ustvari embeddingi teksta<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> embeddings = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>OpenAIEmbeddings<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>()

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">const</span>&lt;<span class="hljs-regexp">/span&gt; textoVector = &lt;span class=&quot;hljs-keyword&quot;&gt;await&lt;/</span>span&gt; embeddings.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;embedQuery&lt;/span&gt;(
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;quot;</span>Spletni programer, strokovnjak za Next.js<span class="hljs-symbol">&amp;quot;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
)
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Rezultat: [0.023, -0.891, 0.445, ...] // 1536 dimenzij&lt;/span&gt;</span>

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Iskanje podobnih<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> resultados = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> pinecone.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;query&lt;/span&gt;({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>vector<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: textoVector,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>topK<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;</span>5<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>includeMetadata<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-literal&quot;</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
})

Vektorske baze podatkov:

  • Pinecone: Upravljana, enostavna za uporabo
  • Weaviate: Odprtokodna, zmogljiva
  • Chroma: Lahka, dobra za razvoj
  • Qdrant: Visoka zmogljivost

3. LangChain in okvirji AI

Orkestracijo kompleksnih aplikacij z LLMs:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;<span class="hljs-regexp">/span&gt; { &lt;span class=&quot;hljs-title class_&quot;&gt;PromptTemplate&lt;/</span>span&gt; } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>prompts&amp;#x27;&lt;/span&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>import<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> { <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>LLMChain<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> } &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;<span class="hljs-regexp">/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&amp;#x27;langchain/</span>chains&amp;#x27;&lt;/span&gt;

<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;</span>// Ponovno uporabljiva predloga<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> template = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>PromptTemplate<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>template<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span>`
    Si asistent za {vloga}.
    
    Kontekst: {kontekst}
    
    Vprašanje uporabnika: {vprasanje}
    
    Podaj odgovor {ton}.
  `<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>inputVariables<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: [<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>vloga<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>, <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>kontekst<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>, <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>vprasanje<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>, <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>ton<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>]
})

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Chain, ki uporablja predlogo&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>LLMChain<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>llm<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>new<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-title class_&quot;</span>&gt;</span>ChatOpenAI<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>(),
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>prompt<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: template
})

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment">// Izvedba&lt;/span&gt;</span>
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>const<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> response = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;</span>await<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span> chain.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-title function_&quot;</span>&gt;call&lt;/span&gt;({
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>vloga<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>spletni programer senior<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>kontekst<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>Uporabnik gradi spletno trgovino<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>vprasanje<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>Kateri stack priporočaš?<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>,
  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;</span>ton<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>: <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;</span><span class="hljs-symbol">&amp;#x27;</span>profesionalen vendar dostopen<span class="hljs-symbol">&amp;#x27;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span></span>
})

Zakaj LangChain:

  • Abstracts kompleksnost klicev LLMs
  • Chains za kompleksne delovne tokove
  • Agenti za avtonomne naloge
  • Spomin za conversacijo na stanju
  • Integracije s 50+ storitvami

4. MLOps in nameščanje modelov

Prenos modelov v produkcijo na zanesljiv način:

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># Primer: Fine-tuning lastnega modela&lt;/span&gt;</span>
&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">from</span>&lt;/span&gt; openai &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-keyword&quot;</span>&gt;<span class="hljs-keyword">import</span>&lt;/span&gt; OpenAI

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 1. Priprava nabora podatkov&lt;/span&gt;</span>
training_data = [
    {
        &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;messages&amp;quot;&lt;/span&gt;: [
            {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;system&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Klasifikator nujnosti&amp;quot;&lt;/span&gt;},
            {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;user&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Sistem je padel&amp;quot;&lt;/span&gt;},
            {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;assistant&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;NUJNO&amp;quot;&lt;/span&gt;}
        ]
    },
    &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># ... več primerov&lt;/span&gt;</span>
]

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 2. Nalaganje nabora podatkov&lt;/span&gt;</span>
file = client.files.create(
    file=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">open</span>&lt;/span&gt;(&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;training_data.jsonl&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;),
    purpose=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;fine-tune&amp;quot;&lt;/span&gt;
)

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 3. Fine-tune&lt;/span&gt;</span>
job = client.fine_tuning.jobs.create(
    training_file=file.&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-built_in&quot;</span>&gt;<span class="hljs-built_in">id</span>&lt;/span&gt;,
    model=&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;gpt-<span class="hljs-number">3.5</span>-turbo&amp;quot;&lt;/span&gt;
)

&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-comment&quot;</span>&gt;<span class="hljs-comment"># 4. Uporaba lastnega modela&lt;/span&gt;</span>
completion = client.chat.completions.create(
    model=job.fine_tuned_model,
    messages=[
        {&lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;user&amp;quot;&lt;/span&gt;, &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;: &lt;span <span class="hljs-keyword">class</span>=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Aplikacija je počasna&amp;quot;&lt;/span&gt;}
    ]
)

Ključni vidiki MLOps:

  • Verzioniranje modelov: Sledenje poskusom
  • Spremljanje: Natančnost, latenca, stroški
  • A/B testiranje: Primerjava modelov v produkciji
  • Rollback: Povratek na prejšnjo različico, če je potrebno
  • Predpomnjenje: Zmanjšanje nepotrebnih klicev API-ja

Celoten portfolio: storitve MLOps.

Stroški in ROI umetne inteligence pri spletnem razvoju

Je ekonomsko smiselno?

Stroški API-jev AI

OpenAI GPT-4 (januar 2026):

  • Vnos: 0,03 $/1K žetonov (~750 besed)
  • Rezultat: 0,06 $/1K žetonov

Primer iz resničnega sveta: Chatbot za strežbo strank

  • 1.000 pogovorov/dan
  • ~500 žetonov na pogovor (vnos + rezultat)
  • Stroški: 25-30$/dan = 750-900€/mesec

Alternativa človeka:

  • 1 agent: 2.000€/mesec
  • Pokriva ~500 pogovorov/dan v 8h
  • Za 1.000 pogovorov: 2 agenta = 4.000€/mesec

Prihranek: ~3.000€/mesec s chatbotom AI

Stroški razvoja

Tradicionalni chatbot vs AI:

Vidik Tradicionalni Z AI
Začetni razvoj 3-4 tedne 1-2 tedni
Stroški razvoja 6.000-10.000€ 4.000-8.000€
Funkcionalnosti Omejene Obsežne
Vzdrževanje Visoko (dodajanje odgovorov) Nizko (samo prilagajanje promptov)

Tipični ROI: 3-6 mesecev za povrnitev investicije.

Produktivnost spletnega programerja

Moja osebna izkušnja z GitHub Copilotom:

  • Stroški: 10$/mesec (zanemarljivo)
  • Prihranjena časa: 15-20h/mesec
  • Enako: 3-5 delovnih dni/mesec
  • ROI: 150-200x stroški

Neuporaba AI v 2026 = tekmovanje z vezano roko.

Prihodnost: kam gremo

Napovedi za 2027-2030

1. AI kot mladi razvojni programer

V 2-3 letih bodo LLMs lahko:

  • Implementirah kompleksne funkcije iz specifikacije
  • Sami napišejo teste
  • Preuredijo staro kodo
  • Obsežno dokumentirajo

Vloga spletnega programerja se bo razvila v:

  • Arhitekt sistemov
  • Pregledovalec kode, generirane z AI
  • Tehnični product manager
  • Strokovnjak za prompt engineering

2. No-code/low-code ojačan z AI

  • Opis aplikacije v naravnem jeziku
  • AI generiira popolno kodo
  • Programer samo prilagodi in personalizira

To bo odpravilo: Dolgočasno boilerplate kodo To NE bo odpravilo: Potreba razumevanja arhitekture, testiranja, varnosti

3. 100% conversacijske aplikacije

  • Naravni vmesniki (glas + besedilo)
  • Aplikacije, ki razumejo polni kontekst
  • "Ustvari poročilo o prodaji za zadnje četrtletje" → opravljeno
  • Spletni programer mora oblikovati te izkušnje

4. AI specializirana za domeno

  • Modelih fine-tuned za ecommerce, zdravstvo, finance
  • Ne splošni spletni programerji
  • DA spletni programerji + domenski strokovnjaki + AI

Veščine, ki ostajajo kritične

Kaj AI ne bo zamenjala:

Razumevanje poslovanja stranke

  • AI ne ve, kaj so tvoji pravi cilji
  • Prevajanje poslovnih potreb v tehnične specifikacije

Arhitektura sistemov

  • Odločitve o razširljivosti
  • Trgovanje s tehnologijo
  • Vzorci za zapletene probleme

Varnost in zasebnost

  • Revija kode za ranljivosti
  • Izvajanje varnostnih najboljših praks
  • Zakonodajna skladnost (GDPR, itd.)

Testiranje in kakovost

  • Oblikovanje strategije testiranja
  • Robni primeri, ki jih AI ne premisli
  • Strukturiran refaktoring

Empatija in komunikacija

  • Razumevanje razočaranja uporabnika
  • Pojašnjenje tehnične odločitve ne-tehnikom
  • Upravljanje pričakovanj

Najboljši spletni programer prihodnosti:

  • Obvlada osnovne ( algoritmi, arhitektura, vzorci)
  • Uporablja AI za pospešitev izvajanja
  • Fokusira čas na kompleksne probleme in strategijo

Moj pristop kot spletni programer + AI

Kombiniram 33 let izkušenj s sodobno AI:

Kaj uporabljam AI za:

  • ✅ Boilerplate kodo (testi, vrste, migracije)
  • ✅ Prva dokumentacija
  • ✅ Predloge optimizacije
  • ✅ Raziskava tehnologij

Kaj vedno osebno naredim:

  • ✅ Arhitektura sistemov
  • ✅ Kritične tehnične odločitve
  • ✅ Obsežna pregledava kode
  • ✅ Audit varnosti
  • ✅ Integracijsko in E2E testiranje

Rezultat: +40% produktivnost brez žrtvovanja kakovosti.

Storitve, ki jih nudim z AI:

Zagotovilo: Obvezni TDD, dokumentirana koda, doživljenjsko zagotovilo.

Zaključek: prilagoditi se ali ostati zaostali

AI ne bo odpravila spletnega programerja. Govorila bo:

  1. Odpraviti dosadne naloge (boilerplate, osnovna dokumentacija)
  2. Dvigniti raven kompetence je bilo potrebno
  3. Omogočiti ustvarjanje bolj sofisticiranih aplikacij v manj časa
  4. Demokratizirati zmogljivosti prej samo v velikih podjetjih

Spletni programer, ki uspeva v 2026:

  • Obvlada trdne osnove
  • Sprejme AI kot orodje, ne kot grožnjo
  • Se specializira za integracijo AI v prave aplikacije
  • Razume omejitve in zmogljivosti LLMs
  • Nikoli ne preneha učiti se

Kaj se ne spremeni:

  • Potreba razumevanja poslovanja
  • Pomen trdne arhitekture
  • Testiranje in kakovost nista za pogajanja
  • Komunikacija in empatija s strankami

S 33 leti razvoja sem videl ducat "tehnoloških revolucij". AI je resnična, vendar ne spreminja temeljnih načel dobrega razvoja.

Želiš integrirati AI v svoje podjetje? Povej mi svoj primer in prejmi:

  • Analiza izvedljivosti
  • Tehnični predlog
  • Ocena ROI
  • Podrobna cena

Vse v manj kot 24 ur.


Jordi Morillo - Spletni programer + AI Engineering | 33 let izkušenj | Celoten portfolio AI