Embeddings ontwerpen voor SQL-databaseworkloads

Voltooid

Insluitingen vertegenwoordigen gegevens als vectoren, zodat overeenkomsten tussen stukken tekst kunnen worden vergeleken. Hoe u insluitingen ontwerpt, is van invloed op relevantie, prestaties en kosten wanneer er later vectoren worden gegenereerd en opgevraagd.

SQL Server biedt ingebouwde AI-functies die ondersteuning bieden voor het insluiten van werkstromen. Algemene vectorzoekpatronen helpen u bij het voorbereiden van tekst voordat insluitingen worden gegenereerd.

Begrijpen hoe vectoren worden gemaakt

Maar wat betekent de term vector in de context van AI-integratie met een SQL-database?

Een AI-model maakt een vector, niet SQL zelf. Het model is getraind om tekst te lezen en een lijst met getallen te retourneren die de betekenis van die tekst vertegenwoordigen.

Wanneer SQL tekst naar een insluitmodel verzendt, retourneert het model een vector, die SQL opslaat voor latere vergelijking met andere vectoren.

Wanneer de tekst 'lichtgewicht wandelrugzak' bijvoorbeeld naar een insluitmodel wordt verzonden, kan het model het volgende retourneren:

[0.12, -0.87, 0.45, 0.31, …]

Een gerelateerde zin zoals 'compacte rugzak voor dagwandelingen' zou een andere lijst met getallen produceren die er ongeveer als volgt uitzien:

[0.10, -0.85, 0.47, 0.29, …]

Omdat de vectoren er ongeveer als volgt uitzien, kan SQL de twee stukken tekst behandelen als gerelateerd, ook al is de formulering anders.

Gegevens identificeren die moeten worden opgenomen in insluitingen

Insluitingen werken het beste wanneer ze tekst vertegenwoordigen die semantische betekenis heeft, zoals beschrijvingen, titels of andere vrije tekstvelden.

Kolommen met id's, numerieke waarden of operationele metagegevens voegen meestal geen semantische waarde toe en moeten worden uitgesloten. Het beperken van insluitingen tot zinvolle tekst vermindert het tokengebruik en verbetert de overeenkomsten.

Ontwerpkeuzes in deze fase bepalen welke gegevens insluitingen vastleggen en hoe goed ze de onderliggende gegevens vertegenwoordigen.

Invoergrootte en -structuur beheren

Embedding-modellen werken met getokeniseerde invoer en leggen limieten op voor de hoeveelheid tekst die in één aanvraag kan worden verwerkt. Een token is een klein stukje tekst, zoals een woord of een deel van een woord, dat het model als een eenheid verwerkt. Lange tekstwaarden vereisen vaak deling in kleinere eenheden.

SQL Server ondersteunt dit patroon via ingebouwde AI-functies waarmee u tekst kunt voorbereiden voor het insluiten van werkstromen. Door de invoergrootte te beheren, kunt u tekst binnen modellimieten houden en ervoor zorgen dat elke insluiting een duidelijk, gericht stukje inhoud vertegenwoordigt.

Goed gestructureerde invoer helpt ook het insluiten van niet-gerelateerde ideeën samen te voorkomen, waardoor de kwaliteit van overeenkomstenresultaten kan worden verminderd.

Strategieën voor segmentering ontwerpen

Segmentering bepaalt hoe grotere tekstwaarden worden onderverdeeld in kleinere segmenten. Een segmenteringsstrategie zorgt voor balans tussen context en precisie.

Segmenten die te groot zijn, kunnen de tokenlimieten overschrijden of semantische focus verdunnen. Segmenten die te klein zijn, kunnen belangrijke context verliezen. Het doel is om betekenis te behouden en segmenten efficiënt te verwerken.

In de praktijk wordt segmentering gedefinieerd door de regels die u toepast bij het splitsen van tekst in SQL. Deze regels bepalen meestal hoeveel tekst in elk segment wordt opgenomen, zoals een maximum aantal tekens en waar splitsingen mogen plaatsvinden.

AI_GENERATE_CHUNKS(SOURCE = description, CHUNK_TYPE = FIXED, CHUNK_SIZE = 500)

Door segmentregels rechtstreeks in SQL te definiëren, in de buurt van de brontabellen, kunt u de segmentgrootte wijzigen of gedrag splitsen door de query aan te passen in plaats van toepassingscode te wijzigen.

Ontwerp voor insluiten toepassen met SQL

In het volgende voorbeeld ziet u een conceptueel patroon dat tekst klaarmaakt voor inbedding door deze op te splitsen in kleinere eenheden.

SELECT
    id,
    c.chunk
FROM dbo.documents
CROSS APPLY
    AI_GENERATE_CHUNKS(SOURCE = description, CHUNK_TYPE = FIXED, CHUNK_SIZE = 500) AS c;

In dit voorbeeld is de tekst in de description kolom onderverdeeld in segmenten van maximaal 500 tekens. Elk segment kan later worden doorgegeven aan een insluitingsfunctie, zodat insluitingen gerichte gedeelten van de oorspronkelijke inhoud vertegenwoordigen.

Als een rij bijvoorbeeld de volgende tekst in de description kolom bevat:

"Lightweight backpack designed for long day hikes in warm weather."

De segmenteringsfunctie kan meerdere segmenten produceren, zoals:

  • "Lightweight backpack designed for long day hikes"
  • "in warm weather."

Elk segment wordt geretourneerd als een afzonderlijke rij door de query. Deze kleinere stukken kunnen vervolgens afzonderlijk worden doorgegeven aan een insluitingsfunctie, zodat elke insluiting een gericht gedeelte van de oorspronkelijke tekst vertegenwoordigt.

Aanbeveling

Een ontwerppatroon is het opslaan van vectoren in een afzonderlijke tabel van de brontekstgegevens. Met een speciale insluitingstabel kunt u gemakkelijker bijhouden hoeveel ruimtevectoren verbruiken en insluitingen opnieuw opbouwen zonder dat dit van invloed is op de oorspronkelijke gegevens.

Belangrijke punten

De kwaliteit van het insluiten is afhankelijk van de beslissingen die u neemt voordat het model start. Het kiezen van de juiste kolommen en het segmenteren van lange teksten in gerichte segmenten met AI_GENERATE_CHUNKS bepaalt hoe nuttig uw vectorzoekresultaten zijn. Door vroegtijdig de juiste ontwerpkeuzes te maken, voorkomt u kostbaar herwerk wanneer u overgaat op het integreren van genereren en opslag.