langchain/templates/self-query-supabase
Erick Friis ebf998acb6
Templates (#12294)
Co-authored-by: Harrison Chase <hw.chase.17@gmail.com>
Co-authored-by: Lance Martin <lance@langchain.dev>
Co-authored-by: Jacob Lee <jacoblee93@gmail.com>
2023-10-25 18:47:42 -07:00
..
self_query_supabase Templates (#12294) 2023-10-25 18:47:42 -07:00
tests Templates (#12294) 2023-10-25 18:47:42 -07:00
.gitignore Templates (#12294) 2023-10-25 18:47:42 -07:00
poetry.lock Templates (#12294) 2023-10-25 18:47:42 -07:00
pyproject.toml Templates (#12294) 2023-10-25 18:47:42 -07:00
README.md Templates (#12294) 2023-10-25 18:47:42 -07:00

Self-querying with Supabase

Supabase is an open-source Firebase alternative. It is built on top of PostgreSQL, a free and open-source relational database management system (RDBMS) and uses pgvector to store embeddings within your tables.

Use this package to host a LangServe API that can self-query Supabase. You'll be able to use natural language to generate a structured query against the database.

Install Package

From within your langservehub project run:

poetry run poe add self-query-supabase

Setup Supabase Database

Use these steps to setup your Supabase database if you haven't already.

  1. Head over to https://database.new to provision your Supabase database.

  2. In the studio, jump to the SQL editor and run the following script to enable pgvector and setup your database as a vector store:

    -- Enable the pgvector extension to work with embedding vectors
    create extension if not exists vector;
    
    -- Create a table to store your documents
    create table
      documents (
        id uuid primary key,
        content text, -- corresponds to Document.pageContent
        metadata jsonb, -- corresponds to Document.metadata
        embedding vector (1536) -- 1536 works for OpenAI embeddings, change as needed
      );
    
    -- Create a function to search for documents
    create function match_documents (
      query_embedding vector (1536),
      filter jsonb default '{}'
    ) returns table (
      id uuid,
      content text,
      metadata jsonb,
      similarity float
    ) language plpgsql as $$
    #variable_conflict use_column
    begin
      return query
      select
        id,
        content,
        metadata,
        1 - (documents.embedding <=> query_embedding) as similarity
      from documents
      where metadata @> filter
      order by documents.embedding <=> query_embedding;
    end;
    $$;
    

Setup Environment Variables

Since we are using SupabaseVectorStore and OpenAIEmbeddings, we need to load their API keys.

Create a .env file in the root of your project:

.env

SUPABASE_URL=
SUPABASE_SERVICE_KEY=
OPENAI_API_KEY=

To find your SUPABASE_URL and SUPABASE_SERVICE_KEY, head to your Supabase project's API settings.

  • SUPABASE_URL corresponds to the Project URL
  • SUPABASE_SERVICE_KEY corresponds to the service_role API key

To get your OPENAI_API_KEY, navigate to API keys on your OpenAI account and create a new secret key.

Add this file to your .gitignore if it isn't already there (so that we don't commit secrets):

.gitignore

.env

Install python-dotenv which we will use to load the environment variables into the app:

poetry add python-dotenv

Finally, call load_dotenv() in server.py.

app/server.py

from dotenv import load_dotenv

load_dotenv()