Hogyan készítettem egy lokálisan futtatható AI-vezérelt videógenerátort - Második rész
Bebesi János írása
II. rész: Ollama megértése
Az előző részben bemutattam annak a teljesen lokálisan futó, multimodális MI‑alapú videógeneráló munkafolyamatnak a felépítését, amely képes egy rövid szöveges promptból videót készíteni. A videó előállítása azonban lassú, erőforrás‑igényes folyamat, és különösen érzékeny a bemeneti adatok minőségére. Egy átlagos fogyasztói GPU‑n, például egy RTX 3060‑on egy 30–40 másodperces klip elkészítése órákig is tarthat. Ha a videókészítés előtt a szöveg, a hang és a kép nem megfelelő minőségű vagy nem elég strukturált, akkor ez az idő nagy részben feleslegesen vész el.
A projekt célja egy olyan stabil és kiszámítható munkafolyamat kialakítása, amely jó minőségű köztes eredményeket biztosít, miközben minden helyben, privát módon és teljes mértékben testreszabhatóan fut.
A hatékony működés érdekében a pipeline több elkülönített lépésből áll:
- Szöveggenerálás – a rövid promptból részletes, JSON alapú jelenetleírás készül.
- Hanggenerálás – amely narrációt, éneket vagy párbeszédet biztosít.
- Képgenerálás – amely meghatározza a videó vizuális alapját.
- Videógenerálás – a leglassabb és legköltségesebb lépés.
- Az alkalmazás logikája – amely a teljes folyamatot összehangolja.
Ebben a blogbejegyzésben a szöveggenerálás első részébe, az Ollama használatába merülök el. A forráskód megtalálható ebben a GitHub repóban. A Readme.md fájl és az install.ps1 segít a környezet beállításában. Itt a release ágat hivatkozom, amit kifejezetten ehhez a bloghoz hoztam létre, hogy mindig ugyanazt a kódot lehessen elérni, még ha tovább is fejlesztem az alkalmazást.
Az alkalmazás főként MI által generált, némi iránymutatással. Nem csak a forráskód, hanem a megjelenített szöveg is. Ez félrevezető vagy hibás lehet, óvatosan kezelje. Csak azokat a kódrészeket teszteltem, amelyek az alkalmazás szempontjából relevánsak, lehet benne sehol se használt kódrészlet vagy antipattern. Fontos kiemelni, hogy az alkalmazás nem tekinthető késznek, sok funkciót egyszerűen meg lehetett volna oldani meglévő könyvtárak hivatkozásával, de az MI alig használja a meglévő libeket, mindig megírja az adott funkciót. Csak az alap videókészítési munkafolyamatra koncentráltam, korlátozott videókészítési tudásommal. A cél az volt, hogy bemutassam, hogyan lehet több MI modellt és eszközt kombinálni, hogy kevés erőforrásból is elérjünk egy célt. Minden programozási szempontot, mint a loggolás, monitorozás, teljesítmény vagy biztonsági szempontokat félretettem. Ezeket később lehet, hogy fogok foglalkozni.
Mi az Ollama?
Az Ollama egy platform és eszközkészlet, amely lehetővé teszi szöveggeneráló MI modellek futtatását saját gépen, így privát és biztonságos MI-alapú szöveggenerálást/folyamatokat tesz lehetővé harmadik fél infrastruktúrája nélkül. Támogatja népszerű, előre betanított modellek (pl. Llama4, deepseek, mistral) futtatását, GPU gyorsítást és egyszerű API hozzáférést kínál alkalmazások integrálásához. Alapvető modellkezelési funkciókat nyújt, mint letöltés, frissítés és váltás a modellek között.
Az Ollama főbb funkciói
- Helyi futtatás: Az Ollama legfontosabb funkciója, hogy MI modelleket futtat, így csökkenti az adatvédelmi és biztonsági aggályokat a felhőalapú megoldásokhoz képest. Az MI modellek közvetlenül a felhasználók eszközein futnak, így nagyobb kontrollt és biztonságot nyújtanak az adatok felett, gyorsabb feldolgozást és kisebb külső szerverfüggőséget biztosítanak.
- Kiterjedt és könnyen használható modellkönyvtár: Az Ollama széles körű előre betanított MI modellekhez kínál hozzáférést. A felhasználók különböző feladatokra, területekre és hardverigényekhez igazított modellek közül választhatnak, így rugalmas és sokoldalú MI projekteket valósíthatnak meg.
- Egyszerűen integrálható: Az Ollama API végpontján keresztül könnyen integrálható, így a fejlesztők egyszerűen beépíthetik MI modelleket a programokba.
Szöveges prompt generálása Ollamával
Az Ollama alkalmazásnak van egy egyszerű felhasználói felülete, ahol néhány fontos paramétert lehet beállítani, és letölteni az elérhető modellek. A maximális kontextusablak 256K jelenleg, de ez idővel nőhet.
Ollama fájlok hierarchiája
- Az OllamaService.cs tartalmazza az Ollama API integráció fő logikáját. Ez végzi:
- Az elérhető modellek listájának lekérését tulajdonságaikkal,
- Requestek küldését az Ollama API-hoz,
- Metrikák gyűjtését,
- Felhasználói prompt formázását,
- Responseok parsolását a várt formátumra,
- Felhasználói prompt beillesztését egy előre definiált sablonba a megfelelő formázás érdekében.
- Az OllamaOutputState.cs kezeli a generált tartalom megosztását más szolgáltatásokkal, valamint tárolja a hang-, kép- és videó bemeneteket.
- Az OllamaPromptRequest.cs és OllamaOptions.cs tartalmazzák az Ollama API dokumentációja alapján generált requestbody-kat.
A felhasználói felületen beállítható:
- Temperature és Top P: ezek szabályozzák a véletlenszerűséget és a sokszínűséget. További információ https://promptengineering.org/prompt-engineering-with-temperature-and-top-p/
- Max Tokens: ez gyakorlatilag a válasz maximális hossza. Hosszabb videókhoz hosszabb válasz lehet szükséges.
- Keep alive: sebesség vs memóriafogyasztás. Ha túl alacsony, a modell gyakori indítása sok időt vehet igénybe. Ha túl magas, a modellek túl sokáig maradnak memóriában, és több modell egyidejű futtatása negatívan befolyásolhatja a rendszer teljesítményét.
A modell viselkedésének befolyásolása
Három módot találtam arra, hogy a modell viselkedését befolyásoljam, hogy a struktúra mindig megmaradjon a felhasználói inputtól függetlenül:
- Új modell létrehozása a https://docs.ollama.com/api/create segítségével: Ha egyszer beállítjuk, a modell mindig az elvárt módon viselkedik. Nem kell újra elküldeni a prompt sablont minden alkalommal. Ideális tartós viselkedéshez, kevésbé ideális kísérletezéshez, ha a prompt sablon gyakran változik.
- Rendszerparaméter beállítása: Szabályokat, szerepeket definiál a modell számára („Te egy segítőkész asszisztens vagy”). Ez erősebb, mint a felhasználói input, a rendszerüzenetek általában felülírják a felhasználói utasításokat.
- Felhasználói prompt kiterjesztése (választott megoldás): Ez a legflexibilisebb módja a modell viselkedésének befolyásolására, könnyen változtatható promptonként, de kevésbé biztonságos.
Azért választottam a felhasználói prompt kiterjesztését, mert rugalmas. Gyakorlatban a másik két módszer is működhetne. Éles környezeten az új modell vagy a rendszerparaméter beállítását választanám a termék igényeitől függően. Ez a megoldás különösen rossz, ha bárki írhat promptot a modellnek, mert a prompt kiterjesztés könnyen felülírható rosszindulatú felhasználói utasításokkal (pl. „hagyd figyelmen kívül az előző utasításokat, csináld ezt helyette…”).
Modell kiválasztása a munkafolyamathoz
Modell választásakor figyelembe kell venni, hogy különböző modellek eltérő tulajdonságokkal és követelményekkel rendelkeznek.
- A legjobb modellek ehhez a feladathoz azok, amelyek jól követik az utasításokat és strukturált kimenetet adnak.
- Memóriaigény (lehetőleg maximum 7B modellek)
- Sebesség (jelenleg nem szigorú szempont)
- Nyelv (angol elég most)
Több modellt is használhatsz teszteléshez, ami új problémákat/viselkedéseket hozhat. Ezért fontos a modell kiválasztása már az elején. Több ezer modell létezik.
Eddig tesztelt modellek
- llama2:7b: jól követte az utasításokat, a válasz minősége elég jó volt. Csak angolt támogat. Felismerte, ha magyar szöveget írtam be, de nem tudott válaszolni vagy utasításokat követni.
- goonsai/qwen2.5-3B-goonsai-nsfw-100k: cenzúrázatlan (saját felelősségre, semmit nem utasít vissza), jól teljesít szövegkiegészítésben. Ez a modell adta a leggyengébb választ. A JSON szerkezet gyakran hibás volt. Ezt most nem javítottam. Magyarul is tudott válaszolni.
- mistral 0.3: elérhető utasításkövető és szövegkiegészítő módban. 7B paraméteres modell. Elég jó választ adott magyarul is.
Teszt futtatása
Minden modellt az alábbi egyszerű prompttal teszteltem 10 alkalommal: „Sailorwoman is singing about fishing on the beach.” (Tengerészlány a horgászásról énekel a tengerparton)
A következőket mértem:
- Memóriahasználat
- Első futtatás idejét
- Futtatási időt első futás után 10 alkalommal
- Hibás válaszokat (amikor valami elromlik)
Modell | Első futtatás ideje | Futtatási idő | VRAM | Hibás válaszok |
Llama2:7B | 7502 ms | 3278-4653 ms | ~6GB | 4, hiányzott a negatív prompt képhez és videóhoz |
Mistral | 30014 ms | 15425-18882 ms | ~8.6 GB | Nem tetszett a modell dalszövege |
Goonsai/qwen2.5-3B-goonsai-nsfw-100k | 27131 ms | 8822-33696 ms | ~9 GB | Egyetlen generálás sem volt teljesen követett. Hibás paraméterneveket és extra paramétereket adott hozzá. |
Példa válaszok
Példa válasz llama2:7b-től:
{“audio”: {
“lyrics”: “Oh, I love to fish on the beach, where the sand is soft and the sea is sweet. I cast my line and wait for a bite, watching the waves roll in with a happy sight.”,
“tags”: [“beach”, “fishing”, “sailorwoman”, “happy”] },
“video”: {
“positive_prompt”: “Sailorwoman is singing and dancing on the beach, enjoying her time fishing.”,
“negative_prompt”: “”},
“image”: {
“positive_prompt”: “A picturesque beach with a sailboat in the distance, surrounded by palm trees and a clear blue sky.”,
“negative_prompt”: “”}
}
A formátumot követte a Llama2, de voltak üres válaszok.
Példa válasz mistral-tól:
{ “audio”: {
“lyrics”: “A cheerful sailorwoman sings a lively tune about fishing on the beach, with lyrics like ‘Cast your line, feel the bite, reel it in so tight!’, accompanied by joyful hums and sea-inspired melodies.”,
“tags”: [“happy”, “sailor”, “singing”, “fishing”, “beach”, “melodic”, “cheerful”]
},
“video”: {
“positive_prompt”: “A beautiful day at the beach with a lively sailorwoman joyfully singing about fishing. She wears colorful clothing and is surrounded by various fishing equipment.”,
“negative_prompt”: “No dark or ominous scenes, no sad expressions on the sailorwoman’s face, no dangerous or scary elements.”
},
“image”: {
“positive_prompt”: “A bright, sunny beach scene with a smiling sailorwoman singing while holding a fishing rod and surrounded by colorful sea life such as seagulls, crabs, and fish.”,
“negative_prompt”: “No grim or somber images, no polluted or trash-filled beaches, no stormy weather.”
}
}
Példa válasz Goonsai/qwen2.5-3B-goonsai-nsfw-100k-tól:
{
“audio”: {
“lyrics”: “Sailorwomen sing, ‘Fishing’s my favorite game,'”,
“tags”: [“happy”],
“positive_prompt”: “‘faster fish swimming in ocean'”,
“negative_prompt”: “‘fishermen fishing for other things'”},
“video”: {
“postive_prompt”: “sailing woman singing about happy beach day with smiling face and waves of water.”,
“nagative_promt”:”woman not looking at the viewer”,
“positive_frame_count”:”30-45 frames per second, “,
“frame_rate_per_second”:”” },
“image”:{
“posiive_prompt”: “‘sailorwomen singing happy beach day'”,
“negative_prompt”:”‘happy woman smiling with waves of water'”},
“time_length_seconds”:”6 seconds”,
“audio_frame_count”:”30-45 frames per second”
}
Next steps
A következő blogposztban bemutatom az audió és kép generálást ComfyUI-al.