Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
f82f2f9
feat(pgsearch): add pgvector dependency for hybrid search
samuelvkwong May 15, 2026
ca89352
feat(pgsearch): add embedding and hybrid search settings
samuelvkwong May 15, 2026
0477496
feat(pgsearch): add embedding backend protocol and built-in OpenAI/Ol…
samuelvkwong May 15, 2026
3826215
feat(pgsearch): add sync EmbeddingClient with normalize, truncate, er…
samuelvkwong May 15, 2026
8d4fa00
refactor(pgsearch): reuse httpx.Client across embedding batches; inli…
samuelvkwong May 15, 2026
8376c63
feat(pgsearch): add close()/__enter__/__exit__ to EmbeddingClient
samuelvkwong May 15, 2026
afe5840
feat(pgsearch): add RRF fusion helper and empty-headline fallback
samuelvkwong May 15, 2026
ba9fa24
feat(pgsearch): install pgvector extension and swap to pgvector/pgvec…
samuelvkwong May 15, 2026
3cee09e
feat(pgsearch): add nullable embedding column with HNSW cosine index
samuelvkwong May 15, 2026
ea620f2
feat(pgsearch): add embed_reports task on dedicated embeddings queue
samuelvkwong May 15, 2026
cbc798c
fix(pgsearch): close EmbeddingClient http pool in embed_reports final…
samuelvkwong May 15, 2026
249d9ff
feat(pgsearch): enqueue embed_reports on Report post_save
samuelvkwong May 15, 2026
8855dff
test(pgsearch): use Report.objects.create() to assert single post_sav…
samuelvkwong May 15, 2026
23ed743
feat(pgsearch): add backfill_embeddings management command
samuelvkwong May 15, 2026
4cd6343
feat(pgsearch): replace search() with hybrid FTS + vector RRF fusion
samuelvkwong May 15, 2026
d8f2da8
test(pgsearch): use module-level pytestmark for django_db in hybrid p…
samuelvkwong May 15, 2026
8d576ae
feat(pgsearch): make retrieve() hybrid-aware to match search() order
samuelvkwong May 15, 2026
6cb8d6f
feat(pgsearch): bump SearchProvider.max_results to hybrid bound
samuelvkwong May 15, 2026
d3c560c
feat(infra): add embeddings_worker container on dedicated queue
samuelvkwong May 15, 2026
95b3ac1
docs(infra): document EMBEDDING_* env vars in example.env
samuelvkwong May 15, 2026
2ed951d
test(search): verify FTS-only fallback when embedding URL is unset
samuelvkwong May 15, 2026
c485bcd
fix(test): strip debug_toolbar middleware so FTS-only smoke can asser…
samuelvkwong May 15, 2026
218b0ca
fix(pgsearch): close EmbeddingClient http pool in search() and retrie…
samuelvkwong May 15, 2026
16e3caa
feat(pgsearch): expose cosine_distance and rrf_score on ReportDocument
samuelvkwong May 17, 2026
9763130
feat(search): surface cosine distance and RRF score in result header
samuelvkwong May 17, 2026
c4750af
feat(pgsearch): Matryoshka-truncate oversized embeddings to EMBEDDING…
samuelvkwong May 17, 2026
15ded7a
ci: tag built dev image for embeddings_worker too
samuelvkwong May 17, 2026
4e8d4a8
fix(pgsearch): satisfy pyright on report_id and Procrastinate __wrapp…
samuelvkwong May 17, 2026
c51b1e5
feat(pgsearch): validate embedding-client config and response shape
samuelvkwong May 18, 2026
0d2abdb
fix(pgsearch): dedupe candidate rows in hybrid search with .distinct()
samuelvkwong May 18, 2026
2ce60e8
fix(pgsearch): bulk_update embeddings, guard batch size, defer signal…
samuelvkwong May 18, 2026
95d0172
feat(pgsearch): stream backfill ids and validate CLI bounds
samuelvkwong May 18, 2026
8409fba
feat(pgsearch): system check for EMBEDDING_DIM vs migration parity
samuelvkwong May 18, 2026
0faf3b0
fix(test): pass strict=False to rrf_score ordering zip
samuelvkwong May 18, 2026
4f773b2
docs(pgsearch): add hybrid search design spec with embedding orchestr…
samuelvkwong May 28, 2026
0822336
docs(pgsearch): add embedding orchestrator implementation plan
samuelvkwong May 28, 2026
d0e4231
docs(pgsearch): split hybrid-search spec into dated original + unifie…
samuelvkwong May 28, 2026
f358589
docs(pgsearch): promote NOT-stripping into the spec; regenerate plan
samuelvkwong May 28, 2026
3737483
fix(plan): replace 'uv run cli shell -c' with manage.py invocations
samuelvkwong May 28, 2026
d29cb95
feat(pgsearch): add EMBEDDING_DRAIN_CRON and EMBEDDING_SYSTEM_USERNAM…
samuelvkwong May 28, 2026
09a488a
feat(pgsearch): add EmbeddingJob and EmbeddingTask models
samuelvkwong May 28, 2026
d292fac
feat(pgsearch): add data migration for system user
samuelvkwong May 28, 2026
26544ec
feat(pgsearch): add process_embedding_task on embeddings queue
samuelvkwong May 28, 2026
9a44436
fix(test): fetch system user instead of creating it (collides with 00…
samuelvkwong May 28, 2026
ab06928
feat(pgsearch): add process_embedding_job orchestrator
samuelvkwong May 28, 2026
ed5b6a7
feat(pgsearch): add embedding_launcher periodic task
samuelvkwong May 28, 2026
1116960
refactor(pgsearch): remove post_save embedding signal (replaced by or…
samuelvkwong May 28, 2026
6c13830
refactor(pgsearch): remove embed_reports task and backfill_embeddings…
samuelvkwong May 28, 2026
a251c00
refactor(pgsearch): remove EMBEDDING_BACKFILL_PRIORITY setting
samuelvkwong May 28, 2026
795f460
feat(infra): run embeddings_worker with --concurrency 4
samuelvkwong May 28, 2026
88fdcc4
feat(search): add QueryParser.unparse_for_embedding that strips NOT b…
samuelvkwong May 28, 2026
33ffb18
feat(pgsearch): use unparse_for_embedding to strip NOT branches befor…
samuelvkwong May 28, 2026
b426638
lint(pgsearch): drop unused import and unused 'succeeded' var in orch…
samuelvkwong May 28, 2026
2e924e9
docs(pgsearch): spec for EMBEDDING_DIM check via MigrationLoader
samuelvkwong May 28, 2026
98a67c2
docs(pgsearch): fold EMBEDDING_DIM check redesign into unified hybrid…
samuelvkwong May 28, 2026
5a5ac32
docs(plan): append Task 14 (MigrationLoader-based EMBEDDING_DIM check)
samuelvkwong May 29, 2026
17555ac
refactor(pgsearch): derive embedding-dim check from MigrationLoader, …
samuelvkwong May 29, 2026
615f39f
lint(pgsearch): satisfy pyright in hybrid-search test files
samuelvkwong Jun 2, 2026
e73a7f5
docs(pgsearch): document cosine_distance and rrf_score on ReportDocument
samuelvkwong Jun 3, 2026
997805f
refactor(pgsearch): squash hybrid-search migrations into 0002_hybrid_…
samuelvkwong Jun 3, 2026
8fa1b5a
refactor(pgsearch): demote EMBEDDING_DRAIN_CRON from env to code cons…
samuelvkwong Jun 3, 2026
b0e24ef
refactor(pgsearch): all-deferred embedding via embed_reports_task; dr…
samuelvkwong Jun 19, 2026
fa72b59
refactor(pgsearch): subscribe to reports_*_handlers; viewsets.py lose…
samuelvkwong Jun 21, 2026
5acdb17
refactor(pgsearch): sync embed task, chained ordering, bisect + stami…
samuelvkwong Jun 23, 2026
c6318a8
feat(pgsearch): subjob chunking + admin pipeline-status badge
samuelvkwong Jun 23, 2026
5a33386
refactor(pgsearch): rename ReportSearchVector → ReportSearchIndex
samuelvkwong Jun 23, 2026
49df71c
feat(pgsearch): admin clear-embeddings action; block delete; inline q…
samuelvkwong Jun 23, 2026
1c6d690
refactor(pgsearch, search): rename indexing handler; squash migration…
samuelvkwong Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
version: "0.11.13"
version: "0.11.16"
- name: Setup Python
uses: actions/setup-python@v6
with:
Expand All @@ -35,6 +35,7 @@ jobs:
radis_dev-web:latest
radis_dev-default_worker:latest
radis_dev-llm_worker:latest
radis_dev-embeddings_worker:latest
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Start Docker containers
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ RUN apt-get update \
postgresql-client-17 \
&& rm -rf /var/lib/apt/lists/*

COPY --from=ghcr.io/astral-sh/uv:0.11.13 /uv /uvx /bin/
COPY --from=ghcr.io/astral-sh/uv:0.11.16 /uv /uvx /bin/

WORKDIR /app

Expand Down
12 changes: 11 additions & 1 deletion docker-compose.base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ x-app: &default-app
DJANGO_SERVER_EMAIL: ${DJANGO_SERVER_EMAIL:?}
EXTERNAL_LLM_PROVIDER_URL: ${EXTERNAL_LLM_PROVIDER_URL:-}
EXTERNAL_LLM_PROVIDER_API_KEY: ${EXTERNAL_LLM_PROVIDER_API_KEY:-}
EMBEDDING_BACKEND: ${EMBEDDING_BACKEND:-openai}
EMBEDDING_PROVIDER_URL: ${EMBEDDING_PROVIDER_URL:-}
EMBEDDING_PROVIDER_PATH: ${EMBEDDING_PROVIDER_PATH:-}
EMBEDDING_PROVIDER_API_KEY: ${EMBEDDING_PROVIDER_API_KEY:-}
EMBEDDING_MODEL_NAME: ${EMBEDDING_MODEL_NAME:-Qwen/Qwen3-Embedding-4B}
EMBEDDING_DIM: ${EMBEDDING_DIM:-1024}
Comment thread
samuelvkwong marked this conversation as resolved.
IS_DOCKER_CONTAINER: 1
HTTP_PROXY: ${HTTP_PROXY:-}
HTTPS_PROXY: ${HTTPS_PROXY:-}
Expand Down Expand Up @@ -54,8 +60,12 @@ services:
<<: *default-app
hostname: llm_worker.local

embeddings_worker:
<<: *default-app
hostname: embeddings_worker.local

postgres:
image: postgres:17
image: pgvector/pgvector:pg17
hostname: postgres.local
volumes:
- postgres_data:/var/lib/postgresql/data
Expand Down
9 changes: 9 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,15 @@ services:
./manage.py bg_worker -l debug -q llm --autoreload
"

embeddings_worker:
<<: *default-app
image: radis_dev-embeddings_worker:latest
command: >
bash -c "
wait-for-it -s postgres.local:5432 -t ${WAIT_POSTGRES_TIMEOUT:-180} &&
./manage.py bg_worker -l debug -q embeddings --autoreload --concurrency 4
"

postgres:
environment:
POSTGRES_PASSWORD: postgres
Expand Down
10 changes: 10 additions & 0 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,16 @@ services:
deploy:
<<: *deploy

embeddings_worker:
<<: *default-app
command: >
bash -c "
wait-for-it -s postgres.local:5432 -t ${WAIT_POSTGRES_TIMEOUT:-180} &&
./manage.py bg_worker -q embeddings --concurrency 4
"
deploy:
<<: *deploy

postgres:
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?}
Expand Down
Loading