¿Qué hace generate-questions?
Esta habilidad produce pool.json: una lista de preguntas de investigación candidatas,
cada una con un ID anónimo, fusionadas para que los casi duplicados aparezcan una sola vez, y
reescritas para que cada pregunta tenga el mismo estilo simple y no nombre una
dirección para el efecto que investiga. Las siguientes habilidades (screen-pilot,
critique-forecast, check-novelty) toman este archivo como entrada.
Lo que necesitas primero
- Un perfil de campo: una copia de
field-profile/TEMPLATE.mdde este paquete, completada para tu campo y guardada en el proyecto (por defectoFIELD-PROFILE.mden la raíz del proyecto). El investigador debe acordar su contenido, en particular el campo, los sujetos con los que se ejecutarán los pilotos, los límites del piloto y quién querría saber las respuestas. El perfil probado esfield-profile/example-small-language-models.md. - Una carpeta de trabajo para esta ronda, aquí llamada
RUN/. - Sub-agentes con sus propios contextos. Donde puedas elegir el modelo, usa un modelo diferente para cada generador. También puedes ejecutar un generador a través de la herramienta o API de otro proveedor y guardar su salida en el mismo formato.
Pasos
- Elige los generadores. Usa al menos tres modelos generadores, cada uno
en ambos modos, por lo que cada modelo ejecuta dos generadores:
plainydistant. En la prueba, tres modelos de Claude (Opus 5.5, Fable 5.2, Sonnet 5.5) cada uno escribió 17 preguntas por modo. - Asigna campos distantes. Elige una lista de campos distantes con
hallazgos bien establecidos (probados: psicología cognitiva,
psicolingüística, economía del comportamiento, ecología) y asigna uno por
generador distante sin reemplazo:
python3 scripts/assign_fields.py SEED "campo uno;campo dos;..." NOMBRE1 NOMBRE2 NOMBRE3. Registra la semilla y la salida. - Escribe las instrucciones.
python3 scripts/make_briefs.py FIELD-PROFILE.md RUN N NOMBRE1:plain NOMBRE1:distant:"CAMPO" ...escribe una instrucción por generador enRUN/briefs/(un encabezado corto, el mensaje del modo desdeprompts/plain.mdoprompts/distant.md, luegoprompts/constraints.md, todo completado desde el perfil) y crea las carpetas de salida. - Ejecuta los generadores. Inicia un sub-agente nuevo por instrucción, con el
modelo para el que está la instrucción, y dile que lea solo su instrucción y la
siga. No le muestres preguntas de ejemplo ni la salida de otro generador. Este
escribe
candidates.json(y, en modo distante,transfers.md, su lista de trabajo, que se conserva para el registro y no se pasa más adelante). - Verifica el formato.
python3 scripts/check_candidates.py N RUN/generation/*/*/candidates.json. Pídele al generador una corrección una vez si su archivo falla, y registra eso. - Agrupa y encuentra casi duplicados.
python3 scripts/merge.py RUN/pool SEED plain:NOMBRE1=RUN/generation/plain/NOMBRE1/candidates.json distant:NOMBRE1=... ...conserva solo el texto de la pregunta y mezcla.python3 scripts/candidate_pairs.py RUN/poollista pares de preguntas similares. La versión probada incrusta las preguntas connomic-embed-texta través de un servidor Ollama local y conserva pares con similitud coseno de al menos 0.83, como máximo 5 vecinos más cercanos por pregunta. Sin Ollama, añade--lexical(no probado: similitud de recuento de palabras, 5 vecinos más cercanos de cada pregunta).
- Juzga duplicados. Completa
prompts/dedup_judge.mddesde el perfil (python3 scripts/fill_prompt.py FIELD-PROFILE.md prompts/dedup_judge.md > RUN/pool/dedup_judge.md). Para más de aproximadamente 150 pares, divídelos (python3 scripts/split_pairs.py RUN/pool 150) y entrega cada lote a un juez nuevo (probado: Sonnet 5.5, cuatro lotes de 152 pares). Cada juez lee solo la instrucción completada y su lote y escribe sus decisiones; únelos conpython3 scripts/join_decisions.py RUN/pool decisions_1.json .... Luegopython3 scripts/apply_merges.py RUN/poolfusiona clústeres y escribeto_rewrite.json. - Reescribe. Completa
prompts/rewrite.mdde la misma manera y entrégaselo, conRUN/pool/to_rewrite.json, a un solo agente nuevo (probado: Sonnet 5.5), que escribeRUN/pool/rewritten.jsony no lee ningún otro archivo. - Anonimiza.
python3 scripts/anonymise.py RUN/pool SEEDverifica que cada ID fue reescrito, lista preguntas de más de 50 palabras, reordena, y escribeRUN/pool/pool.json(IDs Q01, Q02, ... y texto) yRUN/pool/sources.json(de qué generador y modo proviene cada uno). Muestra solopool.jsona críticos, pronosticadores, constructores de pilotos y verificadores de novedad.
Semillas: cualquier entero fijo, elegido y registrado antes de ejecutar el paso.
Lo que mostró la prueba
En la prueba (campo: el comportamiento observable de modelos de lenguaje pequeños abiertos), 12 generadores escribieron 204 preguntas en aproximadamente tres minutos. La fusión dejó 168 (el 18% eran casi duplicados; ideas como confianza declarada que separa respuestas correctas de incorrectas surgieron en varios generadores). La proporción de preguntas cuyo piloto encontró un efecto y cuya revisión de literatura no encontró informe previo en la misma dirección fue:
| Modo | Hallazgos nuevos y confirmados |
|---|---|
| Indicación simple | 14 de 50 (28%) |
| Transferencia desde un campo distante | 14 de 51 (27%) |
| Problematización (no incluida) | 6 de 42 (14%) |
| Mapeo de brechas desde resúmenes recientes (no incluido) | 3 de 36 (8%) |
Con 36 a 51 preguntas por modo, estas diferencias son descriptivas (prueba
de tasas iguales, p = 0.054). Los dos modos no incluidos están documentados en
NOT-RECOMMENDED.md en la parte superior de este paquete.
Archivos
prompts/plain.md,prompts/distant.md: los mensajes de generación.Nse reemplaza por el número de preguntas; los otros marcadores de posición provienen del perfil de campo.prompts/constraints.md: restricciones que recibe cada generador.prompts/dedup_judge.md,prompts/rewrite.md: el juez de duplicados y el reescritor.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. Solo biblioteca estándar.