EVIL算法:用LLM引导进化搜索攻克时序数据零样本推理难题

发布时间:2026/6/22 5:30:17
EVIL算法:用LLM引导进化搜索攻克时序数据零样本推理难题
1. 项目概述当LLM学会“进化”时序推理的零样本难题被攻克了吗最近在跟几个做时序数据分析的朋友聊天大家普遍有个头疼的问题面对一个全新的、没有历史标签的时序数据序列比如预测某个新上线App的次日用户活跃度或者判断一台刚部署的工业设备未来几小时的运行状态传统的模型往往束手无策。它们严重依赖大量的标注数据来训练但在“零样本”的场景下——也就是模型在训练阶段完全没见过这类数据——性能会急剧下降。这时候一个名为“EVIL”的算法框架进入了我的视野。EVIL这个名字听起来有点“邪恶”但它的全称“Evolutionary Search via Iterative LLM prompting”却揭示了一种非常巧妙的思路让大语言模型LLM驱动一个进化搜索过程来解决零样本下的时序推理任务。简单来说EVIL不再把LLM当作一个直接生成答案的“神谕”而是把它变成一个“策略大脑”去指导一个搜索算法进化算法在可能的解决方案空间里进行高效探索。你可以把它想象成玩一个复杂的解谜游戏LLM是那个经验丰富的“军师”它虽然不能直接告诉你最终答案但它能根据当前局势搜索状态给出下一步最该尝试哪个方向如何变异或交叉候选解的建议。通过这种“LLM建议-搜索执行”的循环迭代系统能在没有见过任何同类数据样本的情况下逐步逼近最优的推理策略或预测函数。这无疑为金融风控、工业预测性维护、物联网数据分析等领域打开了一扇新的大门。如果你正在为缺乏标注数据而发愁或者对LLM如何与经典算法结合感兴趣那么EVIL的设计思路和实现细节值得你花时间深入了解。2. EVIL核心设计思路为什么是“进化搜索”“LLM”2.1 零样本时序推理的固有挑战要理解EVIL为什么这么设计首先得看清它要解决什么问题。时序推理无论是预测、分类还是异常检测传统机器学习模型如LSTM、Transformer的核心能力来自于从海量标注数据中学习到的模式映射。但在零样本设定下这条路径被堵死了。模型面对的是一个完全陌生的数据分布它之前的“经验”几乎派不上用场。这时候我们需要的不是一個记忆库而是一个强大的“推理引擎”和“策略生成器”。它需要能够理解时序数据的抽象特征如周期性、趋势、波动性并能根据任务描述例如“预测未来三个时间点的值”动态地组合出合适的处理逻辑。直接让LLM进行端到端的数值预测是行不通的。LLM擅长处理符号和语言但对高精度、连续型的数值计算并不敏感且存在幻觉和输出不一致的问题。因此需要一个中间层将LLM的推理能力“转化”为对搜索过程的智能引导。2.2 进化搜索一个灵活的问题解决框架进化算法Evolutionary Algorithm, EA是一类受生物进化启发的全局优化算法。它的核心流程包括初始化一个随机解集种群评估每个解的适应性Fitness选择适应性高的解作为父代通过交叉Crossover和变异Mutation产生子代迭代循环。它的优势在于对问题域的先验知识要求低不需要梯度信息非常适合在复杂、非凸、离散的解空间中进行探索。将时序推理任务如构建一个预测公式定义为一个搜索问题那么每个“解”就是一段可能用于推理的程序代码例如一个由数学运算符、统计函数、条件语句组成的表达式树。进化算法可以在这个巨大的程序空间里进行漫游。但传统进化算法是盲目的变异和交叉是随机的效率低下尤其是在解空间巨大时可能需要无数代才能找到一个勉强可用的解。2.3 LLM作为进化过程的“认知引导器”这就是LLM登场的关键所在。EVIL的创新在于它用LLM替代或增强了进化算法中“随机”的变异和交叉算子。在每一代进化中算法会从当前种群中选出几个有潜力的候选解程序代码连同任务描述、历史进化信息一起构造提示词Prompt输入给LLM。LLM的任务不是直接生成新解而是分析这些现有解的优劣并提出具体的、有针对性的“修改建议”。例如提示词可能是“当前任务是预测股票收盘价。现有候选解A使用了‘移动平均’函数但窗口过大候选解B忽略了交易量特征。请分析它们的问题并提出三个具体的、可操作的修改方案来生成更好的预测程序。” LLM可能会回复“1. 将解A的移动平均窗口从20调整为5。2. 在解B中加入前一日交易量与价格变化的乘积作为特征。3. 尝试在解A中引入一个基于波动率标准差的条件判断语句。”系统随后会将这些自然语言描述的建议通过确定的规则例如一个解析器转化为对程序语法树的具体操作如替换节点、插入子树从而生成高质量的子代个体。这个过程相当于为进化算法安装了一个“实时策略分析引擎”让搜索从“随机漫步”变成了“有指导的探索”极大地加速了收敛过程并提升了最终解的质量。注意这里LLM并不需要理解代码的精确执行语义它只需要理解代码的“结构意图”和与任务描述的逻辑关联。这种“模糊匹配”正是LLM所擅长的。3. 算法架构与核心组件拆解3.1 EVIL的整体工作流程EVIL将一个零样本时序推理任务的处理规范化为一个可迭代执行的循环流程。理解这个流程是复现或应用该方法的基础。问题格式化首先将时序推理任务转化为一个搜索问题。这包括解表示确定如何用结构化的方式如抽象语法树AST、特定领域的语言DSL来表示一个“推理程序”。适应性函数定义如何评价一个解的好坏。对于预测任务通常是预测值与真实值在验证段注意不是训练段因为零样本上的误差如MSE, SMAPE。任务描述用自然语言清晰定义任务目标、可用数据特征如“包含过去24小时的温度、湿度序列”和期望输出如“输出未来6小时的温度预测值”。初始化种群随机生成或使用一些启发式方法如基于常见统计操作生成一批初始解程序构成第一代种群。进化循环开始迭代以下步骤直到达到预设代数或适应度满足要求。评估与选择计算当前种群所有个体的适应度并依据适应度排名选择出一批“精英”个体和“有潜力”的个体作为LLM分析的素材。LLM提示构造与查询这是核心步骤。将选出的个体、它们的适应度得分、任务描述、以及可能的进化历史如上几代的最佳修改建议组合成一个结构化的提示。提示的设计质量直接决定LLM输出的有效性。LLM建议解析与执行接收LLM返回的自然语言建议。需要一个解析器Parser将这些建议映射为对程序语法树的具体操作指令“变异算子”。例如LLM说“增加一个指数平滑项”解析器需要知道如何在AST中插入一个带有特定参数的指数平滑函数节点。生成子代利用解析得到的定向变异算子对父代个体进行操作产生新一代的子代个体。同时可以保留一部分传统的随机变异和交叉以维持种群多样性。种群更新将子代个体与部分父代精英个体合并形成新一代种群。输出与部署进化结束后选择适应度最高的个体推理程序作为最终解。这个程序可以被提取、固化并应用于对同类新数据进行推理。3.2 提示工程如何与LLM高效“对话”提示词是EVIL与LLM交互的接口其设计至关重要。一个糟糕的提示会导致LLM输出无关或无法解析的废话。一个有效的提示通常包含以下部分系统角色设定明确LLM的角色例如“你是一个擅长算法优化和时序数据分析的专家。”任务上下文清晰陈述时序推理任务的具体目标、数据格式和约束。当前候选解展示以清晰、结构化的格式如代码块展示2-4个待分析的候选程序并附上其当前的适应度评分。分析指令要求LLM对比分析这些解的优缺点指出其结构上的不足或改进机会。例如“请从过拟合、特征利用、计算复杂度三个角度分析以下程序。”行动指令明确要求LLM输出具体的、可操作的修改建议。格式必须严格限定以方便后续解析。例如“请严格按照以下JSON格式输出你的建议{improvement_focus: 字符串指出改进方向, concrete_operation: 字符串描述具体的代码修改动作}”。可以要求一次输出3-5条不同方向的建议。历史信息可选提供上一轮进化中产生良好效果的建议示例让LLM保持一致的改进风格。实操心得在初期建议先用少量迭代手动检查LLM的输出调整提示词。重点确保“行动指令”部分LLM能稳定输出结构化的、可解析的内容。使用gpt-4-turbo或claude-3-opus这类高级模型在此环节的稳定性和逻辑性远优于小型模型。3.3 解表示与变异算子设计解的表达方式决定了搜索空间的大小和形状也直接影响LLM建议的解析难度。基于DSL的表达式树这是最常用的方式。定义一个领域特定语言包含基本的运算 - * /、函数moving_avg,diff,std、常量和特征引用。一个解就是一棵由这些元素构成的树。LLM的建议如“将常数5改为一个可学习的参数α”对应着将树中的一个叶子节点从常数改为参数节点。基于模板的程序骨架对于更复杂的推理逻辑可以预设一个程序模板其中包含一些可填充的“槽位”。例如一个预测程序模板可能是if [condition] then [expression1] else [expression2]。LLM的任务就是为这些[condition]、[expression]槽位生成具体的代码片段。这种方式搜索空间更可控但灵活性稍差。变异算子是连接LLM自然语言建议和程序修改的桥梁。解析器需要维护一个“建议-操作”映射表。例如LLM建议“引入一个滞后一阶的特征”。 - 操作在表达式树中插入一个lag(feature_x, order1)节点。LLM建议“组合特征A和特征B的交互项”。 - 操作将当前树中某个节点替换为multiply(feature_a, feature_b)。LLM建议“简化过于复杂的表达式移除冗余项”。 - 操作遍历语法树识别并删除那些对输出影响极小的子树需要结合轻量级评估。4. 实操构建从零搭建一个简易EVIL原型理论说了这么多我们来动手搭建一个针对“单变量时序预测”的简易EVIL原型。我们将使用Python以开源的gpt-3.5-turboAPI或本地部署的Qwen等开源LLM作为引导模型以符号回归作为程序搜索的载体。4.1 环境准备与依赖安装首先确保你的Python环境建议3.9以上并安装必要库。我们主要需要用于与LLM交互的openai库若用其他API需相应调整用于表示和操作表达式树的sympy库以及基础的科学计算库。pip install openai sympy numpy scikit-learn如果你使用本地LLM例如通过ollama运行Qwen则需要安装ollama并拉取模型然后使用其提供的Python库或直接调用HTTP API。4.2 定义解空间与适应性函数我们定义解为一个由sympy符号表达式表示的数学公式。基础操作符集设为{add, sub, mul, div, sin, cos, exp, log, sqrt}特征为时序序列X及其滞后项X(t-1),X(t-2)等。import numpy as np import sympy as sp from typing import List, Tuple # 定义符号 t sp.symbols(t) X sp.Function(X) # 我们实际上用序列值这里用符号表示。实际操作中X(t)代表当前值X(t-1)代表滞后一期。 def create_random_expression(depth3): 随机生成一个深度为depth的表达式树简化版。 # 这是一个简化示例实际需要更复杂的递归生成逻辑 ops [sp.Add, sp.Mul, sp.sin, sp.cos] # ... 具体实现递归生成随机表达式树 pass def fitness(expr, series: np.ndarray, forecast_steps: int) - float: 计算表达式expr的适应度。 思路将表达式解释为一个预测函数用前N个点预测下一个点滚动预测forecast_steps步计算RMSE。 # 将sympy表达式编译为numpy函数以提高速度 # expr中可能包含X(t), X(t-1)等需要将其映射为series数组的索引。 # 这是一个关键且复杂的步骤需要实现一个简单的“解释器”。 # 简化起见假设expr只使用X(t)和常数。 try: # 此处为示意代码 func sp.lambdify(t, expr, numpy) # 进行滚动预测计算误差... predictions [] for i in range(len(series) - forecast_steps): # 这里需要根据expr的结构动态计算非常复杂 pass actual series[forecast_steps:] rmse np.sqrt(np.mean((predictions - actual) ** 2)) return -rmse # 适应度越高越好所以取负误差 except: return -np.inf # 无效表达式赋予最差适应度4.3 实现LLM引导的变异器这是EVIL的核心。我们构建一个类负责构造提示、调用LLM、解析建议并执行变异。import openai import json class LLMGuidedMutator: def __init__(self, api_key, modelgpt-3.5-turbo): self.client openai.OpenAI(api_keyapi_key) self.model model # 定义操作映射简化版 self.operation_map { 增加滞后项: self._add_lag_term, 常数优化: self._optimize_constant, 添加非线性变换: self._add_nonlinear, 简化表达式: self._simplify_expr, } def build_prompt(self, candidate_exprs: List[Tuple[str, float]], task_desc: str) - str: 构建提示词。 candidates_text \n.join([f程序 {i1} (适应度 {score:.4f}): {expr} for i, (expr, score) in enumerate(candidate_exprs)]) prompt f 你是一个时序预测算法优化专家。 任务描述{task_desc} 现有以下候选预测公式及其适应度越高越好 {candidates_text} 请分析这些公式可能存在的问题如是否过拟合、是否忽略了重要特征、是否过于复杂等然后提出3条具体、可操作的修改建议来提升其预测性能。 每条建议请严格遵循以下JSON格式输出 {{analysis: 简要分析, suggestion: 具体的修改操作描述}} 例如 {{analysis: 程序1过于依赖当前值缺乏历史趋势信息。, suggestion: 增加一个一阶滞后项 X(t-1) 并赋予一个可调权重。}} return prompt def get_suggestions(self, prompt: str) - List[dict]: 调用LLM API获取建议。 response self.client.chat.completions.create( modelself.model, messages[{role: user, content: prompt}], temperature0.7, max_tokens800 ) content response.choices[0].message.content # 尝试从返回文本中解析出JSON数组。实际中需要更健壮的解析。 suggestions [] # 这里简化处理假设LLM返回了纯JSON数组或每行一个JSON对象 # 实际应用需要复杂的文本清洗和JSON解析可能结合正则表达式。 return suggestions def mutate(self, expr, suggestion: dict) - sp.Expr: 根据一条建议对表达式进行变异。 op_desc suggestion.get(suggestion, ) # 这里需要根据op_desc的关键词匹配到self.operation_map中的具体函数 for key, op_func in self.operation_map.items(): if key in op_desc: return op_func(expr, suggestion) # 如果没有匹配到返回一个随机轻微变异 return self._random_mutation(expr) def _add_lag_term(self, expr, suggestion): 实现增加滞后项的操作。 # 在expr中随机选择一个叶子节点或根节点将其替换为 Add(expr, coeff * X(t-lag)) # 需要修改sympy表达式树的结构 pass # ... 其他操作函数的具体实现4.4 组装主进化循环将以上组件组装起来形成完整的进化流程。def evil_evolution(series: np.ndarray, task_desc: str, pop_size20, generations50, mutator: LLMGuidedMutator): 主进化函数。 # 1. 初始化种群 population [create_random_expression() for _ in range(pop_size)] fitness_scores [fitness(expr, series, forecast_steps5) for expr in population] for gen in range(generations): # 2. 选择这里使用锦标赛选择 selected_indices select_by_tournament(fitness_scores, tournament_size3, num_selected4) candidates [(str(population[i]), fitness_scores[i]) for i in selected_indices] # 3. LLM引导变异 prompt mutator.build_prompt(candidates, task_desc) suggestions mutator.get_suggestions(prompt) new_offspring [] for idx in selected_indices: if suggestions: # 为每个选中的父代选择一条建议进行变异 chosen_suggestion np.random.choice(suggestions) new_expr mutator.mutate(population[idx], chosen_suggestion) new_offspring.append(new_expr) # 也加入一些随机变异个体保持多样性 new_offspring.append(random_mutate(population[idx])) # 4. 评估子代 offspring_fitness [fitness(expr, series, forecast_steps5) for expr in new_offspring] # 5. 种群更新精英保留子代替换 # 合并父代和子代选择适应度最高的pop_size个个体 combined list(zip(population new_offspring, fitness_scores offspring_fitness)) combined.sort(keylambda x: x[1], reverseTrue) population [expr for expr, _ in combined[:pop_size]] fitness_scores [score for _, score in combined[:pop_size]] print(fGeneration {gen}: Best Fitness {max(fitness_scores):.4f}) # 返回最佳个体 best_idx np.argmax(fitness_scores) return population[best_idx], fitness_scores[best_idx]注意事项以上代码是一个高度简化的原型框架用于阐述核心流程。在实际应用中fitness函数的实现特别是对任意表达式树的解释执行、LLMGuidedMutator中建议到具体语法树操作的映射解析器以及表达式树的随机生成和变异都是极其复杂且需要大量工程工作的部分。建议先从非常受限的解空间例如只允许加法和乘法开始实验。5. 关键参数调优与性能影响因素分析要让EVIL算法真正work起来而不是停留在理论阶段以下几个参数的调校至关重要。5.1 LLM相关参数模型选择模型的推理能力和遵循指令的能力是关键。GPT-4、Claude-3系列在复杂逻辑分析和结构化输出方面显著优于GPT-3.5。如果使用开源模型Qwen-72B、Mixtral等是较好的选择。较小的模型7B, 13B可能无法稳定输出高质量的结构化建议。提示词温度Temperature建议设置在0.5~0.8之间。过低的温度如0.1会导致建议缺乏创造性容易陷入局部最优过高的温度如1.2则可能使建议变得天马行空无法解析。系统提示System Prompt明确赋予LLM“算法优化专家”的角色并严格要求其输出格式能显著提升建议的质量和可解析率。上下文长度每一代都需要将候选解和任务描述发送给LLM。如果解的程序表示很长需注意不要超出模型的上下文窗口。必要时需要对程序进行摘要或截断。5.2 进化算法参数种群大小通常设置在20-100之间。较小的种群利于快速迭代但多样性不足较大的种群能探索更广的空间但每一代的计算LLM调用和适应度评估成本激增。选择压力选择多少个体以及如何选择给LLM分析。通常选择适应度中等偏上的个体而非绝对最优的个体进行分析效果更好。因为最优个体可能已接近局部最优改进空间小而中等个体问题更明显LLM更容易提出有效建议。可以采用“锦标赛选择”或“适应度比例选择”的变体。变异与交叉的平衡EVIL中LLM主要指导“定向变异”。但仍需保留一定比例如20%-30%的随机变异和交叉操作。随机变异负责探索未知区域防止早熟收敛交叉则能组合不同个体的优良模块。精英保留比例每一代必须保留一定比例如10%的最优个体直接进入下一代保证算法不会退化。5.3 解表示与适应度评估解的长度与复杂度惩罚在适应度函数中引入对程序复杂度的惩罚项如表达式树的节点数可以有效防止算法生成过度复杂、可能过拟合的“怪兽公式”。这能引导搜索朝着简洁、可解释的方向进行。适应性评估的效率对每个候选解进行适应度评估通常是执行程序进行预测可能是计算瓶颈。尤其是当种群较大、表达式较复杂时。考虑使用缓存、提前终止对明显糟糕解的评估、或使用代理模型进行快速评估等策略进行加速。任务描述的粒度给LLM的任务描述不能太笼统。例如“预测股价”不如“基于过去20天的收盘价序列预测未来5天的收盘价需注意股价的波动性和短期趋势”来得有效。更细致的描述能约束LLM的想象空间使其建议更聚焦。6. 常见问题、挑战与实战避坑指南在实际尝试实现和应用EVIL的过程中你几乎一定会遇到下面这些问题。以下是我在实验中的一些记录和解决方案。6.1 LLM输出不稳定或无法解析这是初期最大的拦路虎。LLM可能会输出无关评论、格式错误、甚至提出无法在程序语法上实现的建议。问题表现LLM回复“这个程序不错但可以更好”或者建议“使用深度学习模型”这显然无法映射到我们的符号表达式变异上。解决策略强化格式指令在提示词中反复强调输出格式并使用“json ...”这样的代码块包裹示例强制模型结构化输出。设计“安全”的建议词汇表在提示词中明确列出允许的修改操作类型例如“你的建议必须仅限于以下几种类型1. 增加/减少滞后阶数2. 调整常数系数3. 添加/移除基本数学函数sin, cos, exp, log4. 简化表达式。”后处理与重试实现一个健壮的解析器当解析失败时可以尝试提取关键词或直接丢弃该条建议并可能使用一条随机建议替代。对于关键迭代可以设置重试机制当连续多次解析失败时重新生成提示词或降低Temperature再次询问。Few-shot示例在提示词中提供2-3个非常清晰、准确的“输入-输出”示例让LLM进行模仿学习。6.2 搜索效率低下收敛慢即使有LLM引导进化搜索仍然可能在某些问题上徘徊不前。问题表现最佳适应度在几十代后都没有显著提升。解决策略引入多级进化不要在所有代都使用LLM。可以在初期使用随机搜索快速探索中期引入LLM进行精细优化后期再结合局部搜索。动态调整选择策略如果种群多样性下降过快个体间差异小可以临时提高选择给LLM的个体中“表现一般”个体的比例或者增加随机变异算子的概率。缓存与重用LLM建议相似的候选解可能得到相似的改进建议。可以建立一个缓存将(程序指纹, 任务描述)映射到历史上成功的修改建议。当遇到相似程序时优先从缓存中抽取建议减少不必要的LLM调用节省成本和时间。并行评估适应度评估通常是独立的可以并行化以加速单次迭代。6.3 过拟合与泛化能力不足在有限的验证段上找到的最佳程序可能在真正的未来数据上表现糟糕。问题表现在进化验证集上表现优异但在额外的测试集上误差很大。解决策略使用早停法保留一个独立的验证集监控其上的性能。当验证集性能连续多代不再提升时停止进化。在适应度中加入正则化如前所述对程序复杂度长度、深度、操作符数量进行惩罚。数据增强对输入时序数据进行轻微的扰动如添加微小噪声、进行时间缩放让进化出的程序对噪声更鲁棒。集成学习不依赖单一的最优解而是保留最后几代中表现优异且结构差异较大的多个程序在推理时对它们的输出进行平均或投票可以提升稳定性和泛化能力。6.4 计算与成本开销LLM API调用和大量程序执行是主要开销。成本控制批量处理在一轮迭代中将多个候选解打包在同一个提示词中发送给LLM请求其对这一批解进行分析和建议这比逐个询问效率高得多。使用小型/本地LLM进行初筛可以用一个较小的、快速的本地模型如Phi-3-mini,Qwen1.5-7B进行初步的建议生成只对其中看起来最有潜力的建议再用大型、昂贵的模型进行复核和精炼。适应性评估优化对明显无意义的程序如除零、产生无限值进行快速失败判断避免不必要的完整评估。7. 进阶思考与应用场景拓展EVIL的范式不仅仅适用于时序符号回归。它的核心思想——用LLM的推理能力来引导一个面向目标的搜索过程——可以迁移到许多其他零样本或小样本的复杂问题中。7.1 扩展到其他时序任务时序异常检测解空间定义为“异常评分函数”。例如一个程序可能计算滑动窗口内的标准差与阈值的比较或者基于预测残差的函数。LLM的任务是引导搜索使这个函数对正常数据输出低分对异常片段输出高分。时序分类例如根据传感器数据判断设备状态。解空间可以是特征提取分类器的组合逻辑。LLM可以建议添加新的时域/频域特征或者调整分类决策的阈值逻辑。时序表征学习搜索目标是找到一个编码函数程序将原始时序映射到一个低维向量使得这个向量在后续任务如聚类、检索中表现更好。LLM可以指导如何组合多尺度特征来构建这个编码器。7.2 与其他搜索策略结合蒙特卡洛树搜索MCTS在程序生成的每一步如构建表达式树的一个节点利用LLM来评估不同动作的潜在价值或者直接提出高价值的动作候选从而引导MCTS更高效地搜索。强化学习将程序生成视为一个序列决策过程LLM可以作为策略网络的一部分或者作为奖励函数的设计者指导智能体生成更好的程序。7.3 对现实业务系统的集成考量要将EVIL用于生产环境需要考虑更多工程问题稳定性与可重复性LLM的非确定性会导致进化过程有一定随机性。需要多次运行取最优或记录随机种子。解的可解释性与可部署性最终产出的程序公式必须是可解释、可审计的这对于金融、医疗等领域至关重要。同时需要能轻松地转换为生产代码如Python, SQL, C。人机协同可以设计一个交互界面允许领域专家在进化过程中介入对LLM的建议进行认可、否决或修改将人类的先验知识与LLM的搜索能力结合起来形成“人在回路”的混合增强智能系统。从我个人的实验来看EVIL为代表的方法确实为零样本推理问题提供了一条充满想象力的路径。它不再试图让LLM“成为”专家而是让它“辅助”一个搜索系统“成为”专家。这种分工协作的范式或许比一味追求更大的模型参数更能稳健地解决那些缺乏标注数据的现实难题。当然这条路目前还充满工程挑战尤其是如何稳定、高效地将LLM的语言输出与底层的符号操作无缝衔接。如果你正准备尝试我的建议是从一个极其简单、定义明确的玩具问题开始先把“LLM建议 - 程序变异”这个最核心的闭环跑通、跑稳再逐步增加问题的复杂性。这个过程本身就是对LLM如何理解并操作结构化知识的一次深刻探索。