<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
  <title>RadLab — Blog</title>
  <subtitle>Uczenie maszynowe i przetwarzanie języka naturalnego. Modele, zbiory danych i oprogramowanie open source dla języka polskiego.</subtitle>
  <link href="https://radlab.dev/feed.xml" rel="self"/>
  <link href="https://radlab.dev/"/>
  <id>https://radlab.dev/</id>
  <updated>2026-01-01T00:00:00Z</updated>
  <author><name>RadLab</name></author>
  <rights>© RadLab</rights>
  <entry>
    <title>Zmrożone kopalnie kryptowalut?</title>
    <link href="https://radlab.dev/2026-01-01/zmrozone-kopalnie-kryptowalut/"/>
    <id>https://radlab.dev/2026-01-01/zmrozone-kopalnie-kryptowalut/</id>
    <updated>2026-01-01T00:00:00Z</updated>
    <published>2026-01-01T00:00:00Z</published>
<category term="crypto-mining"/><category term="genai"/><category term="llm"/><category term="llm-router"/><category term="local"/><category term="open-source"/><category term="saas"/>    <summary>Dzisiaj nieco z innej „bajki”. Nie technicznie od strony wytwórczej, a być może propozycja częściowego rozwiązania problemu z mediów do czego można jeszcze…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Dzisiaj&lt;/strong&gt; nieco z innej „bajki”. Nie technicznie od strony wytwórczej, a być może &lt;strong&gt;propozycja&lt;/strong&gt; częściowego &lt;strong&gt;rozwiązania&lt;/strong&gt; &lt;strong&gt;problemu&lt;/strong&gt; z mediów do czego można jeszcze wykorzystać „zamrożone” kopalnie kryptowalut 😉 np. &lt;a href=&#34;https://www.benchmark.pl/aktualnosci/odchodza-od-kryptowalut-ai.html&#34;&gt;LINK&lt;/a&gt;. Biorąc pod uwagę zapotrzebowanie na moce obliczeniowe potrzebne do uczenia modeli nie każda karta będzie odpowiednia do tego celu (potrzebne są karty z bardzo dużą ilością vRAM). W tym wpisie pokażemy jak zmienić nośnik USB w &lt;strong&gt;gotowe&lt;/strong&gt; &lt;strong&gt;środowisko&lt;/strong&gt; &lt;strong&gt;obliczeniowe&lt;/strong&gt;, do którego podepniemy &lt;strong&gt;&lt;a href=&#34;https://llm-router.cloud/&#34;&gt;LLM Router&lt;/a&gt;&lt;/strong&gt; jako warstwę &lt;strong&gt;komunikacyjną&lt;/strong&gt; z &lt;strong&gt;modelami&lt;/strong&gt; generatywnymi.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/e70c98c9a0-480.webp 480w, /assets/img/e70c98c9a0-768.webp 768w, /assets/img/e70c98c9a0-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/e70c98c9a0.jpeg&#34; alt=&#34;&#34; width=&#34;1152&#34; height=&#34;896&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Jeżeli &lt;strong&gt;posiadasz&lt;/strong&gt; już gotowe &lt;strong&gt;środowisko&lt;/strong&gt; do &lt;strong&gt;kopania&lt;/strong&gt; &lt;strong&gt;kryptowalut&lt;/strong&gt;, śmiało możesz &lt;strong&gt;pominąć&lt;/strong&gt; krok &lt;strong&gt;Instalacji&lt;/strong&gt; HiveOS. &lt;strong&gt;Jeśli&lt;/strong&gt; &lt;strong&gt;nie&lt;/strong&gt;, to przejście przez ten &lt;strong&gt;krok&lt;/strong&gt; &lt;strong&gt;pomaga&lt;/strong&gt; w &lt;strong&gt;przygotowaniu&lt;/strong&gt; &lt;strong&gt;systemu&lt;/strong&gt;. W opisie wykorzystany został &lt;strong&gt;USB&lt;/strong&gt; jako &lt;strong&gt;nośnik&lt;/strong&gt; systemu, ponieważ &lt;strong&gt;HiveOS&lt;/strong&gt; &lt;strong&gt;domyślnie&lt;/strong&gt; instalowany jest na &lt;strong&gt;USB&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;a class=&#34;headerlink&#34; href=&#34;#intro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jak zatem &lt;strong&gt;llm-router&lt;/strong&gt; może &lt;strong&gt;pomóc&lt;/strong&gt; w rozwiązaniu tego problemu? Propozycja jest w sumie dość oczywista i prosta, &lt;strong&gt;wykorzystanie&lt;/strong&gt; &lt;strong&gt;zasobów&lt;/strong&gt; &lt;strong&gt;kopalni&lt;/strong&gt; &lt;strong&gt;kryptowalut&lt;/strong&gt;, jako &lt;strong&gt;providera&lt;/strong&gt; do świadczenia usług &lt;strong&gt;inferencji&lt;/strong&gt; &lt;strong&gt;modeli&lt;/strong&gt; generatywnych. Czyli, &lt;strong&gt;jeżeli&lt;/strong&gt; &lt;strong&gt;posiadasz&lt;/strong&gt; już gotową &lt;strong&gt;infrastrukturę&lt;/strong&gt;, ten wpis pokaże Ci jak &lt;strong&gt;wykorzystać&lt;/strong&gt; ją do &lt;strong&gt;uruchamiania&lt;/strong&gt; &lt;strong&gt;modeli&lt;/strong&gt; generatywnych. Dzięki temu będziesz miał &lt;strong&gt;działającą&lt;/strong&gt; &lt;strong&gt;lokalnie&lt;/strong&gt; &lt;strong&gt;usługę&lt;/strong&gt; uruchamiania &lt;strong&gt;modeli&lt;/strong&gt; takich jak &lt;em&gt;gpt-oss&lt;/em&gt; czy &lt;em&gt;gemma&lt;/em&gt;. A co z tym fantem można zrobić? Np. &lt;strong&gt;świadczyć&lt;/strong&gt; &lt;strong&gt;płatną&lt;/strong&gt; &lt;strong&gt;usługę&lt;/strong&gt; do &lt;strong&gt;obliczeń&lt;/strong&gt; (inferencji) właśnie na tych modelach.&lt;/p&gt;
&lt;h2 id=&#34;instalacja-hiveos&#34;&gt;Instalacja HiveOS&lt;a class=&#34;headerlink&#34; href=&#34;#instalacja-hiveos&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pierwszym krokiem jest zainstalowanie gotowego systemu ze skonfigurowanymi sterowanikami do kart graficznych. Przykładowo może to być &lt;a href=&#34;https://hiveon.com/&#34;&gt;HiveOS&lt;/a&gt; (samo Ubuntu-desktop też nie jest najgorszym rozwiązaniem, jeśli nie chcemy przejmować się instalacją bibliotek do obsługi sterowników GPU). Proces instalacji przedstawiony jest dokładnie na oficjalnej stronie &lt;a href=&#34;https://hiveon.com/install&#34;&gt;https://hiveon.com/install&lt;/a&gt; – aktualnie dostępna wersja oparta jest o Ubuntu 22.04.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/ebfc1c96ab-480.webp 480w, /assets/img/ebfc1c96ab-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/ebfc1c96ab.png&#34; alt=&#34;&#34; width=&#34;1022&#34; height=&#34;1114&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Wybieramy oczywiście GPU (lub beta z nowymi sterownikami dla odważnych ;-)) i instalujemy zgodnie z &lt;em&gt;&lt;a href=&#34;https://hiveon.com/install/#howto-image&#34;&gt;How to Write Image&lt;/a&gt;&lt;/em&gt;. W przykładzie wykorzystaliśmy instalację na USB za pomocą wbudowanego w Ubuntu narzędzia do nagrywania obrazów (można również skorzystać z  &lt;a href=&#34;https://etcher.balena.io/&#34;&gt;balenaEtcher&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/a3a9373fed-480.webp 480w, /assets/img/a3a9373fed-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/a3a9373fed.png&#34; alt=&#34;&#34; width=&#34;890&#34; height=&#34;557&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Po instalacji domyślny użytkownik to &lt;code&gt;user&lt;/code&gt; a hasło to &lt;code&gt;1&lt;/code&gt;. Oczywiście dobrym zwyczajem jest zmiana domyślnego hasła na bardziej skomplikowane (po zalogowaniu na maszynę z GPU&lt;code&gt;passwd&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;konfiguracja-os&#34;&gt;Konfiguracja OS&lt;a class=&#34;headerlink&#34; href=&#34;#konfiguracja-os&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pomijamy tutaj proces konfiguracji serwera z kartami jako RIG do obliczeń w HiveOS (wydobywania kryptowalut i monitorowania procesu w interfejsie HiveOS’a). Wykorzystujemy fakt już skonfigurowanego systemu, do którego doinstalujemy kilka podstawowych bibliotek systemowych, które wymagane będą do uruchomienia lokalnie swojej isntancji LLM Routera w konfiguracji z modelem dostępnym przez &lt;em&gt;Ollamę&lt;/em&gt;. Lokalny provider jest oczywiście dowolny: Ollama, vLLM, llama.cpp – bez znaczenia, LLM Router jest interfejsem, który komunikuje się z dowolnym protokołem lokalnego providera modeli. Po zalogowaniu się na maszynę z postawionym HiveOS: &lt;code&gt;ssh user@IP.LOKALNE.MASZYNY&lt;/code&gt; dostaniemy informację odnośnie załadowanych driverów i dostępnych kart graficznych:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/039332d5b9-480.webp 480w, /assets/img/039332d5b9-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/039332d5b9.png&#34; alt=&#34;&#34; width=&#34;942&#34; height=&#34;677&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;W naszym przypadku dostępne są trzy karty RTX 3090, każda po 24GB VRAM. Dokładne informacje odnośnie limitów, temperatury itp. można podejrzeć komendą &lt;code&gt;nvidia-info&lt;/code&gt; (dla kart Nvidii):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/6bc206ed03-480.webp 480w, /assets/img/6bc206ed03-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/6bc206ed03.png&#34; alt=&#34;&#34; width=&#34;809&#34; height=&#34;615&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Teraz wystarczy doinstalować podstawowe pakiety &lt;code&gt;pip&lt;/code&gt; (do instalacji zależności) oraz &lt;code&gt;git&lt;/code&gt; (do klonowania repozytorium):&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# Instalacja w systemie (jeżeli nie ma) git + pip&lt;/span&gt;
apt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python3-pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Właściwie te dwa dodatkowe pakiety wystarczą aby system operacyjny był już skonfigurowany do uruchomienia LLM Routera.&lt;/p&gt;
&lt;h2 id=&#34;instalacja-llm-routera&#34;&gt;Instalacja LLM Routera&lt;a class=&#34;headerlink&#34; href=&#34;#instalacja-llm-routera&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;W przykładzie pokazujemy w jaki sposób uruchomić natywnie (nie z obrazu dockerowego) najnowszą wersję LLM Routera z głównej gałęzi &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# Klonowanie rpozytorium llm-router&lt;/span&gt;
git&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clone&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://github.com/radlab-dev-group/llm-router

&lt;span class=&#34;c1&#34;&gt;# Instalacja zależności oraz API&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;llm-router/
pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-r&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;requirements.txt
pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;.&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;api&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I tyle, w skrócie: pobranie, instalacja, uruchomienie w 3 komendach :). Teraz wydając komendę: &lt;code&gt;./run-rest-api-gunicorn.sh&lt;/code&gt; wystawiamy gotowe API za pomocą Gunicorna, jeszcze bez podpiętych modeli, ale już z działająca usługa sieciową (REST Api):&lt;/p&gt;
&lt;h3 id=&#34;zobacz-log-z-uruchomienia-klik&#34;&gt;Zobacz log z uruchomienia [KLIK]+&lt;a class=&#34;headerlink&#34; href=&#34;#zobacz-log-z-uruchomienia-klik&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;err&#34;&gt;roo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;@HiveOS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/home/user/llm&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;./ru&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gu&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;icor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.sh&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;058&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;mai&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tart&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;LLM‑Rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;API&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gu&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;icor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;065&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.core.lb.provider_s&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;trate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gy_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;fa&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;cade&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;provider&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;mo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;check&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;072&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.core.lb.provider_s&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;trate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gy_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;fa&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;cade&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Load&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;bala&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ci&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;trate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Firs&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AvailableS&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;trate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gy&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;072&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.core.mo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or.services_mo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;mo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hread&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tarte&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;077&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIComple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dlerWOApi&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;werBasedO&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;TheCo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nte&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIComple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIModelsV&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ApiVersio&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nts&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ru&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nn&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;LLM&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;versio&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.4.4&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIRespo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nses&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;V&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Pi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIRespo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nses&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Co&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;versa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hModel&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;FullAr&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;icleFromTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ten&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dedCo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;versa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hModel&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ge&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nerate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;NewsFromTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Tra&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nslate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Tex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;078&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Simpli&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;yTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;OllamaTagsHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ge&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nerate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;FromTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;LLMS&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tu&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dioCha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;V&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;OllamaHomeHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Fas&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Tex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Maski&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;VllmCha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Comple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;LmS&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tu&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dioModelsHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIModelsHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.au&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o_loader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nstant&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;OllamaCha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/cha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/comple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIComple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dlerWOApi)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;079&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/ge&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nerat&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ive_a&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(A&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;werBasedO&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;TheCo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nte&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/cha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/comple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIComple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;GET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/v&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/models&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIModelsV&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;GET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/versio&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(ApiVersio&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/v&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/respo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nses&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIRespo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nses&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;V&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;GET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/pi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Pi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;081&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/respo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nses&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIRespo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nses&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;081&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/co&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;versa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h_model&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Co&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;versa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hModel)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;081&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/crea&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;full&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_ar&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;icle_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;fr&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;om_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(FullAr&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;icleFromTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;081&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/ex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ten&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ded_co&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;versa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h_model&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ten&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dedCo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;versa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hModel)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;081&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/ge&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nerate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_ar&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;icle_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;fr&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;om_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ge&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nerate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;NewsFromTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;081&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;translate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Tra&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nslate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Tex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;082&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/simpli&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;y_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Simpli&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;yTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;082&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;GET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ta&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(OllamaTagsHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;082&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/ge&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nerate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ge&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nerate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;FromTex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;082&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/v&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/cha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/comple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(LLMS&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tu&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dioCha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;V&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;082&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;GET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(OllamaHomeHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;082&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;fast&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_mask&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Fas&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Tex&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Maski&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;083&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/v&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/cha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/comple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(VllmCha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Comple&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;083&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;GET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/v&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/models&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(LmS&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tu&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dioModelsHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;083&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;GET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/models&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(Ope&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;AIModelsHa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;083&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tere&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dpoi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/api/cha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(OllamaCha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ha&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dler)&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;083&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.core.me&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tr&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Prome&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;heus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;prepari&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;me&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tr&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ics&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;reques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hooks&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;083&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.core.me&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tr&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Prome&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;heus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;regis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;me&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tr&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ics&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;reques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hooks&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147288&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tart&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gu&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;icor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;23.0.0&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147288&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Lis&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ten&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//0.0.0.0:8080 (147288)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147288&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Usi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;worker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;hread&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147296&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Boo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;worker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147296&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147297&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Boo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;worker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147297&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147298&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Boo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;worker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147298&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147299&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Boo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;worker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;147299&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;2026-01-01&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;066&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;DEBUG&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;llm_rou&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ter&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_api.core.lb.provider_s&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;trate&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;gy_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;fa&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;cade&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;provider&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;mo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;check&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;Log zawiera informacje z trybu DEBUG, więc jest ich całkiem sporo. Jest to domyślny poziom logowania, który dowolnie może być zmieniony.&lt;/p&gt;
&lt;h2 id=&#34;przykadowa-konfiguracja-ollama-gpt-oss120b&#34;&gt;Przykładowa konfiguracja: Ollama + gpt-oss:120b&lt;a class=&#34;headerlink&#34; href=&#34;#przykadowa-konfiguracja-ollama-gpt-oss120b&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Teraz zajmiemy się instalacją Ollamy z udostępnieniem modelu o wielkości 120b parametrów (gpt-oss:120b). Model jest na dyle duży, że wymaga 3 kart RTX z 24GB VRAM każda. Ollama potrafi bardzo dobrze uruchomić ten model na 3 kartach, zachowując przy tym niemalże pełną obsługę długości kontekstu. Zamykamy uruchomioną instancję LLM Routera (CTRL+C) i instalujemy Ollamę – instacja jest banalna, wystarczy w konsoli wywołać oficjalny skrypt instalacyjny:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-fsSL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://ollama.com/install.sh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Po chwili (zależy jakie łącze internetowe) Ollama jest gotowa i należy załadować na nią model lokalny. Dokładny opis jak zrobić to lokalnie znajduje się na stronie karty modelu: &lt;a href=&#34;https://ollama.com/library/gpt-oss&#34;&gt;https://ollama.com/library/gpt-oss&lt;/a&gt;. Wystarczy:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ollama run gpt-oss:120b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Po pobraniu, model od razu dostępny jest w lokalnej instancji Ollamy.&lt;/p&gt;
&lt;aside class=&#34;callout&#34;&gt;&lt;p&gt;&lt;strong&gt;UWAGA&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Model gpt-oss:120b dostępny za pomocą Ollama to skwantyzowana wersja gpt-oss-120b od OpenAI. Pomimo dużej kwantyzacji model nadal jest bardzo duży, zajmuje około 65GB na dysku (i tyle samo w pamięci kart graficznych), dlatego pendrive musi być odpowiednio duży aby lokalnie zmieścić ten model (ewentualnie można podmontować dysk z dostępnym modelem).&lt;/p&gt;&lt;/aside&gt;

&lt;p&gt;&lt;strong&gt;OPCJA:&lt;/strong&gt; Jeżeli model jest już pobrany i dostępny w ramach sieci, można podłączyć model z dysku sieciowego zamiast pobierać na pendrive. Przykład jak na 3 kartach uruchomić model dostępny w ramach sieci (np. po nfs) z katalogu &lt;code&gt;/mnt/data2/llms/models/ollama/.ollama/models/&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;CUDA_VISIBLE_DEVICES=0,1,2 \
  OLLAMA_NOPRUNE=true \
  OLLAMA_CONTEXT_LENGTH=128000 \
  OLLAMA_MODELS=/mnt/data2/llms/models/ollama/.ollama/models/ \
  OLLAMA_HOST=0.0.0.0 \
  ollama serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aby sprawdzić jakie modele dostępne są w Ollamie wystarczy polecenie &lt;code&gt;ollama list&lt;/code&gt;. Przykładowo u nas (z podmontowanego dysku sieciowego):&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;root@HiveOS:/home/user/llm-router# ollama list
NAME                           ID              SIZE      MODIFIED
dolphin-mistral:latest         5dc8c5a2be65    4.1 GB    5 days ago
dolphin3:8b                    d5ab9ae8e1f2    4.9 GB    6 days ago
devstral-2:latest              524a6607f0f5    74 GB     6 days ago
devstral-2:123b                524a6607f0f5    74 GB     6 days ago
deepseek-r1:70b                d37b54d01a76    42 GB     4 weeks ago
gemini-3-pro-preview:latest    91a1db042ba1    -         4 weeks ago
gpt-oss:120b-ctx32k-rope       c265a9f5b5de    65 GB     7 weeks ago
gpt-oss:120b-ctx250k           964592b444fd    65 GB     7 weeks ago
glm-4.6:cloud                  05277b76269f    -         8 weeks ago
qwen3-coder:30b                06c1097efce0    18 GB     2 months ago
qwen3:235b                     72840bddff91    142 GB    3 months ago
gpt-oss:120b                   f7f8e2f8f4e0    65 GB     4 months ago
gpt-oss:20b                    aa4295ac10c3    13 GB     4 months ago
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;konfiguracja-llm-routera-do-obsugi-gpt-oss120b&#34;&gt;Konfiguracja LLM Routera do obsługi gpt-oss:120b&lt;a class=&#34;headerlink&#34; href=&#34;#konfiguracja-llm-routera-do-obsugi-gpt-oss120b&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ok, to posiadamy już system, mamy pobrany router oraz załadowany model do Ollamy. Teraz pora podpiąć model do routera. Wcześniejsze polecenia uruchamiają model na tej samej maszynie, na której uruchomiony jest llm-router. Aby uprościć demonstrację udostępniliśmy również plik konfiguracyjny, który wystarczy podpiąć do uruchamianego routera (nadpisać domyślny plik konfiguracyjny):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Można albo zmodyfikować w skrypcie uruchomieniowym run-rest-api-gunicorn.sh domyślną ścieżkę do konfigu (zmienna LLM_ROUTER_MODELS_CONFIG )&lt;/li&gt;
&lt;li&gt;lub prościej: do procesu routera przekazać przy uruchamianiu ścieżkę do gotowej konfiguracji. Czyli wydać po prostu komednę:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;LLM_ROUTER_MODELS_CONFIG=resources/configs/specific/models-config-local-ollama.json ./run-rest-api-gunicorn.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I właściwie, to tyle 🙂 Można już odpytywać router podając nazwę modelu. Przykład w &lt;code&gt;curlu&lt;/code&gt; i formatowaniem do jsona za pomocą &lt;code&gt;jq&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-X&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;POST&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;http://localhost:8080/v1/chat/completions&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-H&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Content-Type: application/json&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;quot;model&amp;quot;: &amp;quot;gpt-oss:120b&amp;quot;, &amp;quot;messages&amp;quot;: [{&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Cześć&amp;quot;}]}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;jq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;co powinno dać wynik zbliżony do:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/5e76e1b9bc-480.webp 480w, /assets/img/5e76e1b9bc-768.webp 768w, /assets/img/5e76e1b9bc-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/5e76e1b9bc.png&#34; alt=&#34;&#34; width=&#34;1248&#34; height=&#34;740&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;a class=&#34;headerlink&#34; href=&#34;#outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Te kilka opisanych kroków wystarczy na uruchomienie na sprzęcie oraz systemie typowo do wydobywania kryptowalut LLM Routera wykorzystującego te zasoby. Oczywiście to jest tylko przykład, na &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/tree/main/resources/configs&#34;&gt;repozytorium&lt;/a&gt; podaliśmy więcej przykładów modeli i łączenia do różnych lokalnych providerów.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Górnicy, to druga szansa! 🙂&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dobrego w nowym roku! Dbajcie o dane i nie wysyłajcie do chmury danych wrażliwych!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Czy można w prosty sposób wprowadzić bazę wiedzy dla GenAI?</title>
    <link href="https://radlab.dev/2025-12-26/czy-mozna-w-prosty-sposob-wprowadzic-baze-wiedzy-dla-genai/"/>
    <id>https://radlab.dev/2025-12-26/czy-mozna-w-prosty-sposob-wprowadzic-baze-wiedzy-dla-genai/</id>
    <updated>2025-12-27T00:00:00Z</updated>
    <published>2025-12-26T00:00:00Z</published>
<category term="genai"/><category term="huggingface"/><category term="llm"/><category term="llm-router"/><category term="local"/><category term="rag"/><category term="transformers"/>    <summary>Jak najbardziej, wystarczy langchain_rag podpięty do llm-routera 😉 Intro Witajcie! Dzisiaj pokazujemy dodatkowe możliwości LLM Routera w postaci pluginów, a…</summary>
    <content type="html">&lt;p&gt;Jak najbardziej, wystarczy &lt;code&gt;langchain_rag&lt;/code&gt; podpięty do &lt;a href=&#34;https://llm-router.cloud/&#34;&gt;&lt;code&gt;llm-routera&lt;/code&gt;&lt;/a&gt; 😉&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/1643f5479d-480.webp 480w, /assets/img/1643f5479d-768.webp 768w, /assets/img/1643f5479d-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/1643f5479d.jpeg&#34; alt=&#34;&#34; width=&#34;1152&#34; height=&#34;896&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;a class=&#34;headerlink&#34; href=&#34;#intro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Witajcie! Dzisiaj pokazujemy dodatkowe możliwości&lt;a href=&#34;https://llm-router.cloud/&#34;&gt; LLM Routera &lt;/a&gt;w postaci pluginów, a właściwie to jednego pluginu &lt;code&gt;langchain_rag&lt;/code&gt;. Jest to wtyczka, która tworzy lokalną bazę wiedzy z przekazanych w procesie indeksacji treści. Wykorzystuje znane rozwiązania jak &lt;code&gt;langchain&lt;/code&gt; do tworzenia systemu ragowego oraz &lt;code&gt;fais&lt;/code&gt; jako wektorowa baza wiedzy. Następnie utworzoną bazę wiedzy można podpiąć do dowolnego zapytania w LLM routerze, bez modyfikacji aplikacji, która aktualnie wykorzystuje modele generatywne. Co daje takie podejście?&lt;/p&gt;
&lt;p&gt;Możliwość automatycznego wzbogacenia kontekstu przekazywanego do modelu generatywnego – czyli standardowe podejście &lt;a href=&#34;https://radlab.dev/2024/08/04/rag-i-problemy/&#34;&gt;RAG&lt;/a&gt;. Wystarczy zaindeksować wybrane przez siebie dokumenty za pomocą dostępnej komendy CLI &lt;code&gt;llm-router-rag-langchain index [OPTIONS]&lt;/code&gt; i wszystkie te treści dostępne są dla modelu generatywnego podczas generowania odpowiedzi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Co to daje?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Możliwość automatycznego wzbogacenia kontekstu przekazywanego do modelu generatywnego – czyli standardowe podejście&lt;/p&gt;
&lt;p&gt;RAG&lt;/p&gt;
&lt;p&gt;. Wystarczy zaindeksować wybrane przez siebie dokumenty za pomocą dostępnej komendy CLI&lt;/p&gt;
&lt;p&gt;llm-router-rag-langchain index [OPTIONS]&lt;/p&gt;
&lt;p&gt;i wszystkie te treści dostępne są dla modelu generatywnego podczas generowania odpowiedzi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;— Możliwość automatycznego wzbogacenia kontekstu przekazywanego do modelu generatywnego – czyli standardowe podejścieRAG. Wystarczy zaindeksować wybrane przez siebie dokumenty za pomocą dostępnej komendy CLIllm-router-rag-langchain index [OPTIONS]i wszystkie te treści dostępne są dla modelu generatywnego podczas generowania odpowiedzi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;indeksacja&#34;&gt;Indeksacja&lt;a class=&#34;headerlink&#34; href=&#34;#indeksacja&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Indeksacja danych to krok, w którym z zadanego katalogu, pliki z zadanymi rozszerzeniami zapisywane są w lokalnej bazie wiedzy. Plugin &lt;strong&gt;bazy wiedzy&lt;/strong&gt; wykorzystuje załadowany model embeddera (domyślnie skonfigurowany jest &lt;code&gt;google/embeddinggemma-300m&lt;/code&gt;) którym tworzy wektorowe reprezentacje pochunkowanych tekstów i zapisuje je do lokalnie utworzonej &lt;strong&gt;bazy&lt;/strong&gt; &lt;strong&gt;wektorowej&lt;/strong&gt; &lt;strong&gt;FAISS&lt;/strong&gt;. To użytkownik wybiera jakie &lt;strong&gt;dokumenty&lt;/strong&gt; chce wykorzystać &lt;strong&gt;do&lt;/strong&gt; &lt;strong&gt;wzbogacania&lt;/strong&gt; &lt;strong&gt;kontekstu&lt;/strong&gt; oraz w jakich kolekcjach mają się znaleźć. Jest to o tyle istotny krok, ponieważ to od zawartości tej &lt;strong&gt;bazy&lt;/strong&gt; zależny &lt;strong&gt;trafność&lt;/strong&gt; &lt;strong&gt;odpowiedzi&lt;/strong&gt; &lt;strong&gt;modelu&lt;/strong&gt; generatnywnego. Pomimo istotności &lt;strong&gt;proces&lt;/strong&gt; jest bardzo &lt;strong&gt;prosty&lt;/strong&gt;. Po instalacji llm-routera dostępna jest &lt;strong&gt;komenda&lt;/strong&gt; do obsługi bazy wiedzy tej wtyczki: &lt;code&gt;llm-router-rag-langchain&lt;/code&gt;. Komenda instaluje się w CLI więc &lt;strong&gt;dostępna&lt;/strong&gt; jest z poziomu &lt;strong&gt;dowolnego&lt;/strong&gt; &lt;strong&gt;katalogu&lt;/strong&gt; routera. W poruszanym dzisiaj przykładzie jako baza wiedzy wykorzystaliśmy wszystkie opisy ze wszystkich repozytorium i pod-repozytoriów LLM Routera:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Główne repozytorium llm-routera : pliki md i txt ;&lt;/li&gt;
&lt;li&gt;Repozytorium z pluginami (również z opisywanym pluginem) – pliki w formacie md , txt ;&lt;/li&gt;
&lt;li&gt;Serwisy z obsługą pluginów typu guardrails i maskers – md i txt ;&lt;/li&gt;
&lt;li&gt;Repozytorium z przykładowymi narzędziami wykorzystującymi llm-router – pliki md oraz txt ;&lt;/li&gt;
&lt;li&gt;Dedykowane interfejsy graficzne dla Anonimizatora i Configs Managera – również pliki md i txt ;&lt;/li&gt;
&lt;li&gt;Strona internetowa llm-router.cloud – pliki html , md oraz txt ;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dla uproszczenia sprawy dodaliśmy prosty skrypt bashowym, w którym wystarczy zmienić typy plików oraz ścieżki do indeksacji i bez modyfikacji pozostałych ustawień z głównego katalogu routera wydać polecenie [&lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/blob/main/scripts/llm-router-rag-langchain-index.sh&#34;&gt;tutaj&lt;/a&gt; pełen skrypt]:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;bash scripts/llm-router-rag-langchain-index.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dzięki temu w domyślnie ustawionym katalogu: &lt;code&gt;workdir/plugins/utils/rag/langchain/sample_collection/&lt;/code&gt; zapisana będzie lokalna baza wiedzy, którą następnie można podpiąć jako baza wiedzy llm-routerze.&lt;/p&gt;
&lt;h2 id=&#34;uruchomienie-bazy-wiedzy-w-llm-routerze&#34;&gt;Uruchomienie bazy wiedzy w LLM Routerze&lt;a class=&#34;headerlink&#34; href=&#34;#uruchomienie-bazy-wiedzy-w-llm-routerze&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Baza wiedzy wczytywana jest domyślnie z katalogu, w którym uruchomiony jest LLM Router, jednak miejsce zapisu/wczytania może być dowolnie ustawione zmienną systemową &lt;code&gt;LLM_ROUTER_LANGCHAIN_RAG_PERSIST_DIR&lt;/code&gt;.  Aby LLM Router obsługiwał utworzoną bazę wiedzy, należy aktywować plugin &lt;code&gt;langchain_rag&lt;/code&gt; oraz ustawić ścieżkę do utworzonej bazy wiedzy. Po uruchomieniu routera z taką konfiguracją, każde zapytanie do modelu generatywnego będzie wzbogacane o kontekst pochodzący z podpiętej bazy wiedzy. Aktywacja wtyczki to po prostu wyeksportowanie zmiennej środowiskowej z pluginami typu utils przy starcie routera (domyślny &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/blob/main/run-rest-api-gunicorn.sh&#34;&gt;skrypt&lt;/a&gt; umożliwia modyfikacje):&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;export LLM_ROUTER_UTILS_PLUGINS_PIPELINE=&amp;quot;langchain_rag&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I to właściwie tyle, jeżeli nie modyfikujemy parametrów jak wielkość kontekstu, embedder, to nic nie trzeba zmieniać i ustawiać – tylko indeksować własne dane 🙂 A jak to wygląda w praktyce. Poniżej na zdjęciu odpowiedź modelu bez podpiętej wtyczki &lt;em&gt;langchain_rag&lt;/em&gt; z zaindeksowanymi treściami:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/3cd4aa28a6-480.webp 480w, /assets/img/3cd4aa28a6-768.webp 768w, /assets/img/3cd4aa28a6-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/3cd4aa28a6.png&#34; alt=&#34;&#34; width=&#34;1046&#34; height=&#34;1157&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Oraz odpowiedź z podpiętą wtyczką:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/b977cda321-480.webp 480w, /assets/img/b977cda321-768.webp 768w, /assets/img/b977cda321-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/b977cda321.png&#34; alt=&#34;&#34; width=&#34;1046&#34; height=&#34;1157&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;a class=&#34;headerlink&#34; href=&#34;#outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A na zakończenie jeszcze filmik z konsoli, jak zaindeksować wspomniane treści:&lt;/p&gt;
&lt;div class=&#34;embed embed-video&#34;&gt;&lt;video controls preload=&#34;none&#34; src=&#34;/pl/blog/posts/czy-mozna-w-prosty-sposob-wprowadzic-baze-wiedzy-dla-genai/media/llm-router-rag-langchain-indexing.webm&#34;&gt;&lt;/video&gt;&lt;/div&gt;

&lt;p&gt;oraz przełączanie routera do działania w trybie bazy wiedzy (początek filmu, to działanie routera bez bazy wiedzy, druga część filmu, to działanie z podpiętą bazą wiedzy):&lt;/p&gt;
&lt;div class=&#34;embed embed-video&#34;&gt;&lt;video controls preload=&#34;none&#34; src=&#34;/pl/blog/posts/czy-mozna-w-prosty-sposob-wprowadzic-baze-wiedzy-dla-genai/media/llm-router-rag-langchain.webm&#34;&gt;&lt;/video&gt;&lt;/div&gt;

&lt;p&gt;W roli głównej: &lt;em&gt;OpenWeb UI&lt;/em&gt; z podpiętym &lt;em&gt;LLM-Routerem&lt;/em&gt; (z &lt;em&gt;wyłączoną&lt;/em&gt; i &lt;em&gt;włączoną&lt;/em&gt; wtyczką &lt;em&gt;langchain_rag&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zachęcamy do pobierania, sprawdzania oraz dzielenia się swoimi odczuciami z wykorzystywania 🙂&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zobacz powiązane produkty:&lt;/strong&gt; Wzbogacanie kontekstu w oparciu o bazę wiedzy jest natywnie wspierane przez ekosystem wtyczek bramy &lt;a href=&#34;/products/llm-router/&#34;&gt;LLM Router&lt;/a&gt;. Sprawdź także demonstrację działania na żywo w &lt;a href=&#34;/products/playground/&#34;&gt;RDL Playground AI&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>Czy prawa natury można złamać?</title>
    <link href="https://radlab.dev/2025-12-14/czy-prawa-natury-mozna-zlamac/"/>
    <id>https://radlab.dev/2025-12-14/czy-prawa-natury-mozna-zlamac/</id>
    <updated>2025-12-15T00:00:00Z</updated>
    <published>2025-12-14T00:00:00Z</published>
<category term="bielik"/><category term="bielik-guard"/><category term="classification"/><category term="genai"/><category term="github"/><category term="llm"/><category term="llm-router"/><category term="load-labalancing"/>    <summary>Nie wiem, choć się domyślam […] Witajcie! Dzisiaj przybywamy po dwóch miesiącach intensywnej pracy nad upublicznieniem LLM Routera. Tutaj wcześniejszy wpis:…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Nie wiem, choć się domyślam [&lt;a href=&#34;https://www.youtube.com/watch?v=ZECKxkfKkY8&#34;&gt;…&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Witajcie! Dzisiaj przybywamy po dwóch miesiącach intensywnej pracy nad upublicznieniem &lt;a href=&#34;https://llm-router.cloud/&#34;&gt;LLM Routera&lt;/a&gt;. Tutaj wcześniejszy wpis: &lt;a href=&#34;https://radlab.dev/2025/10/13/llm-router/&#34;&gt;klik&lt;/a&gt;. Z małego projektu wyszedł spory moloch, w którego rozwój nie tylko deweloperski zaangażowały się nowe osoby. Oprócz &lt;a href=&#34;https://techsky.pl/&#34;&gt;Michała&lt;/a&gt; i &lt;a href=&#34;https://evaluation.pl/&#34;&gt;Bartka&lt;/a&gt;, pojawili się &lt;a href=&#34;https://codee.dev/&#34;&gt;Krzysiek&lt;/a&gt; i &lt;a href=&#34;https://www.shgrowth.com/&#34;&gt;Maciek&lt;/a&gt;. Robi się niezły &lt;em&gt;set skillsów&lt;/em&gt;&lt;strong&gt;…&lt;/strong&gt; 😉&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/1d4c106c3b-480.webp 480w, /assets/img/1d4c106c3b-768.webp 768w, /assets/img/1d4c106c3b-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/1d4c106c3b.jpeg&#34; alt=&#34;&#34; width=&#34;1024&#34; height=&#34;1024&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;W dzisiejszym wpisie przedstawiamy w jaki sposób można skonfigurować LLM Router wykorzystując do tego celu dostępne modele na licencji Apache 2.0. Wielkie dzięki dla fundacji &lt;strong&gt;&lt;a href=&#34;https://speakleash.org/&#34;&gt;Speakleash&lt;/a&gt;&lt;/strong&gt;, która w ramach swojej działalności udostępniła dwa modele, które idealnie nadają się do wykorzystania w routerze. W tym wpisie pokazujemy jak można podpiąć modele &lt;a href=&#34;https://huggingface.co/speakleash/Bielik-11B-v2.3-Instruct&#34;&gt;Bielik-11B-v2.3-Instruct&lt;/a&gt; oraz &lt;a href=&#34;https://huggingface.co/speakleash/Bielik-Guard-0.1B-v1.0&#34;&gt;Bielik-Guard-0.1B-v1.0&lt;/a&gt; aby współgrały w LLM Routerze. Pokazaliśmy przykład, jak &lt;strong&gt;8 Bielików&lt;/strong&gt; i &lt;strong&gt;5 Sójek&lt;/strong&gt; może ze sobą współpracować w wirtualnym ekosystemie 🙂&lt;/p&gt;
&lt;h2 id=&#34;bieliki-i-sojki-w-jednym-gniezdzie&#34;&gt;Bieliki i Sójki w jednym gnieździe&lt;a class=&#34;headerlink&#34; href=&#34;#bieliki-i-sojki-w-jednym-gniezdzie&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;W naturze &lt;em&gt;Orzeł&lt;/em&gt; Bielik, to samotny drapieżca, który na czas godów łączy się w pary. Nie dopuszcza do swojego terytorium obcego ptactwa. W kontekście Sójki jest prosta relacja: drapieżca – ofiara. Jednak… to „tylko” natura, a w świecie cyfrowym można więcej.&lt;/p&gt;
&lt;h3 id=&#34;metafora-ekosystemu-natury&#34;&gt;Metafora Ekosystemu natury&lt;a class=&#34;headerlink&#34; href=&#34;#metafora-ekosystemu-natury&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;W świecie cyfrowym miano &lt;em&gt;Bielika&lt;/em&gt; przejmuje model językowy &lt;a href=&#34;https://huggingface.co/speakleash/Bielik-11B-v2.3-Instruct&#34;&gt;Bielik-11B-v2.3-Instruct&lt;/a&gt;, ofiarą jest &lt;em&gt;Sójka&lt;/em&gt; – &lt;a href=&#34;https://huggingface.co/speakleash/Bielik-Guard-0.1B-v1.0&#34;&gt;Bielik-Guard-0.1B-v1.0&lt;/a&gt; typu guardrail, a &lt;em&gt;gniazdem&lt;/em&gt; &lt;a href=&#34;https://llm-router.cloud/&#34;&gt;LLM Router&lt;/a&gt;, który w swoim ekosystemie wprowadza ład i harmonię, a zależność drapieżca – ofiara przestaje istnieć. Wręcz przeciwnie, te gatunki zaczynają razem tworzyć liczne stada, a niechciana zwierzyna nie ma wstępu. W konglomeracie modeli &lt;em&gt;Instruct&lt;/em&gt; i &lt;em&gt;Guardrail&lt;/em&gt; wspomaganych t&lt;em&gt;echnikami maskowania danych wrażliwych&lt;/em&gt; otrzymujemy idealne rozwiązanie do kontrolowanego wykorzystywania modeli językowych typu generatywnego. Lokalnie uruchomiony router umożliwia kontrolę treści wysyłanych do modeli generatywnych. Ofiara ze świata &lt;em&gt;natury&lt;/em&gt; staje się obrońcą, model językowy komunikuje się z aplikacją, zaś mechanizmy maskowania w tle zamazują dane wrażliwe. Ten konglomerat, to właśnie opisywane dzisiaj rozwiązanie w &lt;em&gt;LLM Router&lt;/em&gt;ze 😉&lt;/p&gt;
&lt;h3 id=&#34;kilka-sow-o-llm-routerze&#34;&gt;Kilka słów o LLM Routerze&lt;a class=&#34;headerlink&#34; href=&#34;#kilka-sow-o-llm-routerze&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Pełen opis LLM Routera znajduje się &lt;a href=&#34;https://llm-router.cloud/&#34;&gt;stronie domowej llm-router.cloud&lt;/a&gt; oraz w poprzednim &lt;a href=&#34;https://radlab.dev/2025/10/13/llm-router/&#34;&gt;wpisie na blogu&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LLM Router, to rozwiązanie&lt;strong&gt;on-prem&lt;/strong&gt;, którego zadaniem jest &lt;strong&gt;kontrola&lt;/strong&gt; i &lt;strong&gt;optymalizacja&lt;/strong&gt; &lt;strong&gt;ruchu&lt;/strong&gt; do modeli generatywnych. W odróżnieniu od większości &lt;em&gt;routerów&lt;/em&gt; nie optymalizujemy tutaj kosztu odpytania api, a wręcz przeciwnie – mając do dyspozycji providerów (lokalnych i chmurowych) chcemy tak rozłożyć ruch, aby czas odpowiedzi był jak najmniejszy. W całym procesie następują jeszcze dodatkowe kroki, takie jak &lt;strong&gt;sprawdzanie&lt;/strong&gt; wysyłanej &lt;strong&gt;treści&lt;/strong&gt; pod względem &lt;em&gt;etyki&lt;/em&gt; oraz &lt;em&gt;danych wrażliwych&lt;/em&gt;. Poprawność &lt;em&gt;etyczna&lt;/em&gt; wysyłanych treści kontrolowana jest poprzez mechanizmy typu &lt;strong&gt;Guardrails&lt;/strong&gt;, w momencie wykrycia incydentu, rozmowa/wiadomość &lt;strong&gt;automatycznie&lt;/strong&gt; &lt;strong&gt;jest&lt;/strong&gt; &lt;strong&gt;blokowana&lt;/strong&gt;, tworzony jest &lt;strong&gt;audyt&lt;/strong&gt;, do modelu generatywnego nie jest wysyłana żadna treść, a aplikacja otrzymuje informację, że treść jest &lt;strong&gt;zablokowana&lt;/strong&gt; i nie jest możliwa dalsza kontynuacja rozmowy. Zaś mechanizmy &lt;strong&gt;maskowania&lt;/strong&gt; działają w tle i mają za zadanie zamaskowanie &lt;strong&gt;informacji&lt;/strong&gt; &lt;strong&gt;wrażliwych&lt;/strong&gt; &lt;strong&gt;przed&lt;/strong&gt; &lt;strong&gt;wysłaniem&lt;/strong&gt; do modelu generatywnego – ten mechanizm &lt;strong&gt;nie&lt;/strong&gt; &lt;strong&gt;blokuje&lt;/strong&gt; wiadomości, w locie &lt;strong&gt;podmienia&lt;/strong&gt; ją na zamaskowaną, odkłada &lt;strong&gt;audyt&lt;/strong&gt; o wykrytym incydencie i wysyła do modelu generatywnego zamaskowaną wiadomość. Całość konfigurowalna jest poprzez odpowiednie ustawienie uruchamianego routera.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;bieliki-i-sojki-w-llm-routerze&#34;&gt;Bieliki i Sójki w LLM Routerze&lt;a class=&#34;headerlink&#34; href=&#34;#bieliki-i-sojki-w-llm-routerze&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aby wspomniany ekosystem mógł poprawnie działać, musimy odpowiednio przygotować to środowisko. Do tego celu potrzebujemy kilku elementów:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;llm-router – główny ekosystem koordynowania ruchu (dokładny opis znajduje się na gitgubie i www );&lt;/li&gt;
&lt;li&gt;llm-router-services – serwisy, w których uruchamiane są modele typu guardrails (przykład z Bielik-Guard );&lt;/li&gt;
&lt;li&gt;model Bielik-11B-v2.3-Instruct – polski model generatywny;&lt;/li&gt;
&lt;li&gt;model Bielik-Guard-0.1B-v1.0 – model typu guardrail działający na tekstach w języku polskim;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Następnie poszczególne elementy wystarczy poskładać w jednym miejscu – konfiguracji LLM Routera. Aby wpis nie był zbyt długi, wszystkie konfiguracje wrzuciliśmy na githuba: &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router-utils/tree/main/resources/llm-router-speakleash&#34;&gt;tutaj&lt;/a&gt;, tam też umieściliśmy kompletny opis wszystkich kroków. Jednak w skrócie:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Uruchomienie serwisu z Sójką (pięć Sójek jednocześnie pilnuje treści);&lt;/li&gt;
&lt;li&gt;Uruchomienie Bielika na vLLM (8 providerów z tym samym modelem), na GPU cuda:0 , cuda:1 , cuda:2 ;&lt;/li&gt;
&lt;li&gt;Konfiguracja i uruchomienie LLM Routera;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;W podanym przykładzie uruchomiliśmy proces &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/tree/main/llm_router_api/core/auditor&#34;&gt;audytowania&lt;/a&gt; i blokowania treści niedozwolonych oraz &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/tree/main/llm_router_api/core/auditor&#34;&gt;audytowania&lt;/a&gt; i maskowania danych wrażliwych wbudowanym mechanizmem &lt;em&gt;fast_masker&lt;/em&gt; (&lt;a href=&#34;https://github.com/radlab-dev-group/llm-router-plugins/tree/main/llm_router_plugins/maskers/fast_masker&#34;&gt;opis reguł maskujących&lt;/a&gt; oraz ich &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router-plugins/tree/main/llm_router_plugins/maskers/fast_masker/rules&#34;&gt;implementacje&lt;/a&gt; w &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router-plugins/tree/main&#34;&gt;pluginach routera&lt;/a&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;podglad-na-ekosystem&#34;&gt;Podgląd na ekosystem&lt;a class=&#34;headerlink&#34; href=&#34;#podglad-na-ekosystem&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Poniżej znajdują się screeny uruchomionego &lt;code&gt;nvitopa&lt;/code&gt; na każdym z hostów oraz podgląd na konsolę API&lt;/p&gt;
&lt;p&gt;Host &lt;em&gt;Lab2&lt;/em&gt; z odpalonymi trzema modelami Bielika (w vLLM)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/b1b4f0e891-480.webp 480w, /assets/img/b1b4f0e891-768.webp 768w, /assets/img/b1b4f0e891-1024.webp 1024w, /assets/img/b1b4f0e891-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/b1b4f0e891.png&#34; alt=&#34;&#34; width=&#34;2504&#34; height=&#34;1339&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Host &lt;em&gt;Lab3&lt;/em&gt; również trzema z odpalonymi modelami Bielika (vLLM)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/a5bec4fd41-480.webp 480w, /assets/img/a5bec4fd41-768.webp 768w, /assets/img/a5bec4fd41-1024.webp 1024w, /assets/img/a5bec4fd41-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/a5bec4fd41.png&#34; alt=&#34;&#34; width=&#34;2504&#34; height=&#34;1339&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Host &lt;em&gt;Lab4&lt;/em&gt; z dwoma modelami Bielik (vLLM)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/9cfd20e948-480.webp 480w, /assets/img/9cfd20e948-768.webp 768w, /assets/img/9cfd20e948-1024.webp 1024w, /assets/img/9cfd20e948-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/9cfd20e948.png&#34; alt=&#34;&#34; width=&#34;2504&#34; height=&#34;1339&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Host z API routera (4 workery gunicorna, po 16 wątków) i pięcioma Sójkami (5 workerów gunicorna na cuda:0)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/e11de203a6-480.webp 480w, /assets/img/e11de203a6-768.webp 768w, /assets/img/e11de203a6-1024.webp 1024w, /assets/img/e11de203a6-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/e11de203a6.png&#34; alt=&#34;&#34; width=&#34;2504&#34; height=&#34;1339&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Tak skonfigurowane środowisko gotowe jest do przyjmowania dziesiątek zapytań 🙂 Dla testów wydajności przygotowaliśmy prostą aplikację, której zadaniem jest przetłumaczenie zadanego tekstu na język polski. Do tego wykorzystaliśmy wbudowany endpoint z llm-routera &lt;code&gt;/api/translate&lt;/code&gt; a zbiór do tłumaczenia, to &lt;a href=&#34;https://huggingface.co/datasets/marmikpandya/mental-health&#34;&gt;marmikpandya/mental-health&lt;/a&gt; dostępny na huggingface. Do przeprowadzenia testu wykorzystaliśmy aplikację &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router-utils/blob/main/run-text-translator.sh&#34;&gt;run-text-translator.sh&lt;/a&gt; z repozytorium z &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router-utils&#34;&gt;utilsami&lt;/a&gt;, po instalacji biblioteki dostępna jest komenda w CLI &lt;code&gt;translate-texts&lt;/code&gt;:&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Zobacz: translate-texts –help&lt;/summary&gt;&lt;div&gt;&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;$ translate-texts --help
usage: translate-texts [-h] --llm-router-host LLM_ROUTER_HOST --model MODEL --dataset-path DATASET_PATH [--dataset-type {json,jsonl}] [--accept-field ACCEPT_FIELD] [--num-workers NUM_WORKERS] [--batch-size BATCH_SIZE]

options:
  -h, --help            show this help message and exit
  --llm-router-host LLM_ROUTER_HOST
                        Base URL of the LLM router service (e.g., http://localhost:port)
  --model MODEL         Model name to use for translation (e.g., speakleash/Bielik-11B-v2.3-Instruct)
  --dataset-path DATASET_PATH
                        Path to a dataset file. This option can be provided multiple times to process several files.
  --dataset-type {json,jsonl}
                        Explicit type of dataset files (json or jsonl). If omitted, the type is inferred from each file&#39;s extension.
  --accept-field ACCEPT_FIELD
                        Name of a field to retain from each record. Can be supplied multiple times; if omitted all fields are kept.
  --num-workers NUM_WORKERS
                        Number of worker threads for parallel translation (default: 1 – runs sequentially).
  --batch-size BATCH_SIZE
                        How many texts to send in a single request to the router (default: 8).
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;

&lt;p&gt;Na filmiku poniżej pokazaliśmy działanie routera w połączeniu we wspomnianymi wcześniej modelami. Na początku (pierwsze 3 sekundy), to widok na maszynę &lt;em&gt;API&lt;/em&gt; (w górnej części) z llm-routera, dolna lewa część to uruchomiony serwis z Sójkami, zaś prawa dola część to podgląd nvitopem na kraty graficzne. Sekundy 3-6 to podgląd na maszynę &lt;em&gt;Lab4&lt;/em&gt; z dwoma Bielikami (z lewej strony uruchomione vLLMy, z prawej podgląd na utylizację kart graficznych). Kolejne sekundy 6-10 to podgląd na maszynę &lt;em&gt;Lab3&lt;/em&gt; z trzema Bielikami. Sekundy 11-13 to podobny podgląd na obciążenie maszyny &lt;em&gt;Lab2&lt;/em&gt; (trzy Bieliki). Kolejne sekundy, to przełączanie między maszynami, zaś końcówka to podgląd na &lt;em&gt;API&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;embed embed-video&#34;&gt;&lt;video controls preload=&#34;none&#34; src=&#34;/pl/blog/posts/czy-prawa-natury-mozna-zlamac/media/llm-router-bielik-sojka.webm&#34;&gt;&lt;/video&gt;&lt;/div&gt;

&lt;p&gt;Podczas pracy, mechanizm maskowania i wykrywania treści niedozwolonych wyłapał przypadki, które zamaskował, zablokował oraz zaudytował do pliku (w logach pojawiają się wpisy &lt;code&gt;[AUDIT]************&lt;/code&gt;. Audytowana treść zapisywana jest w wydzielonym katalogu (innym niż logi główne) i szyfrowana jest kluczem publicznym GPG. Całość możliwa jest do odkodowania tylko poprzez prywatny klucz. Na poniższym filmiku pokazujemy w jaki sposób przechowywane są logi (pliki z rozszerzeniem &lt;code&gt;.audit&lt;/code&gt;) oraz jak odkodować je z wykorzystaniem dostępnego w repozytorium llm-routera skryptu do deszyfracji &lt;code&gt;scripts/decrypt_auditor_logs.sh&lt;/code&gt;. A oto efekt wykonania komendy&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bash&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scripts/decrypt_auditor_logs.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;z ustawionym dodatkowo hasłem na klucz deszyfrujący:&lt;/p&gt;
&lt;div class=&#34;embed embed-video&#34;&gt;&lt;video controls preload=&#34;none&#34; src=&#34;/pl/blog/posts/czy-prawa-natury-mozna-zlamac/media/llm-router-bielik-sojka-audit-log.webm&#34;&gt;&lt;/video&gt;&lt;/div&gt;

&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;a class=&#34;headerlink&#34; href=&#34;#outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;W ten oto sposób w wirtualnym świecie zastał porządek. Sójki pilnują treści wysyłanych do modeli generatywnych, Bieliki generują treść, mechanizmy maskowania ukrywają treści wrażliwe a audytorzy na bieżąco monitorują całość pod względem bezpieczeństwa.&lt;/p&gt;
&lt;p&gt;Oczywiście zachęcamy do pobierania i testowania rozwiązania! Wszystko dostępne na Apache 2.0. Dobrego maskowania! 😉&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Llm-Router – łącznik między aplikacją, a modelami generatywnymi</title>
    <link href="https://radlab.dev/2025-10-13/llm-router/"/>
    <id>https://radlab.dev/2025-10-13/llm-router/</id>
    <updated>2025-10-23T00:00:00Z</updated>
    <published>2025-10-13T00:00:00Z</published>
<category term="huggingface"/><category term="llm"/><category term="open-source"/><category term="transformers"/>    <summary>Tym razem przybywamy z projektem, który wykorzystujemy od jakiegoś czasu wewnętrznie. Jednak ze względu na dość dużą uniwersalność rozwiązania — może komuś się…</summary>
    <content type="html">&lt;p&gt;Tym razem przybywamy z projektem, który wykorzystujemy od jakiegoś czasu wewnętrznie. Jednak ze względu na dość dużą uniwersalność rozwiązania — może komuś się przydać — a nawet zachęcamy do korzystania i zgłaszania problemów 🙂&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/b051d90efe-480.webp 480w, /assets/img/b051d90efe-768.webp 768w, /assets/img/b051d90efe-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/b051d90efe.jpeg&#34; alt=&#34;&#34; width=&#34;1152&#34; height=&#34;896&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;W dalszej części krótko opiszemy zawartość repozytorium, sposób uruchomienia gotowego obrazu (tak, wystarczy pobrać i uruchomić :)) oraz przykład konfiguracji. W &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/blob/main/README.md&#34;&gt;README&lt;/a&gt; na &lt;a href=&#34;https://github.com/radlab-dev-group&#34;&gt;githubie&lt;/a&gt; opisaliśmy projekt od strony technicznej, tutaj skupiamy się bardziej na wykorzystaniu.&lt;/p&gt;
&lt;h2 id=&#34;login&#34;&gt;Login&lt;a class=&#34;headerlink&#34; href=&#34;#login&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Na &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router&#34;&gt;githubie&lt;/a&gt; udostępniliśmy publicznie projekt llm-router. To rozwiązanie, które działa jak router w świecie sieciowym z tą różnicą, że routing w &lt;strong&gt;llm-router&lt;/strong&gt; jest &lt;strong&gt;między użytkownikiem&lt;/strong&gt;, &lt;strong&gt;a modelami generatywnymi&lt;/strong&gt;. Tak jak router dostaje wiadomość, obsługuje ją, wie gdzie ją skierować dalej i odsyła do użytkownika odpowiedź, tak nasz llm-router otrzymuje zapytanie od użytkownika z informacją o modelu z jakiego chce skorzystać, i już llm-router odpowiednio przekierowuje zapytanie do modelu (zna ich lokalizacje), obsługuje wynik modelu i zwraca odpowiedź do użytkownika. Innymi słowy – użytkownik nie martwi się gdzie jakiś model jest uruchomiony, a jedynie musi znać nazwę modelu i skierować zapytanie do llm-routera.&lt;/p&gt;
&lt;h2 id=&#34;eksplozja-supernowej&#34;&gt;Eksplozja supernowej&lt;a class=&#34;headerlink&#34; href=&#34;#eksplozja-supernowej&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Do czego można wykorzystać llm-router? To rozwiązanie dostępne poprzez API RESTowe, które obsługuje ruch między aplikacją a modelem generatywnym. Robi to w taki sposób, że użytkownik/&lt;strong&gt;aplikacja&lt;/strong&gt; &lt;strong&gt;nie&lt;/strong&gt; musi &lt;strong&gt;znać&lt;/strong&gt; &lt;strong&gt;lokalizacji&lt;/strong&gt; &lt;strong&gt;modelu&lt;/strong&gt;, parametrów połączenia, a tym bardziej &lt;strong&gt;nie&lt;/strong&gt; &lt;strong&gt;przechowuje&lt;/strong&gt; &lt;strong&gt;kluczy&lt;/strong&gt; &lt;strong&gt;prywatnych&lt;/strong&gt; do zewnętrznych serwisów z modelami generatywnymi (openai, google), bo cała logika obsługi modelu jest po stronie llm-routera. Wystarczy wpiąć do niego listę zewnętrznych modeli, a już router zadba o odpowiednie przekierowywanie. I tutaj nie ma znaczenia czy model jest lokalnie uruchomiony np. za pomocą VLLM, LMStudio czy Ollamy, czy też jest dostępny publicznie w chmurze.&lt;/p&gt;
&lt;p&gt;Aktualnie obsługiwane są wszystkie API, które implementują standard Ollama lub OpenAI, a mało tego router potrafi &lt;strong&gt;przekierować&lt;/strong&gt; &lt;strong&gt;ruch&lt;/strong&gt; między &lt;strong&gt;różnymi&lt;/strong&gt; &lt;strong&gt;standardami&lt;/strong&gt; (również strumieniowanie). Nawet jeżeli do tej pory użytkownik korzystał z Ollamy nadal może pozostać przy tym standardzie i &lt;strong&gt;bez modyfikacji kodu aplikacji&lt;/strong&gt;, ale za pomocą llm-routera może wysłać zapytanie do API np. VLLM co daje duże uproszczenie w produkcyjnym uruchamianiu modeli.&lt;/p&gt;
&lt;p&gt;Dodatkowo, &lt;strong&gt;predefiniowane&lt;/strong&gt; &lt;strong&gt;endpointy&lt;/strong&gt; (&lt;a href=&#34;https://github.com/radlab-dev-group/llm-router?tab=readme-ov-file#%EF%B8%8F-endpoints-overview&#34;&gt;klik&lt;/a&gt;), które dowolnie można &lt;strong&gt;rozbudowywać&lt;/strong&gt; i &lt;strong&gt;dodawać&lt;/strong&gt; &lt;strong&gt;nowe&lt;/strong&gt;, znacznie &lt;strong&gt;upraszczają&lt;/strong&gt; proces &lt;strong&gt;wytwarzania&lt;/strong&gt; &lt;strong&gt;oprogramowania&lt;/strong&gt;. Ta sama funkcjonalność, która musiałaby być oprogramowana w aplikacji (i &lt;strong&gt;dostępna&lt;/strong&gt; by była tylko w niej), teraz może być zaimplementowana po stronie llm-routera, jako &lt;strong&gt;centralnym&lt;/strong&gt; &lt;strong&gt;węźle&lt;/strong&gt; dostępowym. Upraszcza to wprowadzanie poprawek, nowych funkcjonalności i zarządzenie nimi. Dedykowane endpointy, można nazwać &lt;strong&gt;agentami&lt;/strong&gt; &lt;strong&gt;realizującymi&lt;/strong&gt; określone &lt;strong&gt;funkcjonalności&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Elastyczność&lt;/strong&gt; &lt;strong&gt;konfiguracji&lt;/strong&gt;, daje również możliwość &lt;strong&gt;nazywania&lt;/strong&gt; &lt;strong&gt;modeli&lt;/strong&gt; &lt;strong&gt;dowolnie&lt;/strong&gt;, np. po stronie aplikacji model, do którego aplikacja wysyła zapytanie może się &lt;strong&gt;np&lt;/strong&gt;. nazywać &lt;code&gt;model_generatywny&lt;/code&gt;, a ta nazwa rozwiązywana jest do poprawnego modelu i hosta po stronie llm-routera (na nagraniu poniżej przykład jak to może wyglądać – &lt;strong&gt;aplikacja&lt;/strong&gt; &lt;strong&gt;nie wie&lt;/strong&gt; &lt;strong&gt;jaki&lt;/strong&gt; &lt;strong&gt;model&lt;/strong&gt; &lt;strong&gt;uruchamia&lt;/strong&gt;).&lt;/p&gt;
&lt;h2 id=&#34;karton-z-klockami&#34;&gt;Karton z klockami&lt;a class=&#34;headerlink&#34; href=&#34;#karton-z-klockami&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A w kartonie w dwa kartony: jeden ze złożoną zabawką a drugi faktycznie z klockami. Zacznijmy od &lt;strong&gt;zabawki&lt;/strong&gt;, czyli &lt;strong&gt;publicznie&lt;/strong&gt; dostępnego &lt;strong&gt;&lt;a href=&#34;https://quay.io/organization/radlab&#34;&gt;obrazu na quay&lt;/a&gt;,&lt;/strong&gt; który można pobrać i uruchomić &lt;strong&gt;bez&lt;/strong&gt; &lt;strong&gt;budowania&lt;/strong&gt;. Jedynie &lt;strong&gt;konfigurujemy&lt;/strong&gt; &lt;strong&gt;modele&lt;/strong&gt;, do których mamy dostęp/aktualnie wykorzystujemy. &lt;strong&gt;Proces&lt;/strong&gt; pobrania i &lt;strong&gt;uruchomienia&lt;/strong&gt; obrazu &lt;strong&gt;jest&lt;/strong&gt; bardzo &lt;strong&gt;prosty&lt;/strong&gt;, wystarczy posiadać zainstalowanego w systemie dockera i pobrać gotowy obraz z naszego repozytorium &lt;a href=&#34;https://quay.io/organization/radlab&#34;&gt;Quay&lt;/a&gt;. Do pobrania obrazu &lt;strong&gt;wystarczy&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5555&lt;/span&gt;:8080&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quay.io/radlab/llm-router:rc1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;a do &lt;strong&gt;aktualizacji&lt;/strong&gt; do najnowszej wersji:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pull&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;quay.io/radlab/llm-router:rc1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Po pobraniu, &lt;strong&gt;obraz&lt;/strong&gt; &lt;strong&gt;sam się&lt;/strong&gt; &lt;strong&gt;uruchomi&lt;/strong&gt; i wystawi &lt;strong&gt;api&lt;/strong&gt; &lt;em&gt;llm-routera&lt;/em&gt; w najprostszej wersji z Flaskiem na porcie 5555 (&lt;code&gt;-p 5555:8080&lt;/code&gt; oznacza, że przekierowujemy port &lt;em&gt;8080&lt;/em&gt; z wewnątrz dockera, na którym działa router, na port &lt;em&gt;5555&lt;/em&gt; dostępny na zewnątrz dockera). Serwerem podstawowym jest Flask, dlatego przed wykorzystywaniem na większą skalę (szczególnie z opcją strumieniowania), zachęcamy do &lt;strong&gt;przeczytania&lt;/strong&gt; &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router?tab=readme-ov-file#3%EF%B8%8F%E2%83%A3-optional-configuration-via-environment&#34;&gt;możliwości &lt;strong&gt;konfiguracji&lt;/strong&gt; zmiennymi środowiskowymi&lt;/a&gt; – i rozważenie uruchomienia z &lt;strong&gt;gunicornem&lt;/strong&gt; z ustaloną liczba &lt;strong&gt;workerów&lt;/strong&gt;, log-levelem itp. Aby uruchomić llm-router z własnych konfigiem, wystarczy podmontować go do obrazu i podmienić domyślny, który znajduje się w obrazie pod ścieżką &lt;code&gt;/srv/llm-router/resources/configs/models-config.json&lt;/code&gt;. Czyli przekazujemy parametr &lt;code&gt;-v&lt;/code&gt; do dockera:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-v sciezka/do/lokalnego/pliku/models.json:/srv/llm-router/resources/configs/models-config.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Teraz klocki… instrukcja dostępna w &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/blob/main/README.md&#34;&gt;README&lt;/a&gt; (oraz &lt;a href=&#34;https://github.com/radlab-dev-group/llm-router/blob/main/llm_router_api/endpoints/README-pl.md&#34;&gt;opis po polsku z przykładowym zaawansowany endpointem&lt;/a&gt;, który samemu można dodać do &lt;em&gt;llm-routera&lt;/em&gt;), dlatego tutaj nie będziemy tego powtarzać, jednak to co jest kluczowe, to sposób budowy pliku konfiguracyjnego. Poniżej w „Coś dla oka” zamieściliśmy przykładowy plik json, z konfiguracją do trzech modeli:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;google/vllm – to model google/gemma-3-12b-it uruchomiony w sieci lokalnej ( http://192.168.100.79:7000/ ), uruchomiony za pomocą VLLMa;&lt;/li&gt;
&lt;li&gt;google/chmura – to tak na prawdę model gemini-2.5-flash-lite dostępny przez api chmurowe googla: https://generativelanguage.googleapis.com/v1beta/openai/ do którego posiadamy klucz PUT YOUR API KEY HERE ;&lt;/li&gt;
&lt;li&gt;openai/model – to model gpt-oss:120b dostępny w lokalnej sieci na hoście http://192.168.100.66:11434 uruchomiony za pomocą Ollamy;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cos-dla-oka&#34;&gt;Coś dla oka&lt;a class=&#34;headerlink&#34; href=&#34;#cos-dla-oka&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Filmik poniżej zawiera kilka ekranów: lewy górny róg, to podgląd na VLLMa z google/gemma3-12b-it, dolny lewy róg, to Ollama z modelem &lt;code&gt;gpt-oss:120b&lt;/code&gt;, dolny prawy róg – konsola z uruchomionym llm-routerem, zaś prawy górny róg to wtyczka&lt;a href=&#34;https://www.jetbrains.com/ai/&#34;&gt; AI Assistant &lt;/a&gt;do &lt;em&gt;Pycharma&lt;/em&gt;. Domślnie wtyczka umożliwia podpięcie się do jednego providera modeli, zaś wpięcie llm-routera pozwala wstrzyknąć dowolny standard, nawet ten nieobsługiwany przez aplikację. Dodatkowo na filmiku pokazaliśmy jak można zmienić nazwy modeli, aby od strony aplikacji nie było wiadomo jaki model jest pod spodem. Zaś w konsoli na dole widać jak llm-router przyjmuje zapytania i kieruje do odpowiedniego hosta:&lt;/p&gt;
&lt;div class=&#34;embed embed-video&#34;&gt;&lt;video controls preload=&#34;none&#34; src=&#34;/pl/blog/posts/llm-router/media/pycharm-llm-router.webm&#34;&gt;&lt;/video&gt;&lt;/div&gt;

&lt;p&gt;Konfiguracja użyta do uruchomienia llm-routera:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;google_models&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;google/vllm&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_host&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;http://192.168.100.79:7000/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_token&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_type&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;vllm&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;input_size&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;model_path&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;google/gemma-3-12b-it&amp;quot;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;google/chmura&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_host&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;https://generativelanguage.googleapis.com/v1beta/openai/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_token&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;PUT YOUR API KEY HERE&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_type&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;openai&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;input_size&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;512000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;model_path&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;gemini-2.5-flash-lite&amp;quot;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;openai_models&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;openai/model&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_host&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;http://192.168.100.66:11434&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_token&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;api_type&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;ollama&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;input_size&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;256000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;model_path&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;gpt-oss:120b&amp;quot;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;active_models&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;google_models&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;google/vllm&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;google/chmura&amp;quot;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;openai_models&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;openai/model&amp;quot;&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I pełen skrypt z uruchomieniem dockera (to co uruchamiane jest w terminalu na filmie — czyli pełna konfiguracja i zmiana wszystkich domyślnych parametrów :)):&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;ch&#34;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&#34;nv&#34;&gt;PWD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;

docker&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;run&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-p&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5555&lt;/span&gt;:8080&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_TIMEOUT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_IN_DEBUG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_MINIMUM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_EP_PREFIX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;/api&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_SERVER_TYPE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gunicorn&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_SERVER_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_SERVER_WORKERS_COUNT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_DEFAULT_EP_LANGUAGE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;pl&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_LOG_FILENAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;llm-proxy-rest.log&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_EXTERNAL_TIMEOUT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;300&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_MODELS_CONFIG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/srv/cfg.json&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LLM_ROUTER_PROMPTS_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;/srv/prompts&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-v&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PWD&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/resources/configs/models-config-names.json&amp;quot;&lt;/span&gt;:/srv/cfg.json&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-v&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PWD&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/resources/prompts&amp;quot;&lt;/span&gt;:/srv/prompts&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;quay.io/radlab/llm-router:rc1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;logout&#34;&gt;Logout&lt;a class=&#34;headerlink&#34; href=&#34;#logout&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jednym z miejsc, gdzie llm-router działa jest nasz playground. Każda funkcjonalność dotycząca modelu generatywnego oprogramowana jest jako dedykowany EP w llm-router.  Kody udostępniamy oczywiście na licencji Apache 2.0 — można brać i wykorzystywać komercyjnie i niekomercyjnie — smacznego!&lt;/p&gt;
&lt;p&gt;Zachęcamy do korzystania i zgłaszania swoich sugestii i uwag.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aktualizacja (Wydanie v1.1+):&lt;/strong&gt; Zapowiadane funkcjonalności (6 zaawansowanych strategii Load Balancingu, Redis Rate Limiting w przesuwnym oknie czasowym, metryki Prometheus oraz potok wtyczek maskowania PII i guardraili NASK/Sójka) zostały w pełni wdrożone! Zobacz &lt;a href=&#34;/products/llm-router/&#34;&gt;pełną specyfikację LLM Routera&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>Upubliczniamy kody</title>
    <link href="https://radlab.dev/2025-09-26/upubliczniamy-kody/"/>
    <id>https://radlab.dev/2025-09-26/upubliczniamy-kody/</id>
    <updated>2025-09-27T00:00:00Z</updated>
    <published>2025-09-26T00:00:00Z</published>
<category term="github"/><category term="huggingface"/><category term="llm"/><category term="method"/><category term="python"/><category term="transformers"/><category term="uczenie"/>    <summary>Witajcie! Dzisiaj technicznie. Ostatni miesiąc pracowaliśmy nad publikacją części naszych rozwiązań. Dzisiaj chcielibyśmy przedstawić kilka z nich. Część, to…</summary>
    <content type="html">&lt;p&gt;Witajcie! Dzisiaj technicznie. Ostatni miesiąc pracowaliśmy nad &lt;a href=&#34;https://github.com/radlab-dev-group&#34;&gt;publikacją&lt;/a&gt; części naszych rozwiązań. Dzisiaj chcielibyśmy przedstawić kilka z nich. Część, to działające mechanizmy na &lt;a href=&#34;https://playground.radlab.dev/&#34;&gt;playgroundzie&lt;/a&gt;, a inne, to realizowane pomysły „z boku”. Wróciliśmy do pomysłu rozwijania rozwiązań całkowicie publicznie na Githubie. Dlatego zapraszamy na &lt;a href=&#34;https://github.com/radlab-dev-group&#34;&gt;nasz profil githubowy&lt;/a&gt;, który krótko w tym wpisie przedstawiamy 😉&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/607b0751fa-480.webp 480w, /assets/img/607b0751fa-768.webp 768w, /assets/img/607b0751fa-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/607b0751fa.jpeg&#34; alt=&#34;&#34; width=&#34;1152&#34; height=&#34;896&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Poniżej przedstawiamy projekty z krótkimi opisami. Każdy z nich na &lt;a href=&#34;https://github.com/radlab-dev-group&#34;&gt;Githubie&lt;/a&gt; posiada dość obszerny plik README.&lt;/p&gt;
&lt;h2 id=&#34;relgat-projector-z-boku&#34;&gt;&lt;a href=&#34;https://github.com/radlab-dev-group/relgat-projector&#34;&gt;relgat-projector&lt;/a&gt; („z boku”)&lt;a class=&#34;headerlink&#34; href=&#34;#relgat-projector-z-boku&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Repozytorium (&lt;a href=&#34;https://github.com/radlab-dev-group/relgat-projector&#34;&gt;klik&lt;/a&gt;) zawiera autorską implementację mechanizmów link-prediction na podstawie grafów semantycznych. Ideą było odtworzenie relacji semantycznych oraz możliwość tworzenia nowych reprezentacji bazując na istniejących. Zakładamy, że w grafie węzły posiadają opis semantyczny (np. za pomocą &lt;em&gt;embeddingu&lt;/em&gt;), krawędzie nie posiadają opisu, jednak są rozróżnialne między sobą. &lt;em&gt;Labelka&lt;/em&gt; &lt;em&gt;krawędzi&lt;/em&gt; w takim grafie oznacza &lt;em&gt;nazwę relacji&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Metoda umożliwia uczenie się macierzy przekształceń dla krawędzi w grafie, bazując na otoczeniu węzłów. Model jednocześnie uczy się przekształceń każdej relacji z osobna oraz uczy się definiować węzły na podstawie istniejących w grafie. Węzeł definiowany jest poprzez jego otoczenie (wejście), zakładamy, że to, co wchodzi do danego węzła, definiuje go. W odróżnieniu od standardowego RelGATa, nie uczymy się całej sieci — uczymy się przekształceń bazowej przestrzeni, do tej samej przestrzeni w taki sposób, że dla [&lt;code&gt;A -&amp;gt; rel1 -&amp;gt; B&lt;/code&gt;], [&lt;code&gt;C -&amp;gt; rel2 -&amp;gt; B&lt;/code&gt;] szukamy przekształceń &lt;code&gt;rel1&lt;/code&gt; i &lt;code&gt;rel2&lt;/code&gt; tak, aby kombinacja embeddingów &lt;code&gt;A&lt;/code&gt; i &lt;code&gt;C&lt;/code&gt; dały embedding &lt;code&gt;B&lt;/code&gt;. Stosując dodatkowo ocenę przez metryki typu &lt;em&gt;hits@X&lt;/em&gt; jako funkcje straty, dodatkowo uczymy się predykcji linków. Dzięki temu, możliwe będzie przetransformowanie dowolnego wektora &lt;code&gt;X&lt;/code&gt;(z uczonej przestrzeni) za pomocą macierzy przekształceń &lt;code&gt;M&lt;/code&gt; (np. aktywując określone relacje), w taki sposób, aby dostać wektor&lt;code&gt;X&#39;&lt;/code&gt;w tej samej przestrzeni, jednak po przekształceniu relacjami.&lt;/p&gt;
&lt;p&gt;Przeprowadziliśmy już serię eksperymentów (na wykresach ostatnie stabilne treningi) i jak na razie (po wykresach) wygląda to obiecująco 😉&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/4341bd956b-480.webp 480w, /assets/img/4341bd956b-768.webp 768w, /assets/img/4341bd956b-1024.webp 1024w, /assets/img/4341bd956b-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/4341bd956b.png&#34; alt=&#34;&#34; width=&#34;1685&#34; height=&#34;768&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/e4992cadcf-480.webp 480w, /assets/img/e4992cadcf-768.webp 768w, /assets/img/e4992cadcf-1024.webp 1024w, /assets/img/e4992cadcf-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/e4992cadcf.png&#34; alt=&#34;&#34; width=&#34;1704&#34; height=&#34;270&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;plwordnet-z-boku&#34;&gt;&lt;a href=&#34;https://github.com/radlab-dev-group/plwordnet&#34;&gt;plwordnet&lt;/a&gt; („z boku”)&lt;a class=&#34;headerlink&#34; href=&#34;#plwordnet-z-boku&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To repozytorium (&lt;a href=&#34;https://github.com/radlab-dev-group/plwordnet&#34;&gt;klik&lt;/a&gt;), za pomocą którego można operować na polskiej i angielskiej &lt;a href=&#34;http://plwordnet.pwr.wroc.pl/wordnet/&#34;&gt;Słowosieci&lt;/a&gt; (Słowosieć – polski, Princeton Wordnet – angielski). Co prawda nie służy ono aktualnie tylko do przeglądania Słowosieci, ale przede wszystkim jest to mechanizm to tworzenia zbiorów danych. Zaimplementowana jest tam metoda tworzenia embeddingów dla węzłów grafów semantycznych. Zawarty jest tam pełen proces od pobrania Słowosieci, przygotowania danych do dalszych procesów, aż do: tworzenia&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;embeddera semantycznego,&lt;/li&gt;
&lt;li&gt;reprezentacji embeddingowych dla znaczeń Słowosieci i Princeton Wordnetu z wykorzystaniem tego embeddera.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Na &lt;a href=&#34;https://huggingface.co/radlab&#34;&gt;huggingface&lt;/a&gt; udostępniliśmy pierwszą wersję &lt;a href=&#34;https://huggingface.co/radlab/semantic-euro-bert-encoder-v1&#34;&gt;modelu&lt;/a&gt; (&lt;a href=&#34;https://huggingface.co/radlab/semantic-euro-bert-encoder-v1&#34;&gt;radlab/semantic-euro-bert-encoder-v1&lt;/a&gt;). To dwujęzyczny model embeddera, w którym jako model językowy wykorzystaliśmy &lt;a href=&#34;https://huggingface.co/EuroBERT&#34;&gt;EuroBERT&lt;/a&gt;. Tworzenie reprezentacji embeddingowych to kilkuetapowy proces. Na początku reprezentacje tworzone są dla jednostek leksykalnych. Następnie, dla tych jednostek, dla których nie można było utworzyć reprezentacji, ale znajdują się w synsecie, w którym są jakieś reprezentacje, tworzona jest sztuczna (&lt;em&gt;fake&lt;/em&gt;) reprezentacja dla jednostki. Po czym dla każdego synsetu, który posiada choć jedną reprezentację jednostki, tworzone są reprezentacje embeddingowe jako ważone, uśrednienie embeddingów jednostek. Po takiej operacji, nie wszystkie jednostki i synsety posiadają definicje, dlatego &lt;a href=&#34;https://github.com/radlab-dev-group/relgat-projector&#34;&gt;relgat-projector&lt;/a&gt; ma posłużyć między innymi do transformacji węzła bez reprezentacji, jednak posiadającego jakieś otoczenie (synset lub jednostka).&lt;/p&gt;
&lt;h2 id=&#34;ml-utils-z-boku&#34;&gt;&lt;a href=&#34;https://github.com/radlab-dev-group/ml-utils&#34;&gt;ml-utils („z boku”)&lt;/a&gt;&lt;a class=&#34;headerlink&#34; href=&#34;#ml-utils-z-boku&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wcześniejsze biblioteki mają zależność do &lt;a href=&#34;https://github.com/radlab-dev-group/ml-utils&#34;&gt;ml-utils&lt;/a&gt;. Jest to biblioteka, która upraszcza potok przetwarzania w kontekście uczenia maszynowego. Zawiera ogólne klasy i metody, które niezależne są od projektu, jednak ich funkcjonalność może być współdzielona do innych projektów. Za pomocą &lt;a href=&#34;https://github.com/radlab-dev-group/ml-utils&#34;&gt;ml-utils&lt;/a&gt; można między innymi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;w prosty sposób zarządzać logowaniem wyników do Weights &amp;amp; Biases,&lt;/li&gt;
&lt;li&gt;zarządzać promptami do modeli generatywnych, poprzez nazwy wynikające ze struktury katalogów,&lt;/li&gt;
&lt;li&gt;obsługiwać dowolne api modelu generatywnego zgodne z OpenAPI, tworzyć kolejki oraz cache’ować odpowiedzi dla zmniejszenia liczby odpytań modelu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dodatkowo dostępne są moduły ogólnego przeznaczenia, takie jak parsowanie &lt;em&gt;envów&lt;/em&gt; czy tworzenie ujednoliconych &lt;em&gt;loggerów&lt;/em&gt;, ale znajduje się tam również moduł do pobierania danych z &lt;a href=&#34;https://github.com/radlab-dev-group/ml-utils/blob/main/rdl_ml_utils/utils/wikipedia.py&#34;&gt;Wikipedii&lt;/a&gt;, który wykorzystywany jest w &lt;a href=&#34;https://github.com/radlab-dev-group/plwordnet&#34;&gt;plwordnet&lt;/a&gt; do wzbogacenia kontekstu budowanych embeddingów.&lt;/p&gt;
&lt;h2 id=&#34;moduy-z-playgroundu&#34;&gt;&lt;a href=&#34;https://playground.radlab.dev/&#34;&gt;Moduły z playgroundu&lt;/a&gt;&lt;a class=&#34;headerlink&#34; href=&#34;#moduy-z-playgroundu&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;W repozytorium &lt;a href=&#34;https://github.com/radlab-dev-group/clusterer&#34;&gt;clusterer&lt;/a&gt; zamieściliśmy moduł odpowiadający za tworzenie klastrów na &lt;a href=&#34;https://playground.radlab.dev/&#34;&gt;playgroundzie&lt;/a&gt;. Typy informacji, które widoczne są w &lt;em&gt;&lt;a href=&#34;https://radlab.dev/2025/05/28/przegladarka-informacji/&#34;&gt;Przeglądarce Informacji&lt;/a&gt;&lt;/em&gt; czy też w &lt;em&gt;&lt;a href=&#34;https://radlab.dev/2025/07/14/eksplorator-informacji-nie-mlotek-a-skalpel/&#34;&gt;Eksploratorze informacji&lt;/a&gt;&lt;/em&gt; są tworzone właśnie za pomocą tego modułu. Dokładniejszy opis metody zamieściliśmy na blogu w podlinkowanych artykułach. Oprócz tego, udostępniliśmy kod do &lt;a href=&#34;https://github.com/radlab-dev-group/graph-visualizer&#34;&gt;wizualizatora grafów&lt;/a&gt;, który aktualnie uruchomiony jest pod adresem &lt;a href=&#34;https://graph.playground.radlab.dev/&#34;&gt;https://graph.playground.radlab.dev/&lt;/a&gt; gdzie prezentowane są grafy informacyjne ciągłe i nieciągłe. Oprócz tego, do kolekcji dołączyliśmy repozytorium &lt;a href=&#34;https://github.com/radlab-dev-group/radlab-playground-ui&#34;&gt;radlab-playground-ui&lt;/a&gt; z kodem interfejsu &lt;a href=&#34;https://playground.radlab.dev/&#34;&gt;Playgroundu&lt;/a&gt;, jako aplikacji w streamlicie.&lt;/p&gt;
&lt;h2 id=&#34;zakonczenie&#34;&gt;Zakończenie&lt;a class=&#34;headerlink&#34; href=&#34;#zakonczenie&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wszystkie kody udostępniamy na otwartej licencji &lt;a href=&#34;https://www.apache.org/licenses/LICENSE-2.0&#34;&gt;Apache 2.0&lt;/a&gt;, można dowolnie wykorzystywać – komercyjnie i niekomercyjnie. Koniec. 😉&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Eksplorator Informacji – nie młotek, a skalpel</title>
    <link href="https://radlab.dev/2025-07-14/eksplorator-informacji-nie-mlotek-a-skalpel/"/>
    <id>https://radlab.dev/2025-07-14/eksplorator-informacji-nie-mlotek-a-skalpel/</id>
    <updated>2025-07-17T00:00:00Z</updated>
    <published>2025-07-14T00:00:00Z</published>
    <summary>Dziś na blogu będzie krótko, ale w załączniku już długaśnie 🙂 Intro i Outro Zachęcamy zapoznać się od kuchni z działaniem Przeglądarki i Eksploratora…</summary>
    <content type="html">&lt;p&gt;Dziś na blogu będzie krótko, ale w załączniku już długaśnie 🙂&lt;/p&gt;
&lt;h2 id=&#34;intro-i-outro&#34;&gt;Intro i Outro&lt;a class=&#34;headerlink&#34; href=&#34;#intro-i-outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Zachęcamy zapoznać się od kuchni z działaniem &lt;a href=&#34;https://radlab.dev/2025/05/28/przegladarka-informacji/&#34;&gt;Przeglądarki&lt;/a&gt; i &lt;a href=&#34;https://playground.radlab.dev/Eksplorator_Informacji&#34;&gt;Eksploratora Informacji&lt;/a&gt; 😉 Na tę okazję przygotowaliśmy raport techniczny z dokładnym opisem działania naszych rozwiązań. W raporcie przedstawiliśmy dokładne definicje &lt;em&gt;informacji&lt;/em&gt; oraz jej rodzajów, czyli &lt;em&gt;informacji dziennej&lt;/em&gt;, &lt;em&gt;ciągłej&lt;/em&gt; i &lt;em&gt;nieciągłej&lt;/em&gt;. Wprowadziliśmy definicje &lt;em&gt;grafów informacyjnych&lt;/em&gt; dla informacji oraz przedstawiliśmy proces ich budowy, analizy i ekstrakcji z nich elementów, które tworzą &lt;em&gt;przeglądarkę&lt;/em&gt; i &lt;em&gt;eksploratora&lt;/em&gt; informacji. Dane, którymi zasilane są te metody, to oczywiście &lt;em&gt;newsy&lt;/em&gt; ze &lt;a href=&#34;https://playground.radlab.dev/Strumie%C5%84_Aktualno%C5%9Bci&#34;&gt;Strumienia Aktualności&lt;/a&gt;. Uruchomiliśmy również publicznego &lt;a href=&#34;https://github.com/radlab-dev-group/latex/blob/main/tech_reports/playground/przegladarka_eksplorator/REAMDE.md&#34;&gt;githuba&lt;/a&gt;, na którym umieściliśmy zarówno &lt;em&gt;&lt;a href=&#34;https://github.com/radlab-dev-group/latex/blob/main/tech_reports/playground/przegladarka_eksplorator/Eksplorator_Informacji-Raport-techniczny-latest.pdf&#34;&gt;pdfa&lt;/a&gt;&lt;/em&gt; jak i &lt;a href=&#34;https://github.com/radlab-dev-group/latex/tree/main/tech_reports/playground/przegladarka_eksplorator&#34;&gt;kody LaTeXowe &lt;/a&gt;raportu.&lt;/p&gt;
&lt;h2 id=&#34;kombo&#34;&gt;Kombo&lt;a class=&#34;headerlink&#34; href=&#34;#kombo&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Przechodząc do lektury, proponujemy czytać całość od początku do końca, nie gubiąc przy tym szczegółów. Raport pokazuje możliwości &lt;em&gt;wyciągania&lt;/em&gt; z danych informacji zapisanych &lt;em&gt;między wierszami&lt;/em&gt;. Oto podgląd pliku pdf:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://radlab.dev/wp-content/uploads/2025/07/Eksplorator_Informacji-Raport-techniczny-v1.0-20250714.pdf&#34;&gt;Pobierz PDF&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eksplorator_Informacji-Raport-techniczny-v1.0-20250714&lt;/p&gt;
&lt;p&gt;Pobierz&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zobacz powiązane produkty:&lt;/strong&gt; Algorytmy grafowe i klastrowanie wiedzy są wdrożone w &lt;a href=&#34;/products/radar/&#34;&gt;Radarze Informacji&lt;/a&gt; oraz module analitycznym na platformie &lt;a href=&#34;/products/playground/&#34;&gt;RDL Playground AI&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>Polaryzacja 3c – model z plg na HF</title>
    <link href="https://radlab.dev/2025-06-01/polaryzacja-3c-model-z-plg-na-hf/"/>
    <id>https://radlab.dev/2025-06-01/polaryzacja-3c-model-z-plg-na-hf/</id>
    <updated>2025-06-01T00:00:00Z</updated>
    <published>2025-06-01T00:00:00Z</published>
<category term="3c"/><category term="polaryzacja"/>    <summary>Intro Witajcie 😉 Dzisiaj przedstawiamy i upubliczniamy element działania playgroundu. Jest to model klasyfikacyjny, którego zadaniem jest określanie…</summary>
    <content type="html">&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;a class=&#34;headerlink&#34; href=&#34;#intro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Witajcie 😉 Dzisiaj przedstawiamy i upubliczniamy element działania &lt;a href=&#34;https://playground.radlab.dev/&#34;&gt;playgroundu&lt;/a&gt;. Jest to model klasyfikacyjny, którego zadaniem jest &lt;a href=&#34;https://huggingface.co/radlab/polarity-3c&#34;&gt;określanie polaryzacji tekstów&lt;/a&gt;. Model upubliczniamy na naszym &lt;a href=&#34;https://huggingface.co/radlab&#34;&gt;huggingface&lt;/a&gt; 😉 Polaryzacje określamy jako:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pozytywna — model przypisuje tę klasę, jeżeli informacje w tekstach mogą wzbudzić pozytywne emocje/odczucia;&lt;/li&gt;
&lt;li&gt;negatywna — jeżeli informacje w tekstach wzbudzają pozytywne odczucia;&lt;/li&gt;
&lt;li&gt;ambiwalentna/neutralna — jeżeli informacja jest obojętna lub wywołuje przeciwstawne odczucia w tym samym czasie;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/7ea37d09b8-480.webp 480w, /assets/img/7ea37d09b8-768.webp 768w, /assets/img/7ea37d09b8-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/7ea37d09b8.png&#34; alt=&#34;&#34; width=&#34;1152&#34; height=&#34;896&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;proces-dane-i-uczenie&#34;&gt;Proces: dane i uczenie&lt;a class=&#34;headerlink&#34; href=&#34;#proces-dane-i-uczenie&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Model powstawał w dwóch etapach. W odróżnieniu jednak od standardowego podejścia (start od anotacji), rozpoczęliśmy jednak od uczenia modelu na podstawie istniejących już anotacji (hm… to nic nowego przecież… &lt;em&gt;i tak i nie…&lt;/em&gt;). Jednak szukając zbioru danych do polaryzacji, najczęściej są to zbiory dotyczące opinii na jakiś temat. W naszym przypadku nie chodzi o określenie polaryzacji opinii (np. &lt;em&gt;Ten produkt można wyrzucić do kosza!&lt;/em&gt; lub &lt;em&gt;Polecam lekarza bo ma bardzo dobre podejście do pacjenta!&lt;/em&gt;) a określenie polaryzacji informacji, którą wtłaczają w nas &lt;em&gt;media&lt;/em&gt; (serwisy internetowe).&lt;/p&gt;
&lt;p&gt;Zatem należało szukać w innym miejscu 😉 Wybór nie był aż tak oczywisty, ale oddający bardziej ideę polaryzacji informacji, niż opinii… i padło na &lt;em&gt;Słowosieć Emo&lt;/em&gt;. Słowosieć Emo, to oznaczona za pomocą emocji (i nie tylko) wybrana część &lt;a href=&#34;http://plwordnet.pwr.wroc.pl/wordnet/&#34;&gt;Słowosieci&lt;/a&gt; (oznaczenia są na poziomie znaczeń słów) — polecam zapoznać się czym jest Słowosieć — to bardzo cenne źródło informacji. Po kilku technicznych krokach, przekształcone przykłady użycia do znaczeń z opisem emocjonalnym, przekształciliśmy w przybliżony zbiór polaryzacji emocjonalnej (redukcja emocji i granulacji do 3 – &lt;em&gt;pozytywna&lt;/em&gt;, &lt;em&gt;negatywna&lt;/em&gt;, ambiwalentna). Poniżej na zdjęciu kilka przykładów ze zbioru, już po konwersji:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/4f873f4675-480.webp 480w, /assets/img/4f873f4675-768.webp 768w, /assets/img/4f873f4675-1024.webp 1024w, /assets/img/4f873f4675-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/4f873f4675.png&#34; alt=&#34;&#34; width=&#34;1507&#34; height=&#34;492&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Ten zbiór wykorzystaliśmy do wyuczenia modelu &lt;em&gt;polarity3c-zero&lt;/em&gt;, czyli modelu, który wykorzystany został od razu w procesie wspierania decyzji podczas anotacji. Model w czasie rzeczywistym proponował propozycje anotacji dla dwóch anotatorów. W ten sposób powstał zbiór około 3500 ręcznych anotacji, które wykorzystane były do finalnego uczenia modelu.&lt;/p&gt;
&lt;p&gt;Finalny model, to prosta architektura, w której nad modelem językowym dodana jest prosta warstwa klasyfikacyjna (&lt;em&gt;ClassificationHead&lt;/em&gt;), która wyuczana jest do określania polaryzacji. Architektura warstwy klasyfikacyjnej:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  (classifier): RobertaClassificationHead(
    (dense): Linear(in_features=1024, out_features=1024, bias=True)
    (dropout): Dropout(p=0.1, inplace=False)
    (out_proj): Linear(in_features=1024, out_features=3, bias=True)
  )
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;1024 na pierwszej gęstej warstwie Liniowej to wyjście modelu bazowego &lt;a href=&#34;https://huggingface.co/sdadas/polish-roberta-large-v2&#34;&gt;polish-roberta-large-v2&lt;/a&gt;, wyjście modelu polarity3c, to warstwa oznaczona (out_proj), która na wyjściu ma 3 cechy, czyli nasze wykrywane klasy. Na wykresach poniżej przedstawiamy podstawowe metryki z uczenia tego modelu:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/0a36d5c7a8-480.webp 480w, /assets/img/0a36d5c7a8-768.webp 768w, /assets/img/0a36d5c7a8-1024.webp 1024w, /assets/img/0a36d5c7a8-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/0a36d5c7a8.png&#34; alt=&#34;&#34; width=&#34;1628&#34; height=&#34;642&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;uruchomienie-i-testowanie&#34;&gt;Uruchomienie i testowanie&lt;a class=&#34;headerlink&#34; href=&#34;#uruchomienie-i-testowanie&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Najprościej uruchomić model za pomocą biblioteki &lt;em&gt;&lt;a href=&#34;https://huggingface.co/docs/transformers&#34;&gt;transformers&lt;/a&gt;&lt;/em&gt; z wykorzystaniem &lt;em&gt;&lt;a href=&#34;https://huggingface.co/docs/transformers/pipeline_tutorial&#34;&gt;pipeline’a&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;transformers&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pipeline&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;classifier&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pipeline&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;radlab/polarity-3c&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;text-classification&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Samo użycie modelu jest równie proste:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; classifier(&amp;quot;Po upadku reżimu Asada w Syrii, mieszkańcy, borykający się z ubóstwem, zaczęli tłumnie poszukiwać skarbów, zachęceni legendami o zakopanych bogactwach i dostępnością wykrywaczy metali, które stały się popularnym towarem. Mimo, że działalność ta jest nielegalna, rząd przymyka oko, a sprzedawcy oferują urządzenia nawet dla dzieci. Poszukiwacze skupiają się na obszarach historycznych, wierząc w legendy o skarbach ukrytych przez starożytne cywilizacje i wojska osmańskie, choć eksperci ostrzegają przed fałszywymi monetami i kradzieżą artefaktów z muzeów.&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;W odpowiedzi dostaniemy wartość&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;label&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;ambivale&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.9994786381721497&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aby odczytać pełen rozkład pewności modelu, wystarczy dodać opcję ile labelek o najwyższym prawdopodobieństwie chcemy otrzymać. W naszym przypadku mamy 3 labelki, dlatego do &lt;code&gt;classifier&lt;/code&gt; dodajemy opcje &lt;code&gt;top_k=3&lt;/code&gt; aby otrzymać informacje o wszystkich klasach:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; classifier(&amp;quot;Po upadku reżimu Asada w Syrii, mieszkańcy, borykający się z ubóstwem, zaczęli tłumnie poszukiwać skarbów, zachęceni legendami o zakopanych bogactwach i dostępnością wykrywaczy metali, które stały się popularnym towarem. Mimo, że działalność ta jest nielegalna, rząd przymyka oko, a sprzedawcy oferują urządzenia nawet dla dzieci. Poszukiwacze skupiają się na obszarach historycznych, wierząc w legendy o skarbach ukrytych przez starożytne cywilizacje i wojska osmańskie, choć eksperci ostrzegają przed fałszywymi monetami i kradzieżą artefaktów z muzeów.&amp;quot;, top_k=3)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A oto i wyjście:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;label&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;ambivale&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.9994786381721497&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;label&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ga&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ive&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.0002675618161447346&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;label&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;posi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ive&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.0002538080152589828&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;a class=&#34;headerlink&#34; href=&#34;#outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Model udostępniony jest od lipca ubiegłego roku na naszym playgroundzie. Zbieramy efekty jego działania, które można podejrzeć w &lt;a href=&#34;https://playground.radlab.dev/Statystyki&#34;&gt;statystykach&lt;/a&gt;. Na &lt;a href=&#34;https://playground.radlab.dev/Strumie%C5%84_Aktualno%C5%9Bci&#34;&gt;strumieniu&lt;/a&gt; przy każdym newsie, dodawana jest również informacja o polarzyacji, właśnie przez ten model. Model oczywiście za free na naszych HF: &lt;a href=&#34;https://huggingface.co/radlab/polarity-3c&#34;&gt;Klik do modelu&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Powiązane rozwiązania:&lt;/strong&gt; Model ten stanowi integralną część analizy sentymentu w &lt;a href=&#34;/products/radar/&#34;&gt;Radarze Informacji&lt;/a&gt; oraz strumienia wiadomości na platformie &lt;a href=&#34;/products/playground/&#34;&gt;RDL Playground AI&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>Przeglądarka informacji</title>
    <link href="https://radlab.dev/2025-05-28/przegladarka-informacji/"/>
    <id>https://radlab.dev/2025-05-28/przegladarka-informacji/</id>
    <updated>2025-09-26T00:00:00Z</updated>
    <published>2025-05-28T00:00:00Z</published>
<category term="playground"/>    <summary>Z perspektywy marketingowej, dobrze byłoby zacząć ten wpis w stylu: Dzisiaj przedstawiamy rewolucyjne, w pełni zautomatyzowane rozwiązanie, które w czasie…</summary>
    <content type="html">&lt;p&gt;Z perspektywy marketingowej, dobrze byłoby zacząć ten wpis w stylu:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dzisiaj przedstawiamy rewolucyjne, w pełni zautomatyzowane rozwiązanie, które w czasie „rzeczywistym” pozwoli Ci analizować trendy w mediach. Chcesz się dowiedzieć o czym się pisze? Co jest na topie? Tak! Dobrze trafiłeś, to właśnie dzisiaj masz okazję skorzystać….&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Easy…. Takie trochę Telemango w dzisiejszych czasach… nie wypada tak 😉 Także zaczniemy standardowo.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/c8612afc62-480.webp 480w, /assets/img/c8612afc62-768.webp 768w, /assets/img/c8612afc62-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/c8612afc62.png&#34; alt=&#34;&#34; width=&#34;1152&#34; height=&#34;896&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;o-czym-jest-dzisiejszy-wpis&#34;&gt;O czym jest dzisiejszy wpis?&lt;a class=&#34;headerlink&#34; href=&#34;#o-czym-jest-dzisiejszy-wpis&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Na &lt;a href=&#34;https://playground.radlab.dev/&#34;&gt;playgroundzie&lt;/a&gt; udostępniliśmy nową funkcjonalność, nazwaliśmy ją &lt;a href=&#34;https://playground.radlab.dev/news_browser&#34;&gt;Przeglądarka Informacji&lt;/a&gt; i służy dokładnie do tego, jak się nazywa — czyli przeglądania informacji w czasie.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Czym jest &lt;strong&gt;informacja&lt;/strong&gt;? Jako informację rozumiemy &lt;strong&gt;zwartą&lt;/strong&gt; &lt;strong&gt;grupę&lt;/strong&gt; &lt;strong&gt;tematyczną&lt;/strong&gt; newsów ze stron internetowych, które w domyśle dotyczą tej samej sytuacji/tematu/zdarzenia… Tego, co pojawia się w wiadomościach, o czym piszą media, co jest na topie. To, co w danym dniu/przedziale czasowym jest tym, o czym się czyta, tylko zebrane w jednym miejscu, podsumowane i nazwane. &lt;strong&gt;Nazwa&lt;/strong&gt; informacji &lt;strong&gt;nie&lt;/strong&gt; &lt;strong&gt;jest&lt;/strong&gt; w żadnym stopniu &lt;strong&gt;predefiniowana&lt;/strong&gt;, &lt;strong&gt;jest&lt;/strong&gt; &lt;strong&gt;wyznaczana&lt;/strong&gt; &lt;strong&gt;na&lt;/strong&gt; &lt;strong&gt;podstawie&lt;/strong&gt; pojawiających się &lt;strong&gt;newsów&lt;/strong&gt; powiązanych w zwarte grupy informacyjne. Nazwa informacji codziennie może być inna — zależy o czym się pisze (i czyta ;-)).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Podstawą działania &lt;em&gt;Przeglądarki&lt;/em&gt;, są informacje występujące na popularnych serwisach newsowych, które cyklicznie analizujemy i wyniki tych analiz prezentujemy w &lt;em&gt;piaskownicy&lt;/em&gt;. &lt;em&gt;Przeglądarka&lt;/em&gt; prezentuje proces automatycznej analizy informacji z tych serwisów. Jest mechanizmem, który przedstawia najistotniejsze informacje z danego dnia, nazwie te informacje oraz napisze krótkie streszczenie, w którym można dowiedzieć się w skrócie czego dotyczy wykryta informacja. Oprócz tego, przedstawi szereg powiązanych (nazwijmy to) &lt;em&gt;wyzwalaczy&lt;/em&gt; tej informacji:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;poda dokładne adresy do stron internetowych, które o tej informacji piszą;&lt;/li&gt;
&lt;li&gt;pokaże źródła propagacji informacji za pomocą diagramu z wizualizacją procentowego udział konkretnego portalu w udostępnianiu tej informacji;&lt;/li&gt;
&lt;li&gt;przedstawi analizę polaryzacji tej informacji (warto zwrócić uwagę na korelację nazwy informacji z polaryzacją informacji);&lt;/li&gt;
&lt;li&gt;za pomocą kalendarza umożliwi śledzenie i analizę informacji w czasie (aczkolwiek może być ona różnie nazwana);&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;jak-to-dziaa&#34;&gt;Jak to działa?&lt;a class=&#34;headerlink&#34; href=&#34;#jak-to-dziaa&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Od strony technicznej, jest to mix różnych metod i optymalizacji. Mechanizm bada różnice między tekstami i na podstawie ich podobieństwa dobiera do jednej grupy informacyjnej te newsy, które z perspektywy zredukowanego embeddingu są do siebie najbardziej podobne. Mechanizm wydzielania skupisk informacyjnych dostraja swoje działanie do liczby danych, które analizuje. Są dni, w których pojawia się około 600 newsów, ale są również dni, kiedy pojawia się dwa razy więcej. Mechanizm na podstawie wielu rozkładów dobiera taki, który najlepiej wpasowuje się w dodatkowe warunki podziału danych, np. nie pozwala na podziały poniżej 5 grup informacyjnych oraz na powyżej 60, a dodatkowo uwzględnia &lt;em&gt;złoty środek&lt;/em&gt; czyli celowanie w 20 tematów dziennie, a jednocześnie optymalizuje liczbę przykładów odrzucanych. Z perspektywy &lt;em&gt;Przejrzanych&lt;/em&gt; dwóch miesięcy, najczęściej w mediach pojawia się od 20 do 30 informacji dziennie.&lt;/p&gt;
&lt;h2 id=&#34;dla-kogo-od-sasa-do-lasa&#34;&gt;Dla kogo: od Sasa do lasa&lt;a class=&#34;headerlink&#34; href=&#34;#dla-kogo-od-sasa-do-lasa&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Można powiedzieć: Od Sasa do lasa… Z perspektywy osoby poszukujących pewnych informacji, jest to rozwiązanie, które w jednym miejscu pozwala dotrzeć do dziesiątek czy setek newsów z konkretnego dnia z konkretną informacją. Jeżeli interesują kogoś wydarzenia sportowe, a danego dnia pojawiło się odpowiednio dużo informacji z wydarzeń sportowych, to dostanie podsumowanie wielu wydarzeń (w tym również z zagranicznych źródeł). Przykładowo propozycja numer 1 (domyślnie pojawia się numer 0) w dniu 26.05.2025 pojawia się informacja „&lt;em&gt;Sport – sukcesy i zmiany.&lt;/em&gt;„, której podsumowanie wygląda tak (klik aby powiększyć):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/cf3980964d-480.webp 480w, /assets/img/cf3980964d-768.webp 768w, /assets/img/cf3980964d-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/cf3980964d.png&#34; alt=&#34;&#34; width=&#34;1196&#34; height=&#34;685&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;A dodatkowo dostajemy adresy powiązanych stron z informacją z tym opisem:&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Kliknij aby zobaczyć zdjęcie&lt;/summary&gt;&lt;div&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/3f4dd9a22c-480.webp 480w, /assets/img/3f4dd9a22c-768.webp 768w, /assets/img/3f4dd9a22c-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/3f4dd9a22c.png&#34; alt=&#34;&#34; width=&#34;1116&#34; height=&#34;1235&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/div&gt;&lt;/details&gt;

&lt;p&gt;Zaś z perspektywy analityka, powiązanie informacji odnośnie źródeł propagacji, czyli wykres:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/56a54d55ab-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/56a54d55ab.png&#34; alt=&#34;&#34; width=&#34;752&#34; height=&#34;364&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;pokazuje skąd ta informacja przychodzi i na ile zdominowana jest przez jedno źródło danych. I o ile w przypadku sportu, może to być mniej istotna zmienna, o tyle w informacjach związanych np. z polityką czy nowoczesnymi technologiami, rozkład pochodzenia stron może pokazywać proces wprowadzania informacji w obieg. Zaś analiza tej informacji w czasie za pomocą kalendarza, umożliwia śledzenie jej i umożliwia wyciąganie wniosków. Należy jedynie pamiętać, że informacje nazywane są indywidualnie w perspektywie jednego dnia, dlatego nazwy mogą się różnić w zależności od dnia. Dlatego (jeszcze) wymagana jest ludzka interakcja, aby śledzić konkretną informację w czasie 😉 Dodatkowo otrzymujemy podsumowanie na temat rozkładu polaryzacji emocji w postaci diagramu:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/58335d752a-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/58335d752a.png&#34; alt=&#34;&#34; width=&#34;752&#34; height=&#34;364&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Przy analizie takiego diagramu warto zwrócić uwagę na korelację nazwy informacji z polaryzacją/wydźwiękiem tekstu (informacja &lt;em&gt;pozytywna&lt;/em&gt;, &lt;em&gt;negatywna&lt;/em&gt;, &lt;em&gt;neutralna&lt;/em&gt;). Nazwa kategorii bardzo wskazuje jaki może być rozkład polaryzacji. A za wykrycie polaryzacji odpowiada nasz model, który na &lt;em&gt;&lt;a href=&#34;https://playground.radlab.dev/&#34;&gt;playgroundzie&lt;/a&gt;&lt;/em&gt; działa od bardzo dawna i służy do oceny tekstów w czasie rzeczywistym. Właśnie na podstawie decyzji tego modelu przedstawiony jest udział konkretnego wydźwięku w konkretnej informacji (nie jest to wydźwięk artykułu podsumowującego, a newsów z informacją). Oprócz tego dostajemy dokładne dane dotyczące informacji odnośnie liczby newsów:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/692f8a4752-465.webp 465w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/692f8a4752.png&#34; alt=&#34;&#34; width=&#34;465&#34; height=&#34;167&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;A powiązanie liczby newsów w informacji z liczbą newsów w całym dniu (a do tej zmiennej jest dostęp):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/a7c865bc4e-480.webp 480w, /assets/img/a7c865bc4e-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/a7c865bc4e.png&#34; alt=&#34;&#34; width=&#34;803&#34; height=&#34;122&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;pozwala określić istotność informacji w kontekście całego dnia…. Resztę można zostawić wyobraźni 😉&lt;/p&gt;
&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;a class=&#34;headerlink&#34; href=&#34;#outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dlaczego tylko jeden dzień? Nie ma problemu, mechanizm działa w oparciu o przedziały czasowe, analizuje informacje ze wskazanego przedziału, nie na wskazany dzień. Sam mechanizm jest uniwersalny i do analiz ponadtygodniowych wymaga już nieco mocniejszego sprzętu (i o dziwo jest to RAM i procesor, nie gpu :)), analiza około tysiąca newsów z dnia trwa od 15 do 28 minut, więc nie tak długo. Aktualnie analizujemy dni aż do 01.01.2025, po tym procesie można będzie prześledzić informacje od 01.01.2025 do dnia, w którym będzie się śledziło 😉 Mechanizm działa w oparciu o zautomatyzowane jednodniowe analizy, dlatego codziennie pojawia się podsumowanie informacji z dnia wcześniejszego. Po analizie jednodniowej planujemy wprowadzić właśnie analizy tygodniowe.&lt;/p&gt;
&lt;p&gt;Zachęcamy do &lt;em&gt;&lt;a href=&#34;https://playground.radlab.dev/news_browser&#34;&gt;Przeglądania Informacji&lt;/a&gt;&lt;/em&gt;, analizowania i wyciągania wniosków. Przeglądarka jest oczywiście w całości non-profit, bez reklam i logowania się 😉&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Content Supervisor o Przeglądarce [klik]&lt;/summary&gt;&lt;div&gt;&lt;p&gt;Podsumowanie tego wpisu za pomocą content supervisora z &lt;a href=&#34;https://playground.radlab.dev/Czat_publiczny&#34;&gt;Czatu Publicznego&lt;/a&gt; 😉 Oto, co gemma napisała o &lt;em&gt;&lt;a href=&#34;https://playground.radlab.dev/Przegl%C4%85darka_Informacji&#34;&gt;Przeglądarce&lt;/a&gt;&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/9f697dd930-480.webp 480w, /assets/img/9f697dd930-768.webp 768w, /assets/img/9f697dd930-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/9f697dd930.png&#34; alt=&#34;&#34; width=&#34;1113&#34; height=&#34;329&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Rozmowa do przeczytania na &lt;a href=&#34;https://playground.radlab.dev/Czat_publiczny&#34;&gt;Czacie Publicznym&lt;/a&gt;, wystarczy załadować hash:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;text
7ivUpPCTNPR0d8gGbPT9hh5nD1Y8yMapJSOISOTg7mFJvryf3BgzGdT03Bsf0Ui3gWymAkciIWRxPJnHslFwnP0FtYzrSi8xj7AOqxT5lcqQ1waaYadNUIOoOJAqu9wP&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;&lt;/details&gt;

&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sprawdź powiązane rozwiązania:&lt;/strong&gt; Zobacz pełny 8-etapowy potok przetwarzania i architekturę w opisie &lt;a href=&#34;/products/radar/&#34;&gt;Radar Informacji&lt;/a&gt; oraz przetestuj wersję demonstracyjną na żywo w &lt;a href=&#34;/products/playground/&#34;&gt;RDL Playground AI&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>pLLama3.1 8B — czyli średnio-duże a nawet małe GenAI dla Polskiego</title>
    <link href="https://radlab.dev/2024-12-08/pllama3-1-8b-czyli-srednio-duze-a-nawet-male-genai-dla-polskiego/"/>
    <id>https://radlab.dev/2024-12-08/pllama3-1-8b-czyli-srednio-duze-a-nawet-male-genai-dla-polskiego/</id>
    <updated>2024-12-08T00:00:00Z</updated>
    <published>2024-12-08T00:00:00Z</published>
<category term="dpo"/><category term="fine-tuning"/><category term="genai"/><category term="huggingface"/><category term="llm"/><category term="pllama"/><category term="transformers"/>    <summary>pLLama – wygenerowane za pomocą AI Ostatnio napisaliśmy: Tak… celowe było błędne zapisanie nie-ko-po-le-i (to nie błąd) jako zapowiedź nie-kolejnej wersji…</summary>
    <content type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/9efe550e20-480.webp 480w, /assets/img/9efe550e20-768.webp 768w, /assets/img/9efe550e20-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/9efe550e20.png&#34; alt=&#34;pLLama - wygenerowane za pomocą AI&#34; width=&#34;1024&#34; height=&#34;796&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;pLLama – wygenerowane za pomocą AI&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ostatnio napisaliśmy:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/2e1d15a6c7-480.webp 480w, /assets/img/2e1d15a6c7-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/2e1d15a6c7.png&#34; alt=&#34;&#34; width=&#34;828&#34; height=&#34;155&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Tak… celowe było błędne zapisanie &lt;strong&gt;nie-ko-po-le-i&lt;/strong&gt; (to nie błąd) jako zapowiedź nie-kolejnej wersji modelu 🙂 między &lt;a href=&#34;https://radlab.dev/2024/08/16/pllama3-8b-70b-genai-dla-polskiego/&#34;&gt;pLlamą3&lt;/a&gt; oraz &lt;a href=&#34;https://radlab.dev/2024/10/20/pllama3-2-1b-3b-male-genai-dla-polskiego/&#34;&gt;pLlamą3.2&lt;/a&gt; była też wersja pLLamy3.1 — i to o niej dzisiejszy wpis.&lt;/p&gt;
&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;a class=&#34;headerlink&#34; href=&#34;#intro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kolejna wersja modelu od Mety mówiąca lepiej po polsku! W tym wpisie przedstawiamy model &lt;a href=&#34;https://huggingface.co/collections/radlab/pllama31-models-6710cace79670d489fe7d9bd&#34;&gt;pLLama3.1&lt;/a&gt; w architekturze 8B. Tym razem opublikowaliśmy model &lt;em&gt;-content&lt;/em&gt;, który jest mniej gadatliwą wersją modelu, model &lt;em&gt;-chat&lt;/em&gt; jako bardziej rozgadana jego wersja, czysty model &lt;em&gt;-base&lt;/em&gt; po LoRze, ale również udostępniliśmy &lt;em&gt;eksperymentalny model z transferem warstw adaptacyjnych&lt;/em&gt; modelu pLLama3 do modelu pLLama3.1 (o tym niebawem kolejny wpis:)). Wszystkie modele dostępne oczywiście na &lt;a href=&#34;https://huggingface.co/radlab&#34;&gt;huggingface&lt;/a&gt; (pełna &lt;a href=&#34;https://huggingface.co/collections/radlab/pllama31-models-6710cace79670d489fe7d9bd&#34;&gt;kolekcja modeli 3.1&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Model radlab/pLLama3.1-8B-content : to model po SFT i DPO udziela krótkich i zwięzłych odpowiedzi.&lt;/li&gt;
&lt;li&gt;Model radlab/pLLama3.1-8B-chat to bardziej gadatliwa wersja modelu (po SFT i DPO), idealnie nadaje się do rozmowy na czacie.&lt;/li&gt;
&lt;li&gt;Model radlab/pLLama3.1-8B-base-ft-16bit to model bezpośrednio po SFT z LoRa.&lt;/li&gt;
&lt;li&gt;Eksperymentalny model radlab/pLLama-L31-adapters-MIX-SFT-DPO z transferem warstw adaptacyjnych między modelami.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;dataset-uczenie-i-wykresy&#34;&gt;Dataset, uczenie i wykresy&lt;a class=&#34;headerlink&#34; href=&#34;#dataset-uczenie-i-wykresy&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wszystkie wersje modeli pLLamy3.1 mają jednego rodzica, mianowicie &lt;a href=&#34;https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct&#34;&gt;Llama-3.1-8B-Instruct&lt;/a&gt; od Meta.AI w architekturze 8B. Ten model już całkiem dobrze pisze w swojej podstawowej wersji po polsku, jednak dużo brakuje do (przynajmniej) poprawnego pisania. Stąd pomysł: douczmy i ten model 🙂&lt;/p&gt;
&lt;p&gt;Do uczenia wykorzystaliśmy zbiór danych opracowany do wcześniejszych modeli. Krótko przypominając jest to ponad 650k instrukcji wygenerowanych automatycznie na podstawie dostępnych zbiorów danych. Każdy zbiór (np. oznaczony częściami mowy), przekształcaliśmy do postaci promtów systemowych na zasadzie pytania i odpowiedzi. W ten sposób powstał zbiór instrukcji, które wykorzystaliśmy jako dane do douczenia modelu. Do DPO również opracowaliśmy zestaw instrukcji na podstawie dostępnych korpusów językowych między innymi NKJP i KPWr.&lt;/p&gt;
&lt;p&gt;Ze względu na ograniczenia sprzętowe SFT robiliśmy z wykorzystaniem warstw adaptacyjnych (LoRA) z kwantyzacją liczb do 16 bitów (bits and bytes). Podobnie w DPO, model bazowy ładowany był jako kwantyzowana wersja pLLamy3.1 po SFT i w trakcie DPO douczana również była warstwa adaptacyjna. Dla przypomnienia, w naszym przypadku podczas SFT przekrzywiamy wagi modelu w stronę języka polskiego, zaś w procesie DPO uczymy model poprawnego generowania tekstu — pod względem gramatycznym i interpunkcyjnym. Modele trenowaliśmy na pojedynczych kartach graficznych RTX 4090 (24 GB). SFT (LoRA) trwało 14d 2h 3m 52s. Zaś DPO 2d 15h 2m 42s. Różnica między modelem &lt;em&gt;-content&lt;/em&gt; a &lt;em&gt;-chat&lt;/em&gt; to kwestia innego sposobu łączenia warstwy adaptacyjnej z modelem (ale o tym będzie osobny wpis). Poniżej dwa wykresy, pierwszy z nich to wartość funkcji straty w SFT, drugi to wartości logitów &lt;em&gt;chosen&lt;/em&gt; i &lt;em&gt;rejected&lt;/em&gt; podczas DPO.&lt;/p&gt;
&lt;p&gt;Funkcja straty podczas SFT z Lorą&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/0d37e0f2a1-480.webp 480w, /assets/img/0d37e0f2a1-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/0d37e0f2a1.png&#34; alt=&#34;&#34; width=&#34;796&#34; height=&#34;314&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I proces DPO:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/a5e10bfbf8-480.webp 480w, /assets/img/a5e10bfbf8-768.webp 768w, /assets/img/a5e10bfbf8-1024.webp 1024w, /assets/img/a5e10bfbf8-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/a5e10bfbf8.png&#34; alt=&#34;&#34; width=&#34;1598&#34; height=&#34;320&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;a class=&#34;headerlink&#34; href=&#34;#outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Czym różni się model w wersji 3.1 od modelu &lt;a href=&#34;https://radlab.dev/2024/08/16/pllama3-8b-70b-genai-dla-polskiego/&#34;&gt;pLLama3&lt;/a&gt;? Przede wszystkim wielkością kontekstu. Model pLLama3 miał ograniczony kontekst do 8k tokenów. Wersja pLLamy3.1 to kontekst o długości 128k tokenów (to wynika z modelu bazowego, czyli w pLLamie 3 douczaliśmy Llamę3 od Mety, zaś w pLLamie3.1 model LLama3.1 od mety). W testach w RAGu pLLama3.1 działa zdecydowanie lepiej od wersji 3 przede wszystkim ze względu na większy kontekst. W tej chwili podczas odpowiadania na pytanie model jest w stanie pomieścić dużo więcej informacji, co mocno zmniejsza częstotliwość jego odpytywania, redukuje mocno problem ze zbyt częstym odpytywaniem modelu, dzieleniem danych do wielkości wejścia (przy okazji redukuje problem składania odpowiedzi końcowej w RAG na podstawie cząstkowych odpowiedzi przy małym kontekście).&lt;/p&gt;
&lt;p&gt;A jako dodatek na HF model, który nazwaliśmy L31 (&lt;a href=&#34;https://huggingface.co/radlab/pLLama-L31-adapters-MIX-SFT-DPO&#34;&gt;pLLama-L31-adapters-MIX-SFT-DPO&lt;/a&gt;) jako pewien eksperyment przy mixowaniu modeli.&lt;/p&gt;
&lt;p&gt;Tyle na dziś, dzięki!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>pLlama3.2 (1B + 3B) – małe GenAI dla polskiego</title>
    <link href="https://radlab.dev/2024-10-20/pllama3-2-1b-3b-male-genai-dla-polskiego/"/>
    <id>https://radlab.dev/2024-10-20/pllama3-2-1b-3b-male-genai-dla-polskiego/</id>
    <updated>2024-10-20T00:00:00Z</updated>
    <published>2024-10-20T00:00:00Z</published>
<category term="dpo"/><category term="fine-tuning"/><category term="genai"/><category term="hf"/><category term="huggingface"/><category term="pllama"/><category term="transformers"/><category term="uczenie"/>    <summary>pLLama – wygenerowane za pomocą AI Intro Cześć Wam! Dziś bardzo krótki wpis. Wpis o modelu, niewielkim jak na te czasy. Pewnie słyszeliście o LLamie3.2 od…</summary>
    <content type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/9efe550e20-480.webp 480w, /assets/img/9efe550e20-768.webp 768w, /assets/img/9efe550e20-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/9efe550e20.png&#34; alt=&#34;pLLama - wygenerowane za pomocą AI&#34; width=&#34;1024&#34; height=&#34;796&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;pLLama – wygenerowane za pomocą AI&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;a class=&#34;headerlink&#34; href=&#34;#intro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cześć Wam!&lt;/p&gt;
&lt;p&gt;Dziś bardzo krótki wpis. Wpis o modelu, niewielkim jak na te czasy. Pewnie słyszeliście o LLamie3.2 od MetaAI? Meta udostępniła ostatnio modele do generowania treści (&lt;em&gt;Instruct&lt;/em&gt;) ale i obrazów (&lt;em&gt;Vision-Instruct&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/5d4ab12b5b-480.webp 480w, /assets/img/5d4ab12b5b-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/5d4ab12b5b.png&#34; alt=&#34;&#34; width=&#34;836&#34; height=&#34;178&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/74cbcb6a25-480.webp 480w, /assets/img/74cbcb6a25-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/74cbcb6a25.png&#34; alt=&#34;&#34; width=&#34;825&#34; height=&#34;361&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Niestety modele &lt;em&gt;Vision-Instruct&lt;/em&gt; nie są dostępne w Unii Europejskiej no i przy okazji w naszym kraju.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/7bd342c90e-480.webp 480w, /assets/img/7bd342c90e-768.webp 768w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/7bd342c90e.png&#34; alt=&#34;&#34; width=&#34;892&#34; height=&#34;157&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Zatem…. co nam zostało? Zostało nam douczyć małe modele tekstowe w architekturze 1B oraz 3B na nasz język 😉&lt;/p&gt;
&lt;h2 id=&#34;dane-i-trening&#34;&gt;Dane i Trening&lt;a class=&#34;headerlink&#34; href=&#34;#dane-i-trening&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Do douczania zastosowaliśmy najpierw technikę fine-tuningu, a następnie w procesie DPO trenowaliśmy oba modele na korekcję języka. Dane dokładnie te same, co w przypadku pLLamy3 (&lt;a href=&#34;https://radlab.dev/2024/08/16/pllama3-8b-70b-genai-dla-polskiego/&#34;&gt;Kliknij aby przeczytać artykuł&lt;/a&gt;) .Zarówno do fine-tuningu, jak i DPO. Jedynie mała zmiana w hiperparametrach uczenia (batch size, learning rate). Liczba epok w FT to 5, liczba kroków w DPO 50k. A… no i uczenie na 16 bitach 🙂&lt;/p&gt;
&lt;p&gt;Zobaczcie sami na wykres funkcji straty zarówno na części treningowej i ewaluacyjnej (to sam proces fine-tuningu na język polski):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/96132b0792-480.webp 480w, /assets/img/96132b0792-768.webp 768w, /assets/img/96132b0792-1024.webp 1024w, /assets/img/96132b0792-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/96132b0792.png&#34; alt=&#34;&#34; width=&#34;2363&#34; height=&#34;1147&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/21a5f11944-480.webp 480w, /assets/img/21a5f11944-768.webp 768w, /assets/img/21a5f11944-1024.webp 1024w, /assets/img/21a5f11944-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/21a5f11944.png&#34; alt=&#34;&#34; width=&#34;2368&#34; height=&#34;1156&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I dokładnie taka między nimi jest różnica 🙂&lt;/p&gt;
&lt;h2 id=&#34;odczucia&#34;&gt;Odczucia&lt;a class=&#34;headerlink&#34; href=&#34;#odczucia&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jako, że modele 1B oraz 3B to destylacja modeli już istniejących zapewne oceniana w większości na danych anglojęzycznych, ciekawy był efekt całego procesu douczania tych modeli. Model w architekturze 1B (zarówno po FT ale i po DPO) to chyba najmniej sprawny model z całej naszej kolekcji — ale statystyki mety pokazują dokładnie to samo. Zaś model w architekturze 3B, to zupełnie inna liga niż 1B. Można powiedzieć, że działa zgodnie z oczekiwaniami 🙂&lt;/p&gt;
&lt;p&gt;Porównywanie ich do większych modeli mija się trochę z celem, ponieważ w przypadku 1B i 3B Meta postawiła na możliwość uruchamiania ich na mniej wydajnym sprzęcie, a nawet na komórce 😉 O ile model 1B słabo sobie radzi, o tyle 3B potrafi zaskoczyć.&lt;/p&gt;
&lt;h2 id=&#34;modele-do-pobrania&#34;&gt;Modele do pobrania&lt;a class=&#34;headerlink&#34; href=&#34;#modele-do-pobrania&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Zapraszamy oczywiście na nasz HuggingFace, na którym stworzyliśmy kolekcję z modelami &lt;em&gt;&lt;a href=&#34;https://huggingface.co/collections/radlab/pllama32-models-6710bdf9eac198072676a52f&#34;&gt;pLLama3.2 Models&lt;/a&gt;&lt;/em&gt;. Wszystkie modele oczywiście udostępniamy publicznie za darmo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modele w architekturze 1B: radlab/pLLama3.2-1B – model tylko po fine-tuningu, oraz radlab/pLLama3.2-1B-DPO po FT + DPO&lt;/li&gt;
&lt;li&gt;Modele w architekturze 3B: radlab/pLLama3.2-3B model tylko po fine-tuning, oraz radlab/pLLama3.2-3B-DPO po FT + DPO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Częstujcie się 🙂&lt;/p&gt;
&lt;h2 id=&#34;co-dalej&#34;&gt;&lt;strong&gt;Co dalej?&lt;/strong&gt;&lt;a class=&#34;headerlink&#34; href=&#34;#co-dalej&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Dalej będzie nie-ko-po-le-i: pLLama3.1-8B (to ten zielony wykres) oraz L31 jako pewien ciekawy mix…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/491ea5e991-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/491ea5e991.png&#34; alt=&#34;&#34; width=&#34;648&#34; height=&#34;268&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/a5be28258b-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/a5be28258b.png&#34; alt=&#34;&#34; width=&#34;647&#34; height=&#34;279&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>pLlama3 (8B + 70B) – GenAI dla polskiego</title>
    <link href="https://radlab.dev/2024-08-16/pllama3-8b-70b-genai-dla-polskiego/"/>
    <id>https://radlab.dev/2024-08-16/pllama3-8b-70b-genai-dla-polskiego/</id>
    <updated>2024-08-18T00:00:00Z</updated>
    <published>2024-08-16T00:00:00Z</published>
<category term="dpo"/><category term="fine-tuning"/><category term="genai"/><category term="hf"/><category term="huggingface"/><category term="llama"/><category term="pllama"/><category term="transformers"/>    <summary>pLLama – wygenerowane za pomocą AI Intro Witajcie! W ostatnim wpisie wspominaliśmy o modelu GenaAI… Tak! Dzisiaj chcemy przedstawić Wam nasz nowy model, a…</summary>
    <content type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/9efe550e20-480.webp 480w, /assets/img/9efe550e20-768.webp 768w, /assets/img/9efe550e20-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/9efe550e20.png&#34; alt=&#34;pLLama - wygenerowane za pomocą AI&#34; width=&#34;1024&#34; height=&#34;796&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;pLLama – wygenerowane za pomocą AI&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;a class=&#34;headerlink&#34; href=&#34;#intro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Witajcie!&lt;/p&gt;
&lt;p&gt;W ostatnim &lt;a href=&#34;https://radlab.dev/2024/08/04/rag-i-problemy/&#34;&gt;wpisie&lt;/a&gt; wspominaliśmy o modelu GenaAI… Tak! Dzisiaj chcemy przedstawić Wam nasz nowy model, a właściwie to rodzinę modeli douczoną na język polski&lt;a href=&#34;https://huggingface.co/radlab/pLLama3-8B-chat&#34;&gt;: pLLama3-8B-chat&lt;/a&gt;,&lt;a href=&#34;https://huggingface.co/radlab/pLLama3-8B-creator&#34;&gt; pLLama3-8B-creator&lt;/a&gt; oraz &lt;a href=&#34;https://huggingface.co/radlab/pLLama3-70B&#34;&gt;pLLama3-70B&lt;/a&gt;. Tym razem poszliśmy w kierunku douczania modeli od gigantów aby lepiej radziły sobie z naszym językiem.&lt;/p&gt;
&lt;p&gt;Na pierwszy strzał poszły &lt;a href=&#34;https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct&#34;&gt;Llama-3-8B-Instruct&lt;/a&gt; oraz &lt;a href=&#34;https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct&#34;&gt;Llama-3-70B-Instruct&lt;/a&gt; od Meta.ai. Jest to model instrukcji, który potrafi wykonywać polecenia zadane w prompt’cie do modelu. Oryginalny model nie radzi sobie za dobrze z językiem polskim. Czasami potrafi coś po polsku napisać, jednak ciężko jest na nim wymusić płynną komunikację w naszym języku. Co ciekawe, zaskakująco dobrze potrafi zrozumieć polskie polecenia, jednak nie potrafi skonstruować poprawnej odpowiedzi.&lt;/p&gt;
&lt;p&gt;Modele w architekturze 8B udostępniamy w dwóch konfiguracjach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;radlab/pLLama3-8B-creator , model który podaje dość krótkie, konkretne odpowiedzi na zapytania użytkownika;&lt;/li&gt;
&lt;li&gt;radlab/pLLama3-8B-chat – model, który jest wersją gadatliwą, odzwierciedlającą zachowanie oryginalnego modelu meta-llama/Meta-Llama-3-8B-Instruct.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;dataset&#34;&gt;Dataset&lt;a class=&#34;headerlink&#34; href=&#34;#dataset&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fakt, że oryginalny model potrafi rozumieć polskie polecenia był dla nas zapalnikiem do pracy nad modelem. Założyliśmy hipotezę, że wystarczy w takim razie odpowiednio douczyć warstwę językową, jak najmniej ingerując w warstwę instrukcji.&lt;/p&gt;
&lt;p&gt;Ale, jak to w przypadku dużych modeli językowych bywa, pojawił się pierwszy problem. Skąd pozyskać dane (&lt;em&gt;szczególnie dostępnych jako zestawy instrukcji/konwersacji na czacie!&lt;/em&gt;), aby było ich wystarczająco dużo oraz aby ich jakość była jak najlepsza? Dla języka polskiego, istnieje tak na prawdę jeden, publicznie dostępny zbiór danych do uczenia modelu instrukcji, jest to &lt;a href=&#34;https://huggingface.co/datasets/Lajonbot/alpaca-dolly-chrisociepa-instruction-only-polish&#34;&gt;alpaca-dolly-chrisociepa-instruction-only-polish&lt;/a&gt;. Jednak wielkość tego zbioru, nie pozwalała na dostateczne douczenie modelu.&lt;/p&gt;
&lt;p&gt;W związku z tym, opracowaliśmy metodę tworzenia zbioru danych w strukturze instrukcji, korzystając z innych, dostępnych w sieci datasetów. Opracowaliśmy zestaw około 650k instrukcji w języku polskim, którymi nakarmiliśmy model podczas uczenia.&lt;/p&gt;
&lt;p&gt;Dodatkowo, opracowaliśmy zbiór uczący do procesu DPO, który zawierał 100k przykładów, w których uczyliśmy model wybierać poprawnie zapisane wersje tekstów od tych, które zawierają błędy językowe. Przykłady uczące do DPO zawierały poprawnie zapisaną formę językową (&lt;em&gt;chosen&lt;/em&gt;) oraz niepoprawnie zapisaną formę (&lt;em&gt;rejected&lt;/em&gt;) tego samego tekstu. Warto zaznaczyć, że danych do DPO budowany był wstecznie — mianowicie dla bardzo dobrej jakości tekstów (&lt;em&gt;chosen&lt;/em&gt;), przygotowaliśmy ich odpowiednik zaśmiecony (&lt;em&gt;rejected&lt;/em&gt;).&lt;/p&gt;
&lt;h2 id=&#34;proces-uczenia&#34;&gt;Proces uczenia&lt;a class=&#34;headerlink&#34; href=&#34;#proces-uczenia&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Proces uczenia podzielony był na dwa etapy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dotrenowywanie ( FT ) na zbiór 650k instrukcji w języku polskim, czas fine-tuningu ustawiony był na 5 epok.&lt;/li&gt;
&lt;li&gt;Po etapie FT, dotrenowaliśmy model za pomocą DPO na 100k instrukcji poprawnego pisanie po polsku, w tym przypadku ustawiliśmy czas uczenia na 15k kroków.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Douczanie modelu na 650k miało na celu przeniesienie warstwy językowej dotrenowywanego modelu w stronę języka polskiego. Niestety ze względu na &lt;strong&gt;nieidealny&lt;/strong&gt; zbiór instrukcji&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ciekawostka&lt;/em&gt;: zbiór instrukcji, generowany był w ~95% automatycznie — wykorzystując wczesną formę uczonego modelu (&lt;em&gt;w architekturze 70B&lt;/em&gt;)  iteracyjnie, do wspomagania tworzenia zbioru, który utworzyliśmy do uczenia tego modelu docelowego…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;model zaczął faktycznie mówić po polsku i reagować na instrukcje, ale czasami popełniał dość sporo literówek. Dlatego postanowiliśmy dotrenować model w DPO. W DPO przede wszystkim chcieliśmy uzyskać poprawę warstwy językowej modelu w stosunku do modelu z FT. Optymalizacja polegała na uczeniu modelu wyboru poprawnej formy językowej, a odrzucaniu niepoprawnej.&lt;/p&gt;
&lt;p&gt;Na poniższym wykresie przedstawiona jest funkcja straty podczas całego procesu uczenia (model 8B). Nagły spadek wartości na początku funkcji, może świadczyć o dość szybkim dostosowaniu modelu do języka polskiego. A cały, długotrwały proces uczenia, to de facto poprawianie już szczegółów językowych.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/1e3570ed6f-480.webp 480w, /assets/img/1e3570ed6f-768.webp 768w, /assets/img/1e3570ed6f-1024.webp 1024w, /assets/img/1e3570ed6f-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/1e3570ed6f.png&#34; alt=&#34;&#34; width=&#34;2387&#34; height=&#34;1225&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Modele 8B uczyliśmy przez 5 epok, i cały proces uczenia trwał przez ponad 19d 14h na jednej karcie RTX 4090.&lt;/p&gt;
&lt;p&gt;Szczegółowe metryki po skończonym fine-tuningu (model 8B):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metryka&lt;/th&gt;
&lt;th&gt;Wartość&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;eval/loss&lt;/td&gt;
&lt;td&gt;0.8690009713172913&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;eval/runtime&lt;/td&gt;
&lt;td&gt;464.5158&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;eval/samples_per_second&lt;/td&gt;
&lt;td&gt;8.611&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;total_flos&lt;/td&gt;
&lt;td&gt;46121863674517000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;train_loss&lt;/td&gt;
&lt;td&gt;0.8724352801788304&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;train_runtime&lt;/td&gt;
&lt;td&gt;1695168.0431&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;train_samples_per_second&lt;/td&gt;
&lt;td&gt;1.758&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;train/epoch&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;train/grad_norm&lt;/td&gt;
&lt;td&gt;0.17023593187332153&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;train/learning_rate&lt;/td&gt;
&lt;td&gt;6.584723441615452e-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;train/loss&lt;/td&gt;
&lt;td&gt;0.8293&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Metryki po procesie uczenia (fine-tuningu)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Zaś metryki DPO przedstawiają się następująco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eval/logits/chosen: 0.1370937079191208&lt;/li&gt;
&lt;li&gt;eval/logits/rejected: 0.07430506497621536&lt;/li&gt;
&lt;li&gt;eval/logps/chosen: -454.11962890625&lt;/li&gt;
&lt;li&gt;eval/logps/rejected :-764.1261596679688&lt;/li&gt;
&lt;li&gt;eval/loss: 0.05717926099896431&lt;/li&gt;
&lt;li&gt;eval/rewards/accuracies: 0.9372459053993224&lt;/li&gt;
&lt;li&gt;eval/rewards/chosen: -26.75682830810547&lt;/li&gt;
&lt;li&gt;eval/rewards/margins: 32.37759780883789&lt;/li&gt;
&lt;li&gt;eval/rewards/rejected: -59.134429931640625&lt;/li&gt;
&lt;li&gt;eval/runtime: 1,386.3177&lt;/li&gt;
&lt;li&gt;eval/samples_per_second: 2.838&lt;/li&gt;
&lt;li&gt;eval/steps_per_second: 1.42&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Na poniższym wykresie przedstawiona jest funkcja straty podczas całego procesu uczenia modelu w architekturze 70B.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/40d18e2ee9-480.webp 480w, /assets/img/40d18e2ee9-768.webp 768w, /assets/img/40d18e2ee9-1024.webp 1024w, /assets/img/40d18e2ee9-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/40d18e2ee9.png&#34; alt=&#34;&#34; width=&#34;2370&#34; height=&#34;1122&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Model 70B uczyliśmy również przez 5 epok, i cały proces uczenia trwał przez &lt;strong&gt;ponad 1mo 5d&lt;/strong&gt; na jednej karcie RTX A6000 ADA 48GB, zaś metryki po skończonym fine-tuningu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eval/loss:0.7297297716140747&lt;/li&gt;
&lt;li&gt;eval/runtime:6,364.4589&lt;/li&gt;
&lt;li&gt;eval/samples_per_second:0.628&lt;/li&gt;
&lt;li&gt;eval/steps_per_second:0.628&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;co-po-uczeniu&#34;&gt;Co po uczeniu?&lt;a class=&#34;headerlink&#34; href=&#34;#co-po-uczeniu&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nasze modele mają jedną, bardzo ciekawą cechę. W tej chwili potrafią przeczytać tekst w „dowolnym” języku, a odpowiedzieć po polsku. Dlatego jeden z nich, który nazwaliśmy &lt;a href=&#34;https://huggingface.co/radlab/pLLama3-8B-creator&#34;&gt;pLLama3-8B-creator&lt;/a&gt; zatrudniliśmy do pisania artykułów do pewnego projektu, o którym wkrótce. Inny z nich &lt;a href=&#34;https://huggingface.co/radlab/pLLama3-8B-chat&#34;&gt;pLLama3-8B-chat&lt;/a&gt; również ma tam swój udział 🙂 Enjoy!&lt;/p&gt;
&lt;h2 id=&#34;huggingface&#34;&gt;Huggingface&lt;a class=&#34;headerlink&#34; href=&#34;#huggingface&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oczywiście! Model udostępniamy za darmo na naszym &lt;a href=&#34;https://huggingface.co/radlab&#34;&gt;huggingface&lt;/a&gt;. Poszczególne modele:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;radlab/pLLama3-8B-chat pod adresem https://huggingface.co/radlab/pLLama3-8B-chat&lt;/li&gt;
&lt;li&gt;radlab/pLLama3-8B-creator dostępny https://huggingface.co/radlab/pLLama3-8B-creator&lt;/li&gt;
&lt;li&gt;radlab/pLLama3-70B dostępny: https://huggingface.co/radlab/pLLama3-70B&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Smacznego i na zdrowie! 🙂&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>RAG (i problemy?)</title>
    <link href="https://radlab.dev/2024-08-04/rag-i-problemy/"/>
    <id>https://radlab.dev/2024-08-04/rag-i-problemy/</id>
    <updated>2024-10-20T00:00:00Z</updated>
    <published>2024-08-04T00:00:00Z</published>
<category term="bi-encoder"/><category term="cross-encoder"/><category term="decoder"/><category term="encoder"/><category term="genai"/><category term="llm"/><category term="rag"/>    <summary>Wstęp Dzisiejszy wpis będzie nieco inny niż przeważnie. Tym razem nie przybywamy z nowym modelem, ale z opisem metody RAG. Metoda jest ogólnie znana, dlatego…</summary>
    <content type="html">&lt;h2 id=&#34;wstep&#34;&gt;Wstęp&lt;a class=&#34;headerlink&#34; href=&#34;#wstep&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dzisiejszy wpis będzie nieco inny niż przeważnie. Tym razem nie przybywamy z nowym modelem, ale z opisem metody RAG. Metoda jest ogólnie znana, dlatego ten wpis będzie bardziej w kontekście problemów, które pojawiają się podczas realizacji systemów wykorzystujących RAG’a, niż opis samej metody.&lt;/p&gt;
&lt;p&gt;Opowiadając w kilku słowach czym jest RAG, można powiedzieć, że jest to metoda wyszukiwania informacji połączona (w warstwie prezentacji wyników) z modelem generatywnym/modelem instrukcji. Mechanizm wyszukiwania oraz zmiany kolejności wyszukanych wyników jest odpowiedzialny za odnalezienie fragmentów tekstów, w których znajduje się odpowiedź na pytanie zadane przez użytkownika. Następnie, fragmenty tekstów aplikowane są do modelu generatywnego w taki sposób, aby model na ich podstawie odpowiedział na pytanie zadane przez użytkownika. I tyle w skrócie 😉&lt;/p&gt;
&lt;p&gt;Do czego, w takim razie, można wykorzystać RAGa? Z racji, że jest to metoda wyszukiwania, to oczywiście do wszelakiego rodzaju wyszukiwarek. Jednak ważnym aspektem, który odróżnia RAGa od standardowego sposobu przeszukiwania kolekcji dokumentów, jest wprowadzenie modelu generatywnego (&lt;em&gt;GenAI&lt;/em&gt;) do udzielenia końcowej odpowiedzi dla użytkownika. Dzięki dokładności samej wyszukiwarki oraz zdolności modelu GenAI do odpowiadania na pytania na podstawie kontekstu, RAG idealnie nada się do wyszukiwania i podsumowywania informacji rozproszonej w wielu dokumentach. Dodatkowo, dzięki GenAI oraz ich przeznaczeniu do prowadzenia konwersacji na czacie, mamy możliwość wpływania na końcową postać odpowiedzi przy zadawaniu pytania. Dla przykładu wyobraźmy sobie, że mamy kolekcję dokumentów, w której gromadzimy teksty z różnymi opiniami użytkowników odnośnie różnych produktów. W tym przypadku RAG idealnie nadałby się do odpowiedzenia na pytanie:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Jakie są pozytywne, a jakie negatywne opinie na temat produktu XYZ? Podaj po trzy przykłady pozytywnych i negatywnych opinii oraz zaproponuj odpowiedzi na komentarz klienta.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jak widać w przykładzie, do RAGa można podać nie tyklo hasło do wyszukania, ale i rozbudowaną &lt;em&gt;instrukcję udzielenia odpowiedzi&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Na Rys. 1 przedstawiliśmy podział procesu RAG na mniejsze i konkretniejsze kroki. Znajduje się tam sześć głównych modułów, które symbolizują zagadnienia w całym potoku RAGa. Za pomocą czerwonej, przerywanej linii i czerwonej strzałki zaznaczona jest &lt;em&gt;minimalna&lt;/em&gt; ścieżka w takim potoku. Zielona linia i zielona strzałka pokazuje &lt;em&gt;optymalną&lt;/em&gt; ścieżkę w potoku, który można nazwać RAGiem. W tym wpisie, krótko opisaliśmy poszczególne kroki, a ich szczegółowe rozwinięcia będą publikowane w kolejnych wpisach.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/3fce57b3bf-480.webp 480w, /assets/img/3fce57b3bf-768.webp 768w, /assets/img/3fce57b3bf-1024.webp 1024w, /assets/img/3fce57b3bf-1440.webp 1440w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/3fce57b3bf.png&#34; alt=&#34;&#34; width=&#34;2328&#34; height=&#34;1220&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Rys.1 Elementy RAG (opracowanie własne)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;rag-w-kawakach&#34;&gt;RAG w kawałkach&lt;a class=&#34;headerlink&#34; href=&#34;#rag-w-kawakach&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;dane&#34;&gt;Dane&lt;a class=&#34;headerlink&#34; href=&#34;#dane&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dane, to podstawowy element każdego systemu, w którym wykorzystywane są metody uczenia maszynowego (ML). W zależności od problemu, który taki system ML realizuje, należy dostarczyć mu odpowiednie dane. W przypadku RAGa – dane, to wszelakiego rodzaju teksty, w których znajdowane będą odpowiedzi. Może się zatem wydawać, że w dzisiejszych czasach w internecie przecież można znaleźć wszystko i brak danych nie powinien być problemem… Po części tak, ale w większej części nie 😉&lt;/p&gt;
&lt;p&gt;To właśnie mnogość danych wprowadza problem z ich lokalizacją, dostępnością na odpowiedniej licencji oraz ich jakością dowolnie rozumianą. Selekcja pochodzenia informacji z określonych źródeł, jakości samych danych, ich czytelność oraz szczegółowość, to bardzo istotny element całej układanki. Dodajmy do tego jeszcze różne formaty plików, w których zapisane są informacje (w tym format &lt;em&gt;pdf&lt;/em&gt;), wtedy na starcie stajemy przed misją integracji różnych źródeł do wspólnego formatu. Pamiętajmy, że jeżeli do systemu wprowadzimy dane, które zawierają nieprawdziwe informacje, lub zawierają ich za mało, bądź są za mało szczegółowe, to system wykorzystujący metodę RAG będzie właśnie na ich podstawie podawał odpowiedzi, które mogą być błędne.&lt;/p&gt;
&lt;p&gt;Warto raz jeszcze podkreślić, że końcowa odpowiedź systemu generowana jest na podstawie dostarczonych danych z wyszukiwarki. Zatem jeżeli w wyszukiwarce znajdą się nierzetelne dane, nieprawdziwe i małomerytoryczne informacje, to takie też odpowiedzi będziemy dostawać. Dlatego warto poświęcić czas na odpowiednie dobranie zbioru/utworzenie kolekcji dokumentów, na której będziemy działać, oraz zadbać o &lt;em&gt;preprocessing danych&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Można zatem śmiało powiedzieć, że jakość odpowiedzi z takiego systemu, jest mocno determinowana jakością danych, z których taki system korzysta.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;preprocessing-danych&#34;&gt;Preprocessing danych&lt;a class=&#34;headerlink&#34; href=&#34;#preprocessing-danych&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bardzo istotnym elementem systemu RAG jest &lt;em&gt;preprocessing danych&lt;/em&gt;, czyli ich wstępna obróbka. Zanim dane trafią do dalszego procesu, warto wprowadzić pewien standard co do ich jakości. Wspomniana różnorodność zapisów danych powoduje problem z odpowiednim ich odczytywaniem. Automatyczne przetwarzanie danych pobranych ze stron www, plików docx, pdf wprowadza duży szum w danych. Z perspektywy systemu RAG ważne jest, aby dane zawierały istotne informacje. Przy automatycznym wczytywaniu danych, przykładowo z pliku pdf, odczytamy nie tylko istotne fragmenty, ale całą masę tekstu, łącznie z nagłówkami rozdziałów, poszatkowanymi danymi tabelarycznymi, bądź co gorsze — całkowicie nieczytelne dane, jak np. te (np. kiedy w pliku pdf są obrazki, które również jest ciężko OCRować):&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;4kV�#4T��##�_#�p��W#�_�|3��-�tg�\S�x�b�X��t�]*���\&amp;amp;/#��/�P�
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Oczywiście na taką sytuację ciężko jest coś poradzić, ale warto je wykrywać i nie dopuszczać danych dalej, już na etapie obróbki wstępnej. W naszym &lt;a href=&#34;https://radlab.dev/2024/04/20/odszumiacz-tekstow/&#34;&gt;wcześniejszym wpisie&lt;/a&gt; przedstawiliśmy inny problem z plikami pdf. Po ich odczytaniu, dostajemy mocno zdeformowane dane, cytując przykład z wpisu:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Strona...Tytuł...%6%z%50%|.....Zdecydowana0większość0czerwonych.karłów$należy#do,typu,widmowego%M,%ale%zalicza^się^do^nich^także^wieleHgwiazdHpóźnychHpodtypówHtypuHwidmowegoHKHorazHrzadkoHwystępujące,,najsłabsze,gwiazdy,typu,L.,Maksimum%intensywności%emitowanego%światła%przypada%w%zakresie%światła%czerwonego%lub%nawet%bliskiej%podczerwieni.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A to z perspektywy dalszego przetwarzania bez odpowiedniego wyczyszczenia takich danych, niesie tylko problemy. Indeksacja tekstu, który zawiera aż tak nieczytelne dane, spowoduje, że będą one równie nieczytelne dla samych metod przeszukujących. Ważne jest aby na tym etapie potrafić dane ocenić pod względem ich jakości oraz w miarę możliwości doprowadzić je do postaci zbliżonej do ideału 😉 Czy na tym etapie warto już wprowadzać modele ML do oceny i poprawy — oczywiście, że tak! Oto przykład działania naszego modelu &lt;a href=&#34;https://radlab.dev/2024/04/20/odszumiacz-tekstow/&#34;&gt;T5&lt;/a&gt;, który czyści teksty z takich sytuacji:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Zdecydowana większość czerwonych karłów należy do typu widmowego M, ale zalicza się do nich także wiele gwiazd późnych podtypów typu widmowego K oraz rzadko występujące, najsłabsze gwiazdy typu L. Maksimum intensywności emitowanego światła przypada w zakresie światła czerwonego lub nawet bliskiej podczerwieni.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Może nie idealnie, ale znacznie lepiej od pierwotnej formy 😉&lt;/p&gt;
&lt;p&gt;Co zrobić w jeżeli w dokumentach mamy dużo tabel, rysunków/wykresów? Warto rozważyć wykorzystanie modeli, które potrafią je interpretować oraz generować opis, którym następnie można wzbogacić oryginalny tekst.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(…) &lt;em&gt;Ważne jest również identyfikowanie tych dobrych i tych złych jakościowo danych, oraz ich standaryzacja do dalszego przetwarzania.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;indeksowanie-danych&#34;&gt;Indeksowanie danych&lt;a class=&#34;headerlink&#34; href=&#34;#indeksowanie-danych&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To bardzo istotny proces w całym RAGu. Po wstępnej obróbce danych trzeba je zapisać w bazie, w której następnie będą one wyszukiwane. Na tym etapie warto wprowadzić równoległe indeksowanie tekstu zarówno w bazie relacyjnej jak i wektorowej. Baza relacyjna pomoże w ułożeniu dłuższego dokumentu w jego oryginalną strukturę, zaś wektorowa umożliwi semantyczne przeszukiwanie. Bardzo ważnym elementem w procesie indeksowania jest sposób indeksacji. To na tym etapie decydujemy, które informacje z wcześniejszego kroku będą indeksowane, oraz gdzie i jak.&lt;/p&gt;
&lt;p&gt;Przede wszystkim należy zastanowić się nad przeznaczeniem systemu RAG (konkretna dziedzina, specjalistyczny agent, ogólne informacje) i dobrać odpowiedni model (&lt;a href=&#34;https://www.sbert.net/examples/applications/cross-encoder/README.html&#34;&gt;embedder&lt;/a&gt;), który odpowiednio dobrze „zrozumie” indeksowane treści. To właśnie &lt;em&gt;embedder&lt;/em&gt; tworzy wektorowe reprezentacje tekstów, które indeksowane są w bazach wektorowych (np. &lt;a href=&#34;https://milvus.io/&#34;&gt;Milvus&lt;/a&gt;), które to następnie są przeszukiwane. Jeżeli na tym etapie transformacja tekstu do wektora będzie niedokładna, czyli innymi słowy, jeżeli źle dobierzemy model embeddera do treści, które indeksujemy, to może to skutkować gorszą/mniej dokładną jakością w procesie ich porównywania. Błąd z indeksowania może zatem być propagowany do dalszych kroków przetwarzania. Ważne jest również dobranie odpowiedniej długości tekstów, które indeksowane są jako pojedynczy fragment. Jeżeli tekst jest za długi, warto podzielić go na mniejsze części zwane &lt;em&gt;chunkami&lt;/em&gt; — czyli jeden tekst podzielony jest na kilka mniejszych fragmentów.&lt;/p&gt;
&lt;p&gt;Co w sytuacji, kiedy indeksujemy mocno specyficzne treści, do których nie ma dostępnych embedderów? Oczywiście, stajemy przed problemem znalezienia innego, bardziej dopasowanego lub wyuczenia takiego modelu od początku. W jednym z wcześniejszych postów przedstawiliśmy nasz wstępny model &lt;a href=&#34;https://radlab.dev/2024/04/30/dwa-nowe-modele-encoderow-dla-polskiego/&#34;&gt;embedder&lt;/a&gt;, który trenowany był na treściach &lt;em&gt;internetowych&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(…) Istotne jest również dobranie lub wyuczenie specjalistycznego embeddera oraz odpowiednia indeksacja w bazach.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;wyszukiwanie&#34;&gt;Wyszukiwanie&lt;a class=&#34;headerlink&#34; href=&#34;#wyszukiwanie&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Można powiedzieć, że sprawa się tutaj nieco upraszcza, ponieważ na etapie wyszukiwania korzystamy z tych samych mechanizmów tłumaczących tekst do reprezentacji wektorowej, co na etapie indeksacji… Nic bardziej mylnego. Dzieje się tak tylko w przypadku, kiedy ograniczamy proces wyszukiwania, tylko do policzenia podobieństwa wektorów reprezentujących pytanie do chunków w bazie. Najczęściej obliczany jest kosinus kąta między wektorem pytania, a wektorami zapisanymi w bazie wektorowej. Tymi wektorami, które zapisaliśmy na etapie indeksowania danych. Jednak, jak wspomnieliśmy wcześniej, &lt;em&gt;zależy jakie informacje indeksujemy, oraz gdzie i jak&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Jeżeli na etapie indeksacji, wzbogacimy informacje o indeksowanych fragmentach o dodatkowe metadane, to właśnie w tym kroku jesteśmy w stanie wstępnie odsiać te chunki, które na 100% są nieprawidłowe. Przykładowo, jeżeli wzbogacimy opis chunku o jego kategorię, wtedy na tym etapie, przed semantycznym porównywaniem za pomocą wyszukiwarki, możemy ograniczyć przestrzeń poszukiwań tylko do tych, które pochodzą ze wskazanej kategorii.&lt;/p&gt;
&lt;p&gt;Zatem warto rozważyć opcję, aby semantyczne wyszukiwanie było ograniczane przez dodatkowe wymiary. Czy do tego przydadzą się dodatkowe metody ML? Oczywiście, że tak. To tylko kwestia wyobraźni oraz przeznaczenia danego modelu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(…) Dodatkowe metainformacje o chunkach mogą mocno pomóc podczas wyszukiwania, np. ograniczenie wyników tylko do dokumentów z określonej kategorii.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;zmiana-kolejnosci-rankingu-wynikow&#34;&gt;Zmiana kolejności rankingu wyników&lt;a class=&#34;headerlink&#34; href=&#34;#zmiana-kolejnosci-rankingu-wynikow&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ok, a co dalej, jeżeli po odpowiednim filtrowaniu i wyszukaniu informacji nadal mamy problem z wyborem, który z wyszukanych chunków jest najistotniejszy? Wtedy z pomocą nadchodzi proces &lt;em&gt;rerankingowania&lt;/em&gt; kolejności wyników zwracanych przez wyszukiwarkę. Jednym ze standardowych podejść jest wykorzystanie modeli typu &lt;em&gt;&lt;a href=&#34;https://www.sbert.net/examples/applications/cross-encoder/README.html&#34;&gt;cross-encoders&lt;/a&gt;&lt;/em&gt;, które, jeżeli są w odpowiedni sposób nauczone, mogą określić stopień relewantności pytania do wyszukanego chunka. Oczywiście, jak w przypadku embeddera, jeżeli model &lt;em&gt;rerankera&lt;/em&gt; nie będzie odpowiednio dobrany do specyfiki danych, wynik może być przeciwny oczekiwanemu 🙂&lt;/p&gt;
&lt;p&gt;Co w takiej sytuacji trzeba zrobić? Głównie stosuje się dwa podejścia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;po lepszym zrozumieniu dziedziny oraz dokładniejszym researchu, bardziej świadomie dobiera się inny,&lt;/li&gt;
&lt;li&gt;lub samemu trenuje się specjalistyczny reranker dostosowany do problemu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zarówno jedno jak i drugie podejście ma zalety i wady. Pierwsze z nich jest szybsze, ale (a) nie ma gwarancji, że w ogóle jest taki model, który potrzebujemy, (b) jeżeli godzimy się na jakiś model, to akceptujemy jego dokładność w naszym problemie. Podejście z uczeniem lub douczaniem własnego, raczej będzie dużo bardziej kosztowne, ze względu na czas potrzebny na jego wytworzenie. Jednak jest duża szansa, że taki model będzie dużo dokładniejszy od dostępnych, co podniesie jakość końcowego systemu RAG. Co zatem wybrać? Zależy od sytuacji… 😉&lt;/p&gt;
&lt;p&gt;Oczywiście w procesie &lt;em&gt;rerankingowania&lt;/em&gt; nie jesteśmy ograniczeni do operowania tylko na modelach &lt;em&gt;cross-encoders&lt;/em&gt;, na tym etapie dostajemy potencjalne fragmenty, które zawierają odpowiedź, więc to jedynie nasza wyobraźnia ogranicza nas tutaj z tym, co można zrobić… Czy warto stosować tutaj modele specjalistyczne? Jak najbardziej.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(…) Dopasowanie relewantności chunku do zadanego pytania jest bardzo istotnym krokiem. Nieodpowiednia zmiana kolejności rankingu dokumentów może spowodować, że teksty z istotną informacją zostaną odrzucone tuż przed samym podaniem do GenAI, co mocno może zepsuć końcowy rezultat.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;generowanie-odpowiedzi&#34;&gt;Generowanie odpowiedzi&lt;a class=&#34;headerlink&#34; href=&#34;#generowanie-odpowiedzi&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I w końcu jesteśmy tutaj, czyli na etapie, który na końcowym użytkowniku wywołuje największe wrażenie. Dopiero na tym etapie do gry wchodzi GenAI — jako element konstruujący odpowiedź, która przedstawiana jest jako odpowiedź dla użytkownika systemu RAG.&lt;/p&gt;
&lt;p&gt;Wszystkie wspomniane wcześniej kroki, to potok preprocessingu danych, wyszukania, selekcji i określenie relewantności cząstkowych wyników do zapytania użytkownika. To właśnie te kroki w bardzo dużym stopniu determinują czy końcowa odpowiedź będzie na temat, czy nie. Źle dobrane dane na tym etapie spowodują &lt;em&gt;efekt halucynacji&lt;/em&gt; modelu GenAI. Ważne jest również, aby model GenAI, który wykorzystujemy do generowania odpowiedzi był również odpowiednio douczony w zadaniu odpowiadania na pytania. Mówiąc o GenAI, raczej myślimy o modelach instrukcji. Ważne zatem jest, aby taki GenAI nie tylko rozumiał język, potrafił w tym języku odpowiadać, ale również odpowiednio reagować na instrukcję. To jego zadaniem będzie podsumowanie wszystkich fragmentów/chunków zwróconych z wcześniejszych kroków. Więc ważne, aby taki model przede wszystkim potrafił reagować na instrukcje odpowiadania na pytania, na podstawie dostarczonego kontekstu w postaci chunków.&lt;/p&gt;
&lt;p&gt;Warto pamiętać o jeszcze jednej, istotniej kwestii takich modeli, mianowicie wielkości wejścia. Każdy model ma określoną wielkość wejścia. Wielkość wejścia oznacza ile danych, mierzonych w liczbie tokenów, taki model jest w stanie przetworzyć. Jeżeli do modelu podamy za dużo danych, najprawdopodobniej będą one pomijane — a tego nie chcemy w RAGu, gdzie przeszukujemy potężne kolekcje i równie dużo odpowiedzi możemy dostać!&lt;/p&gt;
&lt;p&gt;Modele instrukcji, to przeważnie bardzo duże modele, zaczynając od tych mniejszych 8B (&lt;em&gt;miliarów&lt;/em&gt;), przez 70B, 405B i więcej parametrów. W takim razie stajemy przed kolejnym pytaniem — model u siebie, czy model w chmurze? Oczywiście wszystko zależy od przeznaczenia systemu oraz możliwości przesyłania danych przez internet do serwisów zewnętrznych takich jak ChatGPT. Jeżeli wybór pada na model generatywny odpytywany lokalnie, pozostaje kwestia jak we wszystkich wcześniejszych krokach…. odpowiedni model do wybranego problemu 🙂 A jaki model? To już osobne opowiadanie.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(…) Wcześniejsze kroki są istotne, ale równie istotny jest odpowiedni dobór GenAI, który generował będzie końcową odpowiedź. To on może popsuć całe wrażenie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;zakonczenie&#34;&gt;Zakończenie&lt;a class=&#34;headerlink&#34; href=&#34;#zakonczenie&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Poskładajmy całość do kupy 😉&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;M&lt;em&gt;ożna zatem śmiało powiedzieć, że jakość odpowiedzi z takiego systemu, jest mocno determinowana jakością danych, z których taki system korzysta. Ważne jest również identyfikowanie tych dobrych i tych złych jakościowo danych, oraz ich standaryzacja do dalszego przetwarzania&lt;/em&gt;. Istotne jest również dobranie lub wyuczenie specjalistycznego embeddera oraz odpowiednia indeksacja w bazach. Dodatkowe metainformacje o chunkach mogą mocno pomóc podczas wyszukiwania, np. ograniczenie wyników tylko do dokumentów z określonej kategorii. Dopasowanie relewantności chunku do zadanego pytania jest bardzo istotnym krokiem. Nieodpowiednia zmiana kolejności rankingu dokumentów może spowodować, że teksty z istotną informacją zostaną odrzucone tuż przed samym podaniem do GenAI, co mocno może zepsuć końcowy rezultat. Wcześniejsze kroki są istotne, ale równie istotny jest odpowiedni dobór GenAI, który generował będzie końcową odpowiedź. To on może popsuć całe wrażenie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;PPS&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A już niebawem opublikujemy nasz model GenAI — pLLama, model LLama douczony na język polski 🙂&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Narzędzia wspomagające architekturę RAG:&lt;/strong&gt; Aby bezpiecznie kierować ruchem zapytań do modeli lokalnych i chmurowych oraz zabezpieczyć zapytania przed wyciekiem danych osobowych, sprawdź bramę &lt;a href=&#34;/products/llm-router/&#34;&gt;LLM Router&lt;/a&gt; oraz system ochrony prywatności &lt;a href=&#34;/products/pii-masker/&#34;&gt;PII Masker&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>Model bi-encodera i cross-encodera</title>
    <link href="https://radlab.dev/2024-04-30/dwa-nowe-modele-encoderow-dla-polskiego/"/>
    <id>https://radlab.dev/2024-04-30/dwa-nowe-modele-encoderow-dla-polskiego/</id>
    <updated>2024-04-30T00:00:00Z</updated>
    <published>2024-04-30T00:00:00Z</published>
    <summary>Wstęp Możliwości płynące z wykorzystania modeli generatywnych są ogromne, wystarczy spojrzeć na sukces OpenAI i flagowego produktu ChatGPT. Modele generatywne…</summary>
    <content type="html">&lt;h2 id=&#34;wstep&#34;&gt;Wstęp&lt;a class=&#34;headerlink&#34; href=&#34;#wstep&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Możliwości płynące z wykorzystania modeli generatywnych są ogromne, wystarczy spojrzeć na sukces &lt;a href=&#34;https://openai.com/&#34;&gt;OpenAI&lt;/a&gt; i flagowego produktu &lt;a href=&#34;https://chat.openai.com&#34;&gt;ChatGPT&lt;/a&gt;. Modele generatywne oparte o architekturę transformers dorównują człowiekowi w zakresie tworzenia contentu, czy to tekstowego, czy w formie zdjęć, czy też bardziej skomplikowanych animacji. Pomimo potężnych możliwości &lt;em&gt;generatywnych&lt;/em&gt; mają one podstawową wadę: aktualizacja informacji w tych modelach. Odpytując taki model o informacje ze świata codziennego, które wykraczają poza zbiór uczący, praktycznie nie jest możliwe, aby model udzielił prawidłowej odpowiedzi. Jednym z rozwiązań tego problemu, jest podejście oparte o Retrieval Augmented Generation (RAG).&lt;/p&gt;
&lt;h2 id=&#34;retrieval-augmented-generation&#34;&gt;Retrieval Augmented Generation&lt;a class=&#34;headerlink&#34; href=&#34;#retrieval-augmented-generation&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Idea RAGa polega na odseparowaniu od modelu generatywnego warstwy &lt;em&gt;informacyjnej&lt;/em&gt;. Warstwa informacyjna, to jakaś forma bazy danych, w której zapisane są informacje, zaś model generatywny jest wykorzystywany do udzielania odpowiedzi na podstawie wyszukanych w bazie informacji. Co daje takie podejście? Bardzo dużo. Wprowadza to pewien przełom w NLP, gdzie wykorzystywane wcześniej podejścia Retrieval Information (zastąpione przez nowe mechanizmy), połączone z dobrze działającymi modelami generatywnymi, są w stanie udzielać najświeższych informacji. Ponieważ informacje te zapisywane są w bazie, mogą być na bieżąco aktualizowane. W momencie, kiedy jakaś informacja staje się nieaktualna, wystarczy &lt;em&gt;usunąć&lt;/em&gt; ją z bazy. W skutek czego, model generatywny przy udzielaniu odpowiedzi nie otrzyma tej informacji jako kontekstu do udzielenia odpowiedzi, co ograniczy halucynacje tego modelu.&lt;/p&gt;
&lt;h2 id=&#34;maszyneria&#34;&gt;Maszyneria&lt;a class=&#34;headerlink&#34; href=&#34;#maszyneria&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;W takim razie co jest potrzebne, aby zrealizować podejście RAG? W najprostszym przypadku jest to kilka działających mechanizmów:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mechanizm konwertujący tekst do postaci wektorowej (dalej zwany embedderem );&lt;/li&gt;
&lt;li&gt;baza danych, która umożliwia przechowywanie i przeszukiwanie zaindeksowanych tekstów (np. Milvus );&lt;/li&gt;
&lt;li&gt;model generatywny, który będzie udzielał odpowiedzi na podstawie dostarczonego kontekstu (np. LLama3 od MetaAI ).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;W bardziej skomplikowanych przypadkach kontroluje się nie tylko proces wyszukiwania informacji, ale również sam zbiór tekstów, które zostały zwrócone przez wyszukiwarkę.&lt;/p&gt;
&lt;h2 id=&#34;model-embeddera-i-rerankera&#34;&gt;Model embeddera i rerankera&lt;a class=&#34;headerlink&#34; href=&#34;#model-embeddera-i-rerankera&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;W dzisiejszym wpisie chcemy zaprezentować nasze dwa modele. Pierwszy z nich to &lt;em&gt;&lt;a href=&#34;https://huggingface.co/radlab/polish-bi-encoder-mean&#34;&gt;embedder&lt;/a&gt;&lt;/em&gt;, który można wykorzystać do transformacji tekstu w postać wektorową. Drugi, to mechanizm &lt;em&gt;&lt;a href=&#34;https://huggingface.co/radlab/polish-cross-encoder&#34;&gt;rerankingujący&lt;/a&gt;&lt;/em&gt; wyniki zwrócone przez wyszukiwarkę semantyczną. Techniczna różnica między &lt;em&gt;embedderem&lt;/em&gt; (bi-encoderem), a &lt;em&gt;rerankerem&lt;/em&gt; (cross-encoderem) jest bardzo dobrze przedstawiona w &lt;a href=&#34;https://sbert.net/examples/applications/cross-encoder/README.html&#34;&gt;tym artykule&lt;/a&gt;. W telegraficznym skrócie: model &lt;em&gt;bi-encodera&lt;/em&gt; uczymy na proces podobieństwa semantycznego, gdzie funkcja oceny to wskazana odległość semantyczna, w naszym przypadku miara kosinus-kąta. Zaś w przypadku cross-encodera, model uczony jest wartością funkcji straty, wynikającą z korelacji odpowiedzi modelu w stosunku do zbioru testowego.&lt;/p&gt;
&lt;p&gt;Do budowy tych modeli wykorzystaliśmy bibliotekę &lt;a href=&#34;https://sbert.net/&#34;&gt;sentence-transformers&lt;/a&gt;. Funkcja straty dla modelu bi-encodera, to odległość kosinusowa, dla cross-encodera &lt;a href=&#34;https://github.com/yym6472/ConSERT/blob/master/sentence_transformers/cross_encoder/evaluation/CECorrelationEvaluator.py&#34;&gt;CECorrelationEvaluator&lt;/a&gt;. Jako zbiór danych wykorzystaliśmy istniejące zbiory do information-retrieval np. &lt;a href=&#34;https://huggingface.co/datasets/ipipan/maupqa&#34;&gt;ipipan/maupqa&lt;/a&gt;, które wzbogaciliśmy o nasz zbiór &lt;a href=&#34;https://huggingface.co/datasets/radlab/polish-sts-dataset&#34;&gt;radlab/polish-sts-dataset&lt;/a&gt;. Oczywiście w obu przypadkach należało odpowiednio przekształcić te zbiory i dostosować do problemu uczenia bi-encodera i cross-encodera.&lt;/p&gt;
&lt;h3 id=&#34;bi-encoder&#34;&gt;bi-encoder&lt;a class=&#34;headerlink&#34; href=&#34;#bi-encoder&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Model bi-encodera, na jednej karcie NVIDIA GeForce RTX 4090 uczył się przez 1 dzień 9 godzin. Wartości korelacji Pearsona i Spearmana, mierzone na zbiorze ewaluacyjnym przedstawiają się następująco:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/1e2a0b4331-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/1e2a0b4331.png&#34; alt=&#34;&#34; width=&#34;499&#34; height=&#34;74&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;To, co z naszej perspektywy jest najbardziej interesujące, to korelacja dla &lt;em&gt;Cosine-Similariy&lt;/em&gt;. Wartości korelacji są wysokie i w obu przypadkach ich interpretacja jest jako silna i dość silna korelacja. Co oznacza, że odpowiedzi modelu silnie korelują z danymi testowymi. Opublikowany model bi-encodera, posiada uśrednioną warstwą poolingu. Można go wykorzystać do tworzenia embeddingów z tekstu i semantycznego ich porównywania. Link do modelu na huggigface: &lt;a href=&#34;https://huggingface.co/radlab/polish-bi-encoder-mean&#34;&gt;radlab/polish-bi-encoder-mean&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Przykładowy kod do załadowania modelu za pomocą sentence-transformers, który dla wskazanych tekstów stworzy reprezentację wektorową:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sentence_transformers&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SentenceTransformer&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;sentences&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Ala ma kota i psa, widzi dzisiaj też śnieg&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Ewa ma białe zęby&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SentenceTransformer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;radlab/polish-bi-encoder-mean&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;embeddings&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sentences&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embeddings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;cross-encoder&#34;&gt;cross-encoder&lt;a class=&#34;headerlink&#34; href=&#34;#cross-encoder&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Udostępniliśmy również model &lt;em&gt;cross-encodera&lt;/em&gt;, który zwraca wartość relewantności dwóch tekstów. Można go wykorzystać oczywiście jako &lt;em&gt;reranker&lt;/em&gt; np. w wyszukiwarce semantycznej. Jak taki proces może wyglądać? Jak zwykle – prosto 🙂&lt;/p&gt;
&lt;p&gt;Jako wynik wyszukiwania semantycznego, dostajemy pewien zbiór tekstów, który uszeregowany jest względem wartości podobieństwa jednego fragmentu tekstu, do innego – tego wyszukiwanego. Ten zbiór jest idealnym wejściem dla modelu, którego celem jest określenie nie tylko podobieństwa między dwoma fragmentami tekstów, ale również stwierdzenie, który fragment lepiej dopasowuje się do wyszukiwanego tekstu.&lt;/p&gt;
&lt;p&gt;Gotowy model rerankingujący, również udostępniliśmy na huggingface w repozytorium &lt;a href=&#34;https://huggingface.co/radlab/polish-cross-encoder&#34;&gt;radlab/polish-cross-encoder&lt;/a&gt; Model ten uczony był na jednej karcie NVIDIA GeForce RTX 4090 przez 3 dni i 10 godzin. Korelacja Pearsona i Spearmana na zbiorze testowym:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pearson Correlation : 0.9360742942528038&lt;/li&gt;
&lt;li&gt;Spearman Correlation : 0.8718174291678207&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wartości obu korelacji, podobnie jak w przypadku bi-encodera są interpretowane jako silna i dość silna korelacja odpowiedzi modelu ze zbiorem testowym.&lt;/p&gt;
&lt;p&gt;Przykładowy kod (z wykorzystaniem sentence-transformers), który przyporządkowuje odpowiedzi do pytania:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kc&#34;&gt;fr&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;om&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;se&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nten&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ce_&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;transf&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ormers.cross_e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;coder&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;impor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;CrossE&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;coder&lt;/span&gt;

&lt;span class=&#34;err&#34;&gt;model_pa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;radlab/polish-cross-encoder&amp;quot;&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;CrossE&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;coder(model_pa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h)&lt;/span&gt;

&lt;span class=&#34;err&#34;&gt;ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Jaką mamy dziś pogodę? bo Andrzej nic nie mówił.&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Gdzie jedzie Andrzej? Bo wczoraj był w Warszawie.&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Czy oskarżony się zgadza z przedstawionym wyrokiem?&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Pan Andrzej siedzi w pociągu i jedzie do Wiednia. Ogląda na telefonie zabawne filmiki.&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Poada deszcz i jest wilgotno, jednak wczoraj było słonecznie.&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Wyrok jest prawomocny i nie podlega dalszym rozważaniom.&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;co&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nte&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h_ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ns&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;resul&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;sor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d(&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nu&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;mera&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(model.predic&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(co&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nte&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;_wi&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;h_ques&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ms()&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;key=lambda&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;reverse=True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pri&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;QUESTION: {question}&amp;quot;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pri&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;ANSWERS (sorted):&amp;quot;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;resul&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pri&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;\t[{score}]\t{answers[idx]}&amp;quot;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pri&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nt&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Wynik wywołania powyższego kodu, powinien być zbliżony do:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;err&#34;&gt;QUESTION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Jaką&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;mamy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dziś&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pogodę?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;bo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;drzej&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ic&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;mówił.&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;ANSWERS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(sor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.016749681904911995&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Poada&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;deszcz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jes&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wilgo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tn&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jed&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;na&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wczoraj&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;było&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;sło&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;cz&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie.&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.01602918468415737&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Pa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;drzej&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;siedzi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pociągu&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jedzie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wied&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ogląda&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;na&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;telef&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;zabaw&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ilmiki.&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.016013670712709427&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wyrok&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jes&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;prawomoc&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;podlega&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dalszym&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;rozważa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;iom.&lt;/span&gt;

&lt;span class=&#34;err&#34;&gt;QUESTION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Gdzie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jedzie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;drzej?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Bo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wczoraj&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;był&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Warszawie.&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;ANSWERS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(sor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.5997582674026489&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Pa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;drzej&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;siedzi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pociągu&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jedzie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wied&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ogląda&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;na&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;telef&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;zabaw&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ilmiki.&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.4528200924396515&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wyrok&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jes&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;prawomoc&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;podlega&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dalszym&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;rozważa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;iom.&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.17350871860980988&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Poada&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;deszcz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jes&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wilgo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tn&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jed&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;na&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wczoraj&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;było&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;sło&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;cz&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie.&lt;/span&gt;

&lt;span class=&#34;err&#34;&gt;QUESTION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Czy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;oskarżo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;się&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;zgadza&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;z&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;przeds&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ta&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wio&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ym&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wyrokiem?&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;ANSWERS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;(sor&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;te&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;d)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.8431766629219055&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wyrok&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jes&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;prawomoc&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;podlega&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;dalszym&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;rozważa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;iom.&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.6823258996009827&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Poada&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;deszcz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jes&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wilgo&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;tn&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jed&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;na&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;wczoraj&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;było&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;sło&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;cz&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie.&lt;/span&gt;
&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.558414101600647&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Pa&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;drzej&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;siedzi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;pociągu&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;jedzie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Wied&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ia.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;Ogląda&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;na&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;telef&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;zabaw&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ilmiki.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;a class=&#34;headerlink&#34; href=&#34;#outro&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oba, przedstawione dzisiaj modele, można bez problemu wykorzystać do budowy systemu opartego o podejście RAG. Można je również wykorzystać jako niezależnie działające modele. Warto jednak zaznaczyć, że wydajność mierzona czasem działania modelu cross-encodera, jest nieporównywalnie niższa od modelu bi-encodera. Dlatego w końcowym rozwiązaniu, zaleca się łączyć oba modele w jeden potok. W pierwszym kroku bazując na embeddingach tekstów, z bazy wyszukuje się najbardziej podobne fragmenty, następnie na zwróconych fragmentach dopasowuje się pytanie do ograniczonego zbioru odpowiedzi.&lt;/p&gt;
&lt;p&gt;Oczywiście po więcej modeli zapraszamy na naszego &lt;a href=&#34;https://huggingface.co/radlab&#34;&gt;huggingface&lt;/a&gt; Smacznego! 😉&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Odszumiacz tekstów</title>
    <link href="https://radlab.dev/2024-04-20/odszumiacz-tekstow/"/>
    <id>https://radlab.dev/2024-04-20/odszumiacz-tekstow/</id>
    <updated>2024-04-20T00:00:00Z</updated>
    <published>2024-04-20T00:00:00Z</published>
    <summary>Aktualnie świat przetwarzania języka naturalnego został zdominowany przez rozwiązania oparte o modele w architekturze transformers. Różnorodność tych modeli…</summary>
    <content type="html">&lt;p&gt;Aktualnie świat przetwarzania języka naturalnego został zdominowany przez rozwiązania oparte o modele w architekturze &lt;em&gt;transformers&lt;/em&gt;. Różnorodność tych modeli praktycznie zdominowała każdy obszar NLP. Niezależnie jednak od architektury i przeznaczenia mają one wspólną cechę, mianowicie duże zapotrzebowanie na dobrej jakości dane, które wykorzystywane są do treningu tych modeli.&lt;/p&gt;
&lt;h2 id=&#34;problem-do-rozwiazania&#34;&gt;Problem do rozwiązania&lt;a class=&#34;headerlink&#34; href=&#34;#problem-do-rozwiazania&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Skąd w takim razie wziąć dane? Oczywiście zależy to od konkretnego przypadku i przeznaczenia modelu. A dane, jak to dane, często zapisane są w różnych formatach, w tym jednym z najmniej przystępnych do automatycznego przetwarzania czyli &lt;em&gt;pdf&lt;/em&gt;. Koncepcja zapisu w formacie &lt;em&gt;pdf&lt;/em&gt; to przede wszystkim prezentacja zapisanej treści, aby w dowolnym czytniku na dowolnym urządzeniu, forma graficzna była taka sama. Jednak podczas automatycznego przetwarzania tych plików można napotkać na problemy z odczytem zawartości.&lt;/p&gt;
&lt;p&gt;Przykładowy problem z tekstem, który występuje po odczytaniu złej jakości pliku &lt;em&gt;pdf&lt;/em&gt;:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Strona...Tytuł...%6%z%50%|.....Zdecydowana0większość0czerwonych.karłów$należy#do,typu,widmowego%M,%ale%zalicza^się^do^nich^także^wieleHgwiazdHpóźnychHpodtypówHtypuHwidmowegoHKHorazHrzadkoHwystępujące,,najsłabsze,gwiazdy,typu,L.,Maksimum%intensywności%emitowanego%światła%przypada%w%zakresie%światła%czerwonego%lub%nawet%bliskiej%podczerwieni.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Poprawna forma tego tekstu, to:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Zdecydowana większość czerwonych karłów należy do typu widmowego M, ale zalicza się do nich także wiele gwiazd późnych podtypów typu widmowego K oraz rzadko występujące, najsłabsze gwiazdy typu L. Maksimum intensywności emitowanego światła przypada w zakresie światła czerwonego lub nawet bliskiej podczerwieni.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;rozwiazanie-problemu&#34;&gt;Rozwiązanie problemu&lt;a class=&#34;headerlink&#34; href=&#34;#rozwiazanie-problemu&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Widząc wiele problemów, które są powtarzalne w dużej skali, opracowaliśmy metodę &lt;em&gt;zaszumiania&lt;/em&gt; danych, które przypominają napotkane problemy. Metoda bazuje na prawdopodobieństwach warunkowych oraz odwzorowuje rozkład problemów z przetwarzanych masowo tekstów. Opracowany zbiór zawiera 1M tekstów, z których wylosowaliśmy 100k do procesu uczenia modelu &lt;em&gt;odszumiacza&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;uczenie-odszumiacza&#34;&gt;Uczenie odszumiacza&lt;a class=&#34;headerlink&#34; href=&#34;#uczenie-odszumiacza&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wykorzystaliśmy pretrenowany bazowy model w architekturze T5 &lt;a href=&#34;https://huggingface.co/allegro/plt5-base&#34;&gt;allegro/plt5-base&lt;/a&gt;, który wyuczyliśmy na problem oczyszczenia danych. Uczenie modelu trwało &lt;em&gt;5 godzin i 30 minut&lt;/em&gt; na jednej karcie &lt;em&gt;NVIDIA GeForce RTX 4090&lt;/em&gt;. Wykres &lt;em&gt;loss-function&lt;/em&gt; dla zbioru ewaluacyjnego:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/0afa4fccf9-480.webp 480w, /assets/img/0afa4fccf9-768.webp 768w, /assets/img/0afa4fccf9-1024.webp 1024w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/0afa4fccf9.png&#34; alt=&#34;&#34; width=&#34;1105&#34; height=&#34;664&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;przykad-dziaania&#34;&gt;Przykład działania&lt;a class=&#34;headerlink&#34; href=&#34;#przykad-dziaania&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wyuczony model oczywiście udostępniliśmy na naszym &lt;a href=&#34;https://huggingface.co/radlab&#34;&gt;huggingface&lt;/a&gt; w repozytorium &lt;a href=&#34;https://huggingface.co/radlab/polish-denoiser-t5-base&#34;&gt;radlab/polish-denoiser-t5-base&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wejściem do modelu jest tekst w postaci: &lt;code&gt;denoise: &amp;lt;tekst do odszumienia&amp;gt;.&lt;/code&gt; Dla przykładu wyżej, jest to:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;denoise: Strona...Tytuł...%6%z%50%|.....Zdecydowana0większość0czerwonych.karłów$należy#do,typu,widmowego%M,%ale%zalicza^się^do^nich^także^wieleHgwiazdHpóźnychHpodtypówHtypuHwidmowegoHKHorazHrzadkoHwystępujące,,najsłabsze,gwiazdy,typu,L.,Maksimum%intensywności%emitowanego%światła%przypada%w%zakresie%światła%czerwonego%lub%nawet%bliskiej%podczerwieni.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Wyjście z modelu wygląda następująco:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Zdecydowana większość czerwonych karłów należy do typu widmowego M, ale zalicza się do nich także wiele gwiazd późnych podtypów typu widmowego K oraz rzadko występujące, najsławsze gwiazdy typu L. Maksimum intensywności emitowanego światła przypada w zakresie światła czerwonego lub nawet bliskiej podczerwieni.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Przykładowy kod, który umożliwia odpalenie modelu dla tekstu z przytaczanego przykładu:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;transformers&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T5ForConditionalGeneration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T5Tokenizer&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;do_inference&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tokenizer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;input_text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;denoise: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;inputs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tokenizer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;input_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;return_tensors&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;pt&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;max_length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;max_length&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;truncation&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

    &lt;span class=&#34;n&#34;&gt;corrected_ids&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;max_length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;num_beams&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;early_stopping&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

    &lt;span class=&#34;n&#34;&gt;corrected_sentence&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tokenizer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;corrected_ids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;skip_special_tokens&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;corrected_sentence&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T5ForConditionalGeneration&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from_pretrained&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;radlab/polish-denoiser-t5-base&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;tokenizer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T5Tokenizer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from_pretrained&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;radlab/polish-denoiser-t5-base&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;text_str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;Strona...Tytuł...&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%6%&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;z&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%50%&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;|.....Zdecydowana0większość0czerwonych.karłów$należy#do,typu,widmowego%M,&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%a&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;le%zalicza^się^do^nich^także^wieleHgwiazdHpóźnychHpodtypówHtypuHwidmowegoHKHorazHrzadkoHwystępujące,,najsłabsze,gwiazdy,typu,L.,Maksimum&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%i&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;ntensywności&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%e&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;mitowanego%światła%przypada%w%zakresie%światła&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%c&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;zerwonego&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%lu&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;b%nawet%bliskiej%podczerwieni.&amp;quot;&lt;/span&gt;

&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;do_inference&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tokenizer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Zapraszamy do korzystania, smacznego 🙂&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ochrona i sanitizacja promptów:&lt;/strong&gt; W potokach produkcyjnych do automatycznego maskowania i anonimizacji danych wrażliwych przed wysłaniem do modeli LLM sprawdź narzędzie &lt;a href=&#34;/products/pii-masker/&#34;&gt;PII Masker&lt;/a&gt; oraz bramę &lt;a href=&#34;/products/llm-router/&#34;&gt;LLM Router&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  <entry>
    <title>Ekstrakcyjne QA – nasz model polish-qa-v2</title>
    <link href="https://radlab.dev/2024-04-15/ekstrakcyjne-qa-nasz-model-polish-qa-v2/"/>
    <id>https://radlab.dev/2024-04-15/ekstrakcyjne-qa-nasz-model-polish-qa-v2/</id>
    <updated>2024-08-18T00:00:00Z</updated>
    <published>2024-04-15T00:00:00Z</published>
    <summary>W dziedzinie przetwarzania języka naturalnego stale pojawiają się innowacyjne rozwiązania, które umożliwiają precyzyjne odpowiadanie na pytania w różnych…</summary>
    <content type="html">&lt;p&gt;W dziedzinie przetwarzania języka naturalnego stale pojawiają się innowacyjne rozwiązania, które umożliwiają precyzyjne odpowiadanie na pytania w różnych językach. Prezentujemy &lt;a href=&#34;https://huggingface.co/radlab/polish-qa-v2&#34;&gt;model polish-qa-v2&lt;/a&gt;, który stanowi krok naprzód w naszych badaniach nad dziedziną kojarzenia pytań z odpowiedziami przy użyciu wielkich modeli językowych.&lt;/p&gt;
&lt;p&gt;Model &lt;a href=&#34;https://huggingface.co/radlab/polish-qa-v2&#34;&gt;polish-qa-v2&lt;/a&gt; to przykład modelu ekstrakcyjnego QA, który specjalizuje się w wydobyciu najbardziej istotnego fragmentu tekstu celu udzielenia precyzyjnej odpowiedzi na pytanie. W przeciwieństwie do modeli generatywnych, które tworzą odpowiedzi od podstaw, modele ekstrakcyjne ograniczają się do wybierania istniejących fragmentów tekstu jako odpowiedzi na pytania.&lt;/p&gt;
&lt;h2 id=&#34;przykad-uzycia&#34;&gt;Przykład użycia&lt;a class=&#34;headerlink&#34; href=&#34;#przykad-uzycia&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;transformers&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pipeline&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;model_path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;radlab/polish-qa-v2&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;question_answerer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pipeline&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
  &lt;span class=&#34;s2&#34;&gt;&amp;quot;question-answering&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;model_path&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;question&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;Jakie silniki posiadał okręt?&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&amp;quot;Okręt był napędzany przez trzy trzycylindrowe maszyny parowe potrójnego rozprężania, które napędzały poprzez wały napędowe trzy śruby napędowe (dwie trójskrzydłowe&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;zewnętrzne o średnicy 4,5 metra i czteroskrzydłową o średnicy 4,2 metra).&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;Para była dostarczana przez cztery kotły wodnorurkowe typu Marine,&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;wyposażone łącznie w osiem palenisk i osiem kotłów cylindrycznych,&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;które miały łącznie 32 paleniska. Ciśnienie robocze kotłów wynosiło 12 at,&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;a ich łączna powierzchnia grzewcza 3560 m². Wszystkie kotły były opalane węglem,&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;którego normalny zapas wynosił 650, a maksymalny 1070 ton.&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;Nominalna moc siłowni wynosiła 13 000 KM (maksymalnie 13 922 KM przy 108 obr./min),&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;co pozwalało na osiągnięcie prędkości maksymalnej od 17,5 do 17,6 węzła.&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;Zasięg wynosił 3420 mil morskich przy prędkości 10 węzłów. Zużycie węgla przy mocy 10 000 KM&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;wynosiło około 11 ton na godzinę, a przy mocy maksymalnej 16 ton na godzinę.&lt;/span&gt;
&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;question_answerer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;question&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;question&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Po wykonaniu powyższego kodu, uzyskuje się następujący wynik:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;s1&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.612459123134613&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;s1&#34;&gt;&amp;#39;start&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;s1&#34;&gt;&amp;#39;end&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;84&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;s1&#34;&gt;&amp;#39;answer&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39; trzy trzycylindrowe maszyny parowe potrójnego rozprężania,&amp;#39;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Podstawę eksperymentu stanowi model &lt;a href=&#34;https://huggingface.co/sdadas/polish-roberta-large-v2&#34;&gt;sdadas/polish-roberta-large-v2&lt;/a&gt;, który dotrenowaliśmy na zbiorze danych &lt;a href=&#34;https://huggingface.co/datasets/clarin-pl/poquad&#34;&gt;clarin-pl/poquad&lt;/a&gt;. Trening trwał 2 godziny na pojedynczej karcie graficznej RTX 3090 Ti.&lt;/p&gt;
&lt;p&gt;polish-qa-v2 dostępny jest na &lt;a href=&#34;https://huggingface.co/radlab/polish-qa-v2&#34;&gt;https://huggingface.co/radlab/polish-qa-v2&lt;/a&gt;, gdzie istnieje możliwość jego przetestowania, bez potrzeby uruchamiania lokalnie. Dla zainteresowanych udostępniamy pod tym samym linkiem cały model do pobrania.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Nowe modele gpt2!</title>
    <link href="https://radlab.dev/2023-11-30/nowe-modele-gpt2/"/>
    <id>https://radlab.dev/2023-11-30/nowe-modele-gpt2/</id>
    <updated>2024-08-04T00:00:00Z</updated>
    <published>2023-11-30T00:00:00Z</published>
    <summary>Dzisiaj udostępniliśmy dwa modele gpt2 trenowane od podstaw. Jeden w architekturze small, drugi w medium. Modele oczywiście dostępne są publicznie na naszym…</summary>
    <content type="html">&lt;p&gt;Dzisiaj udostępniliśmy dwa modele gpt2 trenowane od podstaw. Jeden w architekturze small, drugi w medium. Modele oczywiście dostępne są publicznie na naszym &lt;a href=&#34;https://huggingface.co/radlab&#34;&gt;huggingface&lt;/a&gt; 😉&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;model w architekturze small : radlab/polish-gpt2-small-v2&lt;/li&gt;
&lt;li&gt;model w architekturze medium : radlab/polish-gpt2-medium-v2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Poniżej po dwa zrzuty ekranu z procesu uczenia (miara &lt;strong&gt;accuracy&lt;/strong&gt;) upublicznionych modeli.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accuracy&lt;/strong&gt; modelu w architekturze &lt;strong&gt;small&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/3a802285e5-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/3a802285e5.png&#34; alt=&#34;&#34; width=&#34;581&#34; height=&#34;299&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/8b418018f4-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/8b418018f4.png&#34; alt=&#34;&#34; width=&#34;522&#34; height=&#34;201&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accuracy&lt;/strong&gt; modelu w architekturze &lt;strong&gt;medium&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/42d7b94c5f-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/42d7b94c5f.png&#34; alt=&#34;&#34; width=&#34;585&#34; height=&#34;301&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;/assets/img/95e2855b9f-480.webp 480w&#34; sizes=&#34;(max-width: 760px) 100vw, 720px&#34;&gt;&lt;img src=&#34;/assets/img/95e2855b9f.png&#34; alt=&#34;&#34; width=&#34;532&#34; height=&#34;239&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/picture&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[Q&amp;A] Uczenie GPU/CPU</title>
    <link href="https://radlab.dev/2022-12-19/qa-uczenie-gpu-cpu/"/>
    <id>https://radlab.dev/2022-12-19/qa-uczenie-gpu-cpu/</id>
    <updated>2024-04-27T00:00:00Z</updated>
    <published>2022-12-19T00:00:00Z</published>
<category term="cuda"/><category term="nvlink"/><category term="uczenie"/>    <summary>Q: Jak uruchomić uczenie/inferencję na wybranych GPU? A: Należy uruchomić program z opcją: gdzie 0 i 1 to numery kart graficznych do rozproszonego obliczenia.…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Q: Jak uruchomić uczenie/inferencję na wybranych GPU?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Należy uruchomić program z opcją:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;CUDA_VISIBLE_DEVICES=0,1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;gdzie &lt;em&gt;0&lt;/em&gt; i &lt;em&gt;1&lt;/em&gt; to numery kart graficznych do rozproszonego obliczenia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: Jak włączyć/wyłączyć obsługę NVX dla połączonych kart graficznych mostkiem NVLink?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Przy połączonych kartach GPU obsługa NVlink w transformersach jest domyślnie uruchomiona. Aby wyłączyć obsługę NVX dla kart należy dodać do wywołania programu opcję&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;NCCL_P2P_DISABLE=1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Błędy podczas uczenia i douczania transformatorów</title>
    <link href="https://radlab.dev/2021-06-22/bledy-podczas-uczenia-i-douczania-transformatorow/"/>
    <id>https://radlab.dev/2021-06-22/bledy-podczas-uczenia-i-douczania-transformatorow/</id>
    <updated>2024-04-27T00:00:00Z</updated>
    <published>2021-06-22T00:00:00Z</published>
    <summary>Chcę wykorzystać trainera do fine-tuningowania ale dostaję komunikat CUBLAS_STATUS_ALLOC_FAILED… Dostaję informację o braku pamięci na GPU pomimo tego, że…</summary>
    <content type="html">&lt;h3 id=&#34;chce-wykorzystac-trainera-do-fine-tuningowania-ale-dostaje-komunikat-cublas_status_alloc_failed&#34;&gt;Chcę wykorzystać trainera do fine-tuningowania ale dostaję komunikat CUBLAS_STATUS_ALLOC_FAILED&lt;a class=&#34;headerlink&#34; href=&#34;#chce-wykorzystac-trainera-do-fine-tuningowania-ale-dostaje-komunikat-cublas_status_alloc_failed&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt; pojawia się w bibliotece huggingface (transformers-4.3.2) + pytorch (torch-1.7.1) i dotyczy braku pamięci GPU.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(…) /pytorch/aten/src/THCUNN/ClassNLLCriterion.cu:108: cunn_ClassNLLCriterion_updateOutput_kernel: block: [0,0,0], thread: [13,0,0] Assertion `t &amp;gt;= 0 &amp;amp;&amp;amp; t &amp;lt; n_classes` failed.                                                               (…)                                                                                                                                                      torch.autograd.backward(self, gradient, retain_graph, create_graph)   File „/usr/local/lib/python3.8/dist-packages/torch/autograd/__init__.py”, line 130, in backward     Variable._execution_engine.run_backward( RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rozwiązanie:&lt;/strong&gt; Prawdopodobnie źle ustawiona liczba klas w trainerze. Liczba etykiet w danych oraz zadeklarowanych są różne.&lt;/p&gt;
&lt;h3 id=&#34;dostaje-informacje-o-braku-pamieci-na-gpu-pomimo-tego-ze-mam&#34;&gt;Dostaję informację o braku pamięci na GPU pomimo tego, że mam&lt;a class=&#34;headerlink&#34; href=&#34;#dostaje-informacje-o-braku-pamieci-na-gpu-pomimo-tego-ze-mam&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt; pojawia się w bibliotece huggingface (transformers-4.3.2) + pytorch (torch-1.7.1).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RuntimeError: CUDA out of memory. Tried to allocate 120.00 MiB (GPU 0; 11.17 GiB total capacity; 7. 92 GiB already allocated; 145.81 MiB free; 6.56 GiB reserved in total by PyTorch)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rozwiązanie:&lt;/strong&gt; Zmniejszyć domyśle wielkości dla długości sekwencji, rozmiaru batcha podczas testowania oraz rozmiaru batcha podczas ewaluacji.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;--max_seq_length
--per_device_train_batch_size
--per_device_eval_batch_size
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;podczas-rozproszonego-uczenia-np-clm-dostaje-komunikat-typu-valueerror-expected-sequence-of-length-1024-at-dim&#34;&gt;Podczas rozproszonego uczenia (np. clm) dostaję komunikat typu ValueError: expected sequence of length 1024 at dim:&lt;a class=&#34;headerlink&#34; href=&#34;#podczas-rozproszonego-uczenia-np-clm-dostaje-komunikat-typu-valueerror-expected-sequence-of-length-1024-at-dim&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Podczas uczenia/testowania/walidacji modelu dostaję komunikat&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;83%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 5/6 [00:07&amp;lt;00:00, 1.03it/s] Traceback (most recent call last): File „run_clm.py”, line 579, in
main()
File „run_clm.py”, line 527, in main
train_result = trainer.train(resume_from_checkpoint=checkpoint)
File „/home/pkedzia/.local/lib/python3.8/site-packages/transformers/trainer.py”, line 1547, in train
return inner_training_loop(
File „/home/pkedzia/.local/lib/python3.8/site-packages/transformers/trainer.py”, line 1769, in _inner_training_loop
for step, inputs in enumerate(epoch_iterator):
File „/home/pkedzia/.local/lib/python3.8/site-packages/torch/utils/data/dataloader.py”, line 681, in &lt;strong&gt;next&lt;/strong&gt;
data = self._next_data()
File „/home/pkedzia/.local/lib/python3.8/site-packages/torch/utils/data/dataloader.py”, line 721, in _next_data
data = self._dataset_fetcher.fetch(index) # may raise StopIteration
File „/home/pkedzia/.local/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py”, line 52, in fetch
return self.collate_fn(data)
File „/home/pkedzia/.local/lib/python3.8/site-packages/transformers/data/data_collator.py”, line 70, in default_data_collator
return torch_default_data_collator(features)
File „/home/pkedzia/.local/lib/python3.8/site-packages/transformers/data/data_collator.py”, line 136, in torch_default_data_collator
batch[k] = torch.tensor([f[k] for f in features])
ValueError: expected sequence of length 1024 at dim 1 (got 393)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rozwiązanie:&lt;/strong&gt; Należy dodać parzystą liczbę workerów w preprocessie, czyli:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;--preprocessing_num_workers 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Ciekawostki o transformatorach</title>
    <link href="https://radlab.dev/2021-06-22/ciekawostki-o-transformatorach/"/>
    <id>https://radlab.dev/2021-06-22/ciekawostki-o-transformatorach/</id>
    <updated>2024-04-27T00:00:00Z</updated>
    <published>2021-06-22T00:00:00Z</published>
    <summary>BERT (ang. Bidirectional Encoder Representations from Transformers), to nie głęboka sieć neuronowa! To…</summary>
    <content type="html">&lt;p&gt;BERT (&lt;em&gt;ang.&lt;/em&gt; &lt;strong&gt;B&lt;/strong&gt;idirectional &lt;strong&gt;E&lt;/strong&gt;ncoder &lt;strong&gt;R&lt;/strong&gt;epresentations from &lt;strong&gt;T&lt;/strong&gt;ransformers), to nie głęboka sieć neuronowa! &lt;strong&gt;To transformator!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Polecamy każdemu zainteresowanemu tematem transfomratorów:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attention Is All You Need&lt;/li&gt;
&lt;li&gt;Transformer: A Novel Neural Network Architecture for Language Understanding&lt;/li&gt;
&lt;li&gt;Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)&lt;/li&gt;
&lt;li&gt;The Illustrated Transformer&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;embed&#34;&gt;&lt;iframe src=&#34;https://www.youtube-nocookie.com/embed/S27pHKBEp30&#34; title=&#34;YouTube&#34; loading=&#34;lazy&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;div class=&#34;embed&#34;&gt;&lt;iframe src=&#34;https://www.youtube-nocookie.com/embed/-QH8fRhqFHM&#34; title=&#34;YouTube&#34; loading=&#34;lazy&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Narzędzia do tworzenia modeli word2vec</title>
    <link href="https://radlab.dev/2021-06-22/narzedzia-do-tworzenia-modeli-word2vec/"/>
    <id>https://radlab.dev/2021-06-22/narzedzia-do-tworzenia-modeli-word2vec/</id>
    <updated>2024-04-27T00:00:00Z</updated>
    <published>2021-06-22T00:00:00Z</published>
    <summary>Fasttext,…</summary>
    <content type="html">&lt;h3 id=&#34;fasttext&#34;&gt;Fasttext&lt;a class=&#34;headerlink&#34; href=&#34;#fasttext&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;h6 id=&#34;informacje-wstepne&#34;&gt;Informacje wstępne&lt;a class=&#34;headerlink&#34; href=&#34;#informacje-wstepne&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;Do pobrania z: &lt;a href=&#34;https://fasttext.cc/&#34;&gt;https://fasttext.cc/&lt;/a&gt;
Samouczek (reprezentacja słów): &lt;a href=&#34;https://fasttext.cc/docs/en/unsupervised-tutorial.html&#34;&gt;https://fasttext.cc/docs/en/unsupervised-tutorial.html&lt;/a&gt;&lt;/p&gt;
&lt;h6 id=&#34;format-wejsciowy&#34;&gt;Format wejściowy&lt;a class=&#34;headerlink&#34; href=&#34;#format-wejsciowy&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;Wejściem jest plik tekstowy, w którym kolejne wiersze reprezentują kolejne teksty, zdania, frazy. Przykładowo:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; awokado przekrawać na pół usuwać pestka i wydrążać miąższ
 dziś niemiecki i musieć zaliczyć
 gra rozpoczynać jeden z gracz ciągnąć karta z stos karta zakryć lub z stos odkryty
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h6 id=&#34;przykadowe-wywoanie&#34;&gt;Przykładowe wywołanie&lt;a class=&#34;headerlink&#34; href=&#34;#przykadowe-wywoanie&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h6&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; ./fasttext skipgram -minCount 5 \
   -lr 0.05 -ws 5 -epoch 10 \
   -input input-corpora-file.txt \
   -output output-corpora-file-model
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;glove&#34;&gt;GloVe&lt;a class=&#34;headerlink&#34; href=&#34;#glove&#34; title=&#34;Permanent link&#34;&gt; &lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;https://nlp.stanford.edu/projects/glove/&lt;/li&gt;
&lt;li&gt;https://www.aclweb.org/anthology/D14-1162.pdf&lt;/li&gt;
&lt;li&gt;https://nlp.stanford.edu/projects/glove/&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
</feed>