* Reduce and tighten comments and docstrings in tests Shorten verbose comments and docstrings across the test suite without changing any test logic. Remove narration that restates the next line, collapse long module and test docstrings to a single line, and drop banner separators. Keep regression context (issue and PR references, run ids), skip reasons, mocking and timing rationale, license headers, lint and type directives, and commented-out code. Comments and docstrings only: an AST signature check confirms no code, assertions, or string literals changed, and the suite byte-compiles cleanly. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
236 lines
6.7 KiB
Python
236 lines
6.7 KiB
Python
"""Synthetic chatml/sharegpt/alpaca datasets with intentional None/empty turns for dataset_none_detect.py."""
|
|
|
|
from datasets import Dataset
|
|
|
|
# ChatML (messages, role/content). pyarrow needs uniform column types, so
|
|
# messages=None / non-list (P1) rows live in a SEPARATE dataset.
|
|
|
|
_CHATML_ROWS = [
|
|
# clean rows
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "What is 2+2?"},
|
|
{"role": "assistant", "content": "4"},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Name a colour."},
|
|
{"role": "assistant", "content": "Blue."},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "system", "content": "You are helpful."},
|
|
{"role": "user", "content": "Hi"},
|
|
{"role": "assistant", "content": "Hello!"},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Tell me a joke."},
|
|
{"role": "assistant", "content": "Why did the chicken cross the road?"},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Capital of France?"},
|
|
{"role": "assistant", "content": "Paris."},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Count to 3."},
|
|
{"role": "assistant", "content": "1, 2, 3."},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "What is Python?"},
|
|
{"role": "assistant", "content": "A programming language."},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Translate 'hello' to Spanish."},
|
|
{"role": "assistant", "content": "Hola."},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "What is gravity?"},
|
|
{"role": "assistant", "content": "A fundamental force."},
|
|
]
|
|
},
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Who wrote Hamlet?"},
|
|
{"role": "assistant", "content": "Shakespeare."},
|
|
]
|
|
},
|
|
# bad rows: None/empty turn content (all values are lists, so pyarrow is happy)
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": None},
|
|
{"role": "assistant", "content": "Sure!"},
|
|
]
|
|
}, # None content
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": ""},
|
|
{"role": "assistant", "content": "OK."},
|
|
]
|
|
}, # empty string
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": " "},
|
|
{"role": "assistant", "content": "Got it."},
|
|
]
|
|
}, # whitespace only
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Hello"},
|
|
{"role": "assistant", "content": None},
|
|
]
|
|
}, # None assistant
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": None},
|
|
{"role": "assistant", "content": None},
|
|
]
|
|
}, # both None
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": ""},
|
|
{"role": "assistant", "content": ""},
|
|
]
|
|
}, # both empty
|
|
{
|
|
"messages": [
|
|
{"role": "user", "content": "Anything?"},
|
|
{"role": "assistant", "content": " \t "},
|
|
]
|
|
}, # tab whitespace
|
|
{"messages": [None, {"role": "assistant", "content": "Reply"}]}, # None turn element
|
|
]
|
|
|
|
# P1 rows: messages is None or non-list. Plain dicts (not an HF Dataset) since
|
|
# pyarrow can't mix list/non-list in one column; the runner mocks find_none_chatml.
|
|
_CHATML_P1_ROWS = [
|
|
{"messages": None}, # whole column None
|
|
{"messages": "not a list"}, # wrong type
|
|
]
|
|
|
|
|
|
def make_chatml_p1_rows() -> list:
|
|
"""Raw P1 rows (not an HF Dataset) for direct mock testing."""
|
|
return list(_CHATML_P1_ROWS)
|
|
|
|
|
|
# ShareGPT (conversations, from/value)
|
|
|
|
_SHAREGPT_ROWS = [
|
|
# clean
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": "Hello"},
|
|
{"from": "gpt", "value": "Hi there!"},
|
|
]
|
|
},
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": "What time is it?"},
|
|
{"from": "gpt", "value": "I don't know."},
|
|
]
|
|
},
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": "Good morning"},
|
|
{"from": "gpt", "value": "Good morning!"},
|
|
]
|
|
},
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": "Tell me about AI."},
|
|
{"from": "gpt", "value": "AI stands for Artificial Intelligence."},
|
|
]
|
|
},
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": "Bye"},
|
|
{"from": "gpt", "value": "Goodbye!"},
|
|
]
|
|
},
|
|
# bad
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": None},
|
|
{"from": "gpt", "value": "Sure!"},
|
|
]
|
|
},
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": ""},
|
|
{"from": "gpt", "value": "OK."},
|
|
]
|
|
},
|
|
{
|
|
"conversations": [
|
|
{"from": "human", "value": "Hello"},
|
|
{"from": "gpt", "value": None},
|
|
]
|
|
},
|
|
{"conversations": None}, # P1: whole column is None
|
|
{"conversations": [None, {"from": "gpt", "value": "Hi"}]},
|
|
]
|
|
|
|
# Alpaca (instruction / output columns)
|
|
|
|
_ALPACA_ROWS = [
|
|
# clean
|
|
{
|
|
"instruction": "Summarise this text.",
|
|
"input": "The sky is blue.",
|
|
"output": "The sky is blue.",
|
|
},
|
|
{"instruction": "Translate to French.", "input": "Hello", "output": "Bonjour"},
|
|
{"instruction": "What is 10*10?", "input": "", "output": "100"},
|
|
{
|
|
"instruction": "Name the planets.",
|
|
"input": "",
|
|
"output": "Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune",
|
|
},
|
|
{
|
|
"instruction": "Write a haiku.",
|
|
"input": "",
|
|
"output": "Old pond — / frog jumps in / water's sound",
|
|
},
|
|
# bad
|
|
{"instruction": None, "input": "", "output": "Some output"},
|
|
{"instruction": "", "input": "", "output": "Some output"},
|
|
{"instruction": "Valid instruction", "input": "", "output": None},
|
|
{"instruction": None, "input": "", "output": None},
|
|
{"instruction": " ", "input": "", "output": ""},
|
|
]
|
|
|
|
|
|
def make_chatml_dataset() -> Dataset:
|
|
return Dataset.from_list(_CHATML_ROWS)
|
|
|
|
|
|
def make_sharegpt_dataset() -> Dataset:
|
|
return Dataset.from_list(_SHAREGPT_ROWS)
|
|
|
|
|
|
def make_alpaca_dataset() -> Dataset:
|
|
return Dataset.from_list(_ALPACA_ROWS)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("Synthetic dataset sizes:")
|
|
print(f" chatml: {len(_CHATML_ROWS)} rows (+ {len(_CHATML_P1_ROWS)} P1 mock rows)")
|
|
print(f" sharegpt: {len(_SHAREGPT_ROWS)} rows")
|
|
print(f" alpaca: {len(_ALPACA_ROWS)} rows")
|
|
print(
|
|
"\nImport make_chatml_dataset, make_sharegpt_dataset, make_alpaca_dataset, make_chatml_p1_rows."
|
|
)
|