yezdata/SmolLM2-1.7B-Instruct-DocstringGenerator
SmolLM2-1.7B-Instruct · DocstringGenerator
A fine-tuned [SmolLM2-1.7B-Instruct](https://huggingface.co/HuggingFaceTB/SmolLM2-1.7B-Instruct) specialised in writing concise, high-level Python docstrings for functions, methods and classes. This model is the backbone of the [PyDoctor](https://github.com/yezdata/pydoctor) CLI — a fully local, LLM-powered tool that automatically writes and manages docstrings in your Python codebase.
   
Intended Use
The model generates summary-style docstrings — single-paragraph, plain-English descriptions of a Python code block's purpose and architectural role. It does not produce Args:, Returns:, or Raises: sections by design.
Suitable for:
- Automated docstring generation in CI/CD pipelines
- Interactive IDE plugins
- Local, privacy-preserving documentation workflows via llama.cpp / GGUF
Not suitable for:
- General-purpose code generation
- Generating full NumPy/Google-style docstrings with parameter tables (explicitly omitted)
- Non-Python languages
Quick Start
With llama.cpp (GGUF · recommended for local use)
# Download the Q8_0 GGUF
huggingface-cli download \
yezdata/SmolLM2-1.7B-Instruct-DocstringGenerator \
smollm2_1_7b_instruct_merged-q8_0.gguf \
--local-dir ./models
# Run inference
llama-cli \
-m ./models/smollm2_1_7b_instruct_merged-q8_0.gguf \
--chat-template chatml \
-p "..."Tip: The PyDoctor CLI handles prompt construction, parsing, and atomic file rewrites out of the box.
Prompt Format (ChatML)
The model uses the ChatML template native to SmolLM2-Instruct:
<|im_start|>system
{SYSTEM_PROMPT}<|im_end|>
<|im_start|>user
CONTEXT
{context_code}
TARGET CODE
{target_code}<|im_end|>
<|im_start|>assistantThe model then generates only the raw docstring text, terminated by <|im_end|>.
Context definition:
- function target -> context = "Independent code block"
- method target → context =
__init__signature of its enclosing class - class target → context = signatures of its methods
Training Pipeline
Stage 1 — Code Extraction
Raw Python source files were streamed from [codeparrot/codeparrot-clean](https://huggingface.co/datasets/codeparrot/codeparrot-clean) (~200 k samples). Each file passed a quality filter that rejected:
Surviving files were parsed with [LibCST](https://libcst.readthedocs.io/) producing (target, context) pairs.
Stage 2 — Synthetic Docstring Generation
(target, context) pairs were labelled in parallel using DeepSeek V4 Flash (via OpenRouter):
The teacher-model system prompt enforced:
- Describe semantic purpose and architectural role, not implementation details
- Use context to disambiguate class membership
Stage 3 — Instruct Data Preparation & Tokenisation
Synthetic batches were assembled into ChatML prompt/completion pairs:
prompt = (
f"<|im_start|>system\n{SYSTEM_PROMPT}<|im_end|>\n"
f"<|im_start|>user\nCONTEXT\n{context}\n\nTARGET CODE\n{target}<|im_end|>\n"
f"<|im_start|>assistant\n"
)
completion = f"{docstring}<|im_end|>"Labels were constructed so that only completion tokens are trained on — prompt tokens are masked from cross-entropy loss.
Stage 4 — QLoRA Fine-tuning
Fine-tuning was performed on Kaggle kernels (instruct_finetune.py):
Loss = next-token cross-entropy, prompt tokens ignored via label mask.
Stage 5 — LoRA Merge & GGUF Export
After training, LoRA adapters were merged back into the base model weights and converted to Q8_0 GGUF using llama.cpp:
LoRA adapter (epoch 1, safetensors)
│
▼ merge_and_unload()
│
merged fp16 safetensors
│
▼ llama.cpp convert_hf_to_gguf.py --outtype q8_0
▼
smollm2_1_7b_instruct_merged-q8_0.ggufFiles
Limitations & Bias
- Summary-only style: the model is trained to output a single-paragraph summary. It will not produce
Args:/Returns:sections. - Python only: trained exclusively on Python source code from codeparrot-clean.
- Context dependency: quality improves when the correct context string is provided. Passing an empty context for class methods may reduce coherence.
- Teacher model bias: docstring style reflects DeepSeek V4 Flash's preferences filtered through the strict prompt rules. Unusual code idioms may yield generic descriptions.
- Not a general assistant: the model is heavily specialised and will likely perform poorly on tasks other than docstring generation.
Citation
@misc{pydoctor2026,
author = {yezdata},
title = {PyDoctor: Local LLM-powered Python Docstring Generator},
year = {2026},
howpublished = {\url{https://github.com/yezdata/pydoctor}},
note = {Fine-tuned SmolLM2-1.7B-Instruct model available at
\url{https://huggingface.co/yezdata/SmolLM2-1.7B-Instruct-DocstringGenerator}}
}License
This model is released under the Apache 2.0 license, matching the base SmolLM2-1.7B-Instruct model. Training data originates from codeparrot/codeparrot-clean (MIT)
