generate-questions は何をしますか?
このスキルはpool.jsonを生成します。これは、候補研究質問のリストであり、各質問は匿名IDを持ち、類似質問は統合され、すべての質問が同じ平易なスタイルで、質問している効果の方向性を特定しないように書き換えられています。後続のスキル(screen-pilot、critique-forecast、check-novelty)はこのファイルを入力として使用します。
事前に必要なもの
- フィールドプロファイル: このパッケージの
field-profile/TEMPLATE.mdをコピーし、あなたのフィールド用に記入してプロジェクト内に保存してください(デフォルトではプロジェクトルートのFIELD-PROFILE.md)。研究者はその内容、特にフィールド、パイロットテストの対象者、パイロットの制限、誰が回答を知りたいと思うかについて合意する必要があります。テスト済みのプロファイルはfield-profile/example-small-language-models.mdです。 - 今回のラウンド用のワークフォルダ。ここでは
RUN/と呼びます。 - それぞれ独自のコンテキストを持つサブエージェント。モデルを選択できる場合は、ジェネレーターごとに異なるモデルを使用してください。別のプロバイダーのツールやAPIを介してジェネレーターを実行し、その出力を同じ形式で保存することもできます。
手順
- ジェネレーターを選択します。 少なくとも3つの生成モデルを使用し、それぞれを両方のモードで実行します。これにより、各モデルは
plainとdistantの2つのジェネレーターを実行することになります。テストでは、3つのClaudeモデル(Opus 5.5、Fable 5.2、Sonnet 5.5)が各モードで17の質問を生成しました。 - 遠方分野を割り当てます。 確立された知見を持つ遠方分野のリスト(テスト済み:認知心理学、心理言語学、行動経済学、生態学)を選択し、ジェネレーターごとに重複なく1つ割り当てます:
python3 scripts/assign_fields.py SEED "分野1;分野2;..." NAME1 NAME2 NAME3シードと出力を記録します。 - ブリーフを作成します。
python3 scripts/make_briefs.py FIELD-PROFILE.md RUN N NAME1:plain NAME1:distant:"FIELD" ...これにより、RUN/briefs/にジェネレーターごとに1つのブリーフが作成されます(短いヘッダー、モードのプロンプト(prompts/plain.mdまたはprompts/distant.md)、その後にprompts/constraints.mdが続き、すべてプロファイルから埋め込まれます)。また、出力フォルダも作成されます。 - ジェネレーターを実行します。 ブリーフごとに、そのブリーフ用のモデルを使用して新しいサブエージェントを起動し、そのブリーフのみを読んで従うように指示します。例となる質問や他のジェネレーターの出力は見せないでください。エージェントは
candidates.json(および、distantモードの場合は、その作業リストであるtransfers.mdも)を書き込みます。これは記録として保持され、後続の処理には渡されません。 - フォーマットを確認します。
python3 scripts/check_candidates.py N RUN/generation/*/*/candidates.jsonファイルが不合格だった場合、ジェネレーターに1回だけ修正を依頼し、その記録を残します。 - プールし、類似質問を見つけます。
python3 scripts/merge.py RUN/pool SEED plain:NAME1=RUN/generation/plain/NAME1/candidates.json distant:NAME1=... ...質問テキストのみを保持し、シャッフルします。python3 scripts/candidate_pairs.py RUN/pool類似質問のペアをリストアップします。テスト済みバージョンでは、nomic-embed-textを使用してローカルのOllamaサーバーを介して質問を埋め込み、コサイン類似度が少なくとも0.83、質問あたり最大5つの最近傍を保持します。Ollamaがない場合は、--lexicalを追加します(未テスト:単語数ベースの類似度、各質問の5つの最近傍)。
- 重複を判定します。 プロファイルから
prompts/dedup_judge.mdを埋め込みます(python3 scripts/fill_prompt.py FIELD-PROFILE.md prompts/dedup_judge.md > RUN/pool/dedup_judge.md)。ペアが約150組を超える場合は、分割します(python3 scripts/split_pairs.py RUN/pool 150)。各バッチを新しいジャッジに渡します(テスト済み:Sonnet 5.5、152組の4バッチ)。各ジャッジは埋め込まれたプロンプトとそのバッチのみを読み、判定を書き込みます。python3 scripts/join_decisions.py RUN/pool decisions_1.json ...でそれらを結合します。次にpython3 scripts/apply_merges.py RUN/poolがクラスターを統合し、to_rewrite.jsonを書き出します。 - 書き換えます。 同様に
prompts/rewrite.mdを埋め込み、それをRUN/pool/to_rewrite.jsonとともに1つの新しいエージェント(テスト済み:Sonnet 5.5)に渡します。このエージェントはRUN/pool/rewritten.jsonを書き出し、他のファイルは読み込みません。 - 匿名化します。
python3 scripts/anonymise.py RUN/pool SEEDすべてのIDが書き換えられたことを確認し、50語を超える質問をリストアップし、再シャッフルし、RUN/pool/pool.json(ID Q01、Q02, ... とテキスト)およびRUN/pool/sources.json(各質問のジェネレーターとモード)を書き出します。批評家、予測者、パイロットビルダー、新規性チェッカーにはpool.jsonのみを表示します。
シード:任意の固定整数。手順の実行前に選択し、記録しておきます。
テスト結果
テスト(フィールド:小規模オープン言語モデルの観察可能な動作)では、12個のジェネレーターが約3分で204の質問を生成しました。統合後は168個(18%が類似質問。正解と不正解を区別する表明された確信などのアイデアは複数のジェネレーターで現れました)。パイロットで効果が見つかり、文献調査で同じ方向の先行報告が見つからなかった質問の割合は以下の通りです。
| モード | 新規かつ確認された知見 |
|---|---|
| 単純プロンプト | 50件中14件 (28%) |
| 遠方分野からの転送 | 51件中14件 (27%) |
| 問題化(未含む) | 42件中6件 (14%) |
| 最近のアブストラクトからのギャップマッピング(未含む) | 36件中3件 (8%) |
モードあたり36~51の質問であるため、これらの差は記述的なものです(比率の等質性検定、p = 0.054)。含まれていない2つのモードは、このパッケージのトップにあるNOT-RECOMMENDED.mdに文書化されています。
ファイル
prompts/plain.md、prompts/distant.md:生成プロンプト。Nは質問数に置き換えられ、その他のプレースホルダーはフィールドプロファイルから埋め込まれます。prompts/constraints.md:すべてのジェネレーターが受け取る制約。prompts/dedup_judge.md、prompts/rewrite.md:重複ジャッジと書き換え用プロンプト。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。標準ライブラリのみを使用しています。