基于计算机视觉的图书推荐应用【AI编程实录】

embedded/2024/10/9 15:20:34/

我相信这篇文章的许多读者都有一个“抽屉”,里面装满了未完成的很酷的业余项目。由于AI每天都在帮助我的团队编写代码,我决定试一试,看看它能让我在一个我最喜欢的业余项目中走多远,最好是用最少的代码编写。

由于我对它能走多远感到非常惊讶,我决定写下我的经历,并检查“无代码人工智能编程”能走多远的极限以及实际的局限性。这篇文章(实际上是这个系列)将描述这段旅程。

1、简介

我酝酿这个想法已经很多年了——一个只需拍照就能推荐书籍的应用程序。正如所说,我通常忙于客户项目。但在最新AI工具的帮助下,我决定试一试。事情并不总是一帆风顺的——计算机视觉和文本识别给我带来了一些意外。但令我惊讶的是,我设法以比我预期快得多的速度得到了一个好的原型。即使在你不是专家的领域,人工智能也能帮助将想法变成现实,这真是太神奇了。这段旅程既令人谦卑又令人兴奋,我迫不及待地想看看它会带来什么。

宣传语如下:“想象一下,你走进一家书店,你真的想买一本书,但买哪一本呢?此外,可能还有一张打折的桌子,周围散落着许多书,等着你选择一本或多本,但同样,选哪一本呢?我希望有一个应用程序可以解决这个问题,而不是无助地四处寻找。进入 Book Shazam:拍一张这个场景的照片,然后获得书籍的个性化评分。”

那么为什么是现在呢?在我们公司 Shibumi AI,我们已经使用 LLM 很长一段时间了,大约从 2021 年 API 发布开始。我们还利用 Copilot 完成各种编程任务。当然,我们使用 Web UI 本身来编写文本、总结文本等等。偶尔,我们会尝试在 Web 应用程序中编写代码(无论是 ChatGPT 还是 Claude)。

直到最近,结果都不是特别令人印象深刻。但最近,特别是自 Claude Sonnet 3.5 发布以来,我们感觉到可以使用此工具创建真正的软件项目,尽管很简单。我们到处尝试(也看到其他人这样做)浏览器扩展、简单的应用程序等。因此,我决定是时候站出来构建一个稍微复杂一点的产品了。这一系列帖子记录了这个过程。

此外,最近一直在讨论非开发人员是否以及何时能够使用 AI 创建成熟的应用程序或产品。在这个项目期间,我牢记这个讨论并尝试:

  • 不要触碰代码,或者至少尽可能少地触碰
  • 特别注意那些对我这个技术人员来说可能很容易,但对非开发人员来说却有点挑战性甚至非常具有挑战性的任务。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

2、规划项目

总体而言,这不是一个超级难的项目,但它有挑战性。此外,作为一名数据科学家,我更擅长 Python 和 ML 模型,而 JavaScript 和 UX 则较弱。但 LLM,尤其是 Claude,让我感觉范围缩小了。所以让我们开始吧。

首先,让我们稍微分解一下产品——我们需要构建:

显然,实施先进而酷炫的解决方案(例如尖端的推荐器和 OCR)很诱人,但我们将采用简单的产品方法。

任何新手产品经理都会为你画出类似这样的图:

这个草图通常意味着从开发的早期阶段开始,你就应该有一个可行的解决方案。换句话说,你不应该在最终的 1.0 版本准备好并发布之前对其进行开发,因为在整个期间你不会得到任何用户反馈。你应该做的是从一个丑陋的简单工作解决方案和 MVP(最小可行产品)开始,并在每个阶段根据用户反馈逐步改进它。我们将采用这种方法。

因此,我们将这样完成我们的任务:

计算机视觉系统:具有简单的用户界面,这将是应用程序的支柱。我们希望具有上传图像、检测书籍、识别其名称(OCR — 光学字符识别)和单击它们的功能。我们将让 Claude 处理所有事情。

推荐引擎:目前最简单的推荐引擎就是“询问 LLM”。我们需要处理冷启动问题(没有新用户的数据),因此我们可以简单地要求用户输入他们最近阅读并喜欢的几本书(我知道这很基本)。我们将在下一篇文章中处理这个问题

UX:在拥有一个“可运行”的系统后,我们将优化用户体验:

  • 使设计看起来更美观、更现代
  • 使流程更友好、更流畅。

更多功能:

  • 为了使这个应用程序更具功能性,我们将添加一个登录系统,让用户可以多次使用该应用程序。
  • 最终,我们将把应用程序部署到云端,让用户可以访问它。
  • 超出本系列的范围,我们可以为应用程序添加更多功能,例如对不在图像中的书籍进行评级等等。

3、流程—书籍检测

让我们首先讨论使用 LLM 进行开发的一般方法:如前所述,Claude 的能力将我们带到了 LLM 开发的 0.2 版。0.1 版本是 GPT4(和 4o),它主要返回有时有效的代码,并且每个任务都需要进行几次迭代。

在 Claude 中,情况会好一些:代码版本会作为工件保存,你可以管理一种对话(有时包括编辑模型消息以进行错误的转变)。

Claude 还包括“预览”功能,允许在编辑器本身中运行简单的脚本。这似乎是一个小功能,但在我看来,对于非开发人员来说至关重要。我们不会在本演练中使用它。

当你要求 Claude 编写代码时,应该:

  • 非常具体。
  • 清楚地写出所有必需的功能。
  • 不要写得太长。

所以我要求以下内容:

请注意,这是使用 LLM 执行编程任务的良好做法:

  • 如果模型在某个部分严重失败,您可以使用相关部分的“强化”编辑请求(如您在“确保”中看到的 - 根据我在计算机视觉任务中的经验,模型经常变得懒惰并选择无法真正处理任务的模型。)
  • 另外,请注意,我给了模型选择技术的自由 - 它可以选择 JavaScript 或其其中一种风格(例如 React)......实际上,它选择了 Flask - 这极大地影响了整个架构 - 而不是在浏览器中运行整个模块,我们将在这里拥有一个服务器/客户端系统。这种选择有利有弊。但是,由于我们计划在应用程序中使用 LLM,因此目前将密钥保留在服务器上会更容易。此外,我对 Python 感觉更舒服,所以我现在不会抱怨。但我们以后可能会想要一个仅限客户端的应用程序。

为了测试目的,我们将配备一张测试图像:

Claude 有一个漂亮的用户界面,左侧是文本,右侧是代码(“工件”)。它以 Python、HTML 和 Javascript 格式返回输出,但将代码存储在一个文件中,并在注释中指出 — 我应该手动将它们分开 — .py 和 .HTML。

此外,Claude 还为代码添加了清晰的说明和解释,这可能对使用代码和更好地理解代码都非常有帮助。如果你想边构建边学习,这是一个非常有用的工具。

将文件放到位后,我按照 Claude 的说明运行了 python app.py,得到了以下结果应用:

应用的第一个打开屏幕

非常丑陋,但现在我们正在尝试让它工作,设计将在稍后完成。

文件上传和图书检测工作正常 - 除 2 本外,所有图书均能被检测到。但有一个错误 - 单击一本书不会执行任何操作。

检测结果

由于我们正在与 Claude 交谈,我可以简要地记录下故障,Claude 将尝试修复该错误:

Claude 重写了 HTML 代码,现在它可以工作了,请参见下面的“获取信息”弹出窗口。

现在剩下的就是在弹出窗口中填充内容——稍后再添加书名和评分。我会让 Claude 插入一个 OCR 组件:

Claude 选择使用 Tesseract — 带有 Python 包的最通用 OCR 工具。它不是最好的工具,但它是最新的并且随着时间的推移不断改进,所以我们来试一试:

显然,如上所示,Tesseract 不起作用。在大多数书中,它都找不到任何东西,在一些书中它检测到一些乱码,只有在一本书中它检测到文本(不是最清晰的文本),这让我认为它出现了某种故障。

所以让我们再给它一两次机会。

于是Claude对代码做了一些改进,但是效果仍然不太好。

我认为我们可以进一步改进 Tesseract,而且对于所谓的“野外文本”有更好的包装,但是我们目前想要快速行动,所以有时给 Claude 指明正确的方向是件好事:让我们使用非常好的 Google vision API。

Claude 遵从命令,用 Google Vision 替换了 Tesseract 代码,剩下的就是从 Google 复杂的界面获取服务帐户密钥。这项任务对于非开发人员来说可能有点困难,但 Claude 会在这里提供说明。将一切准备就绪后,OCR 就可以正常工作了:

这并不难,而且让我们完成了项目的重要部分,让我们庆祝一下吧!

4、分析

但是,等等,让我们想一想。我们渴望继续前进并完成 MVP。但是,既然应用程序的这么重要部分已经准备就绪,让我们(在庆祝的同时)思考一下实际将其产品化还缺少什么(除了我们之前讨论过的推荐器和用户体验)

4.1 计算机视觉

我们这里有两个任务:

  • 检测
  • OCR

我们以一种黑客的方式用一张图片推进,并见证了以下结果(见上面的检测结果图片):

  • 检测到 17 本书(真阳性)
  • 2 本书未检测到(假阴性)
  • 2 个假阳性

未检测到的书籍应该得到处理。让我们看看 Claude 做了什么。

查看代码,Claude 为我们选择了经典的 Yolo5 模型,该模型在 COCO 数据集上进行了预训练,并“突出显示”了书籍类别,幸运的是,该类别包含在数据集中。

但是,它也选择了“S”模型,这意味着模型很小。

我们可以:

  • 用更大的模型替换模型(不用想)
  • 用 Yolo v8(一种具有更高准确度的较新模型)替换模型
  • 用专门针对书籍进行训练的模型替换模型(需要输入一些详细的结果表)
  • 自己微调模型(需要我们撸起袖子)

从快速实验来看,将 Yolo-small 更改为 Yolo-medium 确实可以改善结果。

为了真正获得详尽的结果,我们需要收集更多图像作为测试集。假设约 100 张,在不同设置和光照条件下 - 但这超出了本文的范围。

这种计算机视觉优化是 Shibumi 的专长之一。

4.2 架构和部署

此应用程序目前仅在我的机器上运行。为了使用户可以使用它,我们需要做一些基础工作:

  • 使用更好的服务功能包装应用程序(例如 gunicorn、docker)
  • 优化服务时间和流程:目前,代码似乎为每个 API 调用实例化模型,这不是最理想的。我们需要优化此流程以使我们能够为多个用户提供服务

这些项目和其他项目对于将此类应用程序从 MVP 阶段转变为完整工作的应用程序至关重要,这也是我们在 Shibumi 中主要做的事情。我们将在稍后阶段处理它。

5、结束语

正如所说,我们似乎处于“使用 LLM 编程”的 0.2 阶段。我们正在探索其功能和局限性。

主要限制之一是编程中的一些小而烦人的事情——在代码中插入一些密钥(正如我们在 Google API 的服务帐户 jey 中看到的那样)、设置服务器和修复一个小错误。

作为开发人员,解决这些问题是我们工作的一部分。但对于非开发人员来说,这些可能是严重的阻碍。在 0.3 版或更高版本中,有多少这样的事情会消失?有多少将通过外部工具(例如 Replit 或 Cursor)解决?很难知道。但我们专注于我们现在拥有的东西。

现在就这些。在下一部分中,我们将添加推荐系统。


原文链接:用AI编程的实践记录 - BimAnt


http://www.ppmy.cn/embedded/101413.html

相关文章

Mysql集群相关技术

目录 一、源码部署mysql 1.1 下载源码包 1.2 安装部署 二、mysql 的主从复制 2.1 在master上配置 2.2 在slave上的配置 2.3 测试 2.4 延迟复制 2.5 慢查询日志 2.6 mysql的并行复制 2.7 原理剖析 2.8 架构缺陷 三、半同步模式 3.1半同步模式原理 3.2 gtid模式 …

NLP -->定义、应用、与职业前景解析

1. 自然语言处理(NLP)的定义与误区 定义: 自然语言处理主要集中于文本的处理,旨在使计算机能够理解和生成自然语言文本。常见误区: 初学者容易将自然语言处理与语音识别混淆。 语音识别: 将语音转成文字,这不属于自然语言处理范畴…

DNS详解

DNS详解 DNS 是一个域名系统,它主要用于将人类容易记忆的域名转换成ip地址。 默认情况下,设备会自动从网络供应商获取DNS服务器地址,并使用DNS服务器对域名进行解析。 此外,你也可以手动设置DNS服务器,具体操作系统…

nginx知识补充

文章目录 一、正、反向代理服务器正向代理服务器(Forward Proxy)反向代理服务器(Reverse Proxy)正向代理与反向代理的主要区别总结 二、nginx的四、七层反向代理七层反向代理(Layer 7 Proxy)四层反向代理&a…

【YOLOv8改进[Conv]】 感受野注意力卷积RFAConv(2024.3)| 使用RFAConv改进目标检测效果 + 含全部代码和详细修改方式

本文将进行在YOLOv8中使用 感受野注意力卷积RFAConv改进v8 的实践,助力YOLOv8目标检测效果,文中含全部代码、详细修改方式。助您轻松理解改进的方法。

解决执行npm run dev报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS

问题: 最近下载了一个开源系统,执行npm install很顺利,以为大功告成,结果运行npm run dev时报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS 解决方法: 应用程序配置(package.json&a…

UE4编安卓时Core模块为何只include Android文件夹?

Core模块 Core模块是整个引擎中最核心的模块。几乎UE4中的每个其他模块都导入Core。Engine\Source\Runtime\Core\Private下有很多文件夹&#xff0c;下面罗列一部分&#xff1a; G:\St\EngineSource\Engine\Source\Runtime\Core\Private 的目录 2024/07/18 12:02 <DIR…

DataX(Doris同步数据到SelectDB)

背景 由于之前的doris数仓在本地的服务器&#xff0c;当数据量越来越大&#xff0c;服务器的性能达不到要求&#xff0c;查询数据经常超时&#xff0c;故需要把本地的doris数仓部署到云上&#xff0c;本文以阿里云为例&#xff0c;迁移工具使用的阿里开源的datax。 datax官方文…