初次使用n8n與supabase串接vector

從YT上看到,於是就來實作看看。

Vector是向量,在應用上把「輸入」做成具有768或是1536個次元的向量。而我們在搜尋時,則會用輸入去轉換成向量,比較資料庫中的哪些向量最接近,然後回傳。

能把輸入資料變成向量的為embedding模型,而輸出的向量的次元數則取決於embedding模型。

如果初次使用supabase,想要作為向量資料庫,需要做一點操作。

以下使用到的API,皆為「免費」!請自行去其官網註冊帳號。

N8N架構

上半部為輸入進Supabase Vector Store中。

下半部為依據Supabase Vector Store去回答問題。

Enbeddings model使用HuggingFace,可以免費調用,模型使用「sentence-transformers/all-mpnet-base-v2」,這是sentence-transformers網站上顯示綜合效能最好的。 ※記得API Key需要勾選用途,不然預設沒勾的話,API是調不出來的。

此模型相關資訊如下

all-mpnet-base-v2 
Description:All-round model tuned for many use-cases. Trained on a large and diverse dataset of over 1 billion training pairs.
Base Model:microsoft/mpnet-base
Max Sequence Length:384
Dimensions:768
Normalized Embeddings:true
Suitable Score Functions:dot-product (util.dot_score), cosine-similarity (util.cos_sim), euclidean distance
Size:420 MB
Pooling:Mean Pooling
Training Data:1B+ training pairs. For details, see model card.
Model Card:https://huggingface.co/sentence-transformers/all-mpnet-base-v2

Chat Model使用Groq,也是可以免費調用,模型並無特別指定,除了View模型外,請隨意使用。這種問答只需要能快速回答,所以我選擇8B模型。

一般來說,照著架構圖做,就能輕鬆搭建出來。

輸入資料我使用「生日」與一些資料,作為預先輸入到向量資料庫中。

Supabase

參考文章

https://community.n8n.io/t/supabase-vector-store-issue/34885/2

根據參考文章的提供的程式碼

Supabase一開始是沒有啟用embedding向量,在SQL Editor中,把以下輸入,就能一口氣完成。

會建立一個名為documents的資料表,到時到n8n中可以看到。

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

-- Create a table to store your documents
create table documents (
  id bigserial primary key,
  content text, -- corresponds to Document.pageContent
  metadata jsonb, -- corresponds to Document.metadata
  embedding vector(768) -- 1536 works for OpenAI embeddings, change if needed
);

-- Create a function to search for documents
create function match_documents (
  query_embedding vector(1536),
  match_count int DEFAULT null,
  filter jsonb DEFAULT '{}'
) returns table (
  id bigint,
  content text,
  metadata jsonb,
  embedding jsonb,
  similarity float
)
language plpgsql
as $$
#variable_conflict use_column
begin
  return query
  select
    id,
    content,
    metadata,
    (embedding::text)::jsonb as embedding,
    1 - (documents.embedding <=> query_embedding) as similarity
  from documents
  where metadata @> filter
  order by documents.embedding <=> query_embedding
  limit match_count;
end;
$$;

完成後,照著n8n的Supabase串接API文件去完成n8n與Supabase串接。

測試

首先先把資料輸入到Supabase中,按下Supabase Vector Store的開始鍵,等待完成。

準備了三個問題,接著在對話欄依序輸入以下問題:

  • JN的生日是?
  • JN是什麼會員?
  • JN的興趣是?

測試有依照輸入資料去回答,如果沒有搜尋到的就會回覆不知道。