mirror of
https://github.com/supabase/supabase.git
synced 2026-10-11 12:25:05 +03:00
Closes DOCS-1057 Contributes to DOCS-1052 ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## Problem We have hundreds of MDX lint warnings in our docs going against style best practices. ## Solution Remove and replace in context the following: - PostgreSQL. There was only one. There was concern about exceptions, but I found none. - Just - Quickly - Actually ### What changed Edits follow the [Google developer documentation style guide](https://developers.google.com/style): concise, direct, active voice. The flagged words were removed when the sentence still read well, or replaced when meaning needed to be preserved. ### Common patterns | Flagged word | Approach | Example | |---|---|---| | **just** (filler) | Removed | "you just installed" → "you installed" | | **just** (limiting) | **only** | "just one row" → "only one row" | | **just like** | **like** / **the same as** | "function just like regular users" → "function like regular users" | | **not just** | **not only** | "not just errors" → "not only errors" | | **quickly** (performance) | **efficiently** or removed | "find rows quickly" → "find rows efficiently" | | **quickly** (time) | **soon** / **rapidly** / removed | "expires too quickly" → "expires too soon" | | **actually** (filler) | Removed | "actually execute" → "execute"; "is actually the most common" → "is the most common" | ## Tophatting 1. See the diff. 2. See that content continues to make sense in context. 3. Locally, `cd apps/docs` and run `pnpm run lint:mdx`. 4. Search for "just," "actually," "quickly", and "PostgreSQL" and see there are 0 warnings. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Updated wording across quickstarts, guides, and troubleshooting articles for grammar, clarity, and consistent step-by-step phrasing. * Clarified key concepts including Row Level Security policy evaluation across Supabase products, deferred foreign key constraint behavior, and when `EXPLAIN ANALYZE` executes queries (and related side effects). * Refined several troubleshooting instructions and added guidance to cap log payload size to reduce billed Logs Ingest volume. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Nik Richers <nrichers@gmail.com> Co-authored-by: Chris Chinchilla <chris.ward@supabase.io>
118 lines
4.9 KiB
Plaintext
118 lines
4.9 KiB
Plaintext
---
|
|
title: 'Adding generative Q&A for your documentation'
|
|
subtitle: 'Learn how to build a ChatGPT-style doc search powered using our headless search toolkit.'
|
|
breadcrumb: 'AI Examples'
|
|
---
|
|
|
|
Supabase provides a [Headless Search Toolkit](https://github.com/supabase/headless-vector-search) for adding "Generative Q&A" to your documentation. The toolkit is "headless", so that you can integrate it into your existing website and style it to match your website theme.
|
|
|
|
You can see how this works with the Supabase docs. Enter `cmd+k` and ask, for example, "what are the features of Supabase?". You will see that the response is streamed back using the information provided in the docs:
|
|
|
|

|
|
|
|
## Tech stack
|
|
|
|
- Supabase: Database & Edge Functions.
|
|
- OpenAI: Embeddings and completions.
|
|
- GitHub Actions: for ingesting your markdown docs.
|
|
|
|
## Toolkit
|
|
|
|
This toolkit consists of 2 parts:
|
|
|
|
- The [Headless Vector Search](https://github.com/supabase/headless-vector-search) template which you can deploy in your own organization.
|
|
- A [GitHub Action](https://github.com/supabase/embeddings-generator) which will ingest your markdown files, convert them to embeddings, and store them in your database.
|
|
|
|
## Usage
|
|
|
|
There are 3 steps to build similarity search inside your documentation:
|
|
|
|
1. Prepare your database.
|
|
2. Ingest your documentation.
|
|
3. Add a search interface.
|
|
|
|
### Prepare your database
|
|
|
|
To prepare, create a [new Supabase project](https://database.new) and store the database and API credentials, which you can find in the project [settings](/dashboard/project/_/settings).
|
|
|
|
Now we can use the [Headless Vector Search](https://github.com/supabase/headless-vector-search#set-up) instructions to set up the database:
|
|
|
|
1. Clone the repo to your local machine: `git clone git@github.com:supabase/headless-vector-search.git`
|
|
2. Link the repo to your remote project: `supabase link --project-ref XXX`
|
|
3. Apply the database migrations: `supabase db push`
|
|
4. Set your OpenAI key as a secret: `supabase secrets set OPENAI_API_KEY=sk-xxx`
|
|
5. Deploy the Edge Functions: `supabase functions deploy --no-verify-jwt`
|
|
6. Expose `docs` schema via API in Supabase Dashboard [settings](/dashboard/project/_/settings/api) > `API Settings` > `Exposed schemas`
|
|
|
|
### Ingest your documentation
|
|
|
|
Now we need to push your documentation into the database as embeddings. You can do this manually, but to make it easier we've created a [GitHub Action](https://github.com/marketplace/actions/supabase-embeddings-generator) which can update your database every time there is a Pull Request.
|
|
|
|
In your knowledge base repository, create a new action called `.github/workflows/generate_embeddings.yml` with the following content:
|
|
|
|
```yml
|
|
name: 'generate_embeddings'
|
|
on: # run on main branch changes
|
|
push:
|
|
branches:
|
|
- main
|
|
|
|
jobs:
|
|
generate:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: supabase/embeddings-generator@v0.0.x # Update this to the latest version.
|
|
with:
|
|
supabase-url: 'https://your-project-ref.supabase.co' # Update this to your project URL.
|
|
supabase-secret-key: ${{ secrets.SUPABASE_SECRET_KEY }}
|
|
openai-key: ${{ secrets.OPENAI_API_KEY }}
|
|
docs-root-path: 'docs' # the path to the root of your md(x) files
|
|
```
|
|
|
|
Make sure to choose the latest version, and set your `SUPABASE_SECRET_KEY` and `OPENAI_API_KEY` as repository secrets in your repo settings (settings > secrets > actions).
|
|
|
|
### Add a search interface
|
|
|
|
Now inside your docs, you need to create a search interface. Because this is a headless interface, you can use it with any language. The only requirement is that you send the user query to the `query` Edge Function, which will stream an answer back from OpenAI. It might look something like this:
|
|
|
|
```js
|
|
const onSubmit = (e: Event) => {
|
|
e.preventDefault()
|
|
answer.value = ""
|
|
isLoading.value = true
|
|
|
|
const query = new URLSearchParams({ query: inputRef.current!.value })
|
|
const projectUrl = `https://your-project-ref.supabase.co/functions/v1`
|
|
const queryURL = `${projectUrl}/${query}`
|
|
const eventSource = new EventSource(queryURL)
|
|
|
|
eventSource.addEventListener("error", (err) => {
|
|
isLoading.value = false
|
|
console.error(err)
|
|
})
|
|
|
|
eventSource.addEventListener("message", (e: MessageEvent) => {
|
|
isLoading.value = false
|
|
|
|
if (e.data === "[DONE]") {
|
|
eventSource.close()
|
|
return
|
|
}
|
|
|
|
const completionResponse: CreateCompletionResponse = JSON.parse(e.data)
|
|
const text = completionResponse.choices[0].text
|
|
|
|
answer.value += text
|
|
});
|
|
|
|
isLoading.value = true
|
|
}
|
|
```
|
|
|
|
## Resources
|
|
|
|
- Read about how we built [ChatGPT for the Supabase Docs](/blog/chatgpt-supabase-docs).
|
|
- Read the pgvector Docs for [Embeddings and vector similarity](/docs/guides/database/extensions/pgvector)
|
|
- See how to build something like this from scratch [using Next.js](/docs/guides/ai/examples/nextjs-vector-search).
|