Vaši uživatelé nepřemýšlejí v názvech souborů nebo hierarchiích složek. Myslí v myšlenkách.
- „Robot namalovaný akvarelem.“
- „Slunečná pláž plná barev.“
- „Něco, co vypadá jako Mona Lisa… ale z budoucnosti.“
Nezáleží na tom, zda tato myšlenka pochází z obrázku, objednávky zákazníka, e-mailu nebo dokumentu 4D Write Pro – výzva je stejná: jak dodat výsledky, které odpovídají záměru, nikoliv jen klíčovým slovům?
S aplikacemi 4D.Vector a 4D AI Kit může vaše aplikace konečně dávat smysl. V tomto příspěvku si to ukážeme na příkladu sémantického vyhledávání podobnosti obrázků. A zde je klíč: ve skutečnosti vůbec nepracujeme se surovými obrázky – pracujeme s jejich popisy. Úplně stejný přístup funguje pro jakýkoli druh textových dat ve vaší aplikaci.
Proč vektory + umělá inteligence mění vše
Tradiční vyhledávání má jediný úkol: najít přesné výrazy. Vaši uživatelé ale ne vždy vědí, jaký přesný výraz mají použít. Věci popisují. Vyjadřují záměr. Přemýšlejí neuspořádaným, krásným, lidským jazykem.
Aby vyhledávání fungovalo tak, jak vaši uživatelé přemýšlejí, potřebujete víc než jen porovnávání řetězců. Potřebujete porozumění – a k tomu slouží vektorové vložky.
Co přesně je vektorové vložení?
Vložení je způsob, jak z chaotického, nestrukturovaného vstupu – věty, výzvy nebo obrázku – udělat strukturovaný vektor čísel. Není to jen seznam tokenů nebo klíčových slov. Je to matematický snímek významu.
Když modelu text-embedding-ada-002 společnosti OpenAI pošlete větu „robot namalovaný akvarelem“, vrátí vám několik set hodnot s pohyblivou řádovou čárkou. Každá z nich něco zachycuje: téma, náladu, styl, sémantické vztahy zapracované do této výzvy. Podobné fráze vytvářejí podobné vektory. Nepodobné? Ty jsou od sebe vzdálenější.
Představte si to jako umístění významu na mapu. Čím blíže jsou si dvě fráze v tomto vysokorozměrném prostoru, tím jsou si podobnější – bez ohledu na znění. To je základ pro vytváření vyhledávání, doporučení, shlukování a kategorizace na základě významu.

Skutečný případ použití: vyhledávání obrázků podle významu
Na naší ukázkové stránce můžete nechat uživatele vyhledávat sémanticky. Zadají výzvu nebo vyberou jednu ze seznamu a vaše aplikace jim vrátí obrázky seřazené podle toho, jak dobře odpovídají dané myšlence.
Uživatelské rozhraní je záměrně minimální:
- Textové pole pro vlastní výzvy
- Rozbalovací seznam předdefinovaných výzev
-
Matice, která zobrazuje obrázky seřazené podle podobnosti s výzvou.
Zde je klíč: surové obrázky nevektorizujeme. Místo toho je každý obrázek analyzován systémem AIKit OpenAIVision, který generuje titulek a popis v přirozeném jazyce. Tento popis se vloží do 4D.Vector a uloží.
Tímto způsobem se vše porovnává na úrovni významu, nikoliv pixelů.
Poznámka: Tento příklad používá 4D Qodly Pro, ale stejná logika se dokonale uplatní i na standardní formuláře 4D. Ve skutečnosti veškerý kód běží uvnitř metod a funkcí 4D. Jediný rozdíl je v tom, jak se rozhodnete výsledky zobrazit – v klasickém formuláři 4D nebo na stránce Qodly.
Jak vygenerujete vektor
Když někdo zadá výzvu a klikne na tlačítko„Použít vlastní výzvu„, spustí 4D funkci calculate() ze třídy VectorManagement:
exposed shared Function calculate($prompt : Text) : cs.PicturesSelection
Ta začne tím, že z paměti vezme váš OpenAI API klíč (Storage.OpenAI.key) – ten by měl být odeslán z prvního vstupního pole na kartě Info. Pokud jste toto přeskočili a přesto jste klikli na tlačítko Použít vlastní výzvu, zobrazí se modální okno, které vás před pokračováním vyzve k zadání klíče:
If (Storage.OpenAI.key#"")
$apiKey:=Storage.OpenAI.key
Else
$apiModal:=Web Form.setApiKeyModal
$apiModal.show()
End if
Poznámka: Tento příklad používá pro operace AI OpenAI, ale můžete použít jakéhokoli poskytovatele kompatibilního s OpenAI – dokonce i místní model s Ollama. My zde používáme OpenAI, protože se snadno nastavuje a nevyžaduje žádnou místní instalaci. Pokud chcete postupovat podle něj, požádejte o klíč OpenAI zde:.
Dále zavoláte funkci generateVector() uvnitř třídy AIManagement:
var $vector := cs.AIManagement.new($apiKey).generateVector($prompt)
Co se zde děje?
Používáte model OpenAI text-embedding-ada-002 – optimalizovaný pro krátké texty – k přeměně výzvy na vysokorozměrný vektor. Pomocí metody .create() odešlete výzvu a model text-embedding-ada-002 jako požadavek na OpenAI a vrátíte strukturu JSON obsahující vektor. Tento vektor je pak zabalen do objektu 4D.Vector, čímž získáme něco, co můžeme ve 4D nativně porovnávat a třídit.
property clientAI : Object
Class constructor($openAIKey : Text)
This.clientAI := cs.AIKit.OpenAI.new($openAIKey)
Function generateVector($text : Text) : 4D.Vector
var $model := "text-embedding-ada-002"
var $result := This.clientAI.embeddings.create($text; $model)
return $result.vector
V tomto okamžiku jste přeložili výzvu uživatele do strukturovaného formátu, který může 4D použít pro sémantické porovnání.
Od výzvy k seřazeným výsledkům
Když máte svůj vektor v ruce, porovnáte jej nyní se všemi uloženými vektory popisu obrázku v databázi:
var $pictureList := This._calculateVectors($vector)
A uvnitř stránky _calculateVectors se děje toto:
For each ($picture; $pictureList)
$picture.cosineSimilarity := $vector.cosineSimilarity($picture.vector)
$picture.dotSimilarity := $vector.dotSimilarity($picture.vector)
$picture.euclideanDistance := $vector.euclideanDistance($picture.vector)
$picture.save()
End for each
Každá míra podobnosti vám poskytne jinou optiku:
- Kosinová podobnost měří, jak blízko k sobě dva vektory směřují. Ideální pro hodnocení sémantické podobnosti.
- Bodový součin zohledňuje jak směr, tak velikost. Je užitečný, když chcete zohlednit, jak „silně“ se dva vektory shodují.
- Euklidovská vzdálenost je hrubá vzdálenost mezi dvěma body v prostoru. Čím je vzdálenost menší, tím jsou si podobnější.
Pokud s vektorovou matematikou ve 4D začínáte, v prvním příspěvku tohoto seriálu se dozvíte, jak pomocí těchto metod vytvářet a porovnávat vektory a kdy kterou z nich použít.
Jakmile jsou všechna skóre podobnosti vypočtena a uložena na obrazových entitách, seřadíte je podle kosinové podobnosti a vrátíte výsledky:
return $pictureList.orderBy("cosineSimilarity desc")
To znamená, že se nejprve zobrazí koncepčně nejrelevantnější obrázky bez ohledu na jejich název souboru, popis nebo metadata.
Co když si uživatel vybere předdefinovanou výzvu?
Pokud si někdo vybere výzvu z rozevíracího seznamu a klikne na možnost Použít vybranou výzvu, krok vkládání zcela přeskočíte:
exposed shared Function calculateWithSelectedPrompt($prompt : cs.PromptsEntity) : cs.PicturesSelection
var $pictureList:=This._calculateVectors($prompt.Vector)
return $pictureList.orderBy("cosineSimilarity desc")
Žádné další volání OpenAI není potřeba – vektor výzvy je již uložen v databázi. Jednoduše znovu použijete 4D.Vector uložený v datové třídě Prompts při prvním vytvoření výzvy.
Stejně jako popisy obrázků je každá výzva jednou vektorizována a poté uložena pro opakované použití. Tím získáte:
-
Žádné volání API → Okamžité výsledky, žádné zpoždění v síti
-
Žádné náklady na token → Příznivější pro rozpočet, zejména v měřítku
-
Funguje offline → Vše běží lokálně, žádná závislost na externí službě.
OD NAHRÁNÍ OBRÁZKU PO VEKTORIZOVANÝ POPIS
Když někdo nahraje obrázek, nevkládáte pixely. Místo toho obrázek popíšete pomocí OpenAI Vision a vložíte tento popis.
Ve funkci vectorizeImageDescription jsou definovány dvě výzvy: jedna pro krátký popisek a druhá pro úplnější popis. Obě jsou vytvořeny tak, aby vracely jednotlivé plynulé věty optimalizované pro vkládání:
// --- Prompts (single, fluent, embedding-friendly) ---
$captionPrompt:="You are a precise visual captioner. "+\
"Write one short, clear English sentence (12–20 words) that summarizes the main subject of the image. "+\
"Keep it straightforward and descriptive, not poetic. Output only the sentence."
$descriptionPrompt:="You are a detailed scene describer. "+\
"Write a longer English paragraph (80–150 words) that expands on the caption. "+\
"Include context, secondary elements (icons, arrows, checklists, text, logos), and atmosphere so nothing important is missed. "+\
"Avoid repeating the caption verbatim. Output only the description."
Co vidíte v uživatelském rozhraní
Jakmile je porovnání provedeno, vaše matice se okamžitě aktualizuje. Obrázky jsou seřazeny na základě skóre podobnosti.
-
Vyhledáváte: a zobrazí se obrázky s jemnými texturami a robotickými tvary: „akvarelová malba robota“ – a zobrazí se obrázky s jemnými texturami a robotickými tvary:

-
Přepnete se na: – obraz s motivem malíře – obraz s motivem malíře: „živá a slunečná plážová scéna s barevnými prvky“ – a získáte zcela jinou, ale stejně relevantní sadu výsledků:

Ať už je zadáte nebo nahrajete, vždy porovnáváte myšlenky – ne pixely, ne názvy souborů.
Co získáte jako vývojář
Používání vektorů s umělou inteligencí odemyká skutečnou, okamžitou hodnotu ve vašich 4D aplikacích:
-
Chytřejší vyhledávání: Umožněte uživatelům vyhledávat podle významu, nikoli podle klíčových slov. Žádné značky, žádné filtry – jen relevantní výsledky.
-
Nativní logika: Vše běží uvnitř 4D. Není třeba používat externí vyhledávače ani nástroje třetích stran.
-
Opakovaně použitelný vzor: Funguje pro obrázky, dokumenty, produkty, vstupenky – cokoli, co chcete porovnávat podle konceptu.
-
Nízké nároky na nastavení, vysoký dopad: Několik řádků kódu vám poskytne řazení, filtrování a doporučení využívající umělou inteligenci.
-
Levnější + rychlejší: Jednou vložte, uložte vektor a používejte ho navždy. Žádná opakovaná volání API ani náklady na tokeny.
-
Základ připravený na AI: Nejde jen o přidání vyhledávání – pokládáte základy pro chatboty, doporučení a chytřejší pracovní postupy.
Se sadou 4D.Vector a 4D AI Kit nemusíte vytvářet inteligenci – stačí ji zapojit.
Závěrečné myšlenky
Umělou inteligenci do své aplikace nepřišroubováváte – zabudováváte ji do základní logiky.
Pomocí stránek 4D.Vector a sady 4D AI Kit dáváte své aplikaci schopnost porozumět záměru, nikoli pouze vstupním údajům. Vyplouvat na povrch význam, ne jen shody.
Nástroje jsou připraveny. Kód je lehký. Hodnota je skutečná. Vše, co nyní potřebujete… je výzva.
K tomuto příspěvku zatím nelze přidávat komentáře.