Que fait générer-questions ?
Cette compétence produit pool.json : une liste de questions de recherche candidates,
chacune avec un identifiant anonyme, fusionnées de sorte que les quasi-doublons n'apparaissent qu'une fois, et
réécrites pour que chaque question ait le même style simple et ne nomme aucune
direction pour l'effet qu'elle examine. Les compétences suivantes (screen-pilot,
critique-forecast, check-novelty) prennent ce fichier en entrée.
Ce dont vous avez besoin en premier
- Un profil de domaine : une copie de
field-profile/TEMPLATE.mdde ce package, rempli pour votre domaine et sauvegardé dans le projet (par défautFIELD-PROFILE.mdà la racine du projet). Le chercheur doit approuver son contenu, en particulier le domaine, les sujets sur lesquels les pilotes seront exécutés, les limites des pilotes et qui voudrait connaître les réponses. Le profil testé estfield-profile/example-small-language-models.md. - Un dossier de travail pour cette série, appelé ici
RUN/. - Des sous-agents avec leurs propres contextes. Lorsque vous pouvez choisir le modèle, utilisez un modèle différent pour chaque générateur. Vous pouvez également exécuter un générateur via l'outil ou l'API d'un autre fournisseur et enregistrer sa sortie dans le même format.
Étapes
- Choisir les générateurs. Utilisez au moins trois modèles générateurs, chacun
dans les deux modes, donc chaque modèle exécute deux générateurs :
plainetdistant. Lors du test, trois modèles Claude (Opus 5.5, Fable 5.2, Sonnet 5.5) ont chacun écrit 17 questions par mode. - Attribuer des domaines distants. Choisissez une liste de domaines distants avec
des résultats bien établis (testés : psychologie cognitive,
psycholinguistique, économie comportementale, écologie) et tirez un par
générateur distant sans remise :
python3 scripts/assign_fields.py GRAINE "domaine un;domaine deux;..." NOM1 NOM2 NOM3. Enregistrez la graine et la sortie. - Rédiger les briefs.
python3 scripts/make_briefs.py FIELD-PROFILE.md RUN N NOM1:plain NOM1:distant:"DOMAINE" ...écrit un brief par générateur dansRUN/briefs/(un court en-tête, le prompt du mode depuisprompts/plain.mdouprompts/distant.md, puisprompts/constraints.md, tous remplis à partir du profil) et crée les dossiers de sortie. - Exécuter les générateurs. Démarrez un sous-agent frais par brief, avec
le modèle pour lequel le brief est conçu, et dites-lui de lire uniquement son brief et de le
suivre. Ne lui montrez aucun exemple de question et aucune sortie d'un autre générateur. Il
écrit
candidates.json(et, en mode distant,transfers.md, sa liste de travail, qui est conservée pour mémoire et non transmise). - Vérifier le format.
python3 scripts/check_candidates.py N RUN/generation/*/*/candidates.json. Demandez à un générateur une correction une fois si son fichier échoue, et enregistrez-le. - Regrouper et trouver les quasi-doublons.
python3 scripts/merge.py RUN/pool GRAINE plain:NOM1=RUN/generation/plain/NOM1/candidates.json distant:NOM1=... ...ne conserve que le texte de la question et mélange.python3 scripts/candidate_pairs.py RUN/poolliste les paires de questions similaires. La version testée intègre les questions avecnomic-embed-textvia un serveur Ollama local et conserve les paires avec une similarité cosinus d'au moins 0,83, au maximum 5 plus proches voisins par question. Sans Ollama, ajoutez--lexical(non testé : similarité du nombre de mots, les 5 plus proches voisins de chaque question).
- Juger les doublons. Remplissez
prompts/dedup_judge.mdà partir du profil (python3 scripts/fill_prompt.py FIELD-PROFILE.md prompts/dedup_judge.md > RUN/pool/dedup_judge.md). Pour plus d'environ 150 paires, divisez-les (python3 scripts/split_pairs.py RUN/pool 150) et donnez chaque lot à un juge frais (testé : Sonnet 5.5, quatre lots de 152 paires). Chaque juge lit uniquement le prompt rempli et son lot et écrit ses décisions ; joignez-les avecpython3 scripts/join_decisions.py RUN/pool decisions_1.json .... Ensuite,python3 scripts/apply_merges.py RUN/poolfusionne les clusters et écritto_rewrite.json. - Réécrire. Remplissez
prompts/rewrite.mdde la même manière et donnez-le, avecRUN/pool/to_rewrite.json, à un agent frais (testé : Sonnet 5.5), qui écritRUN/pool/rewritten.jsonet ne lit aucun autre fichier. - Anonymiser.
python3 scripts/anonymise.py RUN/pool GRAINEvérifie que chaque identifiant a été réécrit, liste les questions de plus de 50 mots, remélange et écritRUN/pool/pool.json(identifiants Q01, Q02, ... et texte) etRUN/pool/sources.json(de quel générateur et mode chacun provient). Montrez aux critiques, prévisionnistes, constructeurs de pilotes et vérificateurs de nouveauté uniquementpool.json.
Graines : tout entier fixe, choisi et enregistré avant l'exécution de l'étape.
Ce que le test a montré
Lors du test (domaine : le comportement observable des petits modèles de langage ouverts), 12 générateurs ont écrit 204 questions en environ trois minutes. La fusion en a laissé 168 (18 % étaient des quasi-doublons ; des idées telles que la confiance déclarée séparant les réponses correctes des incorrectes sont apparues chez plusieurs générateurs). La part des questions dont le pilote a trouvé un effet et dont la vérification de la littérature n'a trouvé aucun rapport antérieur dans la même direction était :
| Mode | Résultats nouveaux et confirmés |
|---|---|
| Invite simple | 14 sur 50 (28 %) |
| Transfert depuis un domaine distant | 14 sur 51 (27 %) |
| Problématisation (non inclus) | 6 sur 42 (14 %) |
| Cartographie des lacunes à partir de résumés récents (non inclus) | 3 sur 36 (8 %) |
Avec 36 à 51 questions par mode, ces différences sont descriptives (test
d'égalité des taux, p = 0,054). Les deux modes non inclus sont documentés dans
NOT-RECOMMENDED.md en haut de ce package.
Fichiers
prompts/plain.md,prompts/distant.md: les prompts de génération.Nest remplacé par le nombre de questions ; les autres espaces réservés proviennent du profil de domaine.prompts/constraints.md: contraintes que chaque générateur reçoit.prompts/dedup_judge.md,prompts/rewrite.md: le juge de doublons et le réécrivain.scripts/:fill_prompt.py,make_briefs.py,assign_fields.py,check_candidates.py,merge.py,candidate_pairs.py,split_pairs.py,join_decisions.py,apply_merges.py,anonymise.py. Bibliothèque standard uniquement.