自然语言处理实战:从原型构建到生产部署

引言与定义

杰里米·荣(主持人):你好,我是《软件工程电台》的杰里米·荣。今天,我与Ines Montani进行对话。她是某专注于机器学习和自然语言处理开发者工具公司的联合创始人兼首席执行官,也是spaCy NLP库和Prodigy标注工具的核心开发者。Ines,欢迎来到《软件工程电台》。

伊内斯·蒙塔尼:你好,非常感谢邀请。非常兴奋。

自然语言处理概述与任务分类

主持人:我想我们可以从定义NLP开始。对于不熟悉的人来说,什么是NLP?

伊内斯:嗯,这是个好问题,因为实际上,如果你在网上查看或关注这个领域,你可能会发现略有不同的定义。我会将其描述为处理大量文本。你有文本,你想从中找出一些信息。最近,许多人也开始将更通用的自然语言理解归入NLP这个术语下。所以,即使你有一个生成文本的聊天机器人,比如大多数人熟悉的ChatGPT,虽然它与纯粹的文本处理任务略有不同,但通常也被定义在这个范畴内。但基本上,我认为核心问题是:有文本,你想用计算机对其做些什么。这就是NLP。

主持人:在你的一些演讲中,我认为你将问题大致分为了两类:生成式和预测式。

伊内斯:是的,我认为这也是为了回应……也许人们甚至对什么是NLP感到有点困惑,可能主要想到的是生成部分,而不是从文本中提取结构化数据的预测部分。尽管我想说,在工业界和生产环境中,预测任务可能仍然是NLP应用的主要领域,尤其是在公司里,因为这里有太多非结构化文本,有太多情况你需要将文本转换成可以计算或处理的格式。所以我认为这个区别非常重要。

主持人:你能具体举一些生成式任务和预测式任务的例子吗?

伊内斯:当然。生成式任务,当然是经典的与对话系统(如聊天机器人)对话、问答、翻译。这些都是文本输入、文本输出的任务。预测式任务则更多是关于信息提取。例如,你有文本,或者收到电子邮件,你想判断这些邮件是垃圾邮件还是关于账单的?这通常被称为文本分类。你为整个文本分配一个标签。或者还有其他任务,你需要从文本中提取文本片段,如人名、组织、短语等。这也是信息提取的一个领域,是基于非结构化文本进行预测并产生非常结构化信息的领域。

主持人:听起来生成式是指创造新文本,而预测式则是想了解或学习现有文本中的某些信息。这样理解准确吗?

伊内斯:是的,可以这么说。对于预测式任务,重要的是,你想从文本中发现的信息,通常需要映射回文本本身。你想知道这些人名在哪里,它们是什么,它们之间有什么关系,它们是如何被使用的。通常你也希望将这些任务堆叠在一起,比如,你可能想先判断什么是垃圾邮件,然后对所有非垃圾邮件,提取它是关于哪个部门的。再根据这一点,如果它是关于那个部门且与账单相关,邮件中提到的发票编号是多少,等等。所以,通常这里真的有一个你想应用的步骤流水线,这些步骤可以相互依赖,每个步骤有不同的要求和不同的难度。有些你可能可以使用规则,可以将其连接到你的数据库,而其他事情则要复杂和微妙得多。还有一些事情你甚至根本不需要机器学习,因为你可以只用正则表达式或用代码写出来。所以,是的,人们试图做的事情有很多种。

实际项目案例与问题拆解

主持人:由于你的公司最初是为NLP工作提供咨询服务的,能否举例说明你们公司承接的一些项目,以便让人们了解NLP问题是什么样子的?

伊内斯:好的,有很多例子。我们实际上偶尔仍然会做咨询,因为我们觉得保持与用例的紧密联系非常重要。因为如果你在开发解决问题的工具,你需要确保你实际上也在用这些技术解决自己的问题。所以我们仍然有这样的项目。举个例子,一个常见的主题或用例是从新闻中提取某些信息,然后将其输入到内部知识库中。比如,可能有一个公司想知道其供应链或他人供应链中的某些事情是否可能受到影响并给他们带来很多问题。这听起来可能像个无聊的用例,但如果你仔细想想,它的价值是巨大的。
那么你该怎么做?你想爬取新闻,然后发现:嘿,这个小城镇发生了罢工,这可能之后会通过这些渠道影响到我们。类似这样的事情。或者你想分析关于收购和兼并的财务文件:谁被收购了,金额是多少,最后你可能想计算诸如有哪些新兴领域、某公司在那个时间段进行了多少次收购等等。所以,这是非常经典的信息提取工作。实际上,这也是我们在人们试图解决的项目中看到的很多内容。

主持人:你们公司构建了一个名为spaCy的库,我想知道,在spaCy的背景下,以及你可能需要在其周围使用的其他工具,你会如何开始处理像那样的问題?你拥有所有这些非结构化数据,有新闻报告、财务报告。在这个过程中你从哪里开始?

伊内斯:是的,实际上,真正决定要做什么这一步确实是最难的部分。人们常常会想训练一个模型等等,哦,算法这些东西,但如今这些都非常直接。困难的部分是真正开始并决定做什么、尝试不同的东西,而这真的就是软件开发或编码。你写的第一行代码很少会是你要部署到生产环境的那一行。你需要迭代、重构、尝试。处理数据也是如此。通常,甚至在接触任何工具之前的第一步是思考你希望系统做什么。这听起来简单,但确实是我们都在试图解决的基本问题:我们有一台计算机,计算机应该做一件事。我们如何让计算机准确地做我们想做的事情?我们如何描述它?
如果你有很多原始数据,其中一种方法是直接创建标注样本。你获取数据,标注这里所有的公司收购信息,过滤出正确的样本,标注你感兴趣的文本片段,并完成这个过程。即使你使用不依赖于标注数据的方法,你总是需要这类步骤,因为你需要一个事实来源,需要一个评估系统的方法。很多人不这样做,但如果你考虑最佳实践……就像很多人写代码时不写测试一样,这是事实,但我们都知道这不是我们应该做的。我们都需要写测试。对于一个评估集也是如此。所以,你基本上想开始创建一些你知道答案的样本来测试你的方法。甚至在工具介入之前,事情可能就会变得棘手,因为你会发现语言并不像你天真想象的那样整齐地划分为类别,所以你会有边界情况,你需要决定如何处理它们,你想要什么标签,你想如何划分问题?这些都是具有挑战性的工作。我认为大多数人在这方面挣扎得最多,通常这需要经验,需要尝试,然后选择你想要训练的正确组件。这是一个对整个文本进行预测有意义的问题,还是一个提取文本片段有意义的问题?你想要提取什么样的文本片段?等等。有很多这样的决定,通常你只需要尝试一下,也许你最初的想法或天真的想法并不是正确的前进方向。
所以,假设你经历了所有这些过程,决定了你想要什么,它是有意义的,是实际上在你的数据中有效的东西,那么你就可以开始挑选工具,组装你的流水线了。SpaCy确实是一个专为这种多步骤流水线工作流设计的库,并且真正为生产使用进行了优化。所以它真的非常非常快。你可以训练针对你想做的事情非常特定的、非常小的模型。你可以将它们与你已有的规则或知识库结合起来。如果你的数据准备好了,你想训练什么明确了,那么实际的训练实际上可能非常直接,真的只是一个你运行的命令,得到你的模型并使用它。但是到达那一步的道路,这才是棘手的。这也是为什么这是我们真正致力于工作的一个领域,我们一直在努力,并且在未来的项目中,我们真正想要解决的是:如何让没有机器学习背景的非专家更容易地进行这个过程。

数据标注、模型微调与工作流

主持人:听起来第一步是将一个可能模糊的问题具体化,比如“我想知道世界上发生的事情是否会影响我的业务”,这是一个非常宽泛的问题。所以你从“好的,我要引入所有这些非结构化数据,我要写一个应用程序来爬取新闻网站并获取所有这些文档”开始。但是,然后你必须将其分解成这些更具体的……我不知道用“问题”这个词是否合适?

伊内斯:预测问题。我想我们就是这么称呼它的。另外,我想你很快就会看到,你的业务问题实际上并不会一一对应地转化为预测问题。

主持人:所以一开始是决定,好吧,也许我需要能够阅读这些文档并确定这些文档在谈论什么,然后判断它是积极的还是消极的事情,然后对所有这些进行分类……

伊内斯:甚至“积极”或“消极”意味着什么?一个例子是,我想有人也试图为新闻和正在发生的事情建立类似的模型,用于声誉管理,基本上就是人们如何谈论我的品牌,好还是坏?但他们有这样的想法:嗯,如果人们说竞争对手的坏话,那对我们来说是好事,我们想将其提取为积极的。但是,如果没有你的产品和所有其他背景,这并不是真正能转化为预测问题的东西。模型无法理解这一点。或者,如果你那样标注并试图教模型,模型真的会很难理解这个概念:为什么这种负面情绪突然变成了好事?所以,在你真正开始处理数据之前,这些都是你需要解决的重要问题。

主持人:你能给出一个你合作过的客户的具体例子吗?他们是如何分解问题,或者如何分解“我需要分类这个和那个,这是我最终会使用的结果”?

伊内斯:好的,通常这真的取决于具体问题,而且常常需要尝试。但很多时候,它归结为真正思考:好的,我想要的结构化输出是什么?模型最终产生这个输出有多容易/多困难?通常,这要么是你之前做过,要么是你能够尝试的事情。
有一个案例,我想我们也会将其作为案例研究发布,这是一个金融用例。他们想要提取大量极其特定的术语,其程度达到你读句子时会想:我知道这些都是词,但我完全不知道它在说什么。但文本中需要处理超过30个属性,几乎需要实时处理,需要提取。
他们做的第一件事是将这些属性分成两类:一类是值只能是特定类型或基本上是枚举类型的属性,另一类是需要预测的所有其他属性。对于枚举类型,嗯,这相当直接。你可以只提供规则列表、示例列表,甚至更抽象的东西。对于其他属性,嗯,你需要为它们创建一些数据,并在上下文中查看它们。
最初他们做的是:嗯,我们只想每个样本看一次,让我们把所有内容都排好队进行标注,一次性标注所有30个属性,通过那种繁琐的过程创建一些数据。但这基本上根本不可能高效地完成,因为你必须同时专注于30个不同的决定,不断在它们之间切换。所以这个过程真的很慢。然后再次审视后,他们想:好吧,让我们尝试一次只处理一个标签,真正专注于推进它。起初听起来工作量更大,因为对于30个标签,你需要看每个样本30次,但实际上这变成了一个整体快10倍以上的过程,因为你减少了创建数据的人的认知负担。所以我认为这是一个有趣的例子,因为这些东西也很重要。我认为这也常常是人们甚至不愿首先查看数据这条路的原因,因为这感觉像是极其繁琐的点击工作,而很多时候这只是关于你如何构建它,也许想出更有创意、更聪明的方式来查看你的数据。
因为我认为总的来说,通过示例来指导计算机仍然是一种很好的方式。在某种程度上,我认为它比人们从ChatGPT或类似模型中知道的写提示词有很多优势。但它目前要困难得多。所以,虽然提示词非常容易上手,任何人都可以写点东西让模型去做,但创建样本、训练模型则要多得多的工作。所以,这实际上是我们觉得超级兴奋的领域,因为,好吧,我们如何将这个在很多方面更优但更专业的工作流,变得几乎和写提示词一样直接?

大型语言模型的作用与权衡

主持人:在你给出的例子中,他们有30个潜在标签可以分配给文本,你能具体说说吗?他们是看一个句子还是一个段落,然后他们只标注那一件事,还是……

伊内斯:是文本片段。所以是一位金融分析师写的关于市场上发生的事情,有很多关于价格、什么市场的特定术语。再次强调,如果你没有金融背景,你会想:这是什么?这几乎不是英语,但数据就是这样来的。然后理想情况下,你也希望实时获得它的结构化格式,并且你不能让你的分析师用不同的方式做这件事,因为他们已经在尽可能快地报告他们的事情,但你可以潜在地构建一个能够处理它的系统。他们实际上成功构建了一个非常快的流水线,模型超级小,比如6兆字节,这在今天尤其显得“哇”,它完全私有化运行。这也是能够构建自己的系统的另一个优势,因为你不需要API,你可以在内部运行它。如果你在某个领域工作,这一点很重要——金融数据甚至不能接触任何第三方服务,显然,即使在办公室里,能够接触到这些数据的人也是被隔离的,因为他们拥有的信息可能会影响市场。所以,是的,但他们通过以聪明的方式处理问题并进行推理,能够实现非常高的准确率,而且相当快。我经常在很多其他背景下说这句话:哦,你只需要坐下来推理事情,因为,我认为虽然这不是最有吸引力的答案或建议,因为你仍然需要坐下来推理。但最终,我认为这就是软件开发和人工智能中很多问题的核心,我们学到的关于如何构建软件的最佳实践仍然适用,并不会因为突然变成了人工智能就全部改变。

主持人:我们稍微多谈一点,因为你给出了一些专业模型更好的例子,因为你可以在本地运行,用你自己的例子训练它,所以你更清楚它符合你的期望,我想是这样。但是,大型语言模型在哪种管道中适合这类任务?或者说,它们擅长解决什么样的问题?

伊内斯:是的,这总是一个权衡,而且通常也不是非此即彼的问题。大多数情况下你可以组合不同的技术。所以,当然,最近推出的许多模型确实增加了我们以前无法做到的能力,这确实是围绕文本生成。例如,能够准确地总结文本,这在以前并不那么好,需要很多工作才能让它至少还行,现在这相当不错了。所以,如果你的工作流中有一个长文档,你想总结它,然后从摘要中提取信息(这样处理起来容易得多),那么使用大型生成模型确实能做一些我们以前做不到的事情。
还有快速上手和快速原型设计的方面。以前我们总是存在初始数据的瓶颈。在你有一个能预测东西并让你了解“我构建这个问题的想法是否有意义?”的模型之前,你需要至少几百个好的样本,如果你认真做,很容易投入40个小时的工作,然后你训练模型,准确率可能是零,那么你必须找出问题所在?是因为我的数据不好吗?我忘了某个超参数吗?我的代码有错误吗?这部分非常令人沮丧。而现在,通过现有模型API,你几乎可以立即获得一个还不错的系统原型,并用正确的工具测试你的想法。例如,对于SpaCy,我们有spaCy-LLM库,它提供流水线中的所有这些组件,但由大型语言模型(例如通过某中心的API或本地模型)提供支持。所以你有相同的预测行为,但模型和功能是通过来自大型语言模型的提示词实现的。所以,几分钟内你就可以运行一些东西,然后可以改进它,也可以测试它是否有效?它在我的数据上表现如何?这是一个巨大的改进,然后你可以看到哪些部分可以混合搭配。也许有些任务是非常通用的,大型通用模型做得很好,你想保留那个;而另一些任务你可能意识到,实际上你花了所有时间试图预测它,但无法比正则表达式做得更好。这也是你经常必须意识到的,或者为什么拥有基线是有回报的,因为,是的,你可能花了很多时间,然后意识到,是的,好吧,这个,是的,你无法做得比正则表达式更好。

技术总结与未来展望

主持人:所以听起来当你在处理NLP类型的任务时,你有所有这些不同的工具可用。就像你说的,甚至提到了正则表达式,你可以尝试,还有这些你提供示例的模型……

结束语

主持人:如果人们想了解你的近况或查看SpaCy或Prodigy,他们应该去哪里?

伊内斯:嗯,我们的主站 explosion.ai 提供了我们所做一切工作的概述,我们也总是展示生态系统中的东西,其他人发布的东西。所以我认为这是首要的去处。从那里你可以进入我们的文档,你可以在社交媒体上找到我,也许在某个会议上打个招呼。今年我正尝试再次参加一些活动,我将在欧洲的一些会议上发言,所以,是的。

主持人:太酷了。那么,Ines,感谢你加入《软件工程电台》。

伊内斯:再次感谢邀请。

主持人:我是《软件工程电台》的杰里米·荣。感谢收听。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值