用 AI 辅助产品调研时,最危险的往往不是数字完全错误,而是真实数据被顺手推导成未经验证的商业结论。要让报告真正服务于需求排序,就需要区分实测、官方数据、付费信号与主观假设,并为低等级证据设置可执行、可检查的排期边界。
1.81 亿条裁判文书 + 607 万条法规——这是我在一份产品调研报告里,**亲手从"核心壁垒"降级成"假设"**的数字。
原因很简单:它属于 E5 级证据。数字是真的,但没有任何人因此付过一分钱。
给 AI 定下 5 级证据之后,它第一次在 18 条需求里,把 3 条纯假设挡在了前三期排期之外。
我让 AI 写产品调研报告,它给出的每一句话看着都有来源:
"该产品覆盖 1.81 亿裁判文书、607 万部法规,构成数据壁垒。"
前半句是对方官网自己写的,属实。后半句——"构成壁垒"——是它自己推的。
问题出在我的提问方式:我只要求"标注来源",没要求"标注来源的可信强度"。于是"官方自述""第三方转述""我们自己实测""我猜的"被混在同一句话里,输出看起来一样扎实。
我做的第一件事,是把"来源"这个词拆成五档,并且规定:每一档能干什么、不能干什么。
| 等级 | 来源 | 可信度 | 能拿来做什么 |
|---|---|---|---|
| E1 实测 | 对目标站点/系统的实机拆解(接口、额度、价目、数据池) | 高 | 判断"现有资产能不能承接这个需求" |
| E2 官方 | 最高法、人社部、司法部、网信办等公开数据 | 高 | 判断需求的规模与真实性 |
| E3 市场付费 | 同类产品的真实收入与定价 | 中高 | 判断"有人为此付过钱"——比问卷硬 |
| E4 团队选择 | 团队自己已经做的功能/场景页 | 中 | 说明"有人判断过这是需求",但不区分高频与高价值 |
| E5 假设 | 推理得出、无任何用户验证 | 低 | 必须验证后才可投入开发 |
配一条闸门规则:E5 级不得直接排期。
这句话是整个体系里唯一"有牙齿"的部分。没有它,五级证据只是一张好看的分类表。
一个具体案例。原方案里有个功能叫"企业风险查询",给了个单次付费商品:¥29/次。
按证据分级拆开看:
于是它被降级,不是被删掉:从"单次商品"改为"月报订阅权益"包在订阅里。需求留下了,但它不能再单独占一个付费入口——因为支撑它定价的那条证据根本不存在。
而真正被提拔的是另一条:"欠款要不回来"。它的证据是 E2(2025 年首次执行案件 1,000 万件、执行到位 2.16 万亿元)+ E3(下游律师函与服务已形成成熟价格带)+ E4(团队已建"民间借代/债务催收"场景页)——三级证据叠加,因此从原方案的"迭代 4"直接提到 M1。
同一套方法,把一条需求从 M1 之后拽到了最前面,又把另一条从付费商品降级成订阅权益。 分级不是为了打分,是为了决定顺序。
光有表不够,得能查。下面这段脚本我真实跑过,它做三件事:把需求表解析出来 → 按编号去重 → 找出"只有 E5 支撑"的条目。
# evidence_census.py —— 需求证据普查
import re, html, collections, pathlib
P = '需求对齐说明源文件_v1.1.html'
s = pathlib.Path(P).read_text(encoding='utf-8')
rows = re.findall(r'<tr>(.*?)</tr>', s, re.S)
uniq = {}
for r in rows:
c = re.findall(r'<t[dh][^>]*>(.*?)</t[dh]>', r, re.S)
if len(c) < 4:
continue
t = [html.unescape(re.sub(r'<[^>]+>', '', x)).strip() for x in c]
if re.fullmatch(r'[BCL]d+', t[0]) and re.search(r'E[1-5]', t[3]):
uniq[t[0]] = (t[3], t[-1]) # 同一编号取带证据标记的那行
hard = {k: v for k, v in uniq.items() if set(re.findall(r'E[1-5]', v[0])) - {'E5'}}
pure = {k: v for k, v in uniq.items() if set(re.findall(r'E[1-5]', v[0])) == {'E5'}}
print(f'去重后需求条目:{len(uniq)} 条')
print(f'E1–E4 硬证据:{len(hard)} 条')
print(f'纯 E5 假设:{len(pure)} 条 -> {sorted(pure)}')
print('全文档证据标记:', collections.Counter(re.findall(r'E[1-5]', s)))
真实输出:
文件 需求对齐说明源文件_v1.1.html:28567 字符 / 467 行
去重后需求条目:18 条
E1–E4 硬证据:15 条
纯 E5 假设:3 条 -> ['B10', 'B4', 'B5']
全文档证据标记: Counter({'E4': 12, 'E3': 10, 'E5': 7, 'E2': 6, 'E1': 5})
再和排期表对一次账(同一条脚本加几行):
M1 -> B1(欠款要不回来)
M2 -> B2(合同)
M3 -> B3(用工风险)+ C 端流量承接
M4 -> B4(期限提醒)+ B5(批量)
M5 -> B10(找律师)+ L1(案源)
M1–M3 服务需求:['B1', 'B2', 'B3']
纯 E5 ∩ 前三期 = 空集
3 条纯假设全部落在 M4/M5,前三期一条都没进来。 这是这条规则唯一值得信的地方——它不是我自己读出来的感觉,是脚本算出来的交集。
顺手还有个不用写代码的版本,检查任意文档的证据标签分布:
grep -o 'E[1-5]' 需求对齐说明源文件_v1.1.html | sort | uniq -c | sort -k2
# 5 E1
# 6 E2
# 10 E3
# 12 E4
# 7 E5
反直觉 1:真正会漏进来的,是 E5 的"子能力",不是 E5 的条目。
M1 里有一条内容叫"到期提醒(站内 + 订阅消息)",而"期限与提醒"这条需求挂的正是 B4——纯 E5。它凭什么进 M1?文档里给的理由是:提醒同时服务 B1(证据最硬),而且它是"让用户回来"的唯一机制。
闸门查的是编号,漏的却是子能力。所以补了一条:既然放进来,就必须给它配一个验证指标。M1 的验证项写的是"① 律师函付费转化 ② 发函后是否有人回来问下一步 ③ 提醒是否被打开"——第③条就是这条 E5 能力的"验尸口"。
规则修正:闸门要下沉到功能粒度,且每个"破例"必须自带一个验证指标。
反直觉 2:这套规则拦得最多的是我自己。
"1.81 亿裁判文书 + 607 万法规"这句话,错不在数字,错在我的推论。定稿时它被改成"自述值、未获第三方验证;不构成壁垒",卖点也从"数据规模"换成了"每条结论可点回原文"。
为什么必须换?因为同期调研里躺着反例:IBM ROSS 因训练数据版权诉讼,2020 年 12 月起停止接客、2021 年 1 月全面停运;vLex 触达 100 万律师靠的是 40+ 州律协会员权益,不是数据量;Robin AI 用"AI + 自有人工律师"的重模式,2025 年裁员约 1/3,独立公司终止。数据规模从来不是护城河,来源链条和交付渠道才是。
同一个表格里还有一批同类项,全部标成自述值:案源池"15 条在招、今日新增 5 条、自述匹配成功率 87%"、律师库"81.6 万+"。它们不是假的,是没被验证过的——而没被验证的数字,在决策里的权重应该和零差不多。
反直觉 3:文档自己报的总数,也会是一条 E5。
这份文档的执行摘要写着"列出 24 条具体需求"。我按编号数,只有 18 条(B1–B10、C1–C5、L1–L3)。
我没有改它,而是把它留在记录里——因为"总数对不上"恰恰证明了一件事:任何一个不能被逐条还原的数字,它自己就处在最低证据等级。 这正是这套规则存在的原因。
顺带一个残酷的数据:斯坦福 HAI 2024 的评测里,专用法律 AI 的幻觉率是 17%–33%,通用模型是 58%–82%。别指望模型自己会闭嘴,得靠规则。
本文数字全部来自本地交付文档与脚本实测输出(2026-09-19 复核),调研中的第三方案例(IBM ROSS、vLex、Robin AI、EvenUp、斯坦福 HAI 等)为调研报告内引用,原始出处以报告附录为准。