[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80973":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},80973,"skillopt-qa","joshhu\u002Fskillopt-qa","joshhu","Minimal faithful re-implementation of Microsoft SkillOpt: a text-space optimizer that trains a deployable natural-language skill for a frozen LLM agent on HotpotQA.",null,"Python",53,7,1,0,9,22,2.71,false,"master",true,[],"2026-06-12 02:04:09","# skillopt-qa\n\n[Microsoft SkillOpt](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FSkillOpt) 的精簡、忠實重現版,\n針對 **HotpotQA** 多跳推理問答任務。\n\nSkillOpt 是一種「**文字空間優化器**」:它不去微調模型權重,而是為一個**凍結的\nLLM agent** 訓練出一份可重複使用的自然語言「**技能**」(`best_skill.md`)。\n整個技能學習流程仿照神經網路訓練——有 epoch、mini-batch,以及一道\n**驗證閘門(validation gate)**:只有當保留集(held-out)準確率提升時,才接受該次\n編輯。訓練結束後唯一保留的產物就是 `best_skill.md`,它可跨模型、跨執行環境部署。\n\n> 論文:《SkillOpt: Executive Strategy for Self-Evolving Agent Skills》\n> ([arXiv:2605.23904](https:\u002F\u002Farxiv.org\u002Fabs\u002F2605.23904))。\n> 本 repo 是獨立、簡化的教學用實作,**並非**官方程式碼。\n\n## 運作原理\n\n```\n種子技能 ──► [讓 agent 帶著技能跑一個 train batch] ──► 軌跡(答對\u002F答錯)\n                          │\n                          ▼\n              [optimizer LLM 提出一次「有界」編輯]\n                          │\n                          ▼\n              [在驗證集上評估候選技能]\n                          │\n              有進步? ──是──► 接受,成為新的最佳技能\n                          │\n                          └─否──► 拒絕,並回饋給 optimizer(別再提同樣的)\n```\n\noptimizer 實作了論文中的穩定機制:**足夠證據**(同時呈現成功與失敗案例)、\n**有界文字更新**(小而精準的編輯,非整篇重寫)、**拒絕編輯記憶**\n(記住被拒絕過的版本)、以及**慢更新**(每步只做一次、且須通過驗證閘門的編輯)。\n\n## 環境需求\n\n- Python ≥ 3.10、[`uv`](https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002F)\n- 一個 **OpenAI 相容**的 chat endpoint。本 repo 不安裝任何 GPU 相關套件——把\n  `model.base_url` 指向任何 endpoint 即可。\n\n預設的 `configs\u002Fhotpotqa\u002Fdefault.yaml` 對接的是本機 **Qwen** vLLM 服務\n(模型 id 為 `qwen3.6-27b`),透過 `http:\u002F\u002Flocalhost:8080\u002Fv1` 存取。請依你的環境\n調整 `base_url`\u002F`target_model`。Qwen3 是**推理(reasoning)模型**,因此\n`max_tokens` 設得較寬鬆,以保留思考過程與最終答案所需的 token;agent 只讀取\n最終的 `content`,不會讀思考內容。\n\n## 安裝\n\n```bash\ncd skillopt-qa\nuv venv\nuv pip install -e \".[dev]\"\ncp .env.example .env        # 設定 OPENAI_API_KEY(多數本機服務任意值即可)\n```\n\n確認你的服務以及它回報的模型 id:\n\n```bash\ncurl http:\u002F\u002Flocalhost:8080\u002Fv1\u002Fmodels\n```\n\n把 `configs\u002Fhotpotqa\u002Fdefault.yaml` 裡的 `model.target_model` \u002F\n`model.optimizer_model` 設成**完全一致**的 id。\n\n## 1. 下載資料集\n\n```bash\nuv run skillopt-download --out data\u002Fhotpotqa --n-train 64 --n-val 64 --n-test 200\n```\n\n會從 HuggingFace 下載 HotpotQA,並寫出:\n\n```\ndata\u002Fhotpotqa\u002F\n├── train\u002Fitems.json\n├── val\u002Fitems.json\n└── test\u002Fitems.json\n```\n\n每筆資料格式:`{\"id\", \"question\", \"context\", \"answers\": [...]}`。train\u002Fval 取自\nHotpotQA 的 `train` 切分;test 取自 `validation`(其答案為公開),因此 test 集在\n優化過程中始終未被看過。\n\n## 2. 訓練技能\n\n```bash\nuv run skillopt-train \\\n    --config configs\u002Fhotpotqa\u002Fdefault.yaml \\\n    --split-dir data\u002Fhotpotqa \\\n    --out-root outputs\n```\n\n常用覆寫參數:`--target-model`、`--base-url`、`--num-epochs`、`--batch-size`、\n`--val-size`、`--workers`、`--metric {em,f1}`、`--no-test`。\n\n產出會放在 `outputs\u002F\u003Crun_name>\u002F`:\n\n```\noutputs\u002F\u003Crun_name>\u002F\n├── best_skill.md          # 可部署的產物\n├── history.json           # 每步的 train\u002Fval 指標與接受\u002F拒絕紀錄\n├── skills\u002Fskill_vXXXX_*.md\n├── steps\u002Fstep_XXXX.json\n└── test_result.json       # 在保留 test 集上的最終 EM \u002F F1\n```\n\n## 3. 部署\n\n`best_skill.md` 就只是一段文字。把它接到任何 QA agent 的 system prompt 前面即可\n(見 `skillopt\u002Fagent.py` 的 `BASE_INSTRUCTIONS`)——甚至可以套到別的模型上。\n\n## 實驗結果\n\n在本機 **Qwen3.6-27B(凍結、關閉思考)** 上,以 HotpotQA(train 64 \u002F val 64 \u002F\ntest 100)實跑一輪:\n\n**驗證閘門軌跡**(只接受讓 val f1 提升的編輯):\n\n| step | 候選 val f1 | 當前最佳 | 動作 |\n|------|------------|---------|------|\n| baseline | 0.8465 | — | 種子技能 |\n| 1 | **0.8822** | 0.8465 | ✅ ACCEPT |\n| 2 | 0.8465 | 0.8822 | reject |\n| 3 | 0.8822 | 0.8822 | reject |\n| 4 | 0.8822 | 0.8822 | reject |\n| 5 | 0.8465 | 0.8822 | reject → 連續 4 次拒絕,提早停止 |\n\n**種子技能 vs 優化後 `best_skill.md` 比較表**(test 為 100 題未見資料):\n\n```\n┌──────────────────┬─────────┬─────────┬─────────┐\n│ Skill            │  val F1 │ test EM │ test F1 │\n├──────────────────┼─────────┼─────────┼─────────┤\n│ Seed (baseline)  │  0.8465 │  0.700  │  0.8424 │\n│ Optimized        │  0.8822 │  0.710  │  0.8524 │\n├──────────────────┼─────────┼─────────┼─────────┤\n│ Delta            │ +0.0357 │  +0.010 │ +0.0100 │\n└──────────────────┴─────────┴─────────┴─────────┘\n```\n\n優化後的技能在完全未見的資料上仍有提升,代表學到的是可泛化的策略,而非擬合\nval——且**全程未更動任何模型權重,只改了一份 `skill.md`**。\n\n> 提升幅度偏小,因為 Qwen3.6-27B 在 HotpotQA 本就很強(種子即 0.84 F1)、樣本也\n> 小;且 temperature=0 在 vLLM 連續批次下並非完全 deterministic,單次 test 分數有\n> ±1 分左右波動。換較弱的目標模型或更難的任務,通常能看到更大的差距(SkillOpt\n> 論文在較弱模型上可達 +20 分級別)。\n\n## 專案結構\n\n| 路徑 | 角色 |\n|------|------|\n| `skillopt\u002Fconfig.py` | YAML 設定 + CLI 覆寫 |\n| `skillopt\u002Fllm.py` | OpenAI 相容的 chat 客戶端 |\n| `skillopt\u002Fdata.py` | HotpotQA 下載與切分建立 |\n| `skillopt\u002Fagent.py` | 凍結的 QA agent + 平行 rollout |\n| `skillopt\u002Fevaluator.py` | EM \u002F token-F1 評分 |\n| `skillopt\u002Foptimizer.py` | 文字空間技能優化器 |\n| `skillopt\u002Ftrainer.py` | epoch\u002Fbatch 迴圈 + 驗證閘門 |\n| `scripts\u002F` | `download_data.py`、`train.py` 兩支 CLI |\n| `tests\u002F` | 單元測試 + 離線 e2e 測試(完全不需網路) |\n\n## 測試\n\n```bash\nuv run pytest            # 所有測試以 fake LLM 離線執行\n```\n\n## 授權\n\nMIT\n","skillopt-qa 是一个针对 HotpotQA 多跳推理问答任务的文本空间优化器，旨在为冻结的大型语言模型（LLM）训练出可部署的自然语言技能。项目核心功能是通过不直接微调模型权重的方式，而是采用类似神经网络训练的过程来迭代优化技能文档 `best_skill.md`，利用验证集上的表现作为接受或拒绝编辑的标准。此方法适用于需要在特定任务上增强现有预训练模型能力而不希望或不能进行全量微调的情况，特别适合资源受限环境下的快速技能开发与测试。实现基于 Python，并要求使用 OpenAI 兼容的聊天端点。",2,"2026-06-11 04:03:02","CREATED_QUERY"]