早上好,欢迎来到澳大利亚美丽的布里斯班。这是我的办公室和我兄弟的办公室,顺便说一下,他那里有个很棒的厨房。我稍后展示给你看,它在一栋旧楼里,在楼上。这些楼梯有点不平,所以你得小心点。这是办公室。这是我兄弟的桌子,那是我的桌子。忽略那些杂乱的线缆吧。我刚重新布置了这个房间。然后我们这边有个小厨房,那边乱得一塌糊涂。我们有冰箱。等一下,让我把摄像头转过来。好了,这样好多了。这是我们的冰箱,有点像是别人用过的旧货。
这是我们两款应用:Keep Track 和 Neutrify。现在总共有四款,这是其中两款。每当我们发布新应用时,就会在冰箱上贴贴纸。这是我们用来保持空气清新的植物。Josh 喜欢宝可梦,如果你喜欢宝可梦请在评论区留言。这是我们的储物柜。如果你知道老式的《创世纪》(Runescape)游戏,你就知道其中一样是什么东西。那是“下巴砍刀”(Chin Chopper),是我朋友 Joey 送的礼物,谢谢 Joey。我们所有的储物用品都在这里。还有 Neutrify 的海报。这是我们推出 Nutri 应用时列出的420种食物,现在 Neutrify 应用中大约有1,070种。
这就是我们日常工作的样子。我们有一台 DGX Spark,你可能在我的频道上看过运行它的视频。目前我大部分工作都是在那里完成的。然后这是一台深度学习电脑,里面装有 RTX 4090(字幕误写为RTX490)。今天是3月3日星期二,早上8点。我将在9:30与客户或潜在客户开会。所以我要做的是阅读一些关于这家客户公司的信息,然后思考在会议中可以讨论哪些机器学习问题以及如何将其融入他们的业务。
接下来我们要开会,之后我们需要着手为微调小型大语言模型(LLM)以执行特定任务创建数据集。所以这是机器学习工程师一天的生活写照。好的,我和我兄弟开发的应用 Neutrify 在去年年底进行了重大更新,我们称之为 Neutrify 2.0。但与其谈论这次更新,不如我们去楼下的厨房吃点早餐,然后我再展示给你看这个更新。早安,伙计。
这是今天的清单。如你所见,我是个老派的人,喜欢用笔和纸。我们需要升级食物提取管道。Claude 聊天给出了接下来的步骤。我们上午9:30有个与 X 的会议,所以我得为此做一些阅读工作。完成用于 LM Pine Tuning(可能是指 LLM 微调)的数据集构建。我们将把它上传到 Hugging Face。当然,今天的主要目标是这两项:步行1万步以上、下午5:30到6:30练习巴西柔术(BJJ)、晚上7点家庭晚餐,以及发布 LinkedIn 帖子。
是的,我把这写下来了,因为你怎么获得客户呢?在过去这么多年里,我所有的客户或商业机会都来自有人给我发邮件或者留言说:“嘿,我看到了你的视频或在某处看到了你的帖子。”然后他们说:“你们能为我们做一个项目吗?”接着我会和他们交谈,如果双方契合,我们就一起合作。所以今天就是这样的对话:“嘿,我们合得来吗?你的时间线和我的对得上吗?这是我有兴趣做的项目吗?我的技能组合是否符合他们的要求?”嗯,我们今天会弄清楚这些。
帖子带来线索(潜在客户),然后线索转化为收入,而收入允许……看看这幅杰作。让我们用 Neutrify 测试一下。Neutri 专注于全食物,所以它不进行条形码扫描。我们不扫条形码,我们只识别你能看到的东西。这里有一个预览正在运行设备端模型。但在单图模式下,它只拍一张食物的照片。所以,“班尼迪克蛋”识别正确了,对吧?但细节不够丰富。
如果我们进入多图模式(这是我们的新更新),让我们拍张照看看会发生什么。这将发送给 Gemini,我们运行的是 2.5 Flash 模型并带有提示词。它将返回 JSON 格式,然后我们将其映射到我们食物的营养数据库上。当然,这取决于网络连接速度以及延迟情况。我的笔刚掉到桌子底下了。结果显示:班尼迪克蛋配培根和微型蔬菜,吐司,荷兰酱,水波蛋,培根,微型蔬菜,黑胡椒。对我来说这基本上很完美,因为它分解成了成分。虽然有两片吐司,但我暂且算作80克左右。荷兰酱可能稍微重了一点,所以我可以将其更改为25克。然后培根……是的,我们有培根。这里实际上有两个鸡蛋,所以我更新一下。
但请记住,这只追踪它能看见的东西。如果它真的看不见下面的两个水波蛋,那就不太准确了。这是 Nutri 2.0 的主要更新之一:多食物追踪功能。“那个额外的空盘子,Daniel。”“谢谢放在架子上。”“酱汁太好吃了。”“真的很好吃不是吗?我甚至……我是乳糖不耐受者,所以从技术上讲我不应该吃黄油酱汁,但我忍不住。我想我会处理后果的。”“黄油里的乳糖不多没事的。”“是的当然没问题。”
日程规划完成,写作也完成了。我写了一篇 LinkedIn 帖子,因为每天早上我喜欢花大约25分钟在750words.com上写约750个字。让我展示一下这篇帖子,这是 Josh。“嘿 Josh。”“嗯……我已经给你看过你的桌子了,你可以开始工作了。好的。这是一篇帖子:3月3日星期二——我是如何与 AI/ML 客户合作的。”“写得真好。”“哦,非常感谢。我很感激。”
楼下有咖啡馆的一个好处是咖啡会送到你手上:冰长黑咖啡。所以,计算设备必须离线运行模型。如果他们表现良好,就该构建技术测试集了。如果你做的修复有效,就建立测试集;如果无效,也建立测试集。这里的目标是创建你工作流的代表性样本,即你想要发生的情况。你要确保这个测试集是你随着时间的推移改进系统时可以反复测试的东西。是的,公共领域的主要模型的基准可以被作弊,但当它是针对你自己业务的特定基准时,在该基准上表现良好是一件好事。这就是今天的 LinkedIn 帖子了。我得打个电话。
你好,未来的 Daniel。结果这段特定片段的声音损坏了,但我当时说的是通话回顾。我没有分享任何具体细节,更多的是我们只是在广泛地讨论这个人如何可能在其业务中使用 AI。他向我展示了他们的工作流程,还展示了他们的定制数据。我们大致在讨论好吧……
这里有一些想法,你可以试试这个,也可以试试那个。接着我们讨论了时间表。自从那通电话以来已经过了几周了。我们在某些邮件往来中反复沟通,但还没有正式形成合同。这就是这类事情的一般情况(lay of the land)。有时候进展很快,你会立刻开始工作;而其他时候则需要反复沟通才能找到正确的路径。有时甚至完全行不通。但如果你做过咨询工作,你就会知道这是常态。
接下来的一个小时左右,我要完成我的数据集制作。我希望拥有10万条图像描述(image caption)类型的数据样本,并从中提取食物和饮料信息生成JSON输出。那么为什么我需要这样一个模型或数据集呢?因为我可以微调一个大语言模型(LLM)来重复这项任务。我打算对GMO 3的70亿参数版本进行微调,然后利用这个经过微调的食物提取模型在像Data Comp 1B这样的大型数据集上运行,从图像描述中提取食物图片、食品名称和饮料名称。
随后我们可以利用这些数据来改进计算机视觉模型。我刚刚发现Python的异步编程(async)非常有用,虽然我之前对它有所了解,但没想到它对这种工作流程帮助这么大。这是Gemini Flash模型,我使用它来生成一些合成描述文本。这里同时运行50个工作线程。
让我用Claude创建一个图表来说明一下。我之前是一次处理一个样本,因为我有6万个或5.7万个样本,所以那会花费很长时间。但我现在使用Python的async创建了多个虚拟工作线程来并行处理,这极大地提高了速度:50个工作线程时每秒生成1.9个描述;200个工作线程时达到每秒8.5个。
之前逐个处理需要24小时,现在生成全部6万个描述只需1.9小时。当Claude在那里发挥它的魔力时,它建议我发送指令给我。我喜欢使用Claude.io,因为我做的很多事情都是迭代式的,对吧?我正在不断实验。所以让我们开始吧,我要生成6万个合成描述文本,同时使用200个工作线程。
看这里,有57,38个样本(可能是口误或显示问题),速度非常棒。可能不到45分钟就能完成,所以让它运行着,然后我们再检查输出结果。我有字符输出和令牌(token)输出,因为我在这里做了一些令牌计算:如果我对500个演示样本的计算正确的话,创建6万个合成样本报销大约需要42美元。
这里有个图表:同步工作线程1, 2, 3...依次处理;而异步是并发的,我们有五个工作线程同时处理1、6, 2、7, 3、8等。所以使用并发工作线程速度提高了5倍。正如我们在这里看到的,Gemini的并发性非常可靠。所以我们要让它继续运行下去。
我想Josh该吃午饭了,他要演示一下。这是Josh,我们的iOS开发人员。NFI应用中所有你能感知和触摸的功能都是Josh制作的。“我负责后端。”“最近怎么样?”“还不错。”那么,这里理想的输出应该是什么样的呢?Josh说:“嗯,可能是粥或者燕麦片之类的。”
“那就是加了酸奶和肉桂的粥。Josh,你正在吃这个吗?”基本上是的。“里面有蜂蜜吗?有蜂蜜在里面吗?”“没有,是枫糖浆。”哦,“你要不要加个鲍鱼进去?”你可以轻松添加上去的,对吧?“是的,你只需要修改一下。‘添加食材’。”看,“更新”,保存。“看起来很整洁啊,兄弟。”“搞定了。”把它加入我的宏量营养素记录中。
你目前也在做客户项目,不是吗?“是的,我正在做一个船的项目。我只能说这么多。”所以本质上,Josh和我的商业模式是:我们确实开发应用,但这些应用在目前阶段产生的收入还不足以支撑我们的生活。所以我们不想接受融资,而是通过自助方式(bootstrapping)来构建我们共同开发的所有应用。
无论是即将推出的Steppy,还是Keep Track、Neurify等,我们都通过客户项目赚取资金,然后用这些钱来资助我们自己应用的开发。这有点像一种双向模式:我们在现实世界中构建实际的产品以练习技能,同时与客户合作来支付账单。你忘了提到Sunny了。“哦对,Sunny。”
“是的,Kaggle比赛就是这样结束的。如果我们要赢得即将到来的电缆(cable)比赛的话。”“我试图让Rosie注册Sunny。”“是的,对不起Steppy。”“他找到了一个漏洞(glitch)。”“什么?”“我建了一个Brighton Boys团队,然后他无法加入。”“什么?你看这个截图。等等,天哪……我告诉过你吧?”
那也将为我们的项目提供资金支持。“是的,Sunny是开源的。”“哦对,Sunny是开源的。你可以下载它。”好的,“我要回去继续完成我的数据集制作。”Josh,去散步吗?“是的。你今天的步数是多少?”我还不清楚呢,我喜欢在散步后查看。“哦,真让人沮丧。就像是个惊喜。”“里面还有人吗?”
阳光明媚的日子。“看,与其晒出屏幕印子的晒痕(screen tan),不如真的去晒晒太阳。”Josh和我喜欢把一天分割开来。因为开发步数应用,你自然希望增加更多步数,而散步只是最简单的方法来打破工作的单调。机器学习工程师面临的难题之一是在数据加载或模型训练期间不知道该做什么。
所以当Gemini在办公室上方工作时,生成6万个合成描述文本时,我们会去散步,享受阳光。我可能会在这之后吃午饭。生成完成后,我们将检查样本,确保它们都是独一无二的且多样化,然后努力将该数据集上传到Hugging Face以便复用。
这就是机器学习工程师日常工作的很大一部分:思考问题,为该问题分析构建数据集(无论是现有数据集还是自定义数据集),然后验证该数据集、上传它使其可复用,接着训练模型并在此基础上进行迭代。
今天天气真美。“我可能没指对地方,但那是Shan Cliff Pier(悬崖码头)。那是一个散步的好地方。这是Sandgate海滨广场。Josh在那里,那边是令人惊叹的莫顿岛(Morton Island)。你可以看到那里边缘有一个沙嘴(sandjune/sand spit)。你看那边有一些船。所以我们喜欢来这里,要么在这里开会,要么进行散步会议。”
每隔几个小时,我就去散步20分钟,绕个街区走走。这样一天下来至少能走一个小时的路。毕竟大家都有体会:坐久了,午餐后总会觉得有点昏昏沉沉、没精神。为了对抗这种倦怠感,我会去散个步,让血液流动起来,当然也能增加运动步数。这就是Stephie发挥作用的地方了。
你还在走吗?太棒了!已经快完成一半了。对于6万个样本来说,这个速度相当快了。不过你会注意到,当处理到10,000个样本时会出现减速,因为系统每千次保存一次数据,这时候性能就会下降。所以我打算去吃午饭,到时候应该差不多完成了。我想我们会吃一顿简单又美味的午餐。哎哟,这太烫了!这是我可爱的妻子做的。谢谢你,宝贝。让我们看看Neutrify的效果如何。
我得稍微谨慎一点,因为我现在的体重刚好卡在标准线上。但这周末我要参加柔术比赛,我需要控制在84公斤以下——确切地说是低于84公斤。所以我们要试试Nutri应用,看看结果怎样。排好队,我们会得到什么反馈呢?你可以看到背景里的DJX Spark和Mac Mini。晚餐是辣椒牛肉配烤红薯,还有……嗯,应该是“Chili Con Carne”(墨西哥辣肉酱)。
我觉得这个结果已经够接近了。不过我要编辑一下,把它修正为“牛肉薄荷炖菜”,分量大约是150克。我可能得直接编辑这里。是的,我们得修复这个编辑功能的问题。所以,如果我修改其中一项,我们希望它能同步更新所有相关项。但这只是当前的生产版应用,这个功能我们可以在未来实现。
那么,为什么我们要收集大量不同的食物图片呢?目前我使用的是DJX Spark运行Quinn 3B(或类似参数量的模型),不过我可能得升级到刚发布的Qwen 3.5,以便用Neutrify的方式给大量图片打标签。这样我们就可以微调一个视觉语言模型(VLM),使其能在设备上运行,就像我们在Sunny应用中展示的那样。
我们曾参加过一个电缆模型比赛,使用的是在设备上运行的模型。这也是我们的目标之一:看看能否用我们自己的设备端定制模型来替代Gemini API,以执行刚才在Nutri应用中展示的工作流。这样做有两个好处:一是节省延迟;二是免费运行,因为它只使用Apple的板载GPU。这可行吗?我不确定,但这非常有趣。我们要弄清楚这一点。现在,该吃午饭并看着进度条了。继续往上走!目前达到了54%。
“今天看起来气色不错,兄弟O。我希望你从受害者那里得到了满意的报酬。” “谢谢你,我的兄弟。”
好消息!我们已经完成了57,000个标题的生成。输入了43.5M tokens,输出了6.5M tokens。让我们去Google表格看看我们的预估有多接近实际值。好的,差距不大:6.7M和4500万(此处原文可能有误或指代不同指标,按语境理解为数量级接近)。误差在正负5%-10%左右。所以并没有偏离太远。这就是为什么我们要先进行试运行,以便获得粗略的估算。
如果我们只处理6万个样本,这实际上并不算大的样本量。虽然不小,但在机器学习领域来说并不极端庞大。如果我们想计算成本等数据,可以先做一次试运行来测试两点:一是确认流程是否可行;二是评估其在成本方面的可行性。既然已经跑完了,现在让我们检查JSONL格式中样本的质量并进行审查。
我将创建一个示例笔记本。好了,完美!现在我们要做的是查看这些数据,或者至少确保它们都是唯一的。我们可以通过检查来确认所有样本都是独一无二的。太好了!接下来我们将让Claude为我们创建一个HTML查看器来处理这些示例数据。我们的下一个目标是,在验证所有这些样本并确认它们没问题后,将它们推送到Hugging Face,并将它们与我现有的食物提取数据集合并。
我们的目标是创建“Food Extract 100K”,即包含10万个文本样本的数据集,这些样本提取了食物和饮料信息,并标注了其类别(是食品还是饮品)。然后我们可以使用这个数据集来微调一个小语言模型,再用这个小模型去筛选一个大型数据集。太棒了!
看来Claude离线了,所以我转向ChatGPT。这表明这些工具在很大程度上是可以互换的。但这正是机器学习工程师处理数据集的工作流程:执行某项操作、查看结果、验证数据,然后使数据集变得可复用。在当今世界,图像和文本几乎是无限的,因此你可以生成所需的样本数据。这些看起来相当不错。
以下是由Gemini根据种子信息生成的原始标题,而种子信息来源于维基百科上关于不同菜系的文章。因此这里涵盖了非常多样化的内容:不同类型的菜系、不同的食物种类以及不同的食材成分。好了,我的下一步是将这些数据移入README中提到的位置。我现有的数据集是“Food Extract 75K”,我想将两者合并,创建“Food Extract 100K Plus”。
这就是我的下一步:将其移至Hugging Face,甚至可能训练一个模型。我曾在“Food Extract 1K”上训练过模型(该数据集包含来自Pixmo、Cato 700M等数据源的1,000个不同样本)。“Food Extract 100K”将是此类数据集的大幅扩展。哦,看来很多人都在创建自己的版本。做得好!大家肯定都看了那个YouTube视频之类的东西吧?
在这里输入一些文本,让我们先用现有的数据集试试。这些是饮品项和食品项。看看“Food Extract 1K”能否从中提取信息。这只是在Hugging Face Spaces上运行。好了,结果已经相当不错了:AL8甜茶、甜牛奶等。让我们对比一下配对情况。食品项确实没有那么多,但我们有非常相似的饮品项。不错,“Food Extract 1K”已经相当不错了。
是时候将我们的数据集上传到Hugging Face了。我们拥有135,000个样本,所以我将把它命名为“Food Extract 135K”。让我们上传它。在后台处理的同时,我们来解释一下具体发生了什么。完美!我们的数据集现已上传到Hugging Face,可以被多次复用。我们还在其中放置了一个README文件,详细说明相关情况。
Hugging Face就像机器学习界的GitHub一样。这就是“Food Extract 135K”。我要给它点个赞,现在当然可以使用了。Hugging Face为我们提供了一个很好的数据集查看器:我们有12.2万个训练行和1.3万个测试行。我们将对其进行评估,并可以直接使用该数据集。我的下一步是调整我这里的代码……
格式是一样的。我刚刚上传的数据集与“Food Extract 1K”的格式相同。“Food Extract 135K”也是同样的格式,只是样本量要大得多。因此,我可以打开这个笔记本,将这里的加载数据集的代码行替换为这一行(指向新数据),然后训练时间会显著延长,因为样本数量多得多。但我们应该能得到一个强得多的模型,因为它至少见过比那一千个样本的子集多得多数据。所以让我们训练一个小语言模型。这是一个基座模型的很好的例子,它尚未经过微调。
这张大气照片捕捉到了一份手写羊皮纸菜单,展示了拜占庭风味的菜肴。每日特色菜包括香肠、用猪油和香料制作的“Alantia”(一种传统菜肴),以及撒有菲达奶酪的新鲜沙拉。现在,如果我们把它输入到基座模型 Gemma 3 中,我们会得到这样的结果:这是一段很好的食物描述。它准确地捕捉了照片的视觉方面,并突出了关键成分和风味。这里有一些改进的小建议:更具体的细节。
现在我们要做的不是这些,我们需要从中提取食物名称。我们希望得到这样的列表:菲达奶酪、糖、香肠、松子、松脂、蜂蜜、Alantia、猪油、沙拉、燕麦片、黄油、Muri(一种奶酪)、香料、Kefa(可能是某种面包或糕点)、Cafalator。所以,我们要对模型进行微调。我们在 NVIDIA RTX 4090(字幕误读为RTX490)上运行它。深度学习电脑就在下面,我看错摄像头了,它就在那儿。我们将进行三个轮次(epochs)的训练,看看结果如何。我们有12.1万个训练样本,正在微调 Gemma 3(270M参数版)。让我们看着 GPU 忙碌起来。
目前还没有GPU使用率,遇到错误了,真棒,“显存不足”。啊,是的。看来我们需要减小批次大小(batch size),设置为8试试。很好,看起来模型正在训练。预计需要大约一个半小时。现在我们的 GPU 运行得很顺畅,25GB显存中使用了22GB(字幕口误说成20或22),GPU利用率约为99%到100%,这是好事。所以我让它在后台运行,趁此机会去进行第二次散步。
散步的一个好处是会遇到随机的迷迭香灌木丛,闻起来像烤羊肉。通常我会朝一个方向走大约10分钟,然后转身往回走。反正我的模型也在训练嘛?我还把轮次从三个降低到了两个。所以我测试过,在1000个样本上三个轮次是有效的。那么我们就看看两个轮次在处理大量数据时表现如何,可能需要训练更久,但如果那样做,我们就让它整夜运行。我只是想看看效果如何。所以经验法则是:如果模型在训练,我就去锻炼。
散步回来,有点出汗,但看起来已经进行到一半了。完成了第一个轮次(共两个)。让我们看看结果如何。现在正在评估,第一次看第一个轮次的结果总是让人捏把汗哦,验证损失(validation loss)。嗯,我们其实不知道这个数值是高还是低。所以我想我们必须等待下一个轮次,大约再过半小时吧。
哦不,经过两个轮次的训练后,训练损失(training loss)上升了,但验证损失却下降了。我不确定这会如何发展下去。那么我们要评估一下吗?让我们试试吧。这花了大约一个小时的训练时间,希望没问题。好吧,也许我们只是碰巧在错误的时间点查看的,但损失看起来是在下降的。验证损失降得很低。这类模型的美妙之处在于,因为它们已经在大量数据上进行了预训练,所以你可以非常快地在自己的特定数据进行微调。
让我们对一些文本进行预测。这个笔记本是在直播中完成的,有人给我传了这行代码作为测试数据。让我们看看得到了什么:食物、烤豆、煎蛋、黑布丁(血肠)、香肠、培根、蘑菇、吐司、炸番茄;饮料:一杯茶。太棒了,这正是我们想要的。好,现在我们要把这个模型上传到 Hugging Face 上。这样它就会变成一个可复用的模型。漂亮,搞定了。让我们去看看这个 URL,看看我们的模型是否正式在 Hugging Face Hub 上上线了。看这里,“Food Extract Gemma Fine-tune v2”。它使用了13.5万个样本进行训练。
我们有数据集吗?这里没有显示,但没关系,我们可以稍后修复所有的 README 文档。让我们评估一下它,或者更好一点,把它变成一个演示应用(Demo)。所以我运行了一下脚本。这将创建一个名为“food-extract-v2”的代码库,然后上传并构建模型。这能行吗?天哪,真的可以。好吧,让我们看看这个演示应用是否有效。“烤巴拉蒙迪鱼沙拉配牛油果、橄榄、番茄和意大利调味汁”。是的,它起作用了。我们得到了“DI”(饮料项)吗?哦,我们不想要那个,因为没有饮品在那道菜里。
好吧,让我们试试我今天午餐吃的东西。那张图片在哪里?或者用早餐的那张图吧,那是早餐,记得吗?所以我们来测试一下。太酷了,我们成功了。好吧,我们可以正式……等等,让我们检查一下构建状态,它现在工作了吗?哦不,构建失败了。我们会修复那个问题。但我们能勾选完成哪些任务呢?我们可以把“上传数据集到 Hugging Face”打勾。是的,哦天哪,那行字写得太烂了。“完成用于大语言模型微调的数据集构建”。漂亮。接下来是巴西柔术(BJJ)和 LinkedIn 帖子,我还没做那个。我已经写好了草稿,但需要……好吧,我们现在正在做的这个就是视频内容。拍摄并直播了“一天生活”的视频。
我们构建了数据集,训练了一个模型,上传了该模型,并在一些样本上确认它有效。但下一步是我得弄清楚如何在一十亿个样本的数据集(Data Comp 1B)上运行此模型,以过滤出其中所有的食物图像。感觉像回家了一样。这种模式如此熟悉,就像我走向你的方式一样,它就在你眼中让它变得重要。看着我,从我习惯的地方看过来。感觉像回家了一样。
太酷了,这真疯狂。现在到底发生了什么?我最喜欢做的事情之一就是在写完待办事项清单的第二天早上,把完成的事项打勾,然后为下一天写下新的任务列表。所以我们要结束这次散步了,一万步以上已完成。很难把这个打勾呢。“巴西柔术 5:30-6:00”,那是一堂有趣的课,我现在浑身酸痛。家庭晚餐,一顿美味的炒饭。然后拍摄“一天生活”视频,这正是你正在观看的内容。所以今天……哦,我做了这些吗?今天我回到工作状态:我必须过滤十亿行文本以区分食物和非食物,并可能获取图像,为潜在的客户工作进行一些研究。然后我们继续前进。
嘿,我是丹尼尔,>>乔什。嗯,“Neutrify”看起来可能和你之前在视频里看到的不太一样。我们刚刚发布了 Neutrify 3.0 版本。我们现在依然支持照片处理,同时也涵盖了其他所有功能。因此,你可以通过文字输入、扫描或语音指令等方式,无论你想怎么做,都可以将内容导入到 Neutrify 中。
我们为那些坚持看完本视频的前一千名用户准备了特别福利:我们将免费提供三个月的 Neutrify 会员服务。所以,快去看看吧!Neutrify 3.0。祝大家在健康饮食的道路上愉快前行。