价格

调研报告

调研出报告

将得到:一份带来源的调研报告(.md + .docx),放在工作空间

联网搜索

可以这样用

  • SaaS 产品常见的定价模式及代表案例
  • 主流开源大模型许可证对比(能不能商用)
  • 预制菜行业的发展与争议
安全检测:未发现风险模式(2026/9/25 20:20:44)

技能说明

【调研报告】用户在首页点了「调研出报告」。交付物:工作空间里的一份 .md 和同名 .docx。

【文件名铁律】必须是「主题-月日-report.md」和「主题-月日-report.docx」,月日取今天, 例如 SaaS定价-0924-report.md / SaaS定价-0924-report.docx。 不许用 report.md 这种没有前缀的名字 —— 同一个人第二次调研时会把上一份直接盖掉(2026-09-24 真机上就发生过)。 下文凡是写 report.md / report.docx 的地方,一律替换成你定下的这个文件名。 万一这个名字已经存在(同一天跑了两次同一个主题),就在末尾加 -2、-3,不要覆盖。

  1. 用 TodoWrite 列出:拆问题 → 搜索 → 打开来源核实 → 写报告 → 核对链接 → 导出 docx。
  2. 把问题拆成 35 个子问题,每个子问题至少搜索一次。快速版总共打开 812 个来源,详细版 15~25 个; 来源至少来自 4 个不同站点,优先官方网站、官方公告、权威媒体,少用问答站和聚合站。
  3. 只引用你本次亲自打开过、并且正文读到了内容的网页。 搜索结果列表里的链接不算: 打开后是 404、跳到首页、或者正文没有相关内容的,直接丢掉,换一个来源,不要照抄那个 URL。 绝不根据记忆拼接 URL。 网络:用户多半在中国大陆、没有代理,Google、Mistral、GitHub、Medium 这类境外站点经常打不开。 每次 web-fetch 都传 timeout: 10000;同一个网址超时或报错一次就放弃,不重试、也不要换浏览器再开一遍, 直接换一个国内能访问的来源(官方中文站、国内权威媒体、36氪、机器之心、知乎专栏等)。 累计失败超过 5 次,就用已经核实过的来源先把报告写出来,并在文末注明哪些信息没能核实。
  4. 报告结构:
    • 标题下第一节就是「核心结论」,3~8 条,每条一句话讲清楚并带数字。
    • 用户说明了「给谁看」时,结论和措辞按读者调整(给老板看就先讲影响和建议,给同行看可以多讲细节)。
    • 正文按子问题分节。每个事实、数字后用【N】标注来源,N 对应文末「参考来源」的编号,全文至少 8 处。
    • 文末「## 参考来源」:编号、标题、完整链接,每行一条。
    • 不同来源说法冲突时,把两种说法都写上并注明出处,不要自己挑一个当定论。
  5. 写完后逐条检查参考来源:凡是第 3 步没有成功打开过的链接,删掉并把引用它的句子改掉或删掉。
  6. 导出 .docx(文件名同上,与 .md 只差后缀)。这一步不要安装任何东西,也不要停下来问用户 —— 下面的脚本只用 Python 标准库: 先用 fs/write 把下面这段代码原样写成工作空间里的 md2docx.py(一个字符都不要改、不要"优化"), 再 exec 跑 python3 md2docx.py 主题-月日-report.md 主题-月日-report.docx(Windows 换成 py -3 md2docx.py ..., 不要调 python3,那是应用商店的空壳别名)。跑完用 python3 -c "import zipfile;zipfile.ZipFile('主题-月日-report.docx').namelist()" 确认文件能打开,再把 md2docx.py 删掉,不要留在工作空间里让用户看见。 本机已经装了 python-docx(python3 -c "import docx" 不报错)的话,用 python-docx 转排版更好,可以优先走它; 没装就走下面这段,不要为了装它而中断任务。
import re, sys, zipfile
T='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
W='http://schemas.openxmlformats.org/wordprocessingml/2006/main'
def esc(s): return s.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;')
def p(t, st=None):
    pr = '<w:pPr><w:pStyle w:val="%s"/></w:pPr>' % st if st else ''
    rs = ''.join('<w:r>%s<w:t xml:space="preserve">%s</w:t></w:r>' % ('<w:rPr><w:b/></w:rPr>' if i%2 else '', esc(x))
                 for i, x in enumerate(re.split(r'\*\*(.+?)\*\*', t)) if x)
    return '<w:p>%s%s</w:p>' % (pr, rs)
body = []
for line in open(sys.argv[1], encoding='utf-8').read().split('\n'):
    s = re.sub(r'\[([^\]]*)\]\((https?://[^)\s]+)\)', r'\1 \2', line.strip()).replace(chr(96),'')
    if not s or re.fullmatch(r'[-*_|:\s]{3,}', s): continue
    m = re.match(r'(#{1,4})\s+(.*)', s)
    if m: body.append(p(m.group(2), 'Heading%d' % len(m.group(1)))); continue
    m = re.match(r'([-*+]|\d+[.)])\s+(.*)', s)
    body.append(p(('• ' if m else '') + (m.group(2) if m else s)))
st = T + '<w:styles xmlns:w="%s">' % W + ''.join(
    '<w:style w:type="paragraph" w:styleId="Heading%d"><w:name w:val="heading %d"/>'
    '<w:pPr><w:outlineLvl w:val="%d"/></w:pPr><w:rPr><w:b/><w:sz w:val="%d"/></w:rPr></w:style>'
    % (n, n, n-1, sz) for n, sz in ((1,36),(2,30),(3,26),(4,24))) + '</w:styles>'
with zipfile.ZipFile(sys.argv[2], 'w', zipfile.ZIP_DEFLATED) as z:
    z.writestr('[Content_Types].xml', T + '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">'
        '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>'
        '<Default Extension="xml" ContentType="application/xml"/>'
        '<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>'
        '<Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/></Types>')
    z.writestr('_rels/.rels', T + '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'
        '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/></Relationships>')
    z.writestr('word/_rels/document.xml.rels', T + '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'
        '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/></Relationships>')
    z.writestr('word/styles.xml', st)
    z.writestr('word/document.xml', T + '<w:document xmlns:w="%s"><w:body>' % W + ''.join(body) + '</w:body></w:document>')
print('ok', sys.argv[2])
  1. 回复里先用 3 行说出最重要的结论,再给出两个文件名,最后提示「想补充哪部分直接告诉我」。
  2. 边界:不做需要付费数据库才能拿到的内容;遇到需要验证码的站点直接跳过换来源。

在「不墨ONE」客户端里填两个空就能跑起来,成品直接落到你本地文件夹。

开始使用看看别的智能体