67 lines
3.0 KiB
Python
67 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
"""WEVAL Brain Fine-Tune Pipeline — TRL v1.0
|
|
Export: python3 finetune.py --export
|
|
Train: python3 finetune.py --train (GPU required)
|
|
"""
|
|
import argparse, json, os
|
|
|
|
def export_data(out='weval-training-data.jsonl'):
|
|
data = []
|
|
# Qdrant skills
|
|
try:
|
|
import requests
|
|
r = requests.post("http://127.0.0.1:6333/collections/weval_skills/points/scroll",
|
|
json={"limit":2000,"with_payload":True}, timeout=30)
|
|
for p in r.json().get("result",{}).get("points",[]):
|
|
pay = p.get("payload",{})
|
|
if pay.get("name") and pay.get("desc"):
|
|
data.append({"messages":[
|
|
{"role":"system","content":"Tu es WEVIA, IA souverain WEVAL Consulting."},
|
|
{"role":"user","content":f"Skill: {pay['name']}"},
|
|
{"role":"assistant","content":pay['desc']}
|
|
]})
|
|
except Exception as e: print(f"Qdrant: {e}")
|
|
|
|
# Agents
|
|
adir = "/opt/oh-my-claudecode/agents"
|
|
if os.path.isdir(adir):
|
|
for f in os.listdir(adir):
|
|
if f.endswith('.md'):
|
|
c = open(os.path.join(adir,f)).read()[:500]
|
|
data.append({"messages":[
|
|
{"role":"system","content":"Tu es WEVIA multi-agent."},
|
|
{"role":"user","content":f"Agent {f.replace('.md','')}"},
|
|
{"role":"assistant","content":c}
|
|
]})
|
|
|
|
# WEVAL knowledge
|
|
for q,a in [("WEVAL?","Cabinet conseil souverain: ERP/SAP, Cloud, IA, Cyber, Pharma. Casablanca."),
|
|
("WEVIA?","IA souverain 7 providers, 4296 skills, 19 agents."),
|
|
("Services?","SAP S/4HANA, Cloud AWS/Azure, Audit ISO27001, Ethica Pharma.")]:
|
|
data.append({"messages":[{"role":"system","content":"WEVIA IA"},{"role":"user","content":q},{"role":"assistant","content":a}]})
|
|
|
|
with open(out,'w') as f:
|
|
for d in data: f.write(json.dumps(d,ensure_ascii=False)+'\n')
|
|
print(f"Exported {len(data)} samples to {out}")
|
|
|
|
def train(data='weval-training-data.jsonl', model='Qwen/Qwen2.5-7B-Instruct'):
|
|
from trl import SFTTrainer, SFTConfig
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
from datasets import load_dataset
|
|
tok = AutoTokenizer.from_pretrained(model)
|
|
mdl = AutoModelForCausalLM.from_pretrained(model, torch_dtype='auto', device_map='auto')
|
|
ds = load_dataset('json', data_files=data, split='train')
|
|
cfg = SFTConfig(output_dir='./weval-brain-v2', num_train_epochs=3, per_device_train_batch_size=2,
|
|
gradient_accumulation_steps=4, logging_steps=10, learning_rate=2e-5, max_seq_length=1024)
|
|
SFTTrainer(model=mdl, args=cfg, train_dataset=ds, tokenizer=tok).train()
|
|
print("Done! Model at ./weval-brain-v2")
|
|
|
|
if __name__ == '__main__':
|
|
p = argparse.ArgumentParser()
|
|
p.add_argument('--export', action='store_true')
|
|
p.add_argument('--train', action='store_true')
|
|
a = p.parse_args()
|
|
if a.export: export_data()
|
|
elif a.train: train()
|
|
else: p.print_help()
|