写点什么

Facebook 提出基于模型的交互式语义分析框架,自然语言生成 SQL 语句准确率提升 10%

  • 2019-11-04
  • 本文字数:8492 字

    阅读完需:约 28 分钟

Facebook提出基于模型的交互式语义分析框架,自然语言生成SQL语句准确率提升10%

交互式语义分析是最近的研究热点,通过与用户的交互提升语义理解的准确性。Facebook AI 研究院研究人员最近提出了一种新的、统一的交互式语义分析方法,通过设计一个基于模型的智能代理(agent),与现有方法相比,可以在减少用户交互次数的同时提升解析精度。 本文是 AI 前线第 98 篇论文导读,我们将对这项研究工作进行详细解读。

概览

允许用户无需编程即可查询数据和调用服务的自然语言界面已被认为是语义分析的关键应用。然而,现有的语义解析技术在实际应用中往往存在不足,面临着若干挑战:(1)用户话语可能存在歧义或含糊,难以一次性得到正确的结果;(2)现有语义分析工具的准确率仍然不够高,无法真正使用;(3)用户很难验证语义分析结果,特别是缺乏可解释的主流神经网络模型。


针对这些挑战,近期交互式语义分析作为一种实用的解决方案被提出,它将用户包含在循环交互中,通过人机协作来解决话语歧义、提升系统的准确性。例如,Gur 等人开发了 DialSQL 系统来检测生成 SQL 查询中的错误,并通过对话请求用户选择备选选项。同样,Chaurasia 和 Mooney 等人提出了一个语义分析器,在生成 If-Then 程序时,询问用户来澄清问题。Su 等人的工作表明,对于自然语言界面到 Web API,大部分用户倾向于使用交互式系统,而不是非交互式系统。近年来的研究也成功地证明了交互式语义分析在实际应用中的价值,但往往受限于某种形式的语言或数据集,因此,这些设计是特别(ad-hoc)定制的,不是通用的。例如,DialSQL 仅适用于 WikiSQL 数据集上的 SQL 查询,将其扩展到其他形式语言甚至是更复杂的 SQL 查询都非常困难。


为了建立交互式语义分析系统的通用原则,本文提出了基于模型的交互式语义分析(MISP),其目标是设计一个基于模型的智能代理,该智能代理可以与用户交互以完成语义分析任务。代理以一个话语作为输入,智能代理逐步构建语义分析(例如,一个 SQL 查询),可能在某些步骤中请求用户反馈以纠正分析错误。如图 1 所示,MISP 代理将维护其状态为当前语义解析,并通过错误检测器决定是否需要人工干预以及在哪里需要人工干预。此操作由问题生成器(actuator)执行,该生成器生成并向用户呈现一个可理解的问题。代理的核心组件是一个世界模型(world model,Ha 和 Schmidhuber 等人在 2018 提出),它将从环境中整合用户反馈并传输到一个新的代理状态(例如,一个更新的语义解析)。重复此过程,直到达到最终状态。这种设计赋予了 MISP 代理交互语义分析三个重要特性:(1)对推理过程进行内省,知道何时需要人的监督;(2)能够以人性化的方式征求用户反馈,(3)能够整合用户反馈(通过由世界模型控制的状态转换)。



与现有的定制化(ad-hot)研究相比,MISP 框架为设计交互式语义解析器提供了一些新的思路。例如,整个问题在概念上简化为构建三个关键组件(即世界模型、错误检测器和执行器),并且可以分别处理和改进。尽管每个组件可能需要针对特定的任务进行定制,但是总体框架仍然没有改变。此外,基于模型的智能代理的设计可以促进其他机器学习技术的应用,如强化学习。


为了更好地展示 MISP 框架的优点,我们提出了一个简单但非常有效的文本到 SQL 任务的实例。我们展示了基于三个基本语义解析器(SQLNet、SQLova 和 SyntaxSQLNet)和两个数据集(WikiSQL 和 Spider)框架的有效性。我们的实验结果证明,在少量有针对性的、参与测试的用户反馈下,交互式语义分析器可以提升 10%到 15%的准确率。与现有的交互式语义分析系统 DialSQL 相比,我们的方法虽然更简单,但是它是更通用的系统设计,只需要问一半问题就能获得更好的解析精度。

基于模型的交互式语义分析

接下来将详细地讨论 MISP 框架(图 1),首先重点介绍每个主要构建块的功能以及它们之间的关系,具体实施的描述将留到第 4 节。


环境 环境由具有特定意图的用户组成,该意图对应于用户希望代理生成的语义分析。基于这个意图,用户给出一个初始的自然语言话语 u(0)来启动语义解析会话,在多轮交互中,代理获得反馈 u(t)来响应任何问题澄清。


Agent 状态 代理状态 s 是基于所有可用信息代理环境的内部解释。代理状态最直接的设计是作为当前预测的语义分析。它还可以赋予句法分析过程的元信息,如预测概率或不确定性,以便做错误检测。


世界模型 它是 MISP 代理的一个关键组件(Ha 和 Schmidhuber,2018 提出),它通过交互压缩历史感知,并根据代理对世界的了解预测未来。更具体地说,它建模了代理状态的转换,p(s(t+1) |s(t),u(t)),其中 u(t)是 t 步的用户反馈,s(t+1)是一个新状态。这种转变可以是确定性的,也可以是随机的。


错误检测器 MISP 代理会反省其状态,并决定是否需要以及在何处需要人类干预,错误检测器起的就是这个作用。给定当前状态 s(t)(可选的全部交互历史)和一组终端状态,它决定操作 a(t):如果代理处于初始状态,它将终止会话,执行语义分析,并将执行结果返回给用户;否则,它将确定当前语义分析中可能存在的跨度错误并将其连同必要的上下文信息一起传递给执行器,以理解错误范围。


执行器 执行器具有面向用户的界面,并以用户友好的方式实现代理的操作。实际上,它可以是自然语言生成器(NLG)或直观的图形用户界面,也可以两者结合。

MISP-SQL: 文本转换为 SQL 的实例

在 MISP 框架下,我们设计了一个交互式语义分析系统(图 2),命名为 MISP-SQL,用于文本到 SQL 的转换。MISP-SQL 假设一个基础的文本到 SQL 的解析器,利用它来设计世界模型和错误检测器。世界模型在本质上是一个包装器,它接受用户输入并更改基本语义解析器的行为(例如,通过更改概率分布或删除某些预测路径)。错误检测器根据预测的不确定性做出决策:如果解析器对预测不确定,则很有可能是一个错误。执行器是为通用 SQL 语言开发的基于模板的自然语言查询生成器。图 2 显示了 MISP-SQL 代理的一个示例。


4.1 代理状态

为了便于讨论,我们假设基本解析器通过预测 SQL 组件的序列来生成 SQL 查询。代理状态 s(t)被定义为部分 SQL 查询,即 s(t)={o1,o2,…,ot},其中 ot 是时间步骤 t 时被预测的 SQL 组件,如图 2 中的 SELECT place。组成 SQL 组件的内容通常在不同的语法分析器中有不同的定义,但通常由 SQL 语法决定。为了支持自省和错误检测,每个预测都与它的不确定性相关联,下面将讨论这个问题。

4.2 错误检测器

MISP-SQL 中的错误检测器是内省和贪婪的。首先它会检查预测的不确定性,而不是预测本身。另一方面,它的决定完全基于最后的预测 o(t)而不是整个状态 s(t)。


我们实验了两种不确定性度量,分别基于基本语义分析器估计的 o(t)的概率以及贝叶斯 dropout 下的标准差。


基于概率的不确定性 直观地说,如果基本语义解析器在一个步骤中给予 top 预测的概率较低,则很可能对预测不确定。具体来说,如果预测 o(t)的概率低于阈值 p*,一个预测 o(t)需要用户澄清。



这一策略在检测错误分类和偏离分布(out-of-distribution)的例子方面表现得很强。


基于 Dropout 的不确定性 Dropout 已被用作贝叶斯估计模型不确定性。不同于其在训练时防止模型过度拟合的标准应用,我们在测试时使用它来测量模型不确定性。直觉是,在 dropout 的情况下,如果一个预测的概率,在不同的扰动下有显著的变化(用标准差来衡量),那么这个模型很可能是不确定的。具体而言,预测 o(t)的不确定度计算如下:



其中 Wi 是第 i 个 dropout 扰动下基本语义分析器的参数,不确定度得分是 n 个随机过程中预测概率的标准差。我们认为,如果 o(t)的不确定度得分大于阈值 s*,则需要用户澄清。


终端状态 唯一的终端状态是当基本语义解析器指示解析结束时。

4.3 执行器: 一个 NL 生成器

MISP-SQL 代理通过向用户提出两个问题来执行其操作(例如,验证列“place”),因此执行器是一个自然语言生成器(NLG)。尽管已经有关于用 NL 状态描述 SQL 查询的工作(Xu 等人,2018),但是很少有工作系统地研究生成关于某个 SQL 组件的问题。


受(王等人,2015)的启发,我们定义了一个基于规则的 NLG,它具有一个种子词典和一个用于解题的语法。表 1 显示了涵盖 WikiSQL 上的 SQL 查询的规则。种子词库以“n→t[p]”的形式定义基本 SQL 元素的 NL 描述,其中 N 是 NL 短语,T 是预定义的句法类别,p 是聚合器(例如,AVG)或操作符(例如,>)。例如,“is greater than→Op[>]”指定一个短语“is greater than”来描述运算符“>”。在 MISP-SQL 中,我们考虑了四种语法类别:聚合器的 AGG、运算符的 Op、Col 表示 columns 和 Q 表示生成的问题。然而,它可以用更多的词条和语法规则来扩展,以适应更复杂的 SQL。



语法定义了派生问题的规则。每一列都由自己描述(即,列名)。与每个 Q 类型项“Q[v||Clause]相关联的规则构造了一个关于 v 在子句(Clause)的 NL 问题。该子句是制定有意义问题的必要背景。图 3 显示了一个派生示例。请注意,我们的系统中的词汇和语法都是不可知的,因为它对任何数据库都不是特定的。因此,它可以在将来的新域中重用。数据库特定的规则,例如用更规范的短语(而不是列名)命名每一列,也是可能的。


4.4 世界模型

代理整合用户反馈并用一个世界模型更新其状态。与训练附加神经网络的 DialSQL 不同,MISP-SQL 代理直接使用基本的语法分析器来转换状态,从而节省了额外的训练工作。


如第 4.3 节所介绍的,代理向用户提出一个关于预测的 SQL 组件 o(t)的二分类问题。因此,接收到的用户反馈要么确认预测,要么否定预测。在前一种情况下,通过继续下一个解码步骤(即 s(t+1)={o1,…,ot,ot+1})来更新状态,其中 o(t+1)是预测的下一个组件,s(t+1)显示更新的部分解析。在后一种情况下,合并用户反馈以限制基本解析器的搜索空间(即,禁止解析器进行相同的错误预测),在此基础上,解析器刷新其预测并形成新的状态 s(t+1)={o1,…,ot-1,ot+1},其中 o(t+1)是替代 o(t)的预测。为了避免被困在一个大的搜索空间中,对于每一个 SQL 组件,我们需要最大数量的 k 个备选方案(除了原始预测)来征求用户反馈。

实验

我们将我们的方法应用于将自然语言问题映射到 SQL 查询的任务。在这一部分中,我们首先介绍了基本的实验设置,包括数据集和基本语义分析器,然后对系统在模拟用户和实际用户上的实验结果进行详细的说明。

5.1 实验设置

我们在 WikiSQL 上评估了我们提出的 MISP-SQL 代理,它包含 80654 个手工注释的<NL quetion,SQL query>对,分布在 wikipedia 的 24241 个表中,我们的实验遵循类似(Zhong 等,2017)的切分。


我们使用两个基本的语法分析器 SQLNet 和 SQLova 来测试 MISP-SQL。与 DialSQL 的评估方式不同,我们没有选择 Seq2SQL 作为基本解析器,而是选择了 SQLova,因为它实现了与 SQLNet 相似的性能,而 SQLova 是目前 WikiSQL 上最好的开源模型,这样我们可以做更全面的评估。


对于两个基本语义分析器,我们分别基于预测概率和贝叶斯 droupout,使用两种错误检测器测试我们的代理(第 4.2 节)。我们将阈值 p 调整为 0.5~0.95,s 调整为 0.01~0.2。特别是对于由贝叶斯 dropout 测量的基于不确定性的检测,设置次数 N 为 10,dropout rate 为 0.1。在训练每个语义分析器时,将在相同的位置应用 dropout 层。当代理与用户交互时,每个组件的最大可选选项的数目(在原始预测的基础上)K 设置为 3。如果他们否定了所有 K+1 预测的候选项,代理将保持原来的预测。

5.2 模拟评估

在模拟评估中,每个代理都与一个模拟用户交互,该用户根据真实的 SQL 查询给出一个是或否的答案。如果代理在连续三个交互中未能更正其预测,则用户将提前离开交互,代理必须在没有用户进一步帮助的情况下完成剩余的生成。


总体比较 我们首先将 MISP-SQL 与表 2 中没有交互的两个基本语义解析器进行比较。对于 SQLNet,我们还将系统与 DialSQL 的报告性能进行比较。但是,由于 DialSQL 不是开源的,而且不容易复现,因此我们无法其适应其到 SQLova 来做更多的比较。


接下来,我们将评估 SQL 查询匹配精度(“Acc(qm)”)和每个代理的执行精度(“Acc(ex)”)。“Avg#q”表示每个查询的平均问题数。对于任何基本解析器,MISP-SQL 通过与用户交互来提高它们的性能。特别是对于 SQLNet,MISP-SQL 的问题数只有 DialSQL 系统的一半(1.104 vs 2.4),而且它的设计简单得多,不需要训练额外的模型(除了训练基本解析器之外,DialSQL 也需要训练基本解析器)。我们的代理甚至可以将 SQLova 的强大性能从 85%提高到 94%,每个查询只有 0.773 个问题。



当代理不采用任何错误检测器时,我们还提供代理的“上限”精度,并询问每个组件最多 10 个(“MISP-SQL(Unlimit10)”)或 3 个(“MISP-SQL(Unlimit3)”)可选的问题。有趣的是,即使对于较弱的 SQLNet 解析器,大多数真正的预测都已经包含在前 10 个选项中(给出 0.932 个查询匹配精度)。当配备了更强大的 SQLova 解析器时,代理有可能通过只考虑每个预测的前三个选项,将执行精度提高到 100%左右。


错误检测器比较 我们比较图 4 中基于概率和基于 dropout 的错误检测,其中每个标记指示代理的准确性以及在某个错误检测阈值下它需要的平均问题数。对于 SQLNet 和 SQLova 来说,基于概率的错误检测器可以获得与基于 dropout 的检测器相同的准确度,但问题的数量要比基于 dropout 的检测器少。我们还发现,在查询匹配精度方面,这种差异更大,SQLNet 大约为 0.15 ~0.25,SQLova 大约为 0.1 ~ 0.15。



为了更好地理解每种错误检测器是如何工作的,我们研究了每种检测器用于正确预测的部分问题(称为“Qr”)。一个理想的系统应该少问正确预测的问题,而找出更真实的错误预测来修正错误。我们在表 3 中给出了各种系统的问题分布。从该表得出的一个重要结论是,基于概率的错误检测在识别错误预测方面更有效。考虑在这样的系统,在 SQLNet 上使用概率阈值 0.5 进行错误检测(即“p*=0.5”),以及使用阈值为 0.2(即“s*=0.2”)的基于 dropout 的错误检测器。当两个系统在交互过程中问的问题数量相同时,前者只花费 16.9%的不必要问题用于正确预测(Qr),而后者则是前者的两倍(32.1%)。SQLova 也观察到类似的情况。值得注意的是,当概率阈值较低(这会导致问题总数较少)时,正确操作的问题部分显著下降(例如,当阈值在 SQLNet 上从 0.8 变为 0.5 时,从 23.0%降至 16.9%)。但是,对于基于 dropout 的错误检测,这一部分仍然保持不变。


5.3 扩展到复杂的 SQL 生成

MISP-SQL 的一个显著特点是它的通用性,因为它充分利用了基本语义解析器,并且不需要额外的模型训练。为了验证这一点,我们进一步在更复杂的文本到 SQL 数据集“Spider”上实验 MISP-SQL。数据集由跨多个领域的数据库上的 10181 个问题组成,其中 SQL 查询可以包含复杂关键字,如聚合操作或连接多个表。我们扩展了 NLG 词典和语法(第 4.3 节)以适应这种复杂性。


我们采用 SyntaxSQLNet 作为基本解析器。在我们的实验中,我们遵循与 Yu 等人相同的数据库拆分并报告验证集上的精确匹配精度(“Acc(em)”)。其他实验设置与在 WikiSQL 上评估 MISP-SQL 时保持相同。表 4 显示了结果。



我们首先观察到,通过与模拟用户交互,MISP-SQL 在每查询 3 个问题的情况下将 SyntaxSQLNet 的准确性提高了 10%。然而,我们也意识到,与 WikiSQL 上的情况不同,在这种情况下,基于概率的错误检测器比基于贝叶斯不确定性的检测器需要更多的问题。这可以解释为基本 SyntaxSQLNet 解析器的性能较差(在没有交互的情况下只有 20%的精度)。


事实上,基于概率的检测器用于正确预测(Qr)的问题仍然是基于 dropout 的检测器要求的一半(12.8% vs 24.8%)。然而,它浪费了大约 60%的问题在无法解决的错误预测上。这种情况通常发生在基本解析器不够强大的情况下,即无法将真实选项排在接近 top 的位置,或者存在未解决的错误先例预测(例如,在“WHERE col op val”中,当 col 是错误的,后面的任何 op/val 都是错误的)。当将来采用更高级的基本解析器时,这个问题可以得到缓解。

5.4 人类评估

我们进一步进行用户研究,以评估 MISP-SQL 代理。我们的评估遵循 Gur 等人 2018 年的实验设置。对于每个基本的语法分析器,我们从相应的数据集(WikiSQL 测试集或 Spider 验证集)中随机抽取 100 个示例,并要求三个人类评估员(他们是研究生,根据我们的调查,他们对 SQL 只有基本的知识)处理每个示例,然后报告平均结果。我们向评估者呈现最初的自然语言问题,并允许他们查看表标题,以便更好地理解问题的意图。在 Spider 数据集上,我们还显示了数据库表的名称。我们根据模拟结果选择错误检测器:对于 SQLNet 和 SQLova,我们为代理配备基于概率的错误检测器(阈值为 0.95);对于 SyntaxSQLNet,我们选择基于贝叶斯不确定性的错误检测器(阈值为 0.03)。在模拟评估中,由于代码尚未公开,我们无法直接与人工评估中的 DialSQL 进行比较。


表 5 显示了结果。在所有设置中,MISP-SQL 都提升了基本解析器的性能,展示了涉及人类交互的好处。但是,我们也注意到收益没有模拟实验那么大,特别是在 SQLova 上。通过对人类评价者的访谈,我们发现主要原因是他们有时很难理解一些模棱两可或包含不熟悉实体的试题的真实意图。我们认为,这反映了一个普遍的挑战,即建立与实际应用程序设置更接近的语义部分的人工评估,因此提出了以下讨论。


5.5 关于后续评估的讨论

迄今为止,大多数(交互式)语义分析器的人类评价研究使用预先存在的测试问题(例如,从像 WikiSQL 这样的数据集)。然而,这引入了一个不希望出现的差异,也就是说,人类评估者未必能够忠实地理解给定问题的真实意图,特别在当问题是模棱两可、含糊不清或包含不熟悉的实体时。


这种差异在我们使用 SQLova 进行的人类评估中得到了明确的体现(表 5)。当基本解析器很强时,剩下的许多错误解析的问题不仅对基本解析器而且对人类评估者都是挑战。我们手动检查了评估者做出不同于模拟者的选择的情况,发现当初始问题模棱两可或好的 SQL 注释是错误的,80%的选择都失败了。例如,对于“name the city for kanjiza”这个问题,在不查看表格内容或事先了解具体的背景知识下,人类评估人员不太可能知道“Kanjiza”是一个“城市聚落”。据报道,这一问题也是进一步改进 SQLova 的主要限制,如果用户有明确和一致的意图,原则上可以通过人的互动来解决。


为了验证这一点,我们使用 SQLova 进行了一个额外的实验,在开始交互之前,人工评估器可以查看表内容和好的 SQL 查询,以便更好地理解真实意图(在表 5 中表示为“w/full info”)。正如预期的那样,当用户知道自己的要求时,MISQP-SQl 代理的性能会更好(接近模拟)。它进一步证实了模拟和人的评价之间不可忽视的部分准确性差距是由于人的评价者没有充分理解问题的意图和给出错误的反馈。为了缓解这种差异,一个常见的做法是向人类评估者展示底层数据库的模式。我们这样做了(第 5.4 节),但仍然不够,特别是对于实体相关问题(例如,“Kanjiza”)。


另一方面,尽管将人类评估人员暴露在表格内容中有助于解决与实体相关的问题,但很可能在被测系统的公平中引入不希望的偏见(即“过度暴露”),因为人类评估人员随后可能比真实用户提供更多的信息反馈。


为了进一步减少人类评估和实际用例之间的差异,一种可能的解决办法是要求人类评估者从零开始提出问题(而不是使用预先存在的测试问题),这保证了意图理解。虽然这个解决方案可能仍然需要将表内容暴露给评价者(这样他们可以对属性中的每个表都有一定的感觉),但是可以通过只显示表内容的一部分(例如,只有几行)来减轻过度暴露。此外,可以通过更大范围的人的评价来补偿评价者组合问题复杂性的可控性降低。我们计划在今后的工作中探索这一背景。

结论和未来的工作

本文提出了一个新的、统一的交互式语义分析任务框架 MISP,并在文本到 SQL 任务中成功实现了它的实例化。我们概述了进一步改进 MISP-SQL 和为其他语义分析任务开发 MISP 系统的几个未来方向:


提升代理组件 MISP 的灵活性允许对每个代理组件分别进行改进。以错误检测器为例。我们可以使用概率校准来增强 MISP-SQL 中基于概率的错误检测器,它在模型置信度与其可靠性对齐方面显示出非常有用。人们还可以使用基于学习的方法,例如强化决策策略,以提升错误识别和可解的预测。


语义分析的终身学习 从用户反馈中学习是终身语义分析器改进的一个有希望的解决方案。然而,从代理的角度来看,这可能导致非平稳的环境(例如,改变状态转换),使得其训练不稳定。在对话系统的上下文中,Padmakumar 等人建议通过批量地联合更新对话策略和语义解析器来减轻这种影响。我们把这项探索留到未来的工作中。


扩大规模 MISP 代理必须扩展到更大的后端数据源(例如,像 Freebase 或 Wikidata 这样的知识库)。为此,我们至少可以从三个方面改进 MISP:(1)使用更智能的交互设计(例如,自由形式的文本作为用户反馈)来加速假设空间的全局搜索,(2)加强世界模型以确定基于初始问题和用户反馈的更小的可信假设集,(3)训练代理学习提高解析精度,同时尽量减少所需的人工干预次数。


论文原文链接:


https://arxiv.org/pdf/1910.05389.pdf


2019-11-04 09:542534

评论

发布
暂无评论
发现更多内容

策略模式

wzh

面试 设计模式 策略模式

Vue进阶(五十四):vue-cli 脚手架 dev-server.js 配置文件详解

No Silver Bullet

Vue 8月日更

Android.mk

Changing Lin

8月日更

【布道API】权限错误码选择:401、403 或 404

devpoint

HTTP Authorization REST API 8月日更

JAVA 规范

gin

几种常用设计模式的简单示例

编程三昧

JavaScript 大前端 设计模式 8月日更

Java技术开发专题系列之【Guava Collections】实战使用相关Guava不一般的集合框架

码界西柚

Java Guava 8月日更 Guava Collections

Nginx-基本概念和使用

Rubble

8月日更

装饰器模式

wzh

面试 设计模式 装饰器

回调模式

wzh

面试 设计模式 回调函数

Java web程序的运行时环境

wzh

Java tomcat 面试 Web JVM

模块一作业2(毕设构架设计)

Laintime

如此爱国,必然自毁长城

箭上有毒

8月日更

Go- 字符串

HelloBug

索引 字符串 Go 语言 拼接 长度

为了完成小姐姐安排的打分系统,又熬了一个小时的夜补充视图与模板

梦想橡皮擦

8月日更

kubernetes/k8s CNI 分析 - 容器网络接口分析

良凯尔

Kubernetes 源码分析 Kubernetes Plugin #Kubernetes# cni

类加载机制

wzh

Java 面试 JVM 类加载器 JVM类加载

使用Redisson优雅关闭订单

码农参上

redission 8月日更

Golang协程之了解管道的缓存能力

Regan Yue

协程 Go 语言 8月日更

java操作sql server数据库

Python研究者

8月日更

架构训练营第一模块作业(1)微信业务构架图学习

Laintime

架构实战营

ShardingSphere源码解析 初步准备

Java 源码 ShardingSphere

Android开发:新建后缀为txt的文件并且使用的步骤

三掌柜

8月日更 8月

IDEA2020.1构建Spring5.2.x源码

4ye

Java spring 源码 后端 8月日更

vue入门:vuex概括与使用

小鲍侃java

8月日更

@ConditionOnClass的使用

Rubble

8月日更

观察者模式

wzh

面试 设计模式 观察者模式

Android EditText输入框实现下拉且保存最近5个历史记录

Andy阿辉

android Android 小菜鸟 编程思想 8月日更

四种常见的 POST 提交数据方式

一个大红包

8月日更

模块五作业

seawolflin

架构训练营

手撸二叉树之合并二叉树

HelloWorld杰少

8月日更 数据结构算法

Facebook提出基于模型的交互式语义分析框架,自然语言生成SQL语句准确率提升10%_语言 & 开发_Ziyu Yao_InfoQ精选文章