什么是嵌入?使用 Supabase 生成嵌入

自然处理语言(NLP)是机器尝试理解、解释和生成有意义的人类语言的过程。我们以 ChatGPT 形式使用的文本生成模型使用该模型来处理语言,因为机器无法理解直接的人类语言。NLP的兴起在未来肯定会兴起,并产生更好的反应。

其中,背后有各种原理,例如标记化、解析、语义角色标签等。其中之一就是词嵌入。这是一种将单词表示为连续向量空间中的多维向量的技术。这种嵌入对于增强任何 NLP 模型的工作非常有用。

所以,今天我们将学习更多关于嵌入的知识。我们要讨论的主题是:

  • 什么是嵌入?
  • 嵌入的用例
  • 在 Supabase 的边缘函数中生成 Embedding
  • 将嵌入存储在 Supabase 中作为 pgvector

我希望这能让您兴奋地学习更多有关词嵌入的知识。

词嵌入

正如我们在简介中讨论的那样,它是一种用于以多维向量格式表示单词的技术。每个单词都有一个以向量表示的数值。这些向量根据大型文本语料库中的上下文捕获单词之间的关系。嵌入已成为任何 NLP 模型的基本组成部分。它有助于提高运行查询时的性能。

让我们举一个嵌入的例子来更好地理解它。下面是三句话:

  1. “猫追老鼠。”
  2. “狗对着猫狂吠。”
  3. “老鼠跑了。”

可以使用以下输出创建二维向量嵌入:

  • “猫”-> [0.9, 0.2]
  • “狗”-> [0.8, 0.3]
  • “鼠标”-> [0.1, 0.9]
  • “追逐”-> [0.7, 0.4]
  • “咆哮”-> [0.6, 0.5]
  • “跑”-> [0.2, 0.8]
  • “the” -> [0.0, 0.0] 像“the”这样的常见单词通常具有接近于零的向量

嵌入的用例

嵌入有多种用例,其中一些是:

  • 语义理解:嵌入中的单词编码了单词之间的关系。相似的词具有在嵌入空间中接近的向量。这种语义理解对于同义词识别和单词类比等任务很有用。
  • 情感分析:它对于理解单词的情感也很有用。书写文字的语气。有助于识别句子的情感价值。它还可以帮助根据语法中的要求改善给定句子的语气。
  • 语言翻译:通过嵌入,可以轻松地将单词从一种语言翻译成另一种语言。它可以给出具有相似向量值的不同语言中的相似单词。
  • 信息检索:词嵌入通过理解用户查询和语料库中文档之间的语义相似性来改进搜索引擎。它将有助于从大数据集中检索有用的数据以进行进一步处理。

词嵌入可以进一步应用于各个领域来处理文本文档。通过对模型进行微调,可以得到更好的结果。有多种模型经过数据预训练以提供嵌入。这些平台可以是Openai嵌入、transformer.js嵌入、FastText等。

使用 Supabase 生成嵌入

Supabase是一个强大的后端即服务平台,允许开发人员使用无服务器功能和 PostgreSQL 数据库轻松构建可扩展的 Web 应用程序。最近他们引入了对 Transformers.js 的支持。它的设计目的是在功能上等同于 Hugging Face 的适用于 NodeJS 和 deno 的 Transformers Python 库。

supabase 的边缘函数中提供了 Transformers.js 的这种支持。边缘函数是在FasS的基础上实现的,运行函数来执行任务。这有助于实现无服务器架构。这些函数在演示环境中运行。我们可以使用这个边缘函数执行各种任务。您可以从此处了解有关边缘函数的更多信息。

我们将构建一个 React 应用程序,它将请求发送到边缘函数以将给定文本转换为嵌入。然后该嵌入被存储在supabase 数据库中。那么,让我们开始吧。

构建反应应用程序

我们将使用 CRA 来使用 React。您还可以使用其他 React 框架。不会有太大区别。
使用以下命令安装 React:

    npx create-react-app embeddings

注意:要使用上述命令和其他命令,您需要预先安装nodejs 。

清理掉不必要的代码。现在,是时候安装必要的库了。以下是这些:

  • @supabase/supabase-js:用于处理 Supabase 请求的 JavaScript 库。
    npm i @supabase/supabase-js

将项目添加到 Supabase

首先,让我们在 supabase 仪表板上设置我们的项目。访问supabase.com,然后单击Start your project导航栏右侧的。这将带您进入登录页面。根据需要输入您的登录或注册详细信息。登录后,您将被重定向到项目页面。从这里,单击New Project创建项目。在“创建新项目”页面上,系统会要求您输入项目的详细信息。

什么是嵌入?使用 Supabase 生成嵌入

填写您的项目的详细信息。根据您的选择输入项目名称。对于密码,您可以使用Generate a password来生成密码。选择距离您的项目用户最近的区域。在免费层中,您可以创建两个项目。填写详细信息后,单击Create new project。设置项目需要几分钟的时间。

应用程序.js

这是 App.js 的代码。每个步骤都有注释来解释。

    import "./App.css";
    import { useState } from "react";
    import { createClient } from "@supabase/supabase-js";

    // Create a single supabase client for interacting with your database
    const supabase = createClient(
      SUPABASE_URL,
      SUPABASE_ANON_KEY,
    );
    function App() {
      // storing data in state
      const [inputData, setInputData] = useState(null);
      const [embedData, setembedData] = useState(null);

      //making call to edge function to create embeddings
      const handleEmbed = async () => {
        const { data, error } = await supabase.functions.invoke(
          "create-embeddings",
          {
            body: { input: inputData },
          }
        );
        if (error) {
          console.log(error);
        } else {
          setembedData("Embed successfully stored");
        }
      };

      return (
        <div className="App">
          <h1>Generate Embeddings</h1>
          <input type="text" onChange={(e) => setInputData(e.target.value)} />
          <br />
          <button onClick={handleEmbed}>Run Embed</button>
          {embedData && <p>{embedData}</p>}
        </div>
      );
    }
    export default App;

SUPABASE_URL并且SUPABASE_ANON_KEY是可以在 Supabase 应用程序仪表板中找到的秘密。转到“项目设置”→“API”,您将在那里找到它。

边缘功能

与在 App.js 中一样,我们正在调用边缘函数。现在是时候创建边缘函数了。在为边缘函数编写代码之前,我们需要安装Supabase CLI来管理边缘函数的创建、运行和部署。CLI 的安装很容易。请按照以下步骤进行安装。

  1. 运行以下命令进行安装:
    npm i supabase --save-dev

注意:应预先安装 Node 和 NPM 才能运行该命令。

  1. 现在,我们需要在 CLI 中登录子基地。要运行任何 supabase 命令,只需在其前面加上 npx supabase then 命令即可。所以这里的登录是:
    npx supabase login

这将要求访问令牌。您可以从此处为您的项目生成访问令牌。在要求的输入中输入该令牌。

  1. 现在,让我们转到要为函数编写代码的项目目录。在根目录中,运行以下命令来初始化supabase。
    npx supabase init
  1. 最后,我们只需要提供来自 supabase 的项目的参考 URL。这是它的命令:
    npx supabase link --project-ref your-project-ref

将 更改为您的项目参考。您可以从 Supabase 的设置 → API 获取项目参考 URL。

编写用于创建嵌入的边缘函数

为了编写函数,首先我们需要创建一个用于编写函数的文件。您可以使用 Supabase CLI 创建该函数。以下是命令:

    npx supabase functions new create-embeddings

这将在supabase→function→create-embeddings中创建一个带有index.ts的文件。您可以在index.ts 文件中编写您的函数。下面是 的代码create-embeddings

    import { serve } from "https://deno.land/[email protected]/http/server.ts";
    import {
      env,
      pipeline,
    } from "https://cdn.jsdelivr.net/npm/@xenova/[email protected]";
    import { supabaseClient } from "../_shared/apiClient.ts";
    import { corsHeaders } from "../_shared/cors.ts";

    // Configuration for Deno runtime
    env.useBrowserCache = false;
    env.allowLocalModels = false;
    const pipe = await pipeline("feature-extraction", "Supabase/gte-small");
    serve(async (req) => {
      // This is needed if you're planning to invoke your function from a browser.
      if (req.method === "OPTIONS") {
        return new Response("ok", { headers: corsHeaders });
      }
      try {

        // Extract input string from JSON body
        const { input } = await req.json();

        // Generate the embedding from the user input
        const output = await pipe(input, {
          pooling: "mean",
          normalize: true,
        });

        // Extract the embedding output
        const embedding = Array.from(output.data);

        const { data, error } = await supabaseClient
          .from("documents")
          .insert({ text: input, embedding: embedding });
        if (error) {
          throw error;
        }

        return new Response(JSON.stringify("Vector stored Successfully!"), {
          headers: { ...corsHeaders, "Content-Type": "application/json" },
          status: 200,
        });
      } catch (error) {
        return new Response(JSON.stringify({ error: error.message }), {
          headers: { ...corsHeaders, "Content-Type": "application/json" },
          status: 400,
        });
      }
    });

Supabase 使用 Transformer.js 来创建嵌入。应用程序的以下代码生成了嵌入并提取输出:

    // Generate the embedding from the user input
    const output = await pipe(input, {
      pooling: "mean",
      normalize: true,
    });

    // Extract the embedding output
    const embedding = Array.from(output.data);

之后,我们将原始文本和嵌入内容与表名文档一起存储到supabase数据库中。嵌入不能以纯文本形式存储。它需要一个特殊的数据类型向量,并带有一个参数作为向量的维度。从 supabase 项目仪表板的 SQL 编辑器中运行以下命令来创建一个表来存储数据库。

    -- Enable the pgvector extension to work with embedding vectors
    create extension vector;

    -- Create a table to store your documents
    create table posts (
      id serial primary key,
      title text not null,
      embedding vector(384)
    );

在代码中,您可以找到两个导入,即CORS和supabaseClient。CORS 用于允许从浏览器调用该函数,而supabaseClient 用于在边缘函数中使用supabase 功能。这两个都存储在_shared函数的目录中。这是这两个的代码

cors.ts

    export const corsHeaders = {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Headers":
        "authorization, x-client-info, apikey, content-type",
    };

api客户端

    import { createClient } from "https://esm.sh/@supabase/supabase-js@2";

    export const supabaseClient = await createClient(
      Deno.env.get("SUPABASE_URL") ?? "",
      Deno.env.get("SUPABASE_ANON_KEY") ?? ""
    );

对于 URL 和 ANON_KEY 等边缘函数,您可以直接在 deno 环境中直接获取 Supabase Secret。

编写边缘函数后,请确保使用以下代码将其部署到supabase:

    npx supabase functions deploy

测试应用程序

如果运行反应应用程序并且没有错误,那么您将看到以下输出屏幕:

什么是嵌入?使用 Supabase 生成嵌入

现在,如果您在文本字段中输入一些内容并单击按钮Run Embed,它将调用边缘函数。成功后,存储嵌入将显示消息Embed successfully stored,如下面的输出所示。

什么是嵌入?使用 Supabase 生成嵌入

您可以从 supabase 仪表板检查嵌入情况。导航到表编辑器 → 表名称。您可以在那里找到嵌入。

什么是嵌入?使用 Supabase 生成嵌入

要添加到项目中的内容

我很乐意创建更多有关嵌入的内容,以使用它来执行不同的任务。同时,您可以通过添加以下功能来向项目添加更多内容:

  • 运行查询搜索以从嵌入中提取有用的信息
  • 对检索数据进行 GPT 调用

我将尝试在接下来的文章中讨论这些主题。因此,请务必关注博客以获取更多内容。

结论

词嵌入是自然语言处理 (NLP) 中的强大工具,可帮助机器更有效地理解和使用人类语言。它们对单词之间的语义关系进行编码,从而支持各种 NLP 任务,例如情感分析、语言翻译和信息检索。Supabase 的边缘函数与 Transformer.js 库结合使用来生成和存储嵌入,这对于任何 NLP 项目来说都是一个有价值的补充。

通过使用 Supabase,您可以轻松创建无服务器应用程序,因为它们提供了通过 FaaS 架构的身份验证、数据库、存储和边缘功能来实现无服务器应用程序的工具。

我希望这篇文章能够帮助您学习嵌入和生成嵌入的方法。感谢您阅读这篇文章。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索