ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

用Claude Code搭建可复现的数学推理实验:以黎曼猜想验证为例

用Claude Code搭建可复现的数学推理实验:以黎曼猜想验证为例 Claude 挑战黎曼猜想失败这个说法最近在技术圈和数学圈同时引发了讨论。它的传播点不在于大模型又做错了一道难题而在于模型给出的错误方式非常接近人类数学家的表达习惯却仍然在关键定义、可验证步骤和逻辑依赖上出现断裂。真正值得技术人关心的不是某一次数学表现而是如何把这种表现变成可复现、可测量、可排查的实验过程。下面围绕一个可控场景展开安装 Claude Code把它接入终端和 VS Code设计一个针对黎曼猜想的验证脚本让模型的数学输出经过代码校验随后观察它在哪些位置失败并整理安装、限流、模型名不识别等高频问题。完成这一整套流程后你得到的不是对黎曼猜想的判断而是一个大模型数学推理实验的基本框架。1. 为什么“Claude 挑战黎曼猜想失败”是值得复现的技术事件1.1 黎曼猜想到底难在什么地方黎曼猜想关注的是黎曼 ζ 函数的非平凡零点。ζ 函数在复平面上的定义依赖解析延拓实数域上常见的级数形式Σ 1/n^s只在Re(s) 1时绝对收敛。通过解析延拓ζ 函数可以定义到整个复平面只在s 1处有一个极点。所谓平凡零点位于负偶数-2, -4, -6, ...非平凡零点则落在临界带0 Re(s) 1内。黎曼猜想断言所有非平凡零点的实部都等于1/2也就是全部落在临界线上。这个问题的难度在于它不是一个可以靠检查前一万个零点就能确认的命题。数值计算可以增强信心但非平凡零点有无穷多个任何有限枚举都不能证明“所有”。同时证明过程往往需要同时处理函数方程、欧拉乘积、伽马函数、素数分布等多个分析学工具任何一个环节的疏忽都会让整条推理链失效。大模型擅长生成连贯的文本但数学证明恰恰不允许“文本连贯”替代“逻辑闭合”。1.2 这次实验真正要验证的是什么与其等待某个版本的模型突然给出一个可信的证明不如主动设计一次可控实验验证模型在数学推理上的实际边界。实验目标不是证明黎曼猜想也不是证明模型“不行”而是回答三个问题。第一模型能不能准确区分定义、假设、定理和需要证明的结论。第二模型会不会在缺少证据时仍然给出置信度很高的答案。第三模型的错误可以被结构化检测出来还是隐藏在流畅的自然语言里。用黎曼猜想作为测试对象有一个好处它足够复杂模型不太可能背出标准答案它又有清晰的验证手段比如用高精度数值库检查零点的实部用函数方程检查关键恒等式。这样模型的每个断言都能落到可运行的代码上而不是停留在“看起来对”的文字层面。1.3 失败模式的工程价值“数学家看懵了”的原因不是模型全错也不是模型全对而是模型呈现出一种混合状态它可能正确写出 ζ 函数的定义也可能正确计算前几个非平凡零点的近似值然后在某一步突然断言“由函数方程可得所有零点位于临界线上”把需要证明的结论包装成显然成立的推论。这种失败模式对工程很有价值。它说明大模型的推理不是严格意义上的公理化推理而是基于训练语料中的模式联想。文本中的“函数方程”和“临界线”经常共同出现模型就倾向于把两者连接起来而不关心连接是否经过严格推导。复现这种失败可以帮助我们设计更好的验证流程凡是模型给出的数学断言都必须附带可执行的验证代码凡是无法验证的断言都必须在输出中显式标记为“未验证”。2. 搭建 Claude Code 实验环境安装、连接、编辑器配置2.1 前置依赖与版本确认Claude Code 的命令行工具通常通过 npm 安装因此环境里需要先有 Node.js 和 npm。安装前先确认版本避免因为 Node 版本过旧导致 postinstall 脚本失败。node -v npm -v如果 Node 版本过低建议先升级到当前 LTS 版本。不同操作系统的包管理器不完全一样macOS 上可以用 HomebrewWindows 上可以直接使用官方安装包Linux 上建议通过 nvm 管理 Node 版本避免污染系统目录。Claude Code 本身更新很快如果后面遇到安装报错第一步永远先看当前 Node 和 npm 版本再看官方发布说明中要求的版本范围。检查完 Node 后还要确认你有没有一个可用的 Claude 账号和 API 权限。命令行工具和网页版对账号的要求可能不同如果账号是新注册的有可能会遇到“当前不对新用户开放”的提示这属于账号侧的限制不是安装错误。2.2 用 npm 安装 Claude Code在终端里执行全局安装。不同版本的安装方式可能微调但常见做法是npm install -g anthropic-ai/claude-code安装完成后验证命令是否在 PATH 中claude --version如果终端提示“claude 不是内部或外部命令”或者 PowerShell 提示“无法将‘claude’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”说明 npm 的全局 bin 目录没有加入 PATH。这个问题非常高频原因和处理方式会在后面第 5 节单独展开。安装成功后在项目目录下启动交互式终端claude第一次启动时工具一般会引导你完成登录或 API Key 配置。建议把实验目录单独建一个项目不要在系统目录里直接操作。命令行工具的配置会写入用户目录但项目相关的 prompt、脚本和运行记录最好都放在项目内方便版本管理。2.3 VS Code 集成终端与工作区配置在 VS Code 里使用 Claude Code不需要特别复杂的插件。最直接的方式是打开 VS Code 的集成终端进入项目目录后运行claude。这样你可以一边查看 Python 验证脚本一边和模型交互模型生成的数学断言可以立刻用旁边的代码验证。如果希望固定一些环境变量可以修改工作区的settings.json。例如通过.vscode/settings.json为集成终端注入环境变量{ terminal.integrated.env.linux: { ANTHROPIC_BASE_URL: http://127.0.0.1:8787/anthropic }, terminal.integrated.env.windows: { ANTHROPIC_BASE_URL: http://127.0.0.1:8787/anthropic } }这里的ANTHROPIC_BASE_URL只有在使用兼容网关时才需要设置。如果直接使用官方服务不应该随意修改这个变量。VS Code 集成终端的好处是你可以在左侧打开目录结构在编辑器里维护 prompt 和验证脚本在下方终端运行 Claude 对话整个过程都在一个窗口内适合作为数学实验工作台。2.4 接入 DeepSeek 等模型的实验性对照配置热搜词里大量出现“claude code 接入 deepseek”本质上是想把 Claude Code 的工具链接到第三方模型上做对照实验。这个方向有价值但需要说明它并不总是一个开箱即用的功能。社区常见的做法是设置两个环境变量ANTHROPIC_BASE_URL指向一个兼容端点ANTHROPIC_MODEL指定模型名。例如在 bash 中export ANTHROPIC_BASE_URLhttp://127.0.0.1:8787/anthropic export ANTHROPIC_MODELdeepseek-chat claude在 PowerShell 中则写成$env:ANTHROPIC_BASE_URL http://127.0.0.1:8787/anthropic $env:ANTHROPIC_MODEL deepseek-chat claude这里的关键问题是模型名白名单。Claude Code 当前版本可能不认识一个模型 ID然后直接报错deepseek-v4-pro is not a model this version of claude code recognizes这个报错不等于模型本身不可用而是当前版本的 Claude Code 不知道这个模型名应该对应什么样的参数空间。处理方式有三种升级 Claude Code 到支持该模型的版本在兼容网关中做模型名映射让外部请求使用 Claude Code 认识的名称或者不使用 Claude Code直接用 OpenAI 兼容 SDK 写一套自己的验证脚本。做对照实验时建议把官方模型和第三方模型的输出分别记录不要混在同一个 JSONL 文件里否则后续分析很难定位差异。3. 用代码给数学推理装一个“围栏”3.1 实验项目结构为了让实验可复现项目里需要同时存放 prompt、验证脚本、运行记录和 Claude 技能配置。下面是一个可参考的结构riemann-claude/ ├── prompt.txt ├── verify_zero.py ├── verify_functional_equation.py ├── verify_euler_product.py ├── run_experiment.py ├── runs/ │ └── run.jsonl └── .claude/ └── skills/ └── math-proof-check/ └── SKILL.mdprompt.txt存放大语言模型的输入提示verify_*.py存放数学验证脚本run_experiment.py负责调用命令行工具并记录输出runs/run.jsonl是每次实验的原始日志.claude/skills是 Claude Code 的技能目录。每次实验前先运行验证脚本确认环境里的数学库可用实验后再把模型的输出与验证脚本的结果对照。3.2 用 mpmath 数值验证非平凡零点黎曼猜想的直接数值验证方式是检查非平凡零点的实部是否等于0.5。mpmath提供了高精度数学函数也内置了零点的近似值。下面脚本检查前 10 个非平凡零点import json import mpmath as mp mp.mp.dps 30 def check_first_zeros(n): rows [] for i in range(1, n 1): z mp.zetazero(i) rows.append({ index: i, real: float(mp.re(z)), imag: float(mp.im(z)), deviation: float(mp.fabs(mp.re(z) - 0.5)) }) return rows if __name__ __main__: print(json.dumps(check_first_zeros(10), ensure_asciiFalse, indent2))运行后会看到real字段全部等于0.5deviation为极小的浮点误差。这个结果只能说明前 10 个零点落在临界线上不能说明“所有”零点。要在实验里强调这一点否则模型可能会把数值检查解释成证明。3.3 用函数方程检查关键恒等式同时小心欧拉乘积的陷阱黎曼 ζ 函数满足函数方程。定义完整的 ξ 函数xi(s) s * (s - 1) * gamma(s / 2) * zeta(s) / 2那么xi(s) xi(1 - s)。在临界线上s和1 - s关于1/2对称所以这个关系可以直接用复数代入检查import mpmath as mp mp.mp.dps 30 def xi(s): return s * (s - 1) * mp.gamma(s / 2) * mp.zeta(s) / 2 s mp.mpf(0.5) mp.mpf(14.134725141734693790457251983562) * 1j diff xi(s) - xi(1 - s) print(xi(s) - xi(1-s) diff:, mp.chop(diff))这里的mp.chop会把接近零的浮点误差清理成精确的0。不过要提醒一点函数方程验证的是 ξ 函数的对称性而不是“零点都在临界线上”的充分条件。模型如果直接从函数方程推出黎曼猜想就是典型的逻辑跳跃。欧拉乘积是 ζ 函数与素数之间关系的核心表达prod_{p} (1 - p^(-s))^(-1) zeta(s)这个等式只在Re(s) 1时绝对收敛。在临界线上级数和无穷乘积都不收敛所以不能拿它直接验证零点。下面脚本只在Re(s) 1的区域做部分和检查import mpmath as mp mp.mp.dps 30 s mp.mpf(2) mp.mpf(1) * 1j partial mp.mpf(1) for k in range(1, 100): p mp.prime(k) partial * 1 / (1 - p**(-s)) print(partial - zeta(s):, mp.chop(partial - mp.zeta(s)))这个脚本的作用是让模型知道欧拉乘积是 ζ 函数的定义来源但不能直接用于临界线上的零点验证。如果模型在输出里声称“用欧拉乘积证明了零点都在临界线上”验证脚本就能第一时间识别出问题。3.4 设计可审计的 Prompt 模板和输出记录实验的 prompt 不应该只是简单的一句“请证明黎曼猜想”而要主动约束输出结构。下面是一个可用的模板保存在prompt.txt你是数学研究助理。请针对黎曼猜想给出推理步骤。 规则 1. 不要使用“显然”“容易证明”“同理可得”作为结论依据。 2. 每个断言必须给出可执行的 Python 或符号计算验证方式。 3. 如果某个断言无法验证请明确标注“未知”。 4. 输出 JSON字段包括 steps、conclusion、confidence、possible_mistakes。模型返回的 JSON 会和记录脚本一起写入run.jsonl。下面是一个调用 Claude Code 并保存输出的脚本import json import subprocess import time prompt open(prompt.txt, encodingutf-8).read() try: result subprocess.run( [claude, -p, prompt], capture_outputTrue, textTrue, encodingutf-8, timeout120 ) except Exception as exc: record { timestamp: time.time(), error: str(exc) } else: record { timestamp: time.time(), returncode: result.returncode, stdout: result.stdout, stderr: result.stderr, } with open(runs/run.jsonl, a, encodingutf-8) as f: f.write(json.dumps(record, ensure_asciiFalse) \n)注意claude -p这个参数不是所有版本都完全一致命令行工具更新很快。运行前先执行claude --help确认当前版本的非交互式输出参数名。记录脚本里额外加了异常处理避免调用失败时整个实验中断。注意实验记录必须保存原始输出不要只保存清理后的文本。模型错误出现的上下文往往比错误本身更有分析价值。4. 让 Claude 挑战黎曼猜想记录一次可控实验4.1 实验步骤与控制变量进入实验目录确认 Node、npm、Claude Code 和 mpmath 都可用。然后执行一次最小实验使用固定 prompt调用命令行工具把输出写入 JSONL。接下来可以准备多个 prompt 变体例如一个要求“给出证明思路”另一个要求“先用 Python 验证前 20 个零点再给出证明”。控制变量建议按照下面的顺序固定 prompt 文本连续运行多次观察输出波动。固定 prompt只切换官方模型和第三方模型观察差异。固定模型只修改 prompt 中“必须输出 JSON”和“允许自由输出”两个版本观察结构化约束对输出质量的影响。每次运行前记录claude --version和安装时间因为工具版本变化会直接影响结果。不要同时变化多个变量。如果既换模型又改 prompt又升级工具最后出现问题时很难定位是哪一步导致的。4.2 输出分析模型常见的失败类型从实际运行经验看模型在黎曼猜想这种高难度推理任务上的失败可以归纳成六类。失败类型典型表现为什么危险怎么检测符号误用混淆ζ(s)与ζ(1-s)或把平凡零点当成非平凡零点后续推理全部建立在错误恒等式上用 mpmath 代入数值检查循环论证先假设黎曼猜想成立再“证明”零点在临界线上结论被隐藏在前提里文本上很难发现列出每一步的依赖关系引用不存在的定理给出一个听起来很专业的定理名作为跳板无法溯源人工核验成本高检查每个定理是否能在标准教材中找到把近似当证明数值算到 10 位一致后宣布“因此所有零点在临界线上”无穷多个零点无法枚举明确数值验证不是证明过度置信输出confidence: 0.95但没有对应证据干扰研究者判断要求 confidence 与步骤证据一一对应以启发代替严格证明写“可以用解析延拓处理”但不展开关键步骤文本流畅但无法执行让模型写出每一步的公式推导这六类失败并不是互斥的。一次输出里可能同时存在符号误用和过度置信也可能前半部分正确、后半部分突然变成循环论证。把输出保存下来后可以用脚本统计“显然”“容易证明”“因此”等词出现的次数再逐条人工核对。关键词统计不能替代人工判断但它能快速标出需要重点检查的位置。4.3 为什么模型会给出让人“看懵”的推理“看懵”的本质是模型的文本连贯性与逻辑严谨性之间出现了错位。人类数学家看到“由函数方程”会自然期待后面的推导严格依赖函数方程的定义和边界条件。但模型并不具备这种“期待”背后的训练约束它只是在统计上一句话和下一句应该怎么衔接。比如模型可能正确写出zeta(s) 在 Re(s) 1 时可以表示为欧拉乘积。紧接着写因此每个非平凡零点的实部必须是 1/2。这两句话单独看都符合数学表达习惯但第二句完全不是第一句的推论。代码围栏在这里的作用就是把这种断裂显式暴露出来。你在验证脚本里写上“欧拉乘积只在 Re(s) 1 时收敛”再看模型的下一句是否仍然强行得出结论就能立刻发现它是在推理还是在做语言联想。5. Claude Code 高频报错排查路径5.1 claude 命令找不到的 PATH 问题最常见的安装后问题是终端不认识claude。Windows 下常见提示是claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称在 cmd 中则是claude 不是内部或外部命令也不是可运行的程序或批处理文件。macOS/Linux 下则通常是command not found: claude原因基本都是 Node 全局安装路径没有加入当前终端的 PATH。先看 npm 的全局前缀npm config get prefixWindows 上通常返回C:\Users\用户名\AppData\Roaming\npm。把这个目录加入系统 PATH 后重新打开终端。macOS 或 Linux 上如果前缀是/usr/local一般已经在 PATH 中如果前缀是用户目录下的.npm-global就需要手动加入。改完 PATH 后执行claude --version检查点命令行能返回版本号说明安装路径和 PATH 都正确。5.2 native binary not installed 与安装回滚另一个高频报错是Error: Claude native binary not installed. either postinstall did not run or your platform is not supported.意思是工具在安装过程中需要下载一个原生二进制文件但 postinstall 脚本没有成功执行。常见原因包括Node 版本不兼容、npm 使用了缓存导致下载不完整、网络问题导致二进制下载中断、目录权限不足。处理步骤按顺序来。先卸载npm uninstall -g anthropic-ai/claude-code清掉 npm 缓存中对应的包缓存npm cache verify然后重新安装npm install -g anthropic-ai/claude-code如果还不行升级或切换 Node LTS 版本后再试。也可以尝试重新执行安装脚本npm rebuild anthropic-ai/claude-code这类问题没有万能解法重点是记录完整错误输出而不是只记一句话。报错信息下半部分通常会包含具体的失败原因例如是网络超时还是平台不支持。5.3 限流、组织策略和模型名不被识别的处理实验过程中很容易出现服务端返回 529 限流。现象是请求中断输出里出现类似Claude Code 529或 HTTP 529 的状态码。处理上先降频减少同时运行的子进程数量增加两次请求之间的间隔不要在一个终端里同时开太多任务。如果持续限流可以等待一段时间再重试。组织账号还会遇到your organization has disabled claude subscription access for claude code这说明组织管理员关闭了 Claude Code 的订阅访问权限。个人账号不会遇到这个问题遇到时只能联系管理员开启或者改用个人账号。新注册账号可能遇到unfortunately, claude is not available to new users right now.这是账号侧限制不是环境错误。确认账号状态等待官方开放或者使用已有的可用账号。模型名不识别的问题在接入第三方模型时最常见报错形态如deepseek-v4-pro is not a model this version of claude code recognizes这个报错提示当前版本的工具不认识你指定的模型 ID。处理方式是升级 Claude Code、调整网关映射或改用当前版本支持的模型名。不要在配置里伪造一个看起来像官方模型的 ID那样即使绕过检查后续请求也会在服务端失败。5.4 排查顺序清单遇到 Claude Code 问题时建议按下面的顺序排查不要跳过任何一步。检查项命令或方式通过标准Node 版本node -v不低于工具要求的最低版本npm 版本npm -v与 Node 版本匹配全局安装路径npm config get prefix路径存在且已加入 PATH命令是否可用claude --version返回版本号登录状态在claude交互界面查看账号信息账号可用环境变量echo $ANTHROPIC_BASE_URL或echo $env:ANTHROPIC_BASE_URL确保没有残留错误配置模型名claude --model或帮助文档使用当前版本支持的模型名网络状态查看错误信息中的状态码没有被限流或网络中断这个清单同样适用于实验前检查。每次实验开始时先跑一遍可以避免把环境问题误判成模型能力问题。注意不要同时修改多个配置后一次性启动。环境变量、模型名、代理网关三者混在一起时报错信息往往互相掩盖。6. 把 Claude Code 用于数学研究的最佳实践6.1 把模型定位成助手而不是证明引擎数学研究里最适合大模型承担的角色是翻译器、代码生成器和思路生成器。它可以把一段不严谨的草稿翻译成结构化文本可以写出用于数值验证的 Python 脚本可以在你给出正确方向时补全推导细节。但不要把模型输出的“证明思路”直接当作证明材料。所有关键步骤必须经过人工验证或形式化验证工具验证。一个实用的做法是要求模型把“断言”和“证据”分离。比如prompt 里可以加一条规则每个断言前用 [CLAIM] 标记每个证据前用 [EVIDENCE] 标记。如果某个断言没有对应证据直接写 [NO_EVIDENCE]。这样输出可以被脚本自动化检查也可以被研究者快速定位薄弱点。6.2 实验记录和人工审核规范数学实验的记录要比一般代码实验更严格。因为语言模型输出有随机性相同的 prompt 每次结果可能不同而数学判断又依赖精确的符号和定义。记录规范建议包含以下内容记录claude --version、Node 版本、安装日期。记录所有环境变量的设置值不要记录为“使用了某个模型”。每次实验使用独立 JSONL 文件保存原始输出、时间戳和退出码。prompt 文件每次修改都提交到版本控制不要只在终端里临时输入。所有由模型生成并用验证脚本检查过的数值都保留脚本版本号和输出摘要。人工审核必须检查模型引用过的定理名、符号定义和最后结论之间的逻辑链不能只检查第一步和最后一步。如果涉及发表或对外发布还需要额外标注哪些内容由模型生成哪些内容经过人工核验。当前没有任何大模型能替代数学家的最终责任。6.3 Skill、本地网关和形式化验证的扩展方向Claude Code 的技能机制可以进一步强化实验流程。在项目目录的.claude/skills下创建一个子目录里面放一个SKILL.md可以让模型在进入实验会话时自动加载一套检查规则。例如创建一个数学证明检查技能--- name: math-proof-check description: 检查数学证明文本中的断言是否都有代码或符号定义支撑。 --- 当用户给出证明文本时 1. 提取所有“显然”“因此”“同理”等关键断言。 2. 对每个断言标注是否可验证、缺少哪一步。 3. 输出一个 markdown 表格列为断言、支撑、验证方式、风险。这个技能本身不能保证正确性但能强制模型在输出时对断言做分类减少“看起来流畅”的文本掩盖逻辑空洞的问题。进一步扩展的方向是接入形式化验证系统。数学界已经有 Lean、Coq、Isabelle 等交互式证明助手。如果想让模型参与真正的数学证明更稳妥的路线是让大模型生成证明草图再由人工在 Lean 中形式化最后交给编译器检查。这样每一步的正确性都是有据可查的而不是依赖模型文本的可信度。本地网关、第三方模型接入、技能配置、形式化验证这些方向组合在一起正好构成一个完整的 AI 数学研究工作台。环境搭建只是第一步真正有价值的是后面的实验记录、失败模式分析和人工审核流程。对新手来说最值得练的并不是让 Claude 证明黎曼猜想而是把一个已知的简单定理交给它然后用第 3 节的脚本去验证它的输出。重复几次之后你会直观理解什么是“看似合理但不可验证”的推理也会明白为什么数学证明最终必须靠严格的验证机制而不是靠文本的流畅度。
返回列表