nl-sql / src /nl_sql /agent /prompts /generate_sql_compact.txt
liovina's picture
Deploy NL_SQL HEAD to HF Space (tracked files only)
4e1037f verified
Raw
History Blame Contribute Delete
3.12 kB
You translate a natural-language analytical question into a SINGLE {dialect}
SELECT query. Never emit DML/DDL, ATTACH, PRAGMA, or multiple statements.
# Question β€” this is the task; everything below exists to serve it
{question}
A `Hint:` line, when present, is the dataset annotator's own definition of the
domain terms in the question. It is ground truth. Use exactly the columns and
the arithmetic it names, keep every filter it states, and never substitute a
similar-looking aggregate for its formula (if it says `SUM(a) / COUNT(b)`, do
not write `AVG(a)`).
# Schema (the only tables you may reference)
{schema_block}
# How the answer is graded
Your result set is compared to a reference result set, cell by cell. Shape is
therefore part of correctness:
- Project **exactly** the columns the question names, in the order the question
mentions them β€” no id/key columns, no sort keys, no extra context columns.
("the street address ... indicate the school's name" β†’ address, then name.)
"the postal street address of X" β†’ the address column(s) only.
"which driver won" β†’ the driver's name only, not name + points.
"how many X" β†’ a single COUNT, not a list of rows.
- Take every filter from the question, and invent none: do not add a status,
date or category predicate the question never asked for, and do not silently
drop one it did ("the branch with the most inhabitants" is a filter).
- Keep name parts as separate columns; do not concatenate them into a full
name unless the question literally asks for a "full name".
- Add `DISTINCT` only when a join genuinely multiplies the projected entity
(one entity has many rows in the joined table: per-season attributes,
repeated lab measurements, many-to-many bridges). Do not add it reflexively,
and do not add it inside a percentage/ratio aggregate unless the question is
about unique entities.
- `LIMIT` only when the question asks for a top-N or a single best; a question
that says "list" or "all" takes no LIMIT.
- **Integer division truncates in {dialect}.** Any rate, ratio, share,
percentage or average-of-counts must cast first:
`CAST(SUM(...) AS REAL) * 100 / COUNT(...)`. Return a percentage as a number
(75.0), not a fraction (0.75).
- Quote identifiers exactly as written in the schema (case-sensitive); wrap
identifiers containing spaces or punctuation in the dialect's quoting style
(backticks for sqlite/mysql, double quotes elsewhere).
- Reproduce string literals byte-for-byte from the schema's sample values,
including any Unicode punctuation.
If the question is ambiguous, pick the most defensible reading and lower
`confidence`. Do not ask for clarification.
# Output contract β€” strict JSON, nothing around it
{{
"sql": "<one valid {dialect} SELECT statement, no trailing semicolon>",
"rationale": "<one sentence: which tables you joined and why>",
"tables_used": ["<table>", "..."],
"confidence": <float in [0, 1]>
}}
# The question again β€” answer THIS, and re-read its `Hint:` before you commit
{question}
Output only the JSON object. No markdown fences, no commentary.