在本地运行嵌入和向量数据库
使用此页面在你的计算机上运行提取的课程聊天机器人。它会安装下载中遗漏的两个包,调整聊天机器人的 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 秘密密钥,这在那个项目中是可以接受的,因为那个项目运行在服务器上,其密钥永远不会到达浏览器。
对于 Supabase,使用可发布密钥或 anon 密钥,这是为浏览器设计的密钥类型,永远不要使用服务器秘密密钥。
你配置的 Supabase 密钥在客户端代码中可读,所以它必须是可发布密钥或 anon 密钥,其访问权限受行级安全限制。将每个服务器端密钥都保持在此项目之外。
anon 密钥只能进行你的行级安全策略允许的操作,这就是为什么这种密钥类型是为浏览器代码设计的。OpenAI 密钥没有这样的限制,会一直花费你的钱,直到你撤销它。 所以 Supabase 密钥在客户端代码中是一个策略问题,而 OpenAI 密钥在生产客户端代码中是一个错误。
打开项目文件夹
在包含 package.json 的提取的聊天机器人文件夹中打开终端:
$ cd path-to-your-downloaded-project为了确认你有正确的下载,打开 package.json:聊天机器人声明了 Vite,其旁边的源代码包括下一部分要编辑的 config.js 和 index.js 文件。这些说明适用于已完成的聊天机器人,其代码同时导入 openai 和 @supabase/supabase-js;仅从文件夹名称无法将其与较早课程的下载区分开来。
package.json 的提取文件夹中工作;此页面上的每个安装和每个文件都属于此处。 如果终端在其他任何地方,命令将在错误的文件夹中运行。在输入任何内容之前,检查文件夹列表中的 package.json。
package.json 中声明了 Vite,其旁边是 config.js 和 index.js。 此页面上的每个命令都假设你在这个文件夹中。
较早课程的下载从文件夹名称来看几乎完全相同,对其应用这些编辑会修复它没有的问题。
为 Vite 准备项目
安装声明的 Vite 依赖,然后安装源代码导入但下载的 package.json 未声明的两个包:
$ npm install
$ npm install openai @supabase/supabase-js打开 config.js 并替换每个 Scrimba 环境读取。保持现有的导入、导出和验证,但替换三个环境名称中的四处出现:
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:
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:
.env
node_modules/将 .env 发送到 Git 仓库是密钥泄露的最常见方式;忽略文件和良好习惯完整涵盖了这个习惯。
这些凭据在浏览器中可见
Vite 将 VITE_ 值复制到前端包中。使用受限的学习凭据,在 Supabase 中启用行级安全,永远不要发布此版本。生产应用必须将 OpenAI 请求转移到后端。
.env 中。 然后添加 .gitignore 使 .env 保持在 Git 之外。
你遗漏的读取会在页面运行时失败,而不是在 Vite 启动时失败。.env 和 .gitignore 配对完成修复。
VITE_ 名称是将值放在包中的东西,包也将 OpenAI 密钥传递到浏览器代码。 这对课程来说是可以接受的,对生产来说是禁止的,所以在真正的用户接触此聊天机器人之前,将 OpenAI 调用移到后端。
运行项目
$ npm start打开 Vite 打印的 Local URL,并向聊天机器人提出课程数据涵盖的问题。有用的回答表明页面、Supabase 检索和 OpenAI 请求都在工作。更改 .env 后重新启动命令,并用 Ctrl+C 停止它。
npm start,打开 Local URL,并向聊天机器人提问课程数据涵盖的内容。 如果你改变 .env,重新启动命令使 Vite 读取新值。完成时按 Ctrl+C。
一个好问题测试 OpenAI 访问和 Supabase 行以及策略,所以把它当作集成测试。任何 .env 更改后重新启动。
故障排除
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 账户中确认账单和密钥访问。使用对该项目可用的当前模型。
process is not defined 意味着 Vite 名称仍然错误,空回答通常指向 Supabase 数据或权限。 一次修复一个,每次修复后重新运行页面。
每一层都取决于前一层,所以在第一个损坏的层停止并在那里修复它。

