“你接下来要做什么?”引入预测界面

当今世界上使用的计算机接口没有太多本质上不同的类型。但是随着Mathematica9我认为我们有了第一个真正实用的新例子——计算预测接口。

如果一个系统有一小部分固定的可能操作或输入,通常可以用菜单或表单等元素构建一个界面。但是如果有一个更开放的系统,通常必须定义某种语言。通常这将基本上是文本的(因为在大多数情况下Mathematica);有时它可能是可视化的(至于系统建模者).

接下来的挑战是使语言变得广泛而强大,同时让人类尽可能容易地书写和理解。在过去的30多年里,作为一名忠实的计算机语言设计师,我为此付出了巨大的努力。

但随着沃尔夫拉姆|阿尔法我有一个不同的想法。不要试图定义人类必须学习的最好的人工计算机语言。相反,使用自然语言,就像人类之间一样,然后让计算机尽最大努力理解这一点。起初,根本不清楚这种方法是否会奏效。但我们从Wolfram | Alpha中学到的一件大事是,只要付出足够的努力(以及足够的内置知识),它就能做到。事实上,两年前Mathematica8我们使用了我们所做的与Wolfram|Alpha添加Mathematica自由形式的自然语言输入,并从它自动精确生成的能力Mathematica语言代码。

但假设一个人刚从中得到了一些输出Mathematica. 下一步该怎么办?人们可能知道适当的方法Mathematica语言输入。或者至少有人能够用自由形式的自然语言表达自己想要做的事情。但在这两种情况下,都需要一种创造性的行为:从无到有,一个人必须想清楚该说什么。

那么我们能让这更容易些吗?我想答案是肯定的。这就是我们现在所做的预测界面在里面Mathematica9.

预测接口的概念是根据您到目前为止所做的,并从中预测您下一步可能想要做的一些可能性。

预测接口

在里面Mathematica它的工作原理是,当你有一个焦点输出时建议栏显示在其下方,并显示下一步可能采取的操作的按钮列表。显示的按钮由请求建议栏时实时运行的计算决定。

这个计算有两种输入。第一个问题是,根据输出的结构和会话的早期历史,哪些操作是常见的。第二,什么行动会带来有益的结果。

随着时间的推移,预测界面将能够从人们在其中采取的行动中学习。但首先,我们使用了几个大的来源。第一个是Wolfram | Alpha使用的精心调整的启发式算法集合,用于确定给定特定输入时要输出哪些POD。第二个是我们在Wolfram | Alpha查询流中看到的数十亿个实际查询。第三个是出版Mathematica代码,例如,在沃尔夫拉姆文献中心Wolfram示范项目. 第四个是我们非常大的内部样本Mathematica代码来自两个源代码Mathematica本身和Wolfram | Alpha。

从Wolfram|Alpha的查询流和启发式算法中,我们学习了许多在不同类型的对象上采取动作的先验概率,以及动作序列的一定数量。从样品Mathematica代码我们学习什么类型的动作一起发生-例如,不同的函数出现在不同类型的参数的概率是什么。

近似地说,在Predictive Interface中发生的事情是,可能的输出被分为数百种不同的通用类型,每一种类型都由一个符号表达式表示,该符号表达式对某些属性和属性进行编码。然后,根据我们的各种来源,建立大量的概率规则,以确定可能建议的特定类型组合的可想象的行动。哪些行动真正有意义,取决于哪些行动会带来有用的结果。因此,典型的预测界面所做的就是尝试候选动作——或者基于它们进行测试——然后使用启发式方法来评估它们所给出的结果的效用。

预测界面通常会在内部找到大量可能的操作建议。然后必须对这些内容进行排名,以便最好的选择能够最先呈现出来。这是通过一个相当复杂的评分系统来完成的,它结合了特定的启发式算法和概率信息以及对结果效用的评估。

但是,经过所有这些复杂的计算,用户最终看到的只是一个简单的按钮列表,供可能采取的行动。

让我们来看一个例子:

预测接口示例

预测接口建议对这个整数做一些事情。他们似乎很明智。但实际上它们比我们想象的还要好。因为预测界面使用的信息是通过实际做它所建议的计算得到的。让我们试试另一个整数:

预测接口示例

这些建议似乎也很合理。但是它们是不同的。原因是预测界面知道这个整数是质数。例如,它可以告诉我们,质数检验特别值得做。有时候,预测界面的预见性是多么的不可思议。但我发现,当一个人习惯了这一点,它就会出乎意料地有用,不仅因为它的主要目的是引导一个人知道他能做什么,而且还因为它能暗示出他所看到的事物的特征。

将预测性接口的概念与Wolfram|Alpha生成报告的方式进行比较是很有趣的。在Wolfram|Alpha中,给定一个特定的输入(例如一个整数),Wolfram|Alpha将生成一个“pods”序列,并将其显示在页面的下面,给出启发式算法确定的有趣的计算结果。在预测界面中也有计算的选择,但现在不是为了实际显示这些计算的结果。相反,在所有类型的内部工作之后,实际显示的只是一系列按钮,供人类用户选择下一步要做什么。

当然,可以将这些方法结合起来,当预测界面确定它会有用时,它会“点亮”建议栏中的Wolfram | Alpha徽标。如果你按下这个按钮,你会得到整个Wolfram | Alpha结果,从中你可以选择一个单独的pod来生成一个特定的新podMathematica输入。

预测接口示例

预测界面给出的建议会导致许多不同类型的操作。但我们发现,最好以或多或少一致的方式呈现每个建议,在按钮上添加一个或多个简单的英语单词。有时按下按钮可能只适用于某个单独的操作Mathematica功能,如解决(用于方程求解),或保理商(整数分解)。在这种情况下,下一个输入就会立刻显示出所做的事情:

预测接口示例

有时,预测界面可能会在运行中生成代码片段,这同样可以通过单个按钮应用:

预测接口示例

通常,这些代码段非常简单,完全显示它们并不会分散注意力。但有时最好是在默认情况下“隐藏”它们,如果你想真正查看代码,可以提供一个“开瓶器”:

预测接口示例

有时候代码实际上是对Wolfram|Alpha的调用:

预测接口示例

预测界面对建议进行排序,并立即显示前几名。如果你按下“more…”,你会看到一个面板,通常会显示更多的建议,现在按类别排列:

预测接口示例

有时一个特定的建议只有一种形式。但通常还是有其他选择的。当有相当少的易于理解的选择时,预测界面就会在下拉列表中列出它们的名称:

预测接口示例

或者,如果发生的事情更复杂,它会显示不同选择的结果的预览:

预测界面示例

在许多情况下,不只是可能的选择列表;相反,你可能需要“填写一张表格”来说明自己想要什么:

预测接口示例

一般来说,预测界面可以呈现一个本质上任意的用户界面。在内部,它只是生成一个符号Mathematica表达式,然后可以使用的任何东西Mathematica接口语言,例如,提供自定义创建的“类似向导”面板:

预测接口示例

在简单的情况下,预测界面只给出一行简单的建议按钮。但是,根据特定输出的含义,通常会有非常不同的建议。在这种情况下,我们发现,与其混合基于不同含义的建议,不如选择一个默认含义,然后提供其他含义作为明确的替代方案,类似于Wolfram | Alpha的“假设”机制的工作方式:

预测接口示例

当使用预测接口时,很常见的情况是最终会得到一整串输入和输出。按照预测接口的设置方式,每个新输入包含以前的输出。下面是一个序列,其中添加了每行的显式预测界面建议栏:

预测接口示例

如果要重复此处的计算顺序,通常需要将它们“上卷”到一行中,建议栏中的螺旋图标就是这样做的:

预测接口示例

目前,预测界面主要为单个输出提供建议——尽管它经常利用上下文和以前的历史。在未来,我们计划在多输入建议、各种形式的重构以及全面的重构方面做更多的工作Mathematica程序。

当我们开始构建预测界面时,我们完全不清楚它最终是否会成功。以前的“建议”界面的例子通常都没有得到很好的接受(比如微软的“Clippy”智能回形针——我不得不说,我一直觉得它很迷人,如果不是特别有用的话)。但我怀疑问题不在于提供上下文建议的总体思路,而在于生成和呈现这些建议的方式。

我们的预测界面的关键思想是Mathematica第9点是用实际的计算来弄清楚应该建议什么。永远不会有一个完整的、精确的算法来确定一个人下一步想要做什么(尽管人们通常比预期的要容易预测得多)。相反,我们需要做的是拥有一整套启发式算法,尽可能地让计算机“按我的意思去做”。

我不得不说,在过去的几年里,我一直对启发式持怀疑态度。因为我想人们会觉得他们很沮丧。当一个人有一种精确的语言和系统,比如Mathematica,好的设计的本质是使一切完全一致,这样人们就可以很容易地预测系统在特定情况下会做什么。但启发式却走了相反的方向,试图很好地覆盖一般情况,但完全不担心整体的一致性。

但我从创建Wolfram | Alpha中学到了一个关键点:如果启发式算法做得很好,有着认真的计算和知识,那么它们实际上是可行的,人们非常喜欢它们。Wolfram | Alpha绝对充满了启发法:为了理解自由形式的语言输入,为了决定要生成什么输出,等等。由于计算机系统经常使用启发法,只要一切都“正常工作”,人们从不考虑启发法,也从不尝试解构它们,永远不要因为缺乏终极一致性而感到困惑。

预测界面在技术上与Wolfram | Alpha截然不同。但拥有一个基于认真计算和知识的整个启发式网络的概念是相同的。在使用预测界面的实践中,它以适当的强调程度呈现自己也很重要:它就在那里,如果你想要它,就很容易得到,但是如果你不需要它,它就足够低调,不会在视觉上妨碍你。

我不得不说,在我自己的使用Mathematica它似乎工作得很好。如果我知道在获得特定输出后要做什么,我只需键入下一个输入,而不会被预测界面分心。但只要我停顿片刻,我就会瞥一眼预测界面。它通常会激发我的思维,并准确地告诉我下一步要做什么。

我现在有机会看了一些Mathematica初学者使用预测界面。看起来效果很好。这既能让玩家获得比以往更快的进展体验,又能让他们接触到更广泛的能力Mathematica否则他们可能很长时间都不会发现。

Mathematica是一个足够大的系统,我不认为任何人(甚至我自己)能立即记住它所做的一切。这就意味着,如果用户使用的是系统中不太熟悉的部分,预测界面是非常有用的。即使在我熟悉的系统领域,按下预测界面按钮也比输入要快。

预测界面由一种无限的建议网络组成。试着从简单的事情开始,看看一个人只需遵循预测性的界面建议就能走多远,这是相当有趣的。值得注意的是,一个人能以如此快的速度完成一些相当复杂的事情。

这是我一直想做的一件大事Mathematica(在Wolfram | Alpha等中)是尽可能地自动化:使计算机能够自动处理的东西能够自动处理。在过去,我们在自动化算法选择、自动化显示输出和可视化的方式,或构建接口,以及在Wolfram | Alpha中,自动化解释输入的方式等方面做了大量工作。有了预测界面,我们正在攻克另一个“自动化前沿”:自动化一个人如何选择下一步做什么。

从界面设计的角度来看,我发现预测界面非常有趣。以前的界面,如菜单、表单、计算机语言或自由形式的语言学,使某些事情变得简单。预测界面使一组新事物变得简单。当我为未来的设计工作时Mathematica-正如我们的其他产品一样,我已经看到我的思维因预测界面而改变。

在语言设计中,人们通常希望有最少数量的名称和概念供人们记忆。在自由形式的语言输入中,我们希望支持人们立即想到的任何东西,而那些人们永远不会“想到去问”的东西几乎不值得覆盖。但有了预测界面,就有了新的机制。一旦人们走上了一个特定的大方向,就可以向他们提出建议,让他们发现他们从未想过的东西,甚至是可能的东西。

这对于像这样的系统尤其重要Mathematica这是深刻而广泛的。人们很容易花费数年时间只使用系统的一小部分,而永远无法从其更广泛的功能中获益。但现在,预测界面不断地引导人们进入系统的其他部分,他们可以立即使用和熟悉。

的预测界面Mathematica9只是个开始。随着时间的推移,人们将有可能做出更丰富、更复杂的预测。不仅利用当前会话中的信息,还利用有关用户的各种历史记录、数据和分析。这个方向在某种意义上是最大程度的自动化。让用户定义一个目标,然后让计算机尽可能多地了解如何实现该目标。有时,用户可以使用自然语言或计算机语言指定目标。但他们往往没有充分地制定出这样的计划。相反,他们只是能够陈述一个大致的方向。在这一点上,预测界面可以接管,提出建议,让用户引导计算机朝着他们想要的方向前进。

今天,预测界面在Mathematica9.我们已经在生产其他利用它的产品了。在未来,我希望看到复杂的计算预测界面到处出现——从某种意义上说,这是一种与计算机交互的新范式。

3评论

  1. 这让我想起了另一个计算预测界面:

    http://www.inference.phy.cam.ac.uk/dasher

    这是同一个游戏,但在字母和单词层面上进行。

    斯蒂芬·卢特雷尔
  2. Mathematica是否向开发人员报告用户的预测界面选择以及实际会话期间的结果?我知道这对改进预测界面非常有用。然而,我认为有些人会以隐私为由提出抗议。

  3. Mathematica 9中的预测界面在用户的计算机上本地运行,不会将任何信息发送回Wolfram的服务器(尽管这很有用)。用户可以按“反馈”按钮发送消息。将来,我们可能会要求“数据捐赠者”自动向我们发送数据。

    吉恩·巴克
    传播主任

Baidu