Skip to content
This page has been auto-translated and may contain errors.View in English

在本地运行嵌入和向量数据库

使用此页面在你的计算机上运行提取的课程聊天机器人。它会安装下载中遗漏的两个包,调整聊天机器人的 OpenAI 和 Supabase 设置以适配 Vite,然后针对你在课程中构建的数据库启动浏览器项目。

你需要提前准备的东西

安装受支持的 LTS 版本的 Node.js。推荐使用 Node 24,它包含 npm。你还需要一个 OpenAI API 密钥和一个包含课程数据的现有 Supabase 项目。

对于 Supabase,使用可发布密钥(以 sb_publishable_ 开头)或旧版 anon 密钥。这些密钥设计用于出现在浏览器代码中:任何复制了密钥的人只能进行你的行级安全策略允许的操作,这是 Supabase 的按行访问规则。Supabase 计划在 2026 年底前停用旧版密钥,所以当你的项目显示可发布密钥时,最好优先使用它。永远不要在此浏览器项目中放入秘密密钥或 service_role 密钥。查看 Supabase API 密钥了解当前的密钥类型。

OpenAI 密钥没有等效的作用域限制:任何复制它的人都可以进行计费到你账户的请求,所以在生产环境中它永远不应该出现在客户端代码中。这个学习设置仍然会将它发送到浏览器,下面 Vite 部分的警告解释了这样做的限制。Vercel AI SDK 项目展示了服务器端的安排:它使用 Supabase 秘密密钥,这在那个项目中是可以接受的,因为那个项目运行在服务器上,其密钥永远不会到达浏览器。

Juno你需要提前准备的东西 安装 Node.js LTS,然后准备好你的 OpenAI 密钥和课程中构建的 Supabase 项目。

对于 Supabase,使用可发布密钥或 anon 密钥,这是为浏览器设计的密钥类型,永远不要使用服务器秘密密钥。

Juno你需要提前准备的东西 此项目需要 Node 以及两个实时服务:OpenAI 和课程中的 Supabase 数据库。

你配置的 Supabase 密钥在客户端代码中可读,所以它必须是可发布密钥或 anon 密钥,其访问权限受行级安全限制。将每个服务器端密钥都保持在此项目之外。

Juno你需要提前准备的东西 复制的可发布密钥或 anon 密钥只能进行你的行级安全策略允许的操作,这就是为什么这种密钥类型是为浏览器代码设计的。OpenAI 密钥没有这样的限制,会一直花费你的钱,直到你撤销它。

所以 Supabase 密钥在客户端代码中是一个策略问题,而 OpenAI 密钥在生产客户端代码中是一个错误。

打开项目文件夹

在包含 package.json 的提取的聊天机器人文件夹中打开终端:

bash
$ cd path-to-your-downloaded-project

为了确认你有正确的下载,打开 package.json:聊天机器人声明了 Vite,其旁边的源代码包括下一部分要编辑的 config.jsindex.js 文件。这些说明适用于已完成的聊天机器人,其代码同时导入 openai@supabase/supabase-js;仅从文件夹名称无法将其与较早课程的下载区分开来。

Juno打开项目文件夹 在包含 package.json 的提取文件夹中工作;此页面上的每个安装和每个文件都属于此处。

如果终端在其他任何地方,命令将在错误的文件夹中运行。在输入任何内容之前,检查文件夹列表中的 package.json

Juno打开项目文件夹 编辑任何内容之前确认文件夹:顶级的 package.json 中声明了 Vite,其旁边是 config.jsindex.js

此页面上的每个命令都假设你在这个文件夹中。

Juno打开项目文件夹 在修复任何内容之前读取导入。这些步骤适用于源代码同时导入 OpenAI 和 Supabase 并运行已完成聊天机器人流程的下载。

较早课程的下载从文件夹名称来看几乎完全相同,对其应用这些编辑会修复它没有的问题。

为 Vite 准备项目

安装声明的 Vite 依赖,然后安装源代码导入但下载的 package.json 未声明的两个包:

bash
$ npm install
$ npm install openai @supabase/supabase-js

打开 config.js 并替换每个 Scrimba 环境读取。保持现有的导入、导出和验证,但替换三个环境名称中的四处出现:

js
process.env.OPENAI_API_KEY
import.meta.env.VITE_OPENAI_API_KEY

process.env.SUPABASE_API_KEY
import.meta.env.VITE_SUPABASE_API_KEY

process.env.SUPABASE_URL
import.meta.env.VITE_SUPABASE_URL

两个 OPENAI_API_KEY 读取分别位于验证检查和 OpenAI 客户端中,所以要改变两处。

打开 index.js 并将聊天模型从 gpt-4 改为 gpt-4o-mini。按照课程进行时,保持提供的 text-embedding-ada-002 嵌入模型不变。课程数据库中的现有向量必须具有与查询嵌入相同的维度;改变该模型是单独的数据库迁移,不属于本地设置的一部分。

package.json 旁边创建 .env

dotenv
VITE_OPENAI_API_KEY=your-openai-api-key
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_API_KEY=your-publishable-or-anon-key

还要创建 .gitignore

txt
.env
node_modules/

.env 发送到 Git 仓库是密钥泄露的最常见方式;忽略文件和良好习惯完整涵盖了这个习惯。

这些凭据在浏览器中可见

Vite 将 VITE_ 值复制到前端包中。使用受限的学习凭据,在 Supabase 中启用行级安全,永远不要发布此版本。生产应用必须将 OpenAI 请求转移到后端。

Juno为 Vite 准备项目 安装缺失的包,将每个旧环境读取替换为其 Vite 对应物,并使用浏览器安全的 Supabase 密钥将你的密钥放在 .env 中。

然后添加 .gitignore 使 .env 保持在 Git 之外。

Juno为 Vite 准备项目 源代码导入下载从未声明的两个 SDK 并读取 Scrimba 的环境名称,所以在启动 Vite 之前安装两个包并改变所有四处读取。

你遗漏的读取会在页面运行时失败,而不是在 Vite 启动时失败。.env.gitignore 配对完成修复。

Juno为 Vite 准备项目 安装 SDK 修复导入;VITE_ 名称是将值放在包中的东西,包也将 OpenAI 密钥传递到浏览器代码。

这对课程来说是可以接受的,对生产来说是禁止的,所以在真正的用户接触此聊天机器人之前,将 OpenAI 调用移到后端。

运行项目

bash
$ npm start

打开 Vite 打印的 Local URL,并向聊天机器人提出课程数据涵盖的问题。有用的回答表明页面、Supabase 检索和 OpenAI 请求都在工作。更改 .env 后重新启动命令,并用 Ctrl+C 停止它。

Juno运行项目 运行 npm start,打开 Local URL,并向聊天机器人提问课程数据涵盖的内容。

如果你改变 .env,重新启动命令使 Vite 读取新值。完成时按 Ctrl+C。

Juno运行项目 Vite 干净地启动证明修复的项目束;有用的回答证明其余的一切。

一个好问题测试 OpenAI 访问和 Supabase 行以及策略,所以把它当作集成测试。任何 .env 更改后重新启动。

Juno运行项目 加载的页面不是通过的测试。本地服务、Supabase 检索、嵌入查找和回答生成是单独的检查点,每一个都可能在正常呈现的页面后面失败。

故障排除

Failed to resolve import "openai""@supabase/supabase-js" 在包含 package.json 的文件夹中运行本页面前面显示的两个安装命令。

process is not defined config.js 中仍然存在 process.env 引用。用匹配的 import.meta.env.VITE_... 值替换它。

Supabase 返回无行或权限错误: 确认项目 URL,使用可发布密钥或 anon 密钥,并检查课程表和行级安全策略是否存在于同一项目中。

OpenAI 拒绝模型或密钥: 在 OpenAI 账户中确认账单和密钥访问。使用对该项目可用的当前模型。

Juno故障排除 将错误作为线索读取:缺失的导入意味着额外的包未安装,process is not defined 意味着 Vite 名称仍然错误,空回答通常指向 Supabase 数据或权限。

一次修复一个,每次修复后重新运行页面。

Juno故障排除 按依赖顺序检查:包解析,然后是所有四个环境替换,然后是 Supabase URL 和 RLS 策略,然后是 OpenAI 密钥和模型。

每一层都取决于前一层,所以在第一个损坏的层停止并在那里修复它。

Juno故障排除 没有有用回答的聊天机器人在三个层中的一个失败:浏览器包、Supabase 权限和行,或 OpenAI 请求。按该顺序检查它们;打开的页面只证明 Vite 正在运行。