Skip to content

Rebuild the backend on Qdrant Cloud Inference, drop Railway - #1

Closed
John Kupchanko | Qdrant (jkupchanko) wants to merge 2 commits into
masterfrom
cloud-inference
Closed

Rebuild the backend on Qdrant Cloud Inference, drop Railway#1
John Kupchanko | Qdrant (jkupchanko) wants to merge 2 commits into
masterfrom
cloud-inference

Conversation

@jkupchanko

Copy link
Copy Markdown
Collaborator

Demo: https://demo-code-search-cloud.vercel.app

Quick update on the rebuild. Same demo, tuned underneath.

Removed: Railway, UniXcoder
Running on: Qdrant Cloud + Vercel, nothing else
Encoder: mxbai-embed-large-v1 + BM25, fused with RRF

Recall@1: 0.567 → 0.883
MRR: 0.713 → 0.928
p50: 178ms → 148ms
Cold start: 2033ms → 775ms
p95: 186ms → 205ms, the one that got worse

Take a look when you have a chance.

Railway existed only so the backend could load UniXcoder and embed the query
itself. Qdrant Cloud Inference does that inside the cluster, so the query goes
out as text and comes back ranked, and the backend is three TypeScript
functions with no dependencies in the same Vercel project as the frontend.
Gone with it: the Dockerfile, docker-compose.yaml, railway.json,
requirements.txt and the whole code_search package.

UniXcoder is not in the Cloud Inference catalog and cannot be added, so this
forced replacing the encoder. bench/bakeoff.py scores ten configurations
through the real production path; mxbai-embed-large-v1 with BM25 fused by RRF
won. SPLADE matches BM25 on docstring queries, loses on paraphrases and runs
three times slower. DBSF fusion was tried and rejected.

One fix is unrelated to the migration and is the largest single win here. The
merge step sorted results by how many overlapping snippet ranges each one had,
so a result with two highlighted ranges outranked the actual best match with
none. Removing that took docstring recall@1 from 0.620 to 0.887. It is
inherited behaviour: measured directly the old demo's own search scores 0.730
while its deployment returns 0.567.

Against the previous deployment on the same 413 queries: docstring recall@1
0.567 to 0.883, MRR 0.713 to 0.928, p50 178ms to 148ms, cold start 2033ms to
775ms. p95 is worse, 186ms to 205ms, and 46ms of that spread is the dense
model's inference call against 1.4ms for the BM25 leg.

The frontend is unchanged apart from wording that named the old encoders. The
CSS file is byte-identical, the per-result JSON keys are identical, and the
corpus and indexed commit are the same, so every result link resolves to the
same code.
@vercel

vercel Bot commented Sep 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
demo-code-search Ready Ready Preview Sep 3, 2026 3:48pm UTC

Request Review

@kanungle kanungle (kanungle) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I approved but this needs to be deployed on code-search.demos.qdrant.tech

@kanungle

Copy link
Copy Markdown
Member

It looks like you have unsupported packages in your build

@kanungle

Copy link
Copy Markdown
Member

I just noticed this repo is in qdrant-labs not qdrant

Six deprecation warnings in the Vercel build log and eight npm audit
vulnerabilities, several high. Inherited, but visible to anyone reading a build.

eslint 8 is end of life and pulled in five of the six deprecations, so this
moves to eslint 10 and flat config. vite 5 to 8, react-router-dom 6 to 7,
postcss-preset-mantine 1.6 to 1.18. @mantine/core stays at 7.1.0 because it
renders the approved design.

Zero deprecations on a clean install, zero vulnerabilities.

The newer react-hooks plugin flagged two real patterns, both fixed rather than
silenced: useTypewriter set state synchronously in an effect, and the search
field built its Enter handler during render. Build, lint, typecheck and tests
pass, the page renders unchanged, and Enter still runs a search.
@jkupchanko

Copy link
Copy Markdown
Collaborator Author

PREVIEW: https://demo-code-search-git-cloud-inference-qdrant.vercel.app

Both are sorted.

Deprecated packages are fixed, with 0 deprecated and 0 vulnerabilities now.

qdrant-labs is intentional since that's what Vercel builds from.

The repos are in sync and the preview is building successfully.

Can you merge when you get a chance?

Production only builds from master, so that's what lets me attach code-search.demos.qdrant.tech.

@jkupchanko

Copy link
Copy Markdown
Collaborator Author

Moved to qdrant#35 per your comment. Closing this one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants