EA-Agent:基于多步推理的实体对齐智能体设计与实现
1. 项目概述当实体对齐遇上“思考型”智能体最近在知识图谱融合和跨领域数据整合的项目里我又一次被“实体对齐”这个老大难问题给绊住了。简单来说实体对齐就是判断两个不同知识图谱里的两个实体比如“苹果公司”和“Apple Inc.”是不是指代同一个现实世界中的对象。这听起来像是简单的字符串匹配但实际操作起来同名异义“苹果”是水果还是公司、异名同义“机器学习”和“ML”、以及不同图谱间结构信息的巨大差异都让这个问题变得异常复杂。传统的实体对齐方法无论是基于嵌入表示学习的还是基于图神经网络GNN的大多遵循一个“编码-比对”的范式先把两个图谱的实体和关系编码成向量然后计算向量间的相似度。这个方法在基准数据集上效果不错但一旦放到真实、复杂、充满噪声的业务数据里就经常“翻车”。模型像一个黑盒你很难理解它为什么认为A和B是对齐的当它出错时你也很难介入和修正。更头疼的是对于需要高度精确对齐的场景比如金融风控、医疗数据整合这种“模糊匹配”带来的不确定性是难以接受的。正是在这种背景下我注意到了“EA-Agent”这个方向。它不是一个具体的工具或框架而是一种将“多步结构化推理”能力赋予实体对齐任务的新思路。简单理解它试图让对齐过程从一个“一次性计算”变成一个“有思考、有步骤的决策过程”。Agent智能体在这里扮演了一个虚拟的“对齐专家”它不再仅仅依赖一次性的向量相似度打分而是会像人一样拆解问题调用不同的工具比如查找属性、分析邻居、验证逻辑一致性一步步地收集证据最终做出一个可解释的、高置信度的对齐判断。这正好切中了当前实体对齐从“追求高召回”到“追求高精度与可解释性”的痛点。2. EA-Agent的核心设计理念从“计算”到“推理”为什么我们需要一个“推理型”的Agent来做实体对齐这得从传统方法的局限性说起。传统的嵌入模型本质上是在学习一个从图谱结构到向量空间的映射函数。它的决策依据是全局的、统计意义上的模式。例如它发现“位于加州库比蒂诺的科技公司”这个模式经常与“苹果”这个实体关联那么当它遇到一个新的实体具有类似邻居时就会倾向于给出高对齐分数。这种方法的软肋在于缺乏可解释性你只知道两个向量很“近”但不知道是哪些具体的属性或关系导致了这种“近”。是公司地址一致还是CEO名字相同模型给不出答案。对噪声和稀疏性敏感如果某个图谱中“苹果公司”的“总部地点”属性缺失或被错误标注为“纽约”基于嵌入的模型很可能就会丢失这个关键对齐线索。难以融入领域知识和规则我们知道“成立日期”必须早于“上市日期”这是一个硬性逻辑规则。但如何让一个端到端的神经网络模型“理解”并应用这条规则来辅助对齐判断非常困难。EA-Agent的设计理念正是为了突破这些限制。它的核心思想是将实体对齐建模为一个序列决策过程。Agent需要观察当前的对齐候选对决定下一步该“调查”什么信息例如去查一下实体的属性列表或者看看它的邻居有哪些然后根据调查结果更新自己的“信念状态”并决定是继续调查、确认对齐还是拒绝对齐。这个过程中有几个关键组件状态StateAgent当前掌握的所有信息包括待对齐的实体对、已收集到的证据如匹配的属性、矛盾的属性、相似的邻居等、以及当前的置信度。动作ActionAgent可以执行的操作。这通常对应着一系列可调用的“工具”Tools。例如get_attributes(entity): 获取实体的所有属性-值对。compare_attributes(entity1, entity2): 比较两个实体的属性找出匹配项和冲突项。get_neighbors(entity, relation_type): 获取实体在特定关系类型下的邻居。check_logical_consistency(evidence): 检查已收集的证据是否存在逻辑矛盾例如两个实体的“成立年份”相差十年但其他属性高度相似。策略Policy决定在给定状态下应该采取哪个动作。这可以是基于规则的if-else也可以是基于学习的如强化学习。策略是Agent的“大脑”它决定了推理路径是否高效、智能。奖励Reward当Agent做出最终判断对齐或不齐后会根据真实标签获得一个奖励信号正奖励或负奖励用于优化其策略。通过这种设计EA-Agent完成一次对齐的过程就像侦探破案一样是一个结构化、多步骤的证据链构建过程。最终的判断不仅有结果还有清晰的推理路径作为支撑极大地提升了可解释性和在复杂情况下的鲁棒性。3. 构建一个基础EA-Agent的实战步骤理解了理念我们来看看如何动手搭建一个基础的EA-Agent。这里我不会依赖某个特定的、未公开的框架而是基于主流Agent开发范式如LangChain、AutoGen的核心思想和实体对齐的专业知识拆解出一个可复现的实现方案。我们的目标是构建一个能处理简单对齐任务的、基于规则的EA-Agent原型。3.1 环境准备与知识图谱数据加载首先我们需要一个实验环境。由于实体对齐涉及图数据处理我们选择Python并搭配常用的库。# 建议使用虚拟环境 pip install networkx pandas numpy # 如果需要更复杂的图操作或未来接入学习组件 pip install torch torch-geometric # 为后续可能的GNN特征提取做准备 pip install langchain langchain-community # 用于构建Agent框架这里主要借鉴其工具调用思想假设我们有两个简单的知识图谱KG1和KG2以CSV格式存储实体、关系、属性。我们首先将它们加载到内存中用NetworkX构建图结构并建立实体属性字典。import pandas as pd import networkx as nx def load_knowledge_graph(entity_file, relation_file, attr_file): 加载知识图谱数据 entities pd.read_csv(entity_file) # 列id, name relations pd.read_csv(relation_file) # 列head, relation, tail attributes pd.read_csv(attr_file) # 列entity_id, attr_name, attr_value G nx.DiGraph() # 添加实体节点 for _, row in entities.iterrows(): G.add_node(row[id], namerow[name]) # 添加关系边 for _, row in relations.iterrows(): G.add_edge(row[head], row[tail], relationrow[relation]) # 构建属性字典 attr_dict {} for _, row in attributes.iterrows(): eid row[entity_id] if eid not in attr_dict: attr_dict[eid] {} attr_dict[eid][row[attr_name]] row[attr_value] return G, attr_dict # 加载两个图谱 kg1_graph, kg1_attrs load_knowledge_graph(kg1_entities.csv, kg1_relations.csv, kg1_attributes.csv) kg2_graph, kg2_attrs load_knowledge_graph(kg2_entities.csv, kg2_relations.csv, kg2_attributes.csv)3.2 定义Agent的“工具包”Tools工具是Agent感知和操作环境的手段。我们为EA-Agent定义几个最核心的工具。class EAAgentTools: def __init__(self, kg1_graph, kg1_attrs, kg2_graph, kg2_attrs): self.kg1 kg1_graph self.attrs1 kg1_attrs self.kg2 kg2_graph self.attrs2 kg2_attrs def get_attributes(self, entity_id: str, kg_source: str): 工具1获取指定实体的所有属性 attrs self.attrs1 if kg_source kg1 else self.attrs2 return attrs.get(entity_id, {}) def compare_attributes(self, entity1_id: str, entity2_id: str): 工具2比较两个实体的属性返回匹配、部分匹配和冲突项 attrs1 self.get_attributes(entity1_id, kg1) attrs2 self.get_attributes(entity2_id, kg2) exact_match [] partial_match [] # 例如字符串包含关系 conflict [] for key1, val1 in attrs1.items(): for key2, val2 in attrs2.items(): # 简单的属性名相似度判断实际中可能需要更复杂的语义匹配 if key1.lower() key2.lower(): if val1.lower() val2.lower(): exact_match.append((key1, val1, key2, val2)) elif val1.lower() in val2.lower() or val2.lower() in val1.lower(): partial_match.append((key1, val1, key2, val2)) else: conflict.append((key1, val1, key2, val2)) return { exact_match: exact_match, partial_match: partial_match, conflict: conflict } def get_neighbors(self, entity_id: str, kg_source: str, relation_type: str None): 工具3获取实体的邻居。可以按关系类型过滤。 graph self.kg1 if kg_source kg1 else self.kg2 neighbors [] if relation_type: # 获取特定类型的出边和入边邻居 out_neighbors [(graph.nodes[n].get(name, n), out) for (u, v, d) in graph.out_edges(entity_id, dataTrue) if d.get(relation) relation_type] in_neighbors [(graph.nodes[n].get(name, n), in) for (u, v, d) in graph.in_edges(entity_id, dataTrue) if d.get(relation) relation_type] neighbors out_neighbors in_neighbors else: # 获取所有邻居 out_neighbors [(graph.nodes[n].get(name, n), out) for n in graph.successors(entity_id)] in_neighbors [(graph.nodes[n].get(name, n), in) for n in graph.predecessors(entity_id)] neighbors out_neighbors in_neighbors return neighbors def check_consistency(self, evidence: dict): 工具4基于简单规则检查证据的一致性 # 示例规则如果存在核心属性冲突如成立年份相差2年则一致性低 conflicts evidence.get(conflict, []) core_attrs [founded, established, creation_date] for conf in conflicts: attr1, val1, attr2, val2 conf if any(core in attr1.lower() for core in core_attrs): # 尝试提取年份并比较这里简化处理 try: year1 int(.join(filter(str.isdigit, val1))[:4]) year2 int(.join(filter(str.isdigit, val2))[:4]) if abs(year1 - year2) 2: return False, f核心时间属性{attr1}冲突过大: {val1} vs {val2} except: pass return True, 无明显硬性冲突3.3 设计Agent的推理策略与状态机这是EA-Agent的“大脑”。我们从一个基于规则的、确定性的策略开始。这个策略定义了一个固定的推理流程。class RuleBasedEAAgent: def __init__(self, tools: EAAgentTools): self.tools tools self.state { candidate_pair: None, # (kg1_entity_id, kg2_entity_id) evidence: { exact_match: [], partial_match: [], conflict: [], neighbor_overlap: [] }, confidence: 0.0, step_history: [] # 记录每一步的动作和结果 } def reset(self, entity1_id, entity2_id): 为新的候选对重置状态 self.state { candidate_pair: (entity1_id, entity2_id), evidence: {exact_match: [], partial_match: [], conflict: [], neighbor_overlap: []}, confidence: 0.0, step_history: [] } def execute_policy(self): 执行预定义的多步推理策略 e1, e2 self.state[candidate_pair] # 步骤1比较属性 attr_result self.tools.compare_attributes(e1, e2) self.state[evidence][exact_match] attr_result[exact_match] self.state[evidence][partial_match] attr_result[partial_match] self.state[evidence][conflict] attr_result[conflict] self.state[step_history].append((compare_attributes, attr_result)) self._update_confidence_step1() # 步骤2检查一致性 is_consistent, msg self.tools.check_consistency(self.state[evidence]) self.state[step_history].append((check_consistency, (is_consistent, msg))) if not is_consistent: self.state[confidence] -1.0 # 直接否定 return self.state # 步骤3比较关键关系的邻居例如“创始人”、“所在地” key_relations [founder, location, industry] neighbor_overlap [] for rel in key_relations: neigh1 set([name for name, _ in self.tools.get_neighbors(e1, kg1, rel)]) neigh2 set([name for name, _ in self.tools.get_neighbors(e2, kg2, rel)]) overlap neigh1.intersection(neigh2) if overlap: neighbor_overlap.append((rel, list(overlap))) self.state[evidence][neighbor_overlap] neighbor_overlap self.state[step_history].append((compare_key_neighbors, neighbor_overlap)) self._update_confidence_step2() # 步骤4最终决策 return self.state def _update_confidence_step1(self): 基于属性证据更新置信度规则示例 base_score 0.0 base_score len(self.state[evidence][exact_match]) * 2.0 base_score len(self.state[evidence][partial_match]) * 0.5 base_score - len(self.state[evidence][conflict]) * 3.0 # 归一化到一个粗略的范围例如[-5, 5] self.state[confidence] max(-5.0, min(5.0, base_score)) def _update_confidence_step2(self): 基于邻居重叠证据更新置信度 neighbor_score 0.0 for rel, overlap_list in self.state[evidence][neighbor_overlap]: neighbor_score len(overlap_list) * 1.5 # 关键关系匹配权重更高 self.state[confidence] neighbor_score # 可以设置一个经验阈值例如 3.0 认为对齐 -2.0 认为不对齐 # 这里我们只更新分数决策可以外部做 def get_decision(self, threshold_positive3.0, threshold_negative-2.0): 根据最终置信度做出决策 if self.state[confidence] threshold_positive: return ALIGN, self.state[confidence], self.state[step_history] elif self.state[confidence] threshold_negative: return MISALIGN, self.state[confidence], self.state[step_history] else: return UNCERTAIN, self.state[confidence], self.state[step_history]3.4 运行与评估Agent现在我们可以用这个Agent来测试一对实体。# 初始化工具和Agent tools EAAgentTools(kg1_graph, kg1_attrs, kg2_graph, kg2_attrs) agent RuleBasedEAAgent(tools) # 假设我们从某种候选生成方法中得到了一个候选对 (kg1_e123, kg2_e456) candidate_entity_kg1 e123 # 对应“Apple Inc.” candidate_entity_kg2 e456 # 对应“Apple” agent.reset(candidate_entity_kg1, candidate_entity_kg2) final_state agent.execute_policy() decision, confidence, reasoning_chain agent.get_decision() print(f对齐决策: {decision}) print(f置信度: {confidence:.2f}) print(\n推理链:) for i, (step, result) in enumerate(reasoning_chain): print(f 步骤{i1}: {step}) print(f 结果摘要: {str(result)[:100]}...) # 打印前100字符 print(f\n详细证据:) print(f 精确匹配属性: {final_state[evidence][exact_match]}) print(f 部分匹配属性: {final_state[evidence][partial_match]}) print(f 冲突属性: {final_state[evidence][conflict]}) print(f 邻居重叠: {final_state[evidence][neighbor_overlap]})通过这样的输出我们不仅得到了一个对齐判断还获得了一个清晰的、结构化的推理过程报告。这对于调试和信任建立至关重要。4. 从规则到学习EA-Agent的进阶策略设计基于规则的Agent虽然可解释性强但其推理能力受限于预设规则的完备性。在真实场景中对齐逻辑可能非常复杂且隐含。这就是为什么EA-Agent的研究会向基于学习的策略演进特别是强化学习Reinforcement Learning, RL。4.1 将实体对齐建模为马尔可夫决策过程MDP要让Agent学会自己寻找最优的推理路径我们首先需要将问题形式化为一个标准的RL问题。状态S需要被数字化。可以包括实体对的初始嵌入相似度、已收集的各类证据的统计特征如匹配属性数、冲突属性数、关键邻居重合度等、当前步骤数等。我们可以用一个特征向量来表示状态s_t。动作A即3.2节中定义的工具集合。例如a_t可以是compare_attributes,get_neighbors(founder),check_consistency等。动作空间是离散的。状态转移P执行动作a_t后会调用对应的工具得到观察结果如匹配的属性列表这个结果会更新证据从而产生新的状态s_{t1}。转移过程是确定性的给定工具和输入输出确定。奖励R这是引导Agent学习的关键。设计奖励函数需要技巧最终奖励当Agent决定终止并给出最终判断时如果判断正确给予一个大的正奖励如10如果错误给予一个大的负奖励如-10。中间奖励稀疏奖励问题为了引导学习过程可以设计一些中间奖励。例如每发现一个精确匹配的核心属性给予一个小正奖励0.5每发现一个关键冲突给予一个小负奖励-1每执行一个步骤给予一个微小的负奖励-0.1以鼓励高效推理避免无意义的循环。折扣因子γ通常设置为0.9或0.99表示未来奖励的现值。4.2 使用深度Q网络DQN训练推理策略我们可以采用经典的DQN算法来训练Agent的策略网络。策略网络Q(s, a; θ)的输入是状态向量s输出是每个可选动作a的Q值预期累积回报。Agent根据ε-greedy策略选择Q值最高的动作或随机探索。训练循环概览初始化经验回放缓冲区Replay BufferD容量为N。初始化Q网络主网络和目标Q网络参数相同。对于每一个训练轮次episodea. 随机采样一个已标注的实体对齐候选对初始化Agent状态。 b.对于每一步step直到Agent终止i. Agent根据当前状态s_t和Q网络以ε概率随机选择动作选择动作a_t。 ii. 执行动作a_t调用工具得到观察结果更新内部证据计算出新状态s_{t1}和即时奖励r_t。 iii. 将经验元组(s_t, a_t, r_t, s_{t1}, done)存入缓冲区D。 iv. 从D中随机采样一小批mini-batch经验。 v.计算目标Q值对于非终止状态y_j r_j γ * max_{a} Q_target(s_{j1}, a; θ-)对于终止状态y_j r_j。 vi. 计算损失均方误差L(θ) (y_j - Q(s_j, a_j; θ))^2。 vii. 使用梯度下降更新主Q网络参数θ。 viii. 每隔C步将主网络参数复制给目标网络θ- ← θ。 ix. 状态更新s_t ← s_{t1}。 c. 如果达到终止状态Agent做出判断或超过最大步数本轮结束。通过大量这样的轮次训练Q网络会逐渐学会在什么样的证据状态下采取什么样的调查动作能最大化长期回报即最终正确对齐的概率。4.3 规则与学习结合的混合策略在实际工业级应用中纯学习的方法可能存在冷启动慢、在极端情况下行为不可控的风险。一个更稳健的方案是混合策略。初级阶段规则主导当Agent经验不足或状态置信度很低时使用一套保守的、基于规则的“安全策略”。例如只要发现核心属性存在硬冲突立即终止并返回“不对齐”避免浪费计算资源。高级阶段学习模型主导当证据模糊、规则无法给出明确指示时将决策权交给训练好的Q网络。Q网络可以学习到更微妙的、基于统计的模式比如“虽然成立年份不匹配但创始人、核心产品和多个高层管理人员都匹配且成立年份数据来源可信度较低因此仍可能对齐”。元控制器可以设计一个更上层的“元控制器”根据当前状态的复杂度、不确定性以及历史动作的有效性动态决定是调用规则引擎还是学习模型。这本身也可以作为一个学习问题。这种混合方式既保证了系统在关键逻辑上的可靠性与可解释性规则部分又赋予了其处理复杂、模糊情况的学习与适应能力。5. 工程实践中的挑战与优化技巧将EA-Agent从原型推向生产环境会遇到一系列工程挑战。以下是我在实践摸索中总结的几个关键点和应对技巧。5.1 工具设计的粒度与效率平衡工具Tools是Agent与知识图谱交互的接口。工具设计得太粗如get_all_information(entity)Agent的操控性差动作空间小不利于精细推理。设计得太细如get_attribute(entity, “founded_year”)会导致动作空间爆炸增加学习难度且每一步交互的通信开销巨大。我的经验是采用“中等粒度”的工具设计并按领域分组属性探查组get_core_attributes(entity)获取如名称、类型、时间、地点等核心属性、get_descriptive_attributes(entity)获取描述性文本属性。关系探查组get_neighbors_by_relation(entity, relation_category)。这里的relation_category可以是预定义的如“人物关系”、“地理关系”、“产品关系”而不是成千上万种具体关系。证据分析组compare_and_summarize(evidence_so_far)对已有证据做摘要计算匹配度、冲突度等统计量、check_plausibility(entity1, entity2)基于常识或领域规则进行快速合理性检查。这样动作空间被控制在几十个的合理范围内同时每个动作都能获取有信息量的观察结果。5.2 状态表示的构建从原始观察到信息摘要原始观察如一大串属性值列表不适合直接作为RL的状态输入。我们需要设计一个状态编码器将历史动作和观察序列压缩成一个固定维度的、富含信息的向量。一个有效的做法是维护几个关键的证据摘要统计量作为状态的核心部分数值特征精确匹配属性数、部分匹配属性数、冲突属性数、关键关系邻居重合度、文本属性相似度如TF-IDF余弦值等。分类特征最高匹配属性的类型如“名称”、“地点”、“时间”、最严重冲突的类型、当前调查阶段“属性对比期”、“关系验证期”、“最终裁决期”等进行one-hot编码。时序/历史特征已执行步骤数、最近三次动作的类型、置信度的变化趋势等。将这些特征拼接成一个向量作为状态s_t。这比使用完整的原始观察历史要高效得多也更能抓住问题的关键。5.3 奖励函数设计的艺术引导智能体学会“思考”奖励函数是指引Agent学习的“指挥棒”。设计不当会导致Agent学会“作弊”或行为怪异。避免短视奖励如果只对发现匹配属性给予即时奖励Agent可能会沉迷于不断调用get_core_attributes而不去调用更耗时但可能提供决定性证据的get_neighbors。因此需要赋予最终正确判断更高的奖励让Agent学会为长远结果规划。惩罚无效探索与循环除了每步给予微小负奖励还可以在状态特征中加入对重复动作或循环模式的检测并给予额外惩罚。分层奖励对于难度不同的对齐任务可以设置动态奖励。例如对齐两个名称完全不同的实体异名同义比对齐名称相似的实体同名异义更难成功后应获得更高奖励。这可以通过一个基于任务初始难度的奖励乘子来实现。利用预训练模型提供辅助奖励在训练初期可以用一个快速但粗糙的预训练对齐模型如基于嵌入的模型对Agent的中间状态进行评估给出一个“软”的、近似正确的奖励信号帮助Agent在早期快速入门解决稀疏奖励问题。5.4 与现有对齐管道的集成EA-Agent不应该取代整个对齐管道而应作为其中一个增强模块集成进去。一个典型的集成架构是候选生成Blocking使用传统的字符串匹配、嵌入索引等方法快速从海量实体对中筛选出Top-K个最有可能的候选对。这一步负责“召回”。精细判别EA-Agent将Top-K候选对送入EA-Agent进行多步推理验证。这一步负责“精准”。后处理与融合收集所有Agent的判断结果和置信度。对于高置信度的对齐对直接采纳。对于低置信度或冲突的结果可以送入人工审核池或者采用投票、集合方法进行最终裁决。这种架构平衡了效率与精度。EA-Agent只处理最有可能、最需要仔细甄别的候选对避免了在全量对上运行带来的巨大计算开销。6. 效果评估与可解释性分析评估一个EA-Agent不能只看最终的准确率、召回率、F1值这些传统指标更要关注其作为“推理智能体”的特有属性。6.1 多维度评估指标决策准确性即传统的Precision, Recall, F1。这是基础。推理效率平均推理步数Average Reasoning Steps完成一个对齐判断平均需要调用多少次工具。步数越少通常意味着策略越高效。决策时间平均处理一个候选对所花费的CPU/GPU时间。资源消耗重点关注对知识图谱查询接口的调用次数。每次调用get_neighbors都可能对应一次昂贵的数据库查询或图遍历。一个优秀的Agent应在达到相同准确率的前提下最小化查询次数。置信度校准CalibrationAgent输出的置信度是否真实反映了其判断正确的概率我们可以绘制可靠性图Reliability Diagram。将预测结果按置信度分桶计算每个桶内预测正确的实际比例。理想情况下点应分布在对角线附近。如果点在对角线之上说明Agent过于自信在下则说明信心不足。6.2 可解释性从“黑箱”到“白箱”EA-Agent最大的优势之一就是可解释性。我们需要系统地收集和呈现其推理过程。推理路径可视化对于每一个对齐决策生成一个决策树或流程图展示Agent每一步选择了什么动作、观察到了什么结果、以及该结果如何影响了内部证据状态和置信度。开始 - [动作: 比较核心属性] - 发现“成立年份”冲突 - 置信度-2 - [动作: 检查数据源可信度] - 发现KG2中该年份数据来源为“用户编辑”可信度低 - 置信度1 - [动作: 比较“创始人”关系邻居] - 发现3个共同创始人 - 置信度4.5 - [动作: 最终裁决] - 置信度(3.5) 阈值(3.0) - 输出: ALIGN证据摘要报告自动生成一段自然语言摘要例如“尽管两个实体的‘成立年份’存在冲突但考虑到冲突数据来源可信度较低且两者共享三位核心创始人因此判定为同一实体。”反事实分析What-if Analysis这对于调试和信任至关重要。可以设计一个功能人工修改某一步的观察结果然后让Agent重新推理看决策是否会改变。这能帮助理解哪些证据是决定性的。例如“如果创始人也不匹配你还会认为它们对齐吗”通过这套评估与解释体系我们不仅能知道Agent“做对了什么”更能理解它“为什么做对”以及在哪些情况下可能会“做错”从而有针对性地改进策略或工具设计。在我自己的项目实践中引入这种结构化的多步推理Agent后在对齐结果的可解释性上获得了业务方极大的认可。尤其是在医疗和金融领域审计和合规要求严格能够提供“为什么认为这两个病历号或两个交易主体是同一个”的清晰证据链其价值甚至超过了几个百分点的精度提升。当然这条路还在探索中如何平衡推理深度与计算开销如何设计更智能的策略都是值得持续投入的方向。