View a markdown version of this page

Tutorial: La tua prima ricerca vettoriale - Amazon DynamoDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Tutorial: La tua prima ricerca vettoriale

Immagina un catalogo di prodotti in cui gli acquirenti descrivono ciò che vogliono con parole proprie invece di corrispondere a parole chiave esatte. Puoi memorizzare un incorporamento vettoriale di ogni descrizione di prodotto in DynamoDB e quindi interrogare un indice vettoriale per trovare le corrispondenze più vicine.

Questo tutorial crea una tabella con un indice vettoriale, genera incorporamenti di 1024 dimensioni con Amazon Bedrock Titan Text Embeddings V2, carica 50 prodotti ed esegue una ricerca di similarità che restituisce le 5 corrispondenze più vicine. Ogni comando può essere incollato direttamente in un terminale. Per informazioni su come funzionano gli incorporamenti con DynamoDB, consulta. Generazione di incorporamenti vettoriali

Informazioni su scalabilità e richiamo

Un indice vettoriale di produzione contiene da milioni a miliardi di vettori. Gli indici vettoriali utilizzano la ricerca approssimativa del vicino più prossimo e le caratteristiche di richiamo di tale approccio diventano osservabili solo su scala molto più ampia. Considerate il catalogo di 50 articoli qui come una dimostrazione della meccanica. Per indicazioni su dimensionamento e messa a punto, vedere. Le migliori pratiche per gli indici vettoriali

Prerequisiti

Prima di iniziare, assicurati di disporre di:

  • AWS CLI versione 2.36.16 o successiva. Il supporto per gli indici vettoriali è stato aggiunto AWS CLI agli AWS SDK nell'aggiornamento del modello di servizio rilasciato il 4 agosto 2026. Le versioni precedenti non riconoscono il --vector-indexes parametro o il search-vectors comando. Controlla la tua versione aws --version e aggiorna se necessario. Se utilizzi un AWS SDK anziché il AWS CLI, hai bisogno della versione botocore 1.43.64 o successiva o della versione equivalente dell'SDK della tua lingua.

  • Credenziali con autorizzazioni per le azioni DynamoDBCreateTable,,,, DescribeTable PutItem BatchWriteItem Scan SearchVectorsUpdateTable, e DeleteTable per l'azione Amazon Bedrock. InvokeModel dynamodb:SearchVectorsè una nuova azione, quindi le politiche esistenti che concedono l'accesso in lettura a DynamoDB non la includono.

  • Accesso al modello Titan Text Embeddings V2 abilitato in Amazon Bedrock per il tuo account e la tua regione. L'accesso al modello Amazon Bedrock è concesso per account e per regione, quindi devi abilitare il modello prima di poterlo chiamare.

  • jqinstallato per rimodellare l'output del modello in formato DynamoDB.

  • Una regione in cui sono disponibili sia gli indici vettoriali DynamoDB che Amazon Bedrock Titan Text Embeddings V2. La disponibilità dei modelli Amazon Bedrock varia in base alla regione ed è generalmente più limitata rispetto alla copertura regionale DynamoDB, quindi conferma entrambi prima di scegliere una regione. Per la disponibilità dei modelli Amazon Bedrock, consulta il supporto dei modelli per AWS regione nella Guida per l'utente di Amazon Bedrock.

Costi

Questo tutorial prevede costi per le chiamate ai modelli Amazon Bedrock e lo storage DynamoDB. Effettua 51 chiamate di incorporamento, ciascuna fatturata come richiesta di inferenza Amazon Bedrock, su input brevi e composti da una sola frase. I costi di archiviazione di DynamoDB si applicano finché esistono la tabella e l'indice vettoriale.

Conferma quale regione stai utilizzando

Ogni comando di questo tutorial deve essere eseguito nella stessa regione. Conferma la regione che AWS CLI verrà effettivamente utilizzata prima di iniziare, perché ha la AWS_REGION precedenza ed entrambe hanno la precedenza sull'regionimpostazione nel tuo AWS CLI file di configurazione. AWS_DEFAULT_REGION Un AWS_REGION valore errato nella shell crea la tabella in una posizione diversa dalla regione desiderata e il modello Amazon Bedrock potrebbe non essere abilitato in tale regione. Per eliminare ogni dubbio, trasmetti --region region esplicitamente ogni comando.

SearchVectorsutilizza un endpoint separato

SearchVectorssi risolve in un endpoint di ricerca dedicato anziché nell'endpoint DynamoDB standard. In una regione commerciale, le richieste vanno asearch-dynamodb.region.amazonaws.com, mentre tutte le altre operazioni di questo tutorial vanno a. dynamodb.region.amazonaws.com Le varianti FIPS e dual-stack seguono lo stesso schema. Ciò ha due conseguenze:

  • Se la rete limita il traffico in uscita tramite un endpoint VPC, un proxy o una lista consentita di uscita, è necessario consentire anche il nome host di ricerca. In caso contrarioCreateTable, le operazioni di scrittura hanno esito positivo e solo SearchVectors negativo, in genere con un errore di connessione che non indica la causa.

  • Non utilizzare --endpoint-url per sovrascrivere l'endpoint DynamoDB per questi comandi. Un singolo override non può servire entrambi i nomi host e interromperà il routing di ricerca.

  1. Crea una tabella con un indice vettoriale. Questo crea una Products tabella con un indice vettoriale denominato DescriptionIndex nell'DescriptionVectorattributo. L'indice utilizza la funzione di COSINE distanza con 1024 dimensioni per corrispondere all'output di Titan Text Embeddings V2. Poiché non è definita alcuna chiave di partizione dell'indice vettoriale, non è necessario eseguire una ricerca. SearchConditionExpression

    aws dynamodb create-table \ --table-name Products \ --attribute-definitions AttributeName=ProductId,AttributeType=S \ --key-schema AttributeName=ProductId,KeyType=HASH \ --billing-mode PAY_PER_REQUEST \ --vector-indexes \ "[ { \"IndexName\": \"DescriptionIndex\", \"VectorAttribute\": {\"AttributeName\": \"DescriptionVector\"}, \"Projection\": {\"ProjectionType\": \"ALL\"}, \"Dimensions\": 1024, \"DistanceFunction\": \"COSINE\" } ]"

    Questo esempio utilizza ProjectionType of ALL in modo che ogni attributo sia disponibile per i risultati della ricerca. Se INCLUDE invece lo usi, nota che il budget previsto per gli attributi non chiave è condiviso: l'attributo vector conta come un attributo e ogni elemento dello schema di INLINE_FILTER ricerca conta come uno. HASHgli elementi dello schema di ricerca non vengono conteggiati ai fini del limite.

  2. Attendi che l'indice diventi attivo. Esegui questo finché non IndexStatus lo èACTIVE.

    aws dynamodb describe-table \ --table-name Products \ --query 'Table.VectorIndexes[0].[IndexName,IndexStatus,Backfilling]'

    Un indice creato come parte diCreateTable, come in questo tutorial, non Backfilling viene riportato e viene restituito null dal comando. In tal caso, usalo IndexStatus da solo come segnale.

    Backfillingviene segnalato per un indice vettoriale con cui si aggiunge a una tabella esistenteUpdateTable. In tal caso, attendi che IndexStatus ACTIVE Backfilling sia così false prima di fare affidamento sui risultati di ricerca completi.

    Attendi l'indice, non solo la tabella

    Non utilizzatelo aws dynamodb wait table-exists per filtrare la ricerca. Quel cameriere corrisponde a attivoTable.TableStatus, che diventa attivo ACTIVE finché l'indice vettoriale può ancora esserloCREATING. Non è previsto alcun limite per la disponibilità dell'indice vettoriale, quindi è necessario eseguire il DescribeTable polling come mostrato. La ricerca in un indice che non lo è ancora ha ACTIVE esito negativo e la ricerca durante il backfill può restituire risultati incompleti.

    Per lo stesso motivo, non è possibile eliminare la tabella finché non è terminata la creazione di ogni indice vettoriale. DeleteTablerestituisce ResourceInUseException il messaggio «Impossibile eliminare la tabella durante la creazione, l'aggiornamento o l'eliminazione degli indici».

  3. Crea il catalogo dei prodotti. Salva i seguenti 50 prodotti in un file separato da tabulazioni denominato. products.tsv Ogni riga contiene un ID del prodotto, un nome e una descrizione composta da una frase. Il catalogo contiene dieci gruppi di cinque prodotti correlati, il che rende i risultati della ricerca nell'ultimo passaggio facili da interpretare.

    p01 Insulated Travel Mug A vacuum insulated stainless steel mug that keeps hot drinks warm for up to twelve hours. p02 Stovetop Espresso Maker A compact aluminum pot that brews strong espresso style coffee directly on a gas or electric burner. p03 Manual Burr Coffee Grinder A hand cranked grinder with adjustable ceramic burrs for consistent coffee grounds. p04 Pour Over Coffee Dripper A ceramic cone that sits on a mug and brews a single cup of filter coffee. p05 Electric Milk Frother A handheld battery powered whisk that creates dense foam for lattes and cappuccinos. p06 Lightweight Running Shoe A breathable mesh road shoe with cushioned foam midsole for daily training runs. p07 Trail Running Shoe An aggressive lugged outsole shoe built for grip on loose gravel and muddy trails. p08 Moisture Wicking Running Socks Ankle height socks knitted from synthetic yarn that pulls sweat away from the skin. p09 Reflective Running Vest A lightweight vest with high visibility strips for running safely after dark. p10 Hydration Waist Belt An elastic belt that holds two small water flasks and a phone during long runs. p11 Ergonomic Mesh Office Chair An adjustable desk chair with breathable mesh back and lumbar support for long work sessions. p12 Sit Stand Desk Converter A height adjustable platform that raises a monitor and keyboard for standing work. p13 Monitor Arm Mount A clamp mounted articulating arm that lifts a display off the desk surface. p14 Under Desk Footrest An angled cushioned platform that supports the feet and improves seated posture. p15 Wireless Split Keyboard A two piece keyboard that separates for a natural shoulder width typing position. p16 Noise Cancelling Headphones Over ear wireless headphones that actively silence engine noise on long flights. p17 Wireless Earbuds Compact in ear buds with a charging case and multi hour battery for commuting. p18 Portable Bluetooth Speaker A water resistant rechargeable speaker sized to fit in a backpack side pocket. p19 Studio Monitor Headphones Wired closed back headphones with flat frequency response for audio mixing. p20 Wired Lapel Microphone A small clip on microphone for recording clear speech during interviews. p21 Four Season Backpacking Tent A double wall tent with an aluminum pole set rated for wind and heavy rain. p22 Down Sleeping Bag A mummy shaped bag filled with compressible down insulation for cold weather camping. p23 Inflatable Sleeping Pad A lightweight pad that inflates in a few breaths and packs down to bottle size. p24 Canister Camping Stove A screw on burner that boils water quickly using a compact fuel canister. p25 Rechargeable Camp Lantern A collapsible lantern with adjustable brightness and a built in battery. p26 Cast Iron Skillet A preseasoned heavy pan that holds heat evenly for searing and oven baking. p27 Nonstick Frying Pan A coated aluminum pan that releases eggs and fish without added oil. p28 Stainless Steel Stock Pot A tall wide pot for boiling pasta and simmering large batches of soup. p29 Enameled Dutch Oven A heavy lidded pot that moves from stovetop to oven for slow braising. p30 Bamboo Cutting Board A large reversible board with a juice groove around the edge. p31 Padded Laptop Backpack A water resistant pack with a suspended sleeve that protects a fifteen inch laptop. p32 Slim Laptop Sleeve A close fitting neoprene case that shields a notebook inside a larger bag. p33 Rolling Carry On Suitcase A hard shell four wheel case sized to fit most overhead cabin bins. p34 Packing Cube Set Zippered fabric cubes that compress clothing and organize a suitcase. p35 Leather Messenger Bag A single strap shoulder bag with a padded compartment and interior pockets. p36 Daily Facial Moisturizer A light lotion with humectants that hydrates skin without leaving residue. p37 Mineral Sunscreen Lotion A broad spectrum zinc based sunscreen formulated for sensitive facial skin. p38 Gentle Foaming Cleanser A low pH face wash that removes oil and sunscreen without stripping the skin. p39 Vitamin C Serum A brightening serum applied before moisturizer to even skin tone over time. p40 Overnight Repair Cream A rich night cream with ceramides that restores the skin barrier while sleeping. p41 Stainless Steel Dog Bowl A weighted nonslip bowl that resists tipping during enthusiastic feeding. p42 Padded Dog Harness An adjustable chest harness that distributes pull away from the neck on walks. p43 Retractable Dog Leash A spring loaded leash that extends and locks at several walking lengths. p44 Interactive Cat Puzzle Feeder A slow feed tray that makes a cat work for dry food and eat more slowly. p45 Self Cleaning Litter Box An enclosed box with a raking mechanism that sifts waste after each use. p46 Bypass Pruning Shears Sharp hardened blades that make clean cuts on green stems and small branches. p47 Long Handled Garden Spade A steel bladed spade with a wooden shaft for turning soil and digging beds. p48 Adjustable Hose Spray Nozzle A metal nozzle that shifts from a fine mist to a strong jet stream. p49 Raised Garden Bed Kit Interlocking cedar panels that assemble into an elevated planting box. p50 Drip Irrigation Starter Kit Tubing and emitters that deliver water slowly to the base of each plant.

    Il separatore tra i tre campi deve essere un carattere di tabulazione letterale. Se copi il catalogo da un browser, verifica che le schede siano sopravvissute prima di continuare.

  4. Genera un incorporamento per un prodotto. Esegui prima una singola chiamata di incorporamento per confermare che l'accesso al tuo modello Amazon Bedrock funziona. Il inputText campo contiene il testo da incorporare, dimensions imposta la dimensione dell'output (i valori validi sono 256, 512 o 1024) e normalize produce vettori di lunghezza unitaria, consigliati per la ricerca di similarità del coseno.

    mkdir -p emb aws bedrock-runtime invoke-model \ --model-id amazon.titan-embed-text-v2:0 \ --body '{"inputText":"A vacuum insulated stainless steel mug that keeps hot drinks warm for up to twelve hours.","dimensions":1024,"normalize":true}' \ --cli-binary-format raw-in-base64-out \ --content-type application/json \ --accept application/json \ emb/p01.json

    Il contrassegno è obbligatorio. --cli-binary-format raw-in-base64-out AWS CLI v2 utilizza per impostazione predefinita la codifica base64 per i parametri binari, quindi senza questo flag il corpo JSON non elaborato non viene inviato correttamente. La risposta viene scritta emb/p01.json e contiene un array di 1024 numeri in virgola mobile. embedding Conferma il conteggio delle dimensioni.

    jq '.embedding | length' emb/p01.json

    L'output è 1024:

  5. Scrivi il primo prodotto. Trasforma l'incorporamento nel formato dell'elemento DynamoDB e scrivilo. L'attributo vector stored utilizza il tipo DynamoDB L (list) che racchiude ogni numero in un tipo. N

    jq '{"ProductId":{"S":"p01"},"Title":{"S":"Insulated Travel Mug"},"DescriptionVector":{"L":[.embedding[]|{"N":(.|tostring)}]}}' emb/p01.json > item-p01.json aws dynamodb put-item --table-name Products --item file://item-p01.json
    Dimensioni del vettore e limiti degli elementi

    Un vettore di 1024 dimensioni aggiunge circa 32 KB al payload della richiesta e circa 5 KB all'elemento archiviato, ben entro il limite di dimensione degli elementi di 400 KB di DynamoDB. Il numero delle dimensioni è il fattore principale della dimensione dell'articolo quando si archiviano gli incorporamenti.

  6. Incorpora i prodotti rimanenti. Questo ciclo genera un incorporamento per ogni prodotto rimanente. Salta qualsiasi file già esistente, quindi puoi rieseguirlo in sicurezza se una chiamata fallisce.

    while IFS=$'\t' read -r id title description; do [ -s "emb/$id.json" ] && continue body=$(jq -n --arg t "$description" '{inputText:$t,dimensions:1024,normalize:true}') aws bedrock-runtime invoke-model \ --model-id amazon.titan-embed-text-v2:0 \ --body "$body" \ --cli-binary-format raw-in-base64-out \ --content-type application/json \ --accept application/json \ "emb/$id.json" >/dev/null || echo "FAILED $id" done < products.tsv ls emb/*.json | wc -l

    Il conteggio deve essere 50 prima di continuare. Se viene stampata una chiamataFAILED, esegui nuovamente il ciclo; riprova solo i file mancanti.

    InvokeModel quote tariffarie

    Amazon Bedrock applica le quote tariffarie richieste a. InvokeModel Se modifichi questo ciclo per effettuare chiamate in parallelo, aspettati eccezioni di limitazione su alcune chiamate e verifica sempre il numero finale dei file anziché dare per scontato che tutte le chiamate siano andate a buon fine. Un catalogo parzialmente incorporato viene caricato senza errori e produce risultati di ricerca che omettono silenziosamente i prodotti mancanti.

  7. Carica i prodotti rimanenti. Carichi utili di richieste di build di 25 elementi ciascuno, che è il numero massimo BatchWriteItem accettato.

    batch=0 count=0 echo -n '{"Products":[' > batch-0.json while IFS=$'\t' read -r id title description; do if [ "$count" -eq 25 ]; then echo ']}' >> "batch-$batch.json" batch=$((batch+1)); count=0 echo -n '{"Products":[' > "batch-$batch.json" fi [ "$count" -gt 0 ] && echo -n ',' >> "batch-$batch.json" jq -c --arg id "$id" --arg title "$title" \ '{PutRequest:{Item:{ProductId:{S:$id},Title:{S:$title}, DescriptionVector:{L:[.embedding[]|{"N":(.|tostring)}]}}}}' \ "emb/$id.json" >> "batch-$batch.json" count=$((count+1)) done < <(tail -n +2 products.tsv) echo ']}' >> "batch-$batch.json"

    Il ciclo viene letto da un reindirizzamento anziché da una pipe perché un while ciclo piped viene eseguito in una subshell di alcune shell, che elimina count i valori batch and e produce file batch non validi.

    Invia ogni batch. BatchWriteItempuò avere esito parziale, quindi invia nuovamente tutto ciò che restituisce. UnprocessedItems

    for f in batch-*.json; do cp "$f" pending.json for attempt in 1 2 3 4 5; do aws dynamodb batch-write-item \ --request-items file://pending.json \ --output json > resp.json left=$(jq '(.UnprocessedItems.Products // []) | length' resp.json) echo "$f attempt $attempt: unprocessed=$left" [ "$left" -eq 0 ] && break jq '.UnprocessedItems' resp.json > pending.json sleep 2 done done

    Conferma che tutti i 50 articoli sono presenti.

    aws dynamodb scan --table-name Products --select COUNT --query 'Count'
    ItemCount gli aggiornamenti sono ritardati

    IndexSizeBytesI valori ItemCount e DescribeTable riportati per un indice vettoriale vengono aggiornati all'incirca ogni sei ore, quindi subito dopo il caricamento possono comunque essere letti 0 anche se tutti gli elementi sono stati scritti. Usalo Scan con--select COUNT, come mostrato, per verificare un carico. Non considerare uno zero ItemCount come un carico fallito.

  8. Genera l'incorporamento e la ricerca di una query. Incorpora la frase di ricerca con lo stesso numero di modelli e dimensioni utilizzati per gli articoli archiviati.

    aws bedrock-runtime invoke-model \ --model-id amazon.titan-embed-text-v2:0 \ --body '{"inputText":"How can I make my desk more comfortable to work at","dimensions":1024,"normalize":true}' \ --cli-binary-format raw-in-base64-out \ --content-type application/json \ --accept application/json \ embedding-query.json
    SearchVector il formato è diverso dal formato vettoriale memorizzato

    Quando memorizzate un vettore in un attributo item, lo racchiudete in un tipo L (elenco):{"L":[{"N":"0.123"},...]}. Quando si passa un vettore di interrogazione aSearchVectors, si utilizza un semplice array di N valori senza il L wrapper:. [{"N":"0.123"},...] La seguente jq trasformazione è diversa da quella utilizzata per gli elementi archiviati per questo motivo. Per ulteriori informazioni, consulta Ricerca di base.

    jq '[.embedding[]|{"N":(.|tostring)}]' embedding-query.json > query-vector.json aws dynamodb search-vectors \ --table-name Products \ --index-name DescriptionIndex \ --search-vector file://query-vector.json \ --top-k 5 \ --projection-expression "ProductId, Title" \ --return-consumed-capacity TOTAL

    Il vettore di interrogazione e i vettori memorizzati devono provenire dallo stesso modello di incorporamento e devono avere lo stesso numero di dimensioni. L'utilizzo di un modello o di un numero di dimensioni diverso produce risultati privi di significato o un errore di convalida.

  9. Leggete i risultati. DynamoDB restituisce i risultati ordinati per somiglianza, con l'elemento più simile per primo. Ogni risultato contiene gli attributi Item proiettati e un. Score

    { "SearchResults": [ { "Item": { "ProductId": { "S": "p11" }, "Title": { "S": "Ergonomic Mesh Office Chair" } }, "Score": 0.6130197048187256 }, { "Item": { "ProductId": { "S": "p12" }, "Title": { "S": "Sit Stand Desk Converter" } }, "Score": 0.781868577003479 }, { "Item": { "ProductId": { "S": "p14" }, "Title": { "S": "Under Desk Footrest" } }, "Score": 0.816369354724884 }, { "Item": { "ProductId": { "S": "p13" }, "Title": { "S": "Monitor Arm Mount" } }, "Score": 0.8283305168151855 }, { "Item": { "ProductId": { "S": "p15" }, "Title": { "S": "Wireless Split Keyboard" } }, "Score": 0.8469693064689636 } ], "ConsumedCapacity": { "VectorSearchRequestBytes": 31449.0 } }

    I punteggi dipendono dal modello di incorporamento e dall'esatto testo di input, quindi i valori saranno leggermente diversi. Ciò che conta è quali elementi sono stati selezionati e in quale ordine. La ricerca non conteneva le parole sedia, monitor o tastiera, ma ha restituito tutti e cinque i prodotti per scrivania e ufficio davanti agli altri 45 articoli del catalogo. Non viene visualizzato nulla dei gruppi dedicati al caffè, al campeggio o agli animali domestici.

    Prova con altre domande per vedere lo stesso comportamento con gruppi diversi. Ripeti il passaggio precedente "Something to brew fresh coffee at home" e i risultati migliori sono la macchina per caffè espresso, il gocciolatore e il montalatte. Ripeti con "Keeping my dog safe on walks" e il guinzaglio e l'imbracatura saranno al primo posto, seguiti da articoli che sono solo vagamente correlati, perché il catalogo contiene solo due prodotti che coincidono strettamente. Vale la pena notare quest'ultimo caso: la ricerca restituisce sempre il numero di articoli richiesti, anche quando il catalogo non contiene molte corrispondenze soddisfacenti. Usa i Score valori, non il conteggio dei risultati, per giudicare la qualità della corrispondenza.

    La modalità di lettura di un punteggio dipende dalla funzione di distanza utilizzata dall'indice:

    • COSINEe EUCLIDEAN restituisci gli elementi con i punteggi più bassi, quindi più basso è più simile. I punteggi del coseno vanno da 0 per la direzione identica a 2 per la direzione opposta.

    • DOT_PRODUCTrestituisce gli elementi con i punteggi più alti, quindi più alto è più simile.

    Questo indice utilizzaCOSINE, quindi il primo risultato ha il punteggio più basso. La ricerca con un testo identico a una descrizione memorizzata restituisce l'elemento per primo con un punteggio pari o prossimo a zero.

Eliminazione

Per evitare addebiti continui, elimina le risorse che hai creato in questo tutorial. L'archiviazione degli indici vettoriali viene fatturata per tutto il tempo in cui l'indice esiste, indipendentemente dal fatto che vengano eseguite o meno ricerche su di esso.

Per eliminare l'indice vettoriale ma conservare la Products tabella e i relativi elementi, usaUpdateTable. Gli elementi rimangono nella tabella e viene rimosso solo l'indice.

aws dynamodb update-table \ --table-name Products \ --vector-index-updates \ "[ {\"Delete\": {\"IndexName\": \"DescriptionIndex\"}} ]"

Per eliminare la tabella e il relativo indice vettoriale insieme, elimina la tabella.

aws dynamodb delete-table --table-name Products

Conferma che la tabella è sparita. Il comando seguente restituisce una ResourceNotFoundException volta completata l'eliminazione.

aws dynamodb describe-table --table-name Products

Per ulteriori informazioni sulla rimozione di un indice vettoriale da una tabella che si desidera conservare, vedere. Eliminazione di un indice vettoriale

Fasi successive

Dopo aver completato questa ricerca vettoriale di base, esplora questi argomenti correlati.