Poids ouverts ne veut pas dire libre
Poids ouverts veut dire que les fichiers des nombres d’un modèle se téléchargent. Cela ne veut pas dire que vous pouvez en faire ce que vous voulez. Une licence fixe les conditions.
C’est important, car une entreprise qui bâtit sur un modèle qu’elle n’a pas le droit d’employer pour vendre peut devoir s’arrêter. Lire les conditions d’abord prend dix minutes.
À la fin de cette leçon
Remarque
Je peux lire la licence d’un modèle et dire ce qu’elle me permet.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Poids | les nombres appris d’un modèle |
| Licence | les conditions pour utiliser une chose |
| Clause | une règle à l’intérieur d’une licence |
| Attribution | dire qui l’a fait |
| Limite d’usage | un plafond, comme un nombre d’utilisateurs |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une licence dit ce que vous pouvez faire
Les poids d’un modèle ont une licence, et le code qui les fait tourner peut en avoir une autre. Lisez les deux.
Chaque règle est une clause. Les clauses courantes posent cinq questions. L’usage commercial est-il permis ? Y a-t-il une limite d’usage ? Quels buts sont interdits ? Peut-on modifier le modèle, et faut-il partager les changements ? Faut-il une attribution ?
Les clauses à vérifier, en mots simples
| Clause | Question à poser |
|---|---|
| Commercial | Puis-je gagner de l’argent avec ? |
| Limite d’usage | Y a-t-il un plafond, comme un nombre d’utilisateurs ? |
| Usages interdits | Mon but est-il sur la liste ? |
| Modifications | Puis-je le modifier, et dois-je partager le changement ? |
| Attribution | Dois-je montrer qui l’a fait ? |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Testez un usage contre chaque clause
Écrivez votre usage : est-il commercial, pour combien d’utilisateurs, dans quel but, allez-vous modifier le modèle et partager les changements. Testez-le ensuite contre chaque clause, l’une après l’autre.
Une clause qui échoue suffit pour dire refusé. Si toutes passent mais que l’attribution est exigée, l’usage est autorisé sous conditions.
Une erreur courante
Attention
Beaucoup pensent qu’un modèle posé sur un site public est libre pour tout usage. Être facile à télécharger ne dit rien des conditions. Lisez les clauses pour votre propre usage avant de bâtir dessus. Cette leçon est un exercice, pas un conseil juridique.
Écrire l’assistant du modèle, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Les jetons d’une réponse, ou null si elle n’en donne pas.' 'function compter(donnees, nom) {' ' return donnees.usage && typeof donnees.usage[nom] === \"number\" ? donnees.usage[nom] : null;' '}' > model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire l’assistant du modèle, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function demander(messages, echantillon, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"statut \" + res.status);' ' const d = await res.json();' ' return { texte: d.choices[0].message.content, entree: compter(d, \"prompt_tokens\"), sortie: compter(d, \"completion_tokens\"), enregistre: false };' ' } catch (erreur) {' ' console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' ' return { texte: echantillon, entree: null, sortie: null, enregistre: true };' ' }' '}' 'module.exports = { demander };' >> model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le vérificateur de licence, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const licences = [' ' { nom: \"Libre A\", commercial: true, maxUtilisateurs: 2000, interdits: [\"armes\"], attribution: true, modification: true, partage: false },' ' { nom: \"Libre B\", commercial: false, maxUtilisateurs: Infinity, interdits: [], attribution: false, modification: true, partage: true },' '];' 'const usage = { commercial: true, utilisateurs: 800, but: \"soutien scolaire\", modifie: true, partage: false };' 'function problemes(l, u) {' ' const trouves = [];' ' if (u.commercial && l.commercial === false) trouves.push(\"usage commercial interdit\");' ' if (u.utilisateurs > l.maxUtilisateurs) trouves.push(\"au-dessus de la limite d’utilisateurs\");' > licence.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le vérificateur de licence, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' if (l.interdits.includes(u.but)) trouves.push(\"usage interdit : \" + u.but);' ' if (u.modifie && l.modification === false) trouves.push(\"modifications interdites\");' ' if (u.modifie && l.partage && u.partage === false) trouves.push(\"modifications à partager\");' ' return trouves;' '}' >> licence.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le vérificateur de licence, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function verdict(l, u) {' ' const trouves = problemes(l, u);' ' if (trouves.length > 0) return \"refusé\";' ' return l.attribution ? \"autorisé sous conditions\" : \"autorisé\";' '}' >> licence.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le vérificateur de licence, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"usage : commercial, 800 utilisateurs, soutien scolaire, modifié, modifications gardées privées\");' ' for (const l of licences) console.log(l.nom + \" : \" + verdict(l, usage) + \" | \" + problemes(l, usage).join(\" ; \"));' ' const q = \"En une phrase courte, pourquoi faut-il lire la licence d’un modèle avant d’utiliser ses poids ?\";' ' const echantillon = \"La licence dit ce que l’on peut faire des poids, et ne pas respecter ses conditions peut faire perdre le droit de les utiliser.\";' ' const reponse = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + reponse.texte);' '}' 'main();' >> licence.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer le vérificateur de licence
docker exec -w /home/node/project agent node licence.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les licences d’ici sont inventées
Libre A et Libre B sont faites pour s’exercer. Ce ne sont pas de vraies licences et elles ne disent rien d’un vrai modèle.
Le vérificateur ne fait que ce que vous lui dites. Une vraie licence demande une lecture soignée, et un vrai doute demande une personne qualifiée.
Ce que le Run affiche
| Ligne | Ce qu’elle montre |
|---|---|
| Libre A : autorisé sous conditions | | Chaque clause passe, mais l’attribution est exigée |
| Libre B : refusé | usage commercial interdit ; modifications à partager | Deux clauses échouent |
| le modèle dit : ... | Une phrase. Les mots changent à chaque Run |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.