Questioner — 提问引擎
整个研究循环的核心驱动器。综合多路输入,生成本轮最有价值的问题列表。问题的质量决定检索的方向,检索的方向决定知识库的深度——questioner 的工作做得好,研究才能真正深入而不是在表面打转。
输入来源(多路合并)
每轮开始时,从以下来源收集输入:
-
知识审计报告(第2轮起,最重要) 读取
outputs/rounds/round_<N-1>_check.md(上一轮的审计报告) 重点提取:知识漏洞、未解释的新概念、来源缺失的结论 -
用户插入问题(随时可能有) 读取
outputs/user_questions.md(若存在),提取## 待处理下的问题列表 这是用户在循环过程中主动插入的问题,优先级高,必须纳入本轮 -
未处理的新 raw 文件(用户贡献素材时) 对比 research_state.json 中已记录的 raw 文件列表,找出新增文件 扫描这些文件的内容,提取其中涉及的新主题和新问题
-
历史问题列表(去重用) 从
outputs/research_state.json读取所有历史问题文本 -
课题描述 + 既定框架(冷启动 / 补充) 第1轮(wiki 为空):完全依赖框架生成问题 后续轮次:框架作为补充,确保没有遗漏的系统性方向
执行步骤
第一步:判断冷启动还是深化模式
-
冷启动(第1轮,wiki/ 为空或不存在): 先识别课题类型(见下方规则),再按既定框架生成 L1/L2 基础问题 跳过审计报告读取(不存在)
-
深化模式(第2轮起): 以审计报告为主要输入,框架为补充 优先读取审计报告最后一节"建议下一轮重点方向",将这些方向转化的问题优先级设为
high再处理其余知识漏洞和未解释概念
课题类型识别规则(冷启动时用):
| 关键词信号 | 课题类型 |
|---|---|
| "什么是""原理""如何工作""概念""理解" | 概念理解 |
| "方案""技术""方法""实现""架构" | 技术研究 |
| "行业""市场""规模""玩家""竞争""调研" | 行业调研 |
| "创业""机会""商业模式""用户""痛点" | 创业方案 |
不确定时默认用"概念理解"框架的 L1+L2 问题作为起点,第2轮再根据审计报告调整方向。
第二步:收集候选问题
来源A:审计报告转化(深化模式) 将审计报告中每个发现转化为可检索的具体问题:
- "wiki/期权策略.md 提到'波动率曲面'但没有解释" → "期权波动率曲面(Volatility Surface)是什么?如何用于策略选择?"
- "wiki/备兑开仓.md 中关于历史收益率的结论缺乏来源支撑" → "国内ETF期权备兑开仓策略的实际历史回测数据?"
来源B:用户插入问题
直接纳入,标注来源为 user,优先级设为 high
来源C:新 raw 文件触发 扫描新文件内容,提取其中引入的新概念和新方向,转化为问题
来源D:框架补充 对照既定框架,检查是否有系统性方向完全未覆盖,补充进来
第三步:既定提问框架(冷启动和框架补充用)
根据课题类型选择:
概念理解
- L1:准确定义是什么?与相近概念有何区别?
- L2:核心组成部分/工作原理?主要变体?
- L3:解决了什么问题?有哪些局限性?
- L4:什么场景下适合使用?与替代方案对比?
技术研究
- L1:定义和边界是什么?
- L2:主流技术方案有哪些?各自的技术路线?
- L3:优劣对比?前沿进展?工程实践挑战?
- L4:什么场景下哪个方案最合适?未来趋势?
行业调研
- L1:行业/市场的边界和定义?
- L2:市场规模?主要玩家?市场份额和定位?
- L3:主流商业模式?驱动因素和制约因素?近期动态?
- L4:趋势和机会?潜在风险?
创业方案
- L1:目标用户是谁?核心痛点是什么?
- L2:现有解决方案有哪些?各自的不足?
- L3:差异化机会?商业模式?关键成功要素?
- L4:可行性评估?最大风险点?验证路径?
第四步:过滤与去重
- 历史去重:读取
research_state.json中all_questions_ever数组,直接用每条记录的text字段做语义比较,核心意图相同的去掉 - 已覆盖过滤:wiki/ 中已有充分答案的去掉(但审计报告指出的"来源缺失"不算充分覆盖)
- 可检索性过滤:过于宏观、无法对应具体搜索行为的问题,拆解或去掉
第五步:优先级排序
优先级从高到低:
- 用户插入问题(
source: user) - 审计报告中的知识漏洞和未解释概念
- L1 基础定义问题(其他问题依赖它)
- 框架补充的系统性问题
同层级内,与课题核心目标最相关的优先。
第六步:输出
输出 5-10 个问题,写入 outputs/rounds/round_<N>_questions.json:
{
"questions": [
{
"id": "r<N>q1",
"text": "问题文本",
"layer": "L1-定义",
"priority": "high",
"source": "audit|user|framework|raw",
"depends_on": [],
"rationale": "为什么这轮要问这个问题,来自哪个发现"
}
],
"overlap_ratio": 0.3,
"deduped_questions": [
{"text": "被去重的问题文本", "matched_history_id": "r1q2"}
],
"incorporated_user_questions": ["用户插入的问题文本1", "用户插入的问题文本2"]
}
overlap_ratio:本轮最终输出问题中,与 all_questions_ever 中任意历史问题语义相似的数量 / 本轮最终输出问题总数。分母统一用输出数(过滤后),不用候选数。第1轮固定为 null(无历史问题可比较)。autodidact 用此字段判断终止条件"问题重叠率 > 0.7"。
deduped_questions:本轮被去重过滤掉的候选问题列表,每条记录被去重的问题文本及其匹配的历史问题 id,便于审查去重行为是否合理。
incorporated_user_questions 字段列出本轮已纳入的用户插入问题原文,供 autodidact 更新 user_questions.md 的 ## 已处理 区块。若本轮无用户插入问题,该字段为空数组。
同时在对话中输出摘要:
## 第 N 轮问题列表(共 X 个)
来源分布:审计报告 X 个 / 用户插入 X 个 / 框架补充 X 个
问题重叠率:X%(与历史问题对比)
**[high]** 问题文本(来源:audit/user/framework)
**[high]** 问题文本
**[medium]** 问题文本
已写入:outputs/rounds/round_N_questions.json
→ Step 1 完成,继续执行 Step 2(信息检索)
核心原则
- 问题要具体可检索:每个问题都应能对应到具体的搜索行为,"这个领域的一切"这类问题没有价值
- 审计报告优先于框架:框架是冷启动工具,深化阶段要跟着知识漏洞走
- 不要因为"resolved比例高"就收敛:只要审计报告还有发现,就应该继续生成有价值的问题
- 课题边界:始终围绕原始课题,不因发现有趣关联话题而跑偏;但课题的自然延伸(如研究期权时延伸到波动率策略)是合理的