Spaces:
Paused
Paused
Mark Space offline pending architecture reassessment
Browse files
README.md
CHANGED
|
@@ -1,104 +1,26 @@
|
|
| 1 |
---
|
| 2 |
-
title: Feature Finder
|
| 3 |
emoji: π
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: "5.50.0"
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
license: apache-2.0
|
| 11 |
-
hardware:
|
| 12 |
hf_oauth: false
|
| 13 |
---
|
| 14 |
|
| 15 |
# Feature Finder
|
| 16 |
|
| 17 |
-
|
| 18 |
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
The scoring model is a **LoRA adapter on Qwen3.5-2B**, distilled from a Pairwise Gaussian Process teacher trained on team-preference signals derived from GitHub merge histories.
|
| 24 |
-
|
| 25 |
-
- **Base**: [Qwen/Qwen3.5-2B](https://huggingface.co/Qwen/Qwen3.5-2B)
|
| 26 |
-
- **Adapter**: [`remyxai/mhpd-dpo-qwen3.5-2b-lora-v1.2-ipo-2epoch`](https://huggingface.co/remyxai/mhpd-dpo-qwen3.5-2b-lora-v1.2-ipo-2epoch) (current production; v1.5 in development)
|
| 27 |
-
- **Training objective**: IPO loss (Ξ²=0.1), bounded target gap that's more robust to noisy confident pairs than sigmoid DPO
|
| 28 |
-
- **Training data**: 50K preference pairs (`chosen` / `rejected`) generated from real GitHub repo merge histories
|
| 29 |
-
- **Eval**: candidate-disjoint repo-disjoint holdout β no paper appears in both train and eval β so accuracy reflects cross-repo generalization, not memorization
|
| 30 |
-
|
| 31 |
-
### Why a fine-tune vs zero-shot LLM?
|
| 32 |
-
|
| 33 |
-
A zero-shot LLM ranking arXiv papers against a team description gives generic "this paper looks topically relevant" answers. Our fine-tune learns the **preference signal** of which papers a team-aware reasoner (the GP teacher) actually flags as worth reading next. That extracts directional signal the LLM doesn't have access to.
|
| 34 |
-
|
| 35 |
-
The whole pipeline (GP teacher β preference pairs β LoRA distillation) is described in our training repository: [github.com/remyxai/mhpd-dpo-training](https://github.com/remyxai/mhpd-dpo-training).
|
| 36 |
-
|
| 37 |
-
### Personalized version
|
| 38 |
-
|
| 39 |
-
The open-source generalist you're using is trained on cross-repo preference signal. For per-team **specialist** models β tailored to your team's development practices via continued fine-tuning on your private preference data β sign up at [engine.remyx.ai](https://engine.remyx.ai). Specialists typically lift confidence by 10-15pts on team-specific picks vs the generalist.
|
| 40 |
-
|
| 41 |
-
## How it works
|
| 42 |
-
|
| 43 |
-
```
|
| 44 |
-
GitHub URL
|
| 45 |
-
β
|
| 46 |
-
Fetch recent commits (GitHub Public API)
|
| 47 |
-
β
|
| 48 |
-
Gemini Flash: filter noise + summarize commits into "experiment history" + "domain summary"
|
| 49 |
-
β
|
| 50 |
-
sentence-transformers (all-MiniLM-L6-v2): embed domain summary, retrieve top-50 arXiv candidates
|
| 51 |
-
β
|
| 52 |
-
v1.2 LoRA on Qwen3.5-2B: score logprob(paper | team_context) per candidate
|
| 53 |
-
β
|
| 54 |
-
Confidence tier (z-score above pool median + embedding-cosine OOD floor)
|
| 55 |
-
β
|
| 56 |
-
Base Qwen3.5-2B: draft a PR body integrating the paper
|
| 57 |
-
```
|
| 58 |
-
|
| 59 |
-
The arXiv candidate pool ([`remyxai/arxiv_pool_daily`](https://huggingface.co/datasets/remyxai/arxiv_pool_daily)) is precomputed daily β abstracts pre-embedded so per-request retrieval is sub-second CPU work. Categories covered: `cs.AI`, `cs.LG`, `cs.CL`, `cs.CV`, `cs.DB`, `cs.IR`, `cs.SE`, `stat.ML`.
|
| 60 |
-
|
| 61 |
-
## Calibration-aware confidence
|
| 62 |
-
|
| 63 |
-
The recommendation is tiered by **two** signals β z-score above the candidate-pool median AND embedding similarity to the team's domain summary. Both gates must clear for a tier:
|
| 64 |
-
|
| 65 |
-
| Tier | z-score | embedding cosine | Estimated accuracy |
|
| 66 |
-
|---|---|---|---|
|
| 67 |
-
| π’ **High** | β₯ 2.0Ο | β₯ 0.60 | ~73% |
|
| 68 |
-
| π‘ **Moderate** | β₯ 1.5Ο | β₯ 0.50 | ~65% |
|
| 69 |
-
| π **Low** | β₯ 1.0Ο | β₯ 0.40 | ~55% |
|
| 70 |
-
| π΄ **Near-random** | otherwise | β | ~50% |
|
| 71 |
-
|
| 72 |
-
The two-signal design handles out-of-distribution repos honestly: a recommendation may be the clear winner *within* its candidate pool (high z-score) while the pool itself doesn't actually contain topical matches for the team's domain (low cosine). The OOD case correctly demotes to Low/Near-random and surfaces the upsell.
|
| 73 |
-
|
| 74 |
-
## Development
|
| 75 |
-
|
| 76 |
-
### Environment variables
|
| 77 |
-
|
| 78 |
-
| Variable | Purpose | Required |
|
| 79 |
-
|---|---|---|
|
| 80 |
-
| `HF_TOKEN` | Read access to the LoRA adapter + arxiv pool dataset | yes |
|
| 81 |
-
| `GEMINI_API_KEY` | Team-context summarization (Gemini Flash). Also used for PR-body generation when `MHPD_GENERATION_BACKEND=gemini` | yes |
|
| 82 |
-
| `MHPD_ADAPTER` | Override the LoRA adapter repo. Default: `remyxai/mhpd-dpo-qwen3.5-2b-lora-v1.2-ipo-2epoch` (v1.2). Will swap to v1.5 once trained. | no |
|
| 83 |
-
| `MHPD_GENERATION_BACKEND` | `local` (default) uses the base 2B on GPU for PR body draft. `gemini` routes PR body to Gemini Flash on CPU, freeing GPU time for the scoring step. | no |
|
| 84 |
-
| `USE_SPACES_GPU` | `true` (default) enables the `@spaces.GPU` decorator for Zero-GPU Spaces. Set `false` on persistent paid GPU Spaces. | no |
|
| 85 |
-
| `ARXIV_POOL_REPO` / `ARXIV_POOL_FILE` | HF dataset hosting the precomputed pool. Default: `remyxai/arxiv_pool_daily` | no |
|
| 86 |
-
|
| 87 |
-
### Local development
|
| 88 |
-
|
| 89 |
-
```bash
|
| 90 |
-
pip install -r requirements.txt
|
| 91 |
-
export HF_TOKEN=hf_...
|
| 92 |
-
export GEMINI_API_KEY=...
|
| 93 |
-
python app.py
|
| 94 |
-
```
|
| 95 |
-
|
| 96 |
-
### Architecture invariants
|
| 97 |
-
|
| 98 |
-
- **GPU only for scoring + PR body generation**. Embedding pre-filter, GitHub fetching, and Gemini call run on CPU before any GPU work is invoked.
|
| 99 |
-
- **arxiv_pool.parquet is precomputed** (daily cron via [GitHub Actions](https://github.com/remyxai/mhpd-dpo-training/blob/main/.github/workflows/refresh-arxiv-pool.yml)) β abstracts already embedded with all-MiniLM-L6-v2 to avoid embedding 500+ papers per cold start.
|
| 100 |
-
- **Single base model on GPU, LoRA toggled** via `enable_adapters()` / `disable_adapters()` for the scoring vs generation pass.
|
| 101 |
|
| 102 |
## License
|
| 103 |
|
| 104 |
-
Apache 2.0 for the Space code.
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Feature Finder (offline)
|
| 3 |
emoji: π
|
| 4 |
+
colorFrom: gray
|
| 5 |
+
colorTo: gray
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: "5.50.0"
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
license: apache-2.0
|
| 11 |
+
hardware: cpu-basic
|
| 12 |
hf_oauth: false
|
| 13 |
---
|
| 14 |
|
| 15 |
# Feature Finder
|
| 16 |
|
| 17 |
+
This Space is **offline** while we reassess the recommender architecture.
|
| 18 |
|
| 19 |
+
Based on our internal eval audit, ranking is better served by a frontier
|
| 20 |
+
LLM that's given the team's GitHub commit history directly as context than
|
| 21 |
+
by the small specialist model this Space served. We may return with a
|
| 22 |
+
redesigned version. In the meantime, the Space is paused.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
## License
|
| 25 |
|
| 26 |
+
Apache 2.0 for the Space code.
|