142 lines
3.7 KiB
Markdown
142 lines
3.7 KiB
Markdown
---
|
|
language:
|
|
- en
|
|
license: apache-2.0
|
|
base_model: Qwen/Qwen3-0.6B
|
|
tags:
|
|
- recipe-generation
|
|
- food
|
|
- cooking
|
|
- fine-tuned
|
|
- qwen3
|
|
- unsloth
|
|
datasets:
|
|
- recipe_nlg
|
|
pipeline_tag: text-generation
|
|
---
|
|
|
|
# Qwen3-0.6B Recipe Chef
|
|
|
|
A fine-tuned version of [Qwen/Qwen3-0.6B](https://huggingface.co/Qwen/Qwen3-0.6B) trained on 60,000 recipes from the RecipeNLG dataset.
|
|
Give it a list of ingredients and it generates a complete recipe with title, quantities, and step-by-step directions.
|
|
|
|
## Model Details
|
|
|
|
| Property | Value |
|
|
|----------------|------------------------------|
|
|
| Base model | Qwen/Qwen3-0.6B |
|
|
| Training data | RecipeNLG (70k samples) |
|
|
| Fine-tune method| LoRA (r=64, alpha=128) |
|
|
| Epochs | 2 |
|
|
| Training loss | 0.86 |
|
|
| Framework | Unsloth + TRL |
|
|
|
|
## How to Use
|
|
|
|
### Option 1 — With Unsloth (recommended, faster)
|
|
|
|
```python
|
|
from unsloth import FastLanguageModel
|
|
import torch
|
|
|
|
model, tokenizer = FastLanguageModel.from_pretrained(
|
|
model_name = "Aniq-63/qwen3-0.6B-recipe-finetuned",
|
|
max_seq_length = 1024,
|
|
load_in_4bit = True,
|
|
)
|
|
|
|
FastLanguageModel.for_inference(model)
|
|
|
|
@torch.inference_mode()
|
|
def generate_recipe(ingredients: str) -> str:
|
|
messages = [
|
|
{
|
|
"role": "system",
|
|
"content": (
|
|
"You are a professional chef assistant. "
|
|
"When given a list of ingredients, generate a complete recipe with "
|
|
"a title, structured ingredient list with quantities, and clear "
|
|
"step-by-step directions."
|
|
)
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": ingredients
|
|
}
|
|
]
|
|
prompt = tokenizer.apply_chat_template(
|
|
messages,
|
|
tokenize=False,
|
|
add_generation_prompt=True,
|
|
enable_thinking=False,
|
|
)
|
|
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
outputs = model.generate(
|
|
**inputs,
|
|
max_new_tokens = 400,
|
|
temperature = 0.7,
|
|
top_p = 0.9,
|
|
do_sample = True,
|
|
use_cache = False,
|
|
)
|
|
new_tokens = outputs[0][inputs["input_ids"].shape[1]:]
|
|
return tokenizer.decode(new_tokens, skip_special_tokens=True)
|
|
|
|
print(generate_recipe("chicken, garlic, onion, olive oil, tomato"))
|
|
```
|
|
|
|
### Option 2 — With standard Transformers
|
|
|
|
```python
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
import torch
|
|
|
|
model = AutoModelForCausalLM.from_pretrained(
|
|
"Aniq-63/qwen3-0.6B-recipe-finetuned",
|
|
torch_dtype = torch.float16,
|
|
device_map = "auto",
|
|
)
|
|
tokenizer = AutoTokenizer.from_pretrained("Aniq-63/qwen3-recipe-chef")
|
|
|
|
messages = [
|
|
{
|
|
"role": "system",
|
|
"content": (
|
|
"You are a professional chef assistant. "
|
|
"When given a list of ingredients, generate a complete recipe with "
|
|
"a title, structured ingredient list with quantities, and clear "
|
|
"step-by-step directions."
|
|
)
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "chicken, garlic, onion, olive oil, tomato"
|
|
}
|
|
]
|
|
|
|
prompt = tokenizer.apply_chat_template(
|
|
messages,
|
|
tokenize=False,
|
|
add_generation_prompt=True,
|
|
)
|
|
|
|
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
|
|
outputs = model.generate(
|
|
**inputs,
|
|
max_new_tokens = 400,
|
|
temperature = 0.7,
|
|
top_p = 0.9,
|
|
do_sample = True,
|
|
)
|
|
|
|
new_tokens = outputs[0][inputs["input_ids"].shape[1]:]
|
|
print(tokenizer.decode(new_tokens, skip_special_tokens=True))
|
|
```
|
|
|
|
## Training Details
|
|
|
|
- **Dataset:** [RecipeNLG](https://www.kaggle.com/datasets/paultimothymooney/recipenlg)
|
|
- **Fine-tune method:** LoRA (Unsloth)
|
|
- **Epochs:** 2
|