看到这个题目,估计不少读者第一反应是:这到底是探讨“大模型能不能搞科研”,还是在讨论某个科幻设定?实际上,这是近期学术界非常热门的一个研究方向:让大语言模型(LLM)在真实世界数据与“平行世界”模拟数据中,尝试自主发现物理规律或科学定律。本文不打算复述某篇论文的结论,而是从工程复现的角度出发,完整梳理 LLM 参与科学发现的核心思路、Prompt 设计、数据生成、闭环验证,并给出一个可运行的实战 Demo,方便新手快速上手,也方便有基础的开发者在此基础上继续扩展。
先说清楚一个概念:所谓“真实世界”与“平行世界”,在科学发现任务里通常指两类数据来源。真实世界数据就是我们常见的实验测量数据,例如自由落体运动中的时间与位移关系;平行世界数据则是指通过模拟器、生成模型或参数扰动构造出的“虚拟物理环境”数据,例如修改重力加速度、摩擦系数之后产生的新数据集。让 LLM 在这两类数据上“发现定律”,本质上是在测试模型的归纳推理能力、符号回归能力以及科学假设生成能力。
这篇文章会分为三个层面展开:第一层面解释 LLM 科学发现的基本范式;第二层面搭建一个最小可运行系统,让 LLM 根据实测数据推断运动学规律;第三层面总结工程落地时常见的坑、Prompt 设计原则和评估方法。如果你正准备做 AI for Science 相关项目,或者想了解如何让 ChatGPT 这类模型参与数据分析,这篇文章可以给你一个相对系统的切入点。
1. 背景与核心概念
1.1 LLM 为什么能参与科学发现
传统科学发现流程大致是:观测现象 → 收集数据 → 提出假设 → 设计实验验证 → 修正理论。这个过程高度依赖人的知识直觉和数据分析能力。LLM 的优势在于它预训练阶段见过海量物理公式、实验数据描述、论文摘要和代码,因此具备较强的“知识联想”和“模式补全”能力。
举个例子,如果你给模型一组看起来像是自由落体运动的数据,并告诉它“物体从静止开始下落,记录不同时刻的位移”,一般 LLM 会很快联想到 s = 1/2 * g * t^2 这条常见规律。这看似简单,但它的意义在于:模型能够在没有人工干预的情况下,把数据特征映射到已知科学表达式中。
更进一步的场景是,当数据来自“平行世界”,例如重力加速度被设定为 19.6 m/s² 而不是 9.8 m/s²,LLM 可能仍然能识别出二次函数关系,但需要额外推理过程去调整参数。这种能力与人类的“迁移类比”非常相似。
当然,必须客观看待:LLM 的科学发现能力本质上是统计推断与知识回忆,不是真正的“实验归因”。它无法判断数据采集过程是否正确,也不会主动设计控制变量实验。所以在工程实践中,LLM 通常作为“假设生成器”和“公式推荐器”,而真正的验证环节仍由传统数值方法或仿真实验完成。
1.2 真实世界与平行世界的定义
在论述科学发现时,“世界”不是哲学概念,而是数据环境的代称。
- 真实世界:指用物理实验、传感器采集到的真实数据。这类数据存在噪声、系统误差和随机误差,例如用光电门测量落体时间时,计时器分辨率有限,数据不会严格符合理想公式。
- 平行世界:指通过参数化模拟器生成的数据。例如在仿真环境中把重力加速度设为任意值,或者引入额外的空气阻力项。这类数据的优点是“真实值已知”,便于验证 LLM 推断是否准确;缺点是没有真实测量噪声,可能让模型过于轻松地发现规律。
有意思的是,在研究论文里,“平行世界”往往还被用来测试 LLM 的“反事实推理”能力:给定一个不存在的物理参数组合,模型是否还能提出合理的假设。例如让 LLM 分析一个摩擦系数为负数的环境下物体的运动轨迹,模型是否会发现数据不符合任何常规物理规律,从而主动怀疑数据来源。
1.3 LLM 科学发现的核心技术环节
如果要让 LLM 完成科学发现任务,通常需要三个环节配合:
- 数据序列化:把原始数值表格变成一个模型能理解的文本序列。常见做法是
textualize,即把 CSV 数据转换为描述性句子。 - 假设生成:设计 System Prompt,要求模型输出候选规律、公式形式、参数估计,甚至给出验证方案。
- 置信度评估:通过数值拟合、残留误差分析、符号回归校验等方法,对 LLM 给出的公式做客观打分。
工程上的难点在于,LLM 输出的是自然语言与 LaTeX 公式混合的文本,无法直接参与数值计算。因此最好规定模型输出格式化为 JSON 或 Python 代码,方便后续自动解析与验证。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与版本说明
2.1 实验环境概览
本文的示例代码以 Python 3.9+ 为基础,核心依赖为 OpenAI 兼容 SDK 与 numpy。你可以把代码中调用模型的部分替换为任意兼容 OpenAI 接口的大模型服务,包括国内主流大模型平台、本地部署的 vLLM 服务等。
版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。
推荐环境如下:
- 操作系统:Windows 10 / 11、macOS 12+、Ubuntu 20.04+ 均可
- Python 版本:3.9 及以上
- 依赖库:
numpy、pandas、openai、python-dotenv - 大模型 API:任意兼容 OpenAI Chat Completions 接口的服务
- IDE:VS Code 或 PyCharm
2.2 项目结构规划
为了让代码清晰可复用,我建议按下面的结构组织项目:
code复制llm-science-discovery/
├── .env # 存放 API Key 等敏感信息
├── config.py # 配置文件
├── data_generation.py # 生成真实/平行世界数据
├── llm_client.py # 封装 LLM 调用逻辑
├── prompt_templates.py # 存放 Prompt 模板
├── discovery_pipeline.py # 主流程:数据→Prompt→LLM→验证
├── validation.py # 数值验证模块
└── output/ # 保存实验结果
后续实战部分会逐个文件讲解。需要特别说明的是,.env 文件不要上传到公开仓库,避免 API Key 泄露。
2.3 安装依赖
创建虚拟环境并安装依赖:
bash复制mkdir llm-science-discovery
cd llm-science-discovery
python -m venv .venv
source .venv/bin/activate # Windows 下使用 .venv\Scripts\activate
pip install numpy pandas openai python-dotenv
安装完成后,可以在项目根目录新建 .env 文件:
ini复制LLM_API_KEY=your-api-key
LLM_API_BASE=https://your-endpoint.example.com/v1
LLM_MODEL=your-model-name
这里不写死具体厂商,因为 OpenAI 兼容协议已经被大多数平台采用。
3. 核心原理拆解
3.1 数据序列化:让模型“看懂”数据
LLM 无法直接读取 CSV 文件,需要把数据转换成文本。设计序列化格式时,要尽可能保持数据的可读性与一致性。最简单的方式是逐行描述:
code复制时刻(s): 0.00, 位置(m): 0.00
时刻(s): 0.10, 位置(m): 0.05
时刻(s): 0.20, 位置(m): 0.20
...
对于列更多的数据集,可以改为表格化描述:
code复制下面是一组实验数据,第1列为时间(秒),第2列为位移(米):
0.00, 0.00
0.10, 0.05
0.20, 0.20
这里的关键点是:给模型提供变量名和单位,这能大幅提升公式识别的准确率。如果只输出数字,模型很难判断数据表示的对象是什么。
3.2 Prompt 设计:科学发现任务的核心
设计科学发现 Prompt 时,我把它拆成四个角色层次:
- 系统层:告诉模型它是什么角色,采用什么推理风格。
- 任务层:明确当前要完成的具体任务,例如“从给定数据中推断位移与时间的关系”。
- 约束层:规定输出格式,防止返回不可解析的文本。
- 元认知层:要求模型对自己给出的假设做置信度评估,并说明数据规律是否可能是“伪相关”。
一个实用的 System Prompt 示例:
python复制SYSTEM_PROMPT = """
你是一名实验物理学家,擅长从观测数据中推断物理规律。
你的任务是根据用户提供的实验数据,提出可能的数学关系式,
并给出参数估计与验证方法。
要求:
1. 优先考虑常见物理公式,但不要只凭记忆下结论。
2. 如果数据有明显噪声,请给出拟合方法建议。
3. 输出 JSON 格式,字段包括:
- expression: 用 LaTeX 或 Python 表达式描述规律
- params: 参数名与估计值
- reasoning: 你的推理过程
- confidence: 0到1之间的置信度
""".strip()
通过这种结构化约束,LLM 返回的结果就能被后续代码安全解析。在实际项目中,还可以让模型输出一个 Python 函数,例如 def predict(t): return 4.9 * t**2,然后直接调用。
3.3 假设生成与验证闭环
LLM 生成的假设只是“候选”,不能直接当成科学结论。正确的闭环包括:
- 第一步:LLM 给出候选公式。
- 第二步:用最小二乘法拟合参数,得到最优参数值。
- 第三步:计算残差平方和(RSS)或决定系数(R²)。
- 第四步:将 LLM 提出的公式与其他候选公式(如线性、指数、幂律)做对比。
- 第五步:如果 LLM 给出的公式拟合优度不高,可以把反馈信息再次发给 LLM,让模型修正假设。
这个闭环在工程上非常好用,既能保留 LLM 的知识联想能力,又能用客观数值约束模型输出。可以把这理解成“让模型做直觉判断、让算法做严谨验证”。
3.4 Few-shot 与自一致性
为了让 LLM 在陌生数据上表现更稳定,可以参考以下技巧:
- Few-shot 示例:在 Prompt 中给出 1 到 2 个完整示例,展示“数据 → 推理 → 公式”的映射关系。
- 自一致性:让 LLM 回答多次,再对结果进行投票或聚类,选择最一致的输出。
- 思想链(Chain-of-Thought):要求模型先描述观察到的趋势,再写出公式,避免跳步。
需要提醒的是,Few-shot 示例不应过于复杂。如果示例中的数据形态与真实输入差距过大,反而会干扰模型判断。
4. 完整实战案例:让 LLM 发现自由落体运动定律
下面进入本文的核心环节。我们将实现一个完整的科学发现流水线,让 LLM 从一组模拟实验数据中推断出位移与时间的关系。整个流程会兼顾“真实世界带噪声数据”与“平行世界参数扰动数据”两种场景。
4.1 创建项目结构
先按上一章的规划创建目录与文件。如果使用命令行,可以执行:
bash复制mkdir -p llm-science-discovery/output
cd llm-science-discovery
touch .env config.py data_generation.py llm_client.py prompt_templates.py discovery_pipeline.py validation.py
4.2 配置模块
config.py 负责读取环境变量,统一管理模型配置:
python复制import os
from dotenv import load_dotenv
load_dotenv()
LLM_API_KEY = os.getenv("LLM_API_KEY")
LLM_API_BASE = os.getenv("LLM_API_BASE")
LLM_MODEL = os.getenv("LLM_MODEL", "gpt-4o-mini")
DEFAULT_TEMPERATURE = 0.2
把温度设置为较低值,有助于减少 LLM 输出的随机性。科学发现任务需要稳定的输出,不建议使用过高的温度。
4.3 数据生成模块
data_generation.py 用来生成两类数据:真实数据(带噪声自由落体数据)与平行世界数据(修改重力加速度后的数据)。
python复制import numpy as np
import pandas as pd
def generate_falling_data(
g: float = 9.8,
time_span: float = 2.0,
num_points: int = 20,
noise_std: float = 0.02,
) -> pd.DataFrame:
"""
生成自由落体运动数据。
物理模型:s = 0.5 * g * t^2
可选噪声用于模拟真实实验观测误差。
"""
t = np.linspace(0.0, time_span, num_points)
s = 0.5 * g * t**2 + np.random.normal(0, noise_std, size=t.shape)
return pd.DataFrame({"time": t, "displacement": s})
def generate_parallel_world_data(
g: float = 3.7,
time_span: float = 3.0,
num_points: int = 20,
noise_std: float = 0.01,
) -> pd.DataFrame:
"""
生成平行世界数据:
将重力加速度设置为不同于地球的值,模拟不同物理环境。
"""
return generate_falling_data(g=g, time_span=time_span,
num_points=num_points, noise_std=noise_std)
需要说明的是,这里的“平行世界”实际上就是改变了物理参数的模拟环境。你可以随意修改重力加速度,甚至给数据加入不同的噪声分布。
4.4 LLM 客户端封装
llm_client.py 封装 Chat Completions 接口,目的是让主流程代码不被 API 细节干扰。
python复制import json
from openai import OpenAI
from config import LLM_API_KEY, LLM_API_BASE, LLM_MODEL, DEFAULT_TEMPERATURE
class LLMClient:
def __init__(self):
self.client = OpenAI(
api_key=LLM_API_KEY,
base_url=LLM_API_BASE,
)
self.model = LLM_MODEL
def chat(self, messages: list[dict], temperature: float = DEFAULT_TEMPERATURE) -> str:
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=temperature,
)
return response.choices[0].message.content
def parse_json_response(self, content: str) -> dict:
"""
清理模型输出中的 Markdown 代码块标记,并解析 JSON。
实际使用中 LLM 可能返回 ```json 包裹的内容,需要预处理。
"""
cleaned = content.strip()
if cleaned.startswith("```json"):
cleaned = cleaned[7:]
if cleaned.endswith("```"):
cleaned = cleaned[:-3]
return json.loads(cleaned.strip())
这里有两个工程细节值得注意:第一,很多兼容接口也需要传 base_url,便于接入不同云服务;第二,LLM 返回的 JSON 经常被 Markdown 代码块包裹,必须做清理,否则 json.loads 会直接报错。
4.5 Prompt 模板
prompt_templates.py 定义科学发现任务的 Prompt 模板。它接收数据帧、数据来源描述和可选提示词,输出一个可直接发送给模型的 messages 列表。
python复制SYSTEM_PROMPT = """
你是一名实验物理学家,擅长从观测数据中推断物理规律。
你需要根据给定数据提出位移与时间之间可能的数学关系式。
输出要求(必须严格遵循):
1. 输出为 JSON 对象。
2. 字段说明:
- expression: 你发现的规律表达式,用 Python 表达式表示。
- params: 参数名与估计值组成的字典。
- reasoning: 推导过程,不超过 200 字。
- confidence: 置信度,0 到 1 之间。
3. 必须在 reasoning 中先描述数据观测到的趋势。
""".strip()
def build_discovery_messages(
df,
data_description: str = "真实世界自由落体实验数据",
additional_hint: str = "",
) -> list[dict]:
data_text = df.to_csv(index=False)
user_prompt = f"""
数据来源:{data_description}
实验数据(CSV格式):
{data_text}
请分析数据中的规律,并按照 System Prompt 要求输出 JSON。
"""
if additional_hint:
user_prompt += f"\n附加提示:{additional_hint}\n"
return [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_prompt},
]
在 Prompt 中加入数据描述,例如“真实世界自由落体实验数据”,有助于模型快速定位知识库中对应的物理公式。不过这也会带来一个争议:模型到底是在“发现”规律,还是在“回忆”规律?
我们会在后续内容中给出改进思路。
4.6 数值验证模块
validation.py 用于验证 LLM 提出的公式是否与数据匹配。这里采用最朴素的方法:解析表达式、计算残差、输出拟合指标。
考虑到 LLM 返回的 expression 可能是字符串,我们可以使用 numpy.polynomial 或 scipy.optimize 做拟合。为了减少依赖,这里使用 numpy 的 polyfit 检测多项式阶数,再与 LLM 输出做对比。
python复制import numpy as np
def fit_polynomial(t: np.ndarray, s: np.ndarray, degree: int = 2) -> np.ndarray:
"""使用最小二乘法拟合多项式,返回系数。"""
coeffs = np.polyfit(t, s, degree)
return coeffs
def r_squared(t: np.ndarray, s: np.ndarray, fit_func) -> float:
"""计算 R² 决定系数。"""
residuals = s - fit_func(t)
ss_res = np.sum(residuals**2)
ss_tot = np.sum((s - np.mean(s)) ** 2)
return 1 - (ss_res / ss_tot)
def compare_with_quadratic(t: np.ndarray, s: np.ndarray):
"""拟合二次多项式并与理论公式比较参数。"""
coeffs = fit_polynomial(t, s, degree=2)
# polyfit 返回从高次到低次的系数
a = coeffs[0] # t^2 系数
return {
"quadratic_coeff": a,
"implied_g": 2 * a,
}
这里的 implied_g 即根据拟合得到的二次项系数换算出的重力加速度估计值。真实自由落体运动中,系数约等于 0.5 * g,所以 g ≈ 2 * a。
4.7 编写主流程
discovery_pipeline.py 把上面的模块串起来。它会执行以下步骤:
- 生成数据。
- 调用 LLM 得到候选假设。
- 解析 JSON 结果。
- 用数值方法验证候选公式。
- 输出结果并保存。
python复制import json
import numpy as np
from data_generation import generate_falling_data, generate_parallel_world_data
from llm_client import LLMClient
from prompt_templates import build_discovery_messages
from validation import compare_with_quadratic
def run_discovery(
df,
data_description: str,
output_path: str = "output/result.json",
additional_hint: str = "",
):
client = LLMClient()
messages = build_discovery_messages(
df,
data_description=data_description,
additional_hint=additional_hint,
)
# 第一次调用
content = client.chat(messages)
llm_result = client.parse_json_response(content)
# 数值验证
t = df["time"].values
s = df["displacement"].values
validation = compare_with_quadratic(t, s)
# 汇总
result = {
"data_description": data_description,
"llm_result": llm_result,
"numerical_validation": validation,
}
with open(output_path, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print(json.dumps(result, ensure_ascii=False, indent=2))
return result
if __name__ == "__main__":
# 场景1:真实世界带噪声数据
real_df = generate_falling_data(g=9.8, noise_std=0.05)
run_discovery(
real_df,
data_description="真实世界自由落体实验数据",
output_path="output/real_world_result.json",
)
# 场景2:平行世界数据,重力加速度为 3.7
parallel_df = generate_parallel_world_data(g=3.7)
run_discovery(
parallel_df,
data_description="平行世界自由落体实验数据,重力加速度未知",
output_path="output/parallel_world_result.json",
)
4.8 运行与预期输出
在终端运行:
bash复制python discovery_pipeline.py
如果一切正常,你会看到终端打印一个 JSON 对象。以平行世界数据为例,LLM 可能会输出类似下面的结果:
json复制{
"expression": "0.5 * g * t**2",
"params": {
"g": 3.7
},
"reasoning": "位移随时间的平方增长,数据噪声较小,符合匀加速直线运动特征。",
"confidence": 0.95
}
数值验证模块则会输出:
json复制{
"quadratic_coeff": 1.85,
"implied_g": 3.70
}
这里的 implied_g 与设定的 g=3.7 非常接近,说明 LLM 找的公式形式是正确的,数值估计也基本合理。
如果数据噪声较大,你可能会发现 LLM 输出的参数估计与拟合值存在偏差。这是正常的。我们可以把数值验证得到的参数写回 prompt,要求 LLM 据此修正输出。这也是一个非常有用的迭代闭环。
5. 常见问题与排查思路
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
API 调用报错 AuthenticationError |
API Key 无效或未配置环境变量 | 检查 .env 文件是否存在,确认环境变量已加载 |
| 返回内容无法解析为 JSON | LLM 输出带有 Markdown 代码块或多余文字 | 清理字符串开头 ```json 与结尾 ``` |
| 模型直接“背出”答案,没有推理 | Prompt 中数据描述过于直白,例如直接写了“自由落体” | 去掉数据来源提示词,改成“未知物理过程实验数据” |
| 并行世界数据下模型置信度异常高 | 模型潜意识中套用了地球重力加速度 | 要求模型先输出数据趋势,再给出假设 |
| 拟合的二次项系数与 LLM 参数估计不一致 | LLM 只是给出了公式形式,没有精确计算参数 | 用 scipy.optimize.curve_fit 做参数估计,再反馈给模型 |
| 多次运行结果不一致 | 温度参数过高 | 把 temperature 降低到 0.2 或 0 |
在这张表中,最值得展开的是“模型直接背出答案”这一项。如果你把 Prompt 写成“这是自由落体运动数据”,那么模型当然会直接回答自由落体公式。为了测试 LLM 真正的归纳能力,我们可以把数据来源描述改成:
code复制数据来源:未知物理实验,变量含义未知,请根据数值规律推断可能的关系。
这样做的目的是强迫模型从数据出发,而不是从记忆出发。实验对比后你会发现,模型依然能猜出二次关系,但推理过程会更谨慎,置信度也会更合理。这个“盲测”思路非常适合做模型能力评估。
另外,如果你在实验中发现 LLM 返回的公式是类似于 s = a * t**2 + b * t + c 的三参数二次多项式,并不代表模型发现了更复杂的规律。它可能只是在默认情况下把“未知关系”建模成多项式。对于物理问题,更好的策略是在 Prompt 中约束“优先考虑简单表达式,参数越少越好”。
6. 最佳实践与工程建议
6.1 数据生成与噪声控制
科学发现任务的成功率很大程度上受数据质量影响。实验中不要只使用无噪声理想数据,否则模型会过拟合到“完美曲线”,并对测量误差缺少预期。建议在数据生成阶段加入可控噪声,同时记录噪声标准差,并在 Prompt 中告诉模型“数据可能包含观测误差,不用追求完全拟合”。
使用不同噪声水平做交叉实验,还能评估模型对数据质量的敏感度。比如把噪声标准差从 0.01 逐步提升到 0.5,观察 LLM 给出的置信度是否随之下降。如果置信度没有变化,说明模型可能忽略了数据幅值信息,需要调整 Prompt。
6.2 Prompt 工程的核心原则
科学发现类 Prompt 与普通对话 Prompt 有明显区别,更接近“结构化任务指令”。我建议遵循以下原则:
- 明确输出格式,能用 JSON 就不用自然语言。
- 让模型分步输出:观察趋势 → 提出假设 → 参数估计 → 置信度评估。
- 避免在 Prompt 中泄露正确答案。
- 给出单位与变量名,但只有在你希望模型识别物理背景时才这么做。
- 如果做盲测,使用“未知变量 X 与 Y”这类中性标签。
一个容易踩坑的地方是:模型对“位移”“时间”这样的变量名称极其敏感。同样是二维数据,把列名改为 x1, x2 后,模型可能完全猜不出物理规律。这说明当前 LLM 的“科学发现”仍有很强的知识检索色彩,我们在设计评估实验时要区分“记忆能力”和“推理能力”。
6.3 多轮迭代与反馈回路
单次调用得到的结果往往不够稳定。推荐采用两轮或三轮迭代:
- 第一轮:让 LLM 提出候选公式与参数。
- 数值验证:对参数做最小二乘拟合。
- 第二轮:把拟合优度、残差信息、修正后的参数反馈给 LLM,让模型决定是否调整公式结构。
实现起来也不复杂,在 prompt_templates.py 中增加一个 build_revision_messages 函数即可。重点是让模型知道“你上一轮的表达式拟合效果如何”,而不是直接告诉它“正确答案是什么”。
6.4 安全与合规边界
当涉及“平行世界”或“反事实”数据时,要明确这只是数据模拟,不涉及任何现实世界中的敏感参数。构造参数时,也要避免使用与国家、人群、地区相关的映射。原则上,科学实验数据生成只应使用物理常数、数学参数或中性名称。
此外,调用大模型 API 时,不要直接把实验数据、API Key、内部项目信息拼进 Prompt 后上传到公共日志平台。有效做法是:
- 使用环境变量读取敏感配置。
- 对上传数据做脱敏处理,把变量名改为中性标识。
- 如果使用私有化部署的模型,优先内网调用。
- 对模型输出做过滤,避免恶意注入指令影响结果。
6.5 结果评估与可复现性
在学术项目或工程落地中,不仅要看 LLM 是否给出了正确答案,还要评估它的“错误模式”。例如:
- 模型给出的公式是否过拟合?
- 置信度是否与残差大小相关?
- 平行世界参数变化时,模型的推理是否稳健?
建议记录每次实验的完整日志,包括 Prompt、模型输出、验证指标。可以用 wandb 或 mlflow 管理实验跟踪;项目较小时,保存 JSON 也完全够用。
7. 总结与学习路线
本文围绕“LLM 能否发现科学定律”这个问题,从概念原理到工程实现做了一个完整拆解。你可能已经发现,当前 LLM 在“发现”定律的过程中,更像是一个强大的“知识联想器与假设生成器”,而不是真正的“独立实验科学家”。它能够在少量样本下快速给出候选公式,但最终是否成立,仍然依赖数值拟合与对照实验。
通过本文学到的内容主要包括:
- 真实世界数据与平行世界数据的生成与差异。
- 如何把实验数据序列化成 Prompt 并调用 LLM。
- 如何设计结构化 Prompt,让模型输出可解析的 JSON 结果。
- 如何用数值拟合验证模型给出的公式。
- 如何构造多轮反馈闭环,提高推断准确率。
如果你对这个方向感兴趣,下一步可以尝试这几个方向:
- 扩展到更多物理定律,例如弹簧振子、单摆周期、行星运动等。
- 引入符号回归工具(如 PySR)与 LLM 做对比,分析两者各自的优势。
- 在平行世界数据中引入更复杂的组合参数,例如同时改变重力加速度与空气阻力系数,观察模型能否区分多个因素。
- 尝试让 LLM 编写仿真代码,由仿真结果代替真实实验完成闭环验证。
实际项目中,这类方法也可用于异常检测、装备故障诊断、工业参数反演等场景。核心思路是一致的:让 LLM 提供候选解释,再用严格数值方法做筛选。
如果在运行本文代码时遇到问题,建议按“环境变量 → API 返回格式 → Prompt 内容 → 数值验证”的顺序排查。代码本身不复杂,真正的难度在于如何设计一份既能发挥模型能力、又不会暴露答案的 Prompt。希望本文能帮你少走一些弯路。
