在本文中,我将向您展示如何使用在免费的Oracle数据库中运行的JavaScript程序快速创建一个完全免费的应用程序,并调用Hugging Face AI,将结果存储在数据库中,然后可以使用SQL、JSON、REST或任何其他语言访问。所有源代码都可以在此处获得。
一般情况下,应用程序的流程和AI应用程序的流程都涉及到应用程序调用AI服务,然后将信息存储在数据库中,以便稍后检索和处理(例如,使用OML)或进行分析和查询。
通过从数据库本身发出命令,数据会立即存储,因此更可靠,因为它正在处理中,不需要额外的网络调用来持久化。此外,通过将逻辑(甚至代码)驻留在数据库中,可以隐式和固有地利用Oracle数据库的高可用性、管理性和可观察性等功能。
这是Oracle数据库的独特功能,因为它包含Java,并且正如我们将在本博客中看到的那样,数据库本身还包括JavaScript运行时引擎。
Hugging Face开发了用于构建使用机器学习的应用程序的工具。它最为人们所熟知的是其为自然语言处理应用程序构建的transformers库以及允许用户共享机器学习模型和数据集的平台。它在过去几年中变得非常流行。
简而言之,我们将执行以下操作:
- 创建一个帐户并选择一个模型。
- 创建Oracle数据库和数据库用户。
- 添加一个带有证书的钱包,以允许进行HTTPS调用。
- 创建一个表。
- 在数据库中运行一个简短的JavaScript程序,调用Hugging Face AI模型并将结果存储在表中。
- 可选择使用SQL、JSON、REST等查询这些结果。
设置Hugging Face帐户和AI模型
转到https://huggingface.co并注册。转到您的个人资料,并单击“设置”按钮。
单击“访问令牌”,创建一个令牌,并将其值复制以供以后使用。
单击“模型”并选择一个模型。在这种情况下,我们将在“自然语言处理”部分选择一个“问答”模型。
选择一个模型(可能是较受欢迎的模型之一),注意左侧的“模型卡”中的信息,然后选择右侧的“部署”下拉菜单。
选择“Inference API”,然后选择“JavaScript”选项,以查看调用该模型的示例代码片段。
设置Oracle数据库
我们可以使用Oracle数据库的任何版本,从21c开始。在云上,我们可以使用Oracle始终免费的自主数据库(这也很好,因为我们可以通过互联网公开它,并在几分钟内使游戏真正全球/在线可用),或者我们可以使用Oracle 23c免费版本,在本地安装或使用容器映像。当然,我们也可以将本地用于开发,云用于生产等等,这两个选项都非常快速。
始终免费的Oracle云数据库选项
您可以在此处设置Oracle云始终免费的自主数据库。提示非常直观。只需在Oracle Database菜单屏幕上选择“自主事务处理”,如下所示,然后单击“创建自主数据库”按钮。您可以选择所有默认设置,只需提供一个管理员用户密码。
Oracle数据库免费选项
您可以在此处设置Oracle数据库免费版23c。
使用容器映像非常简单。只需执行下面的一行代码,将-e ORACLE_PASSWORD=Welcome12345替换为您选择的密码,并将-v oracle-volume:/somedirectory替换为目录位置(如果您只希望具有内存中的数据库,则可以完全省略它)。请注意--add-host docker.for.mac.host.internal:host-gateway参数允许容器外部的调用。这是适用于Mac的设置,如果在其他操作系统上运行,则会有所不同。
docker pull
container-registry.oracle.com/database/free:latest; docker run --add-host docker.for.mac.host.internal:host-gateway -e ORACLE_PASSWORD=Welcome12345 -v oracle-volume:/somedirectory container-registry.oracle.com/database/free:latest
设置 SQLcl(或数据库操作)并连接
如果您使用的是云数据库,您可以通过在OCI控制台中单击数据库操作,然后选择SQL来管理云数据库的SQL和JavaScript。
您还可以按照以下步骤安装SQLcl来管理提到的任一数据库/选项:
-
从此位置下载并安装。这将提供一个可执行文件
[SQLcl_INSTALL_DIR]/bin/sql,我们将用它来管理数据库。为了方便起见,您可以将[SQLcl_INSTALL_DIR]/bin添加到您的PATH中。 -
使用您的SQLcl位置替换
[SQLcl_INSTALL_DIR],并替换为您在创建数据库时提供的作为ORACLE_PASSWORD的密码进行登录。
这是一个使用本地安装的示例(例如,Oracle Database Free容器映像):
这是一个使用云数据库的示例(例如,Oracle Always Free Autonomous):
创建钱包
创建一个钱包来保存从运行在数据库中的JavaScript到Hugging Face的SSL/HTTPS调用的证书。
我们将创建Hugging Face API SSL证书的PEM,将其存储在钱包中,将钱包(特别是ewallet.p12文件)上传到数据库,并指示数据库在HTTPS调用中使用该证书。具体地说,我们将指示Oracle数据库中的JavaScript fetch命令映射/使用的UTL_HTTP包在HTTPS调用中使用该证书。
1. 首先,使用以下命令获取Hugging Face的SSL证书(api-infeerence.hugging.face.co:443),并将其保存到PEM文件中。
2. 在SQLcl提示符处发出以下命令,创建一个钱包,将PEM添加到钱包中,并通过显示结果进行验证。 -cert参数指向您刚刚创建的PEM文件。
3. 现在您有一个包含Hugging Face API证书(pem)的钱包目录,如果尚未这样做,请打开另一个终端窗口,克隆或下载src repos(本文开头链接的位置),cd到根目录(huggingface-javascript-oracle),并将ewallet.p12文件复制到src/main/resources目录中。换句话说:
4. 返回SQLcl终端,并从src repos运行/安装sql/writefile.sql文件。
5. 这将安装我们将从小型Java实用程序调用的write_file存储过程,该实用程序将上传我们的ewallet.p12到数据库以用于HTTPS调用。返回到src repos终端(再次从根目录(huggingface-javascript-oracle)),运行以下命令,根据需要替换数据库连接值。例如,在使用Oracle Free容器映像数据库的情况下:
您应该看到类似于HuggingFaceFromOracleDatabaseApplication ewallet.p12 wallet uploaded to DATA_DUMP_DIR的输出。
6. 返回SQLcl终端窗口,并运行以下命令以获取上传ewallet.p12文件的DATA_DUMP_DIR的位置。
您应该看到类似于以下内容的输出。
7. sql/create_aijs_acl.sql将指示数据库(UTL_HTTP包)使用ewallet.p12中的证书对主体aijs进行HTTPS调用。在此文件中,将前面的/dba_directories查询返回的路径替换为两个wallet_path的值,并替换[WALLET_PASSWORD]的值。
wallet_path => 'file:/opt/oracle/admin/FREE/dpdump/FB9997ED60890BBDE0536402000AF33F',
[...]
'file:/opt/oracle/admin/FREE/dpdump/FB9997ED60890BBDE0536402000AF33F', '[WALLET_PASSWORD]'
8. 现在运行以下SQL文件来创建aijs用户,其必要的授权和ACLs(请注意,这些可以进一步加强以提高安全性)。
9. 现在连接用户并创建一个表来存储对Hugging Face的调用结果。
现在一切准备就绪可供运行。
运行应用程序并管理结果
最后,从数据库中的JavaScript代码运行HuggingFace查询:
然后,通过执行SQL查询来检查存储在表中的JSON结果。
通过查看我们刚刚执行的代码,我们可以看到JavaScript代码片段:
有关Hugging Face的有用参数和调试信息可以在文档中找到。
现在可以使用SQL或JSON(同时,由于新的JSON二元性功能)以及REST或甚至MongoDB API来查询、分析等处理结果。
Oracle数据库是用于AI的完美数据库,原因如下:
- 用于矢量表示和存储的本地数据类型:RAW、BLOB、JSON
- 内存列存储器用于存储和搜索矢量嵌入,具有SIMD内核以实现令人惊叹的性能
- 可扩展的索引框架用于创建数据模型特定的索引(例如,文本、空间)
- 本机Oracle机器学习API – 建模、分类、评分、聚类等
- DML、并行加载、分区、高级压缩、并行查询、RAC、分片等
还可以从Oracle数据库内部调用Oracle OCI AI和其他服务。
结论
本文介绍了如何使用JavaScript从Oracle数据库内部调用Hugging Face API,从而展示了一个强大的功能组合,非常适合各种AI解决方案,并且对JavaScript开发人员友好。
与数据库中的JavaScript相关的其他博客,例如使其成为可能的多语言引擎(MLE)等内容,可以在Martin Bach的帖子和这篇关于在23c中导入JavaScript ES模块的帖子中找到。
期待您的任何评论或问题,并非常感谢您阅读。