hello-rag · pgvector + OpenAI starter
Pgvector + text-embedding-3-large @ 1024 + a Markdown FAQ corpus. The first end-to-end RAG.
services:
pgvector:
image: pgvector/pgvector:pg16
environment: { POSTGRES_PASSWORD: rag, POSTGRES_DB: rag }
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 2s
retries: 10
volumes: ["pg:/var/lib/postgresql/data"]
api:
image: python:3.11-slim
working_dir: /app
depends_on:
pgvector: { condition: service_healthy }
volumes: ["./src:/app/src:ro", "./corpus:/app/corpus:ro", "./requirements.txt:/app/requirements.txt:ro"]
environment:
OPENAI_API_KEY: ${OPENAI_API_KEY:?}
PG_URL: postgresql://postgres:rag@pgvector:5432/rag
EMBED_MODEL: text-embedding-3-large
EMBED_DIM: "1024"
MODEL_VERSION: "v1"
ports: ["8000:8000"]
command: >-
bash -c "pip install -q -r requirements.txt && python -m src.ingest /app/corpus && uvicorn src.api:app --host 0.0.0.0 --port 8000"
volumes: { pg: {} }
Drop your team's Markdown / Confluence / Notion export into ./corpus, add an auth layer, point any chat UI at GET /search. Promote the pg container to your existing managed Postgres with one `CREATE EXTENSION vector`. Stamp model_version='v2' before re-embedding to a new model — never re-embed in place. Snap's first internal docs-search shipped with this exact compose; the day-1 cost was an afternoon.
hello-rag · pgvector + OpenAI starter
Pgvector + text-embedding-3-large @ 1024 + a Markdown FAQ corpus. The first end-to-end RAG.
services:
pgvector:
image: pgvector/pgvector:pg16
environment: { POSTGRES_PASSWORD: rag, POSTGRES_DB: rag }
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 2s
retries: 10
volumes: ["pg:/var/lib/postgresql/data"]
api:
image: python:3.11-slim
working_dir: /app
depends_on:
pgvector: { condition: service_healthy }
volumes: ["./src:/app/src:ro", "./corpus:/app/corpus:ro", "./requirements.txt:/app/requirements.txt:ro"]
environment:
OPENAI_API_KEY: ${OPENAI_API_KEY:?}
PG_URL: postgresql://postgres:rag@pgvector:5432/rag
EMBED_MODEL: text-embedding-3-large
EMBED_DIM: "1024"
MODEL_VERSION: "v1"
ports: ["8000:8000"]
command: >-
bash -c "pip install -q -r requirements.txt && python -m src.ingest /app/corpus && uvicorn src.api:app --host 0.0.0.0 --port 8000"
volumes: { pg: {} }
Drop your team's Markdown / Confluence / Notion export into ./corpus, add an auth layer, point any chat UI at GET /search. Promote the pg container to your existing managed Postgres with one `CREATE EXTENSION vector`. Stamp model_version='v2' before re-embedding to a new model — never re-embed in place. Snap's first internal docs-search shipped with this exact compose; the day-1 cost was an afternoon.