View a markdown version of this page

Tutoriel : Votre première recherche vectorielle - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Tutoriel : Votre première recherche vectorielle

Imaginez un catalogue de produits dans lequel les acheteurs décrivent ce qu'ils veulent avec leurs propres mots au lieu de faire correspondre des mots clés exacts. Vous pouvez stocker une intégration vectorielle de chaque description de produit dans DynamoDB, puis interroger un index vectoriel pour trouver les correspondances les plus proches.

Ce didacticiel crée un tableau avec un index vectoriel, génère des intégrations en 1024 dimensions avec Amazon Bedrock Titan Text Embeddings V2, charge 50 produits et exécute une recherche de similarité qui renvoie les 5 correspondances les plus proches. Chaque commande peut être collée directement dans un terminal. Pour plus d'informations sur le fonctionnement des intégrations avec DynamoDB, consultez. Génération d'intégrations vectorielles

À propos de la balance et du rappel

Un indice des vecteurs de production contient des millions, voire des milliards de vecteurs. Les index vectoriels utilisent la recherche approximative du voisin le plus proche, et les caractéristiques de rappel de cette approche ne deviennent observables qu'à une échelle beaucoup plus grande. Considérez le catalogue de 50 articles ici comme une démonstration des mécanismes. Pour obtenir des conseils sur le dimensionnement et le réglage, voirMeilleures pratiques pour les index vectoriels.

Conditions préalables

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • AWS CLI version 2.36.16 ou ultérieure. La prise en charge des index vectoriels a été ajoutée aux AWS SDK AWS CLI et aux kits de développement logiciel dans la mise à jour du modèle de service publiée le 4 août 2026. Les versions précédentes ne reconnaissaient ni le --vector-indexes paramètre ni la search-vectors commande. Vérifiez votre version aws --version et mettez-la à niveau si nécessaire. Si vous utilisez un AWS SDK au lieu de AWS CLI, vous aurez besoin de la version botocore 1.43.64 ou ultérieure, ou de la version équivalente de votre SDK linguistique.

  • Informations d'identification avec autorisations pour les actions DynamoDBCreateTable,DescribeTable,PutItem,BatchWriteItem,Scan, et SearchVectors UpdateTableDeleteTable, et pour l'action Amazon Bedrock. InvokeModel dynamodb:SearchVectorsest une nouvelle action. Par conséquent, les politiques existantes qui accordent un accès en lecture à DynamoDB ne l'incluent pas.

  • Accès au modèle Titan Text Embeddings V2 activé dans Amazon Bedrock pour votre compte et votre région. L'accès au modèle Amazon Bedrock est accordé par compte et par région. Vous devez donc activer le modèle avant de pouvoir l'appeler.

  • jqinstallé pour remodeler la sortie du modèle au format DynamoDB.

  • Région dans laquelle les index vectoriels DynamoDB et Amazon Bedrock Titan Text Embeddings V2 sont disponibles. La disponibilité du modèle Amazon Bedrock varie selon les régions et est généralement plus restreinte que la couverture régionale DynamoDB. Vérifiez donc les deux avant de choisir une région. Pour en savoir plus sur la disponibilité des modèles Amazon Bedrock, consultez la section Prise en charge des modèles par AWS région dans le guide de l'utilisateur d'Amazon Bedrock.

Frais

Ce didacticiel entraîne des frais pour les appels au modèle Amazon Bedrock et le stockage DynamoDB. Il effectue 51 appels d'intégration, chacun étant facturé comme une demande d'inférence Amazon Bedrock, sur de courtes entrées d'une seule phrase. Les frais de stockage DynamoDB s'appliquent tant que la table et l'index vectoriel existent.

Confirmez la région que vous utilisez

Toutes les commandes de ce didacticiel doivent être exécutées dans la même région. Vérifiez la région qu'il AWS CLI utilisera réellement avant de commencer, car elle AWS_REGION a priorité surAWS_DEFAULT_REGION, et les deux ont priorité sur le region paramètre de votre fichier de AWS CLI configuration. Une AWS_REGION valeur errante dans votre shell crée la table ailleurs que dans la région que vous souhaitiez, et le modèle Amazon Bedrock n'y est peut-être pas activé. Pour lever tout doute, passez --region region explicitement chaque commande.

SearchVectorsutilise un point de terminaison distinct

SearchVectorsaboutit à un point de terminaison de recherche dédié plutôt qu'au point de terminaison DynamoDB standard. Dans une région commerciale, les demandes sont adressées àsearch-dynamodb.region.amazonaws.com, tandis que toutes les autres opérations de ce didacticiel sont envoyées àdynamodb.region.amazonaws.com. Les variantes FIPS et Dual-Stack suivent le même schéma. Cela a deux conséquences :

  • Si votre réseau restreint le trafic sortant via un point de terminaison VPC, un proxy ou une liste d'autorisation de sortie, vous devez également autoriser le nom d'hôte de recherche. Dans le cas contraireCreateTable, les opérations d'écriture réussissent et SearchVectors échouent uniquement, généralement avec une erreur de connexion qui n'en indique pas la cause.

  • Ne pas utiliser --endpoint-url pour remplacer le point de terminaison DynamoDB pour ces commandes. Un seul remplacement ne peut pas servir les deux noms d'hôte et interrompra le routage des recherches.

  1. Créez un tableau avec un index vectoriel. Cela crée une Products table avec un index vectoriel nommé DescriptionIndex sur l'DescriptionVectorattribut. L'index utilise la fonction de COSINE distance avec 1024 dimensions pour correspondre à la sortie Titan Text Embeddings V2. Aucune clé de partition d'index vectoriel n'étant définie, vous n'avez pas besoin SearchConditionExpression de recherche.

    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\" } ]"

    Cet exemple utilise ProjectionType of ALL pour que chaque attribut soit disponible dans les résultats de recherche. Si vous l'utilisez à la INCLUDE place, notez que le budget d'attributs non clés projeté est partagé : l'attribut vectoriel compte comme un attribut et chaque élément du schéma INLINE_FILTER de recherche compte comme un seul. HASHles éléments du schéma de recherche ne sont pas pris en compte dans la limite.

  2. Attendez que l'index soit actif. Exécutez-le jusqu'à ce que ce IndexStatus soit le ACTIVE cas.

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

    Car un index créé dans le cadre deCreateTable, comme dans ce didacticiel, n'Backfillingest pas signalé et la commande null le renvoie. IndexStatusUtilisez-le seul comme signal dans ce cas.

    Backfillingest indiqué pour un index vectoriel que vous ajoutez à une table existante avecUpdateTable. Dans ce cas, attendez que « IndexStatus est » ACTIVE et « Backfilling est » false avant de vous fier aux résultats de recherche complets.

    Attendez l'index, pas seulement le tableau

    Ne pas utiliser aws dynamodb wait table-exists pour limiter la recherche. Ce serveur continueTable.TableStatus, ce qui devient ACTIVE alors que l'indice vectoriel peut encore êtreCREATING. Il n'y a pas de serveur pour la préparation de l'indice vectoriel, vous devez donc effectuer DescribeTable le sondage comme indiqué. La recherche dans un index qui ne l'est pas encore ACTIVE échoue et la recherche pendant le remplissage peut renvoyer des résultats incomplets.

    Pour la même raison, vous ne pouvez pas supprimer la table tant que la création de chaque index vectoriel n'est pas terminée. DeleteTablerenvoie ResourceInUseException le message « Impossible de supprimer la table pendant la création, la mise à jour ou la suppression des index ».

  3. Créez le catalogue de produits. Enregistrez les 50 produits suivants dans un fichier séparé par des tabulations nommé. products.tsv Chaque ligne contient un identifiant de produit, un nom et une description en une phrase. Le catalogue contient dix groupes de cinq produits connexes, ce qui facilite l'interprétation des résultats de recherche de la dernière étape.

    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.

    Le séparateur entre les trois champs doit être un caractère de tabulation littéral. Si vous copiez le catalogue depuis un navigateur, vérifiez que les onglets ont survécu avant de continuer.

  4. Générez une intégration pour un produit. Lancez d'abord un seul appel d'intégration pour confirmer que l'accès à votre modèle Amazon Bedrock fonctionne. Le inputText champ contient le texte à intégrer, dimensions définit la taille de sortie (les valeurs valides sont 256, 512 ou 1024) et normalize produit des vecteurs de longueur unitaire, ce qui est recommandé pour la recherche de similarité en cosinus.

    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

    Le --cli-binary-format raw-in-base64-out drapeau est obligatoire. AWS CLI La v2 utilise par défaut le codage base64 pour les paramètres binaires. Ainsi, sans cet indicateur, le corps JSON brut ne sera pas envoyé correctement. La réponse est écrite emb/p01.json et contient un embedding tableau de 1024 nombres à virgule flottante. Confirmez le nombre de dimensions.

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

    La sortie est alors 1024.

  5. Écrivez le premier produit. Transformez l'incorporation au format d'élément DynamoDB et écrivez-le. L'attribut vectoriel stocké utilise le type DynamoDB L (liste) encapsulant chaque nombre dans un N type.

    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
    Taille du vecteur et limites d'éléments

    Un vecteur de 1024 dimensions ajoute environ 32 Ko à la charge utile de la demande et environ 5 Ko à l'élément stocké, bien en deçà de la limite de taille d'élément DynamoDB de 400 Ko. Le nombre de dimensions est le principal facteur qui détermine la taille des éléments lorsque vous stockez des intégrations.

  6. Intégrez les produits restants. Cette boucle génère une intégration pour chaque produit restant. Il ignore tout fichier existant, vous pouvez donc le réexécuter en toute sécurité en cas d'échec d'un appel.

    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

    Vous devez compter 50 avant de continuer. Si un appel est affichéFAILED, relancez la boucle ; elle réessaie uniquement les fichiers manquants.

    InvokeModel quotas tarifaires

    Amazon Bedrock applique des quotas de demande à. InvokeModel Si vous modifiez cette boucle pour émettre des appels en parallèle, attendez-vous à des exceptions de limitation sur certains appels et vérifiez toujours le nombre final de fichiers plutôt que de supposer que chaque appel a réussi. Un catalogue partiellement intégré se charge sans erreur et produit des résultats de recherche qui omettent silencieusement les produits manquants.

  7. Chargez les produits restants. Créez des charges utiles de demandes de 25 éléments chacune, soit le maximum BatchWriteItem accepté.

    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"

    La boucle se lit à partir d'une redirection plutôt que d'un tube, car une while boucle canalisée s'exécute dans un sous-shell de certains interpréteurs, ce qui supprime les count valeurs batch et et produit des fichiers batch mal formés.

    Soumettez chaque lot. BatchWriteItempeut partiellement réussir, alors soumettez à nouveau tout ce qu'il renvoie. 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

    Vérifiez que les 50 éléments sont présents.

    aws dynamodb scan --table-name Products --select COUNT --query 'Count'
    ItemCount les mises à jour sont retardées

    Les IndexSizeBytes valeurs ItemCount et déclarées pour DescribeTable un index vectoriel sont mises à jour toutes les six heures environ. Ainsi, immédiatement après un chargement, elles peuvent toujours être lues 0 même si chaque élément a été écrit. Utilisez Scan with--select COUNT, comme indiqué, pour vérifier une charge. Ne considérez pas un zéro ItemCount comme un échec de chargement.

  8. Générez une requête incorporant et recherchez. Intégrez la phrase de recherche avec le même modèle et le même nombre de dimensions que ceux que vous avez utilisés pour les éléments stockés.

    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 le format diffère du format vectoriel stocké

    Lorsque vous stockez un vecteur dans un attribut d'élément, vous l'encapsulez dans un type L (liste) :{"L":[{"N":"0.123"},...]}. Lorsque vous passez un vecteur de requête àSearchVectors, vous utilisez un tableau simple de N valeurs sans le L wrapper :[{"N":"0.123"},...]. La jq transformation suivante diffère de celle que vous avez utilisée pour les éléments stockés pour cette raison. Pour de plus amples informations, veuillez consulter Recherche de 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

    Le vecteur de requête et les vecteurs stockés doivent provenir du même modèle d'intégration et doivent avoir le même nombre de dimensions. L'utilisation d'un modèle ou d'un nombre de dimensions différent produit des résultats inutiles ou une erreur de validation.

  9. Lisez les résultats. DynamoDB renvoie les résultats triés par similarité, en commençant par l'élément le plus similaire. Chaque résultat contient les Item attributs projetés et Score a.

    { "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 } }

    Les scores dépendent du modèle d'intégration et du texte d'entrée exact. Vos valeurs peuvent donc légèrement différer. Ce qui compte, c'est quels articles ont été sélectionnés et dans quel ordre. La requête ne contenait pas les mots chaise, écran ou clavier, mais la recherche a renvoyé les cinq produits de bureau et de bureau devant les 45 autres articles du catalogue. Rien du café, du camping ou des groupes d'animaux de compagnie n'apparaît.

    Essayez d'autres requêtes pour constater le même comportement avec différents groupes. Répétez l'étape précédente "Something to brew fresh coffee at home" et vous obtiendrez les meilleurs résultats avec la machine à expresso, le compte-gouttes et le mousseur à lait. Répétez cette opération "Keeping my dog safe on walks" et la laisse et le harnais passeront en premier, suivis des articles qui ne sont que faiblement liés, car le catalogue ne contient que deux produits qui se ressemblent étroitement. Ce dernier cas mérite d'être noté : la recherche renvoie toujours le nombre d'articles que vous demandez, même lorsque le catalogue ne contient pas autant de bonnes correspondances. Utilisez les Score valeurs, et non le nombre de résultats, pour évaluer la qualité des matchs.

    La façon de lire une partition dépend de la fonction de distance utilisée par l'indice :

    • COSINEet EUCLIDEAN renvoyez les éléments avec les scores les plus faibles, de sorte que le score le plus bas soit plus similaire. Les scores de cosinus vont de 0 pour une direction identique à 2 pour une direction opposée.

    • DOT_PRODUCTrenvoie les éléments ayant obtenu les scores les plus élevés, donc plus élevé est plus similaire.

    Cet indice utiliseCOSINE, donc le premier résultat obtient le score le plus bas. La recherche avec un texte identique à une description enregistrée renvoie cet élément en premier avec un score égal ou proche de zéro.

Nettoyage

Pour éviter des frais permanents, supprimez les ressources que vous avez créées dans ce didacticiel. Le stockage de l'index vectoriel est facturé tant que l'index existe, que vous effectuiez des recherches sur celui-ci ou non.

Pour supprimer l'index vectoriel tout en conservant le Products tableau et ses éléments, utilisezUpdateTable. Les éléments restent dans le tableau et seul l'index est supprimé.

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

Pour supprimer le tableau et son index vectoriel en même temps, supprimez le tableau.

aws dynamodb delete-table --table-name Products

Vérifiez que la table a disparu. La commande suivante renvoie un une ResourceNotFoundException fois la suppression terminée.

aws dynamodb describe-table --table-name Products

Pour plus d'informations sur la suppression d'un index vectoriel d'une table que vous souhaitez conserver, consultezSuppression d’un index vectoriel.

Étapes suivantes

Après avoir effectué cette recherche vectorielle de base, explorez ces sujets connexes.