/ Модель

Характеристики

Контекст
262 144 токена
Размер весов
19,3 ГБ
Лицензия
Apache 2.0
Архитектура
qwen3_5 · dense
Базовая модель
Qwen3.5-9B
Библиотека
transformers
Опубликована
5 июл 2026

sqrl-9b

Генерация текстаТекст → текст5 профессий

Агентная модель на 9 млрд параметров, которая отвечает на вопросы к базам SQLite, формируя SQL и при необходимости предварительно исследуя данные.

1 977скачиваний за 30 дней5лайковвеса обновлены7 июл 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Тесты пользователейпока нет

Никто ещё не опубликовал тест этой модели. Соберите бенчмарк из своих задач — результат появится здесь.

  1. Добавьте модель в бенчмарк

    Вместе с другими моделями категории «Текст» — сравнение идёт внутри одной категории.

  2. Опишите свои задачи

    Напишите запросы, при необходимости приложите файлы и эталонные ответы.

  3. Запустите и опубликуйте

    Модели ответят на каждую задачу, судья оценит ответы. Опубликованный результат появится на этой странице.

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

sqrl-9b — агентная модель преобразования запросов на естественном языке в SQL для SQLite, разработанная feyninc на базе Qwen/Qwen3.5-9B. Модель может сначала выполнять исследовательские SELECT-запросы для проверки значений, связей таблиц и фильтров, а затем выдавать итоговый SQL. Для работы используется протокол с одним блоком действия за ход и передачей результатов исследования обратно в контекст.

Модель содержит 9 млрд параметров и обучена в два этапа: дистилляция с учителем на проверенных выполнением траекториях и онлайн RL с наградой за совпадение результата SQL. По оценке авторов на BIRD-dev результат составляет 66,6% для pass@1 и 69,8% для голосования по восьми вариантам. Репозиторий содержит объединённый чекпойнт с LoRA, доступный в формате safetensors; лицензия — Apache-2.0. Унаследованная от базовой модели башня зрения сохранена, но обучение для SQL было текстовым.

Предназначена прежде всего для генерации SQL по схеме SQLite и вопросу пользователя; качество зависит от соблюдения описанного в карточке протокола и может улучшаться за счёт нескольких сэмплов и голосования. Модель не настроена на другие диалекты SQL, использует соглашения SQLite для кавычек идентификаторов. Сгенерированные запросы следует проверять и выполнять в режиме только для чтения.

Сценарии применения

  • преобразование вопроса на естественном языке в SQL-запрос SQLite
  • поиск записей в базе данных по пользовательскому вопросу
  • уточнение форматов значений и условий фильтрации через исследовательские SELECT-запросы
  • выбор связей таблиц для ответа на вопрос к базе
  • генерация SQL с голосованием по нескольким вариантам для повышения надёжности

Ограничения

Модель настроена на SQLite и не адаптирована для других диалектов SQL; для корректной работы следует соблюдать описанный протокол взаимодействия. Генерируемый SQL нужно проверять и выполнять только в режиме чтения.

Для каких профессий подходит5

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Также подходит для

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

sqrl-9b

sqrl-9b is a 9B-parameter agentic text-to-SQL model built on Qwen/Qwen3.5-9B. It answers natural-language questions over SQLite databases by optionally probing the database first — running read-only exploration queries to check value formats, join paths, and filters — before committing to a final SQL answer. It is the larger sibling of feyninc/sqrl-4b, trained with the same recipe.

Training stages:

  1. SFT distillation — fine-tuned on ~10.2k execution-verified agentic trajectories sampled from a much stronger RL-trained 35B teacher (Qwen3.6-35B-A3B, 70.3% BIRD-dev EX) on cleaned BIRD-train + Spider-train questions. Only trajectories whose final SQL execution-matched the gold answer were kept.
  2. CISPO RL — online reinforcement learning (group-relative advantage, group size 8) with execution-match reward on the same cleaned BIRD+Spider question pool, with async dynamic sampling. Best checkpoint at step 60.

Results

All BIRD-dev numbers measured on the full 1534-question set at temperature 0.7 with the agentic harness (execution-clustered majority vote = sample 8 candidates, group them by identical execution result set, return the largest cluster's query).

BenchmarkMetricScore
BIRD-devpass@1 (avg over 8 samples)66.6% EX
BIRD-devvote-of-8 (execution-clustered)69.8% EX

Family comparison on identical seeds (pass@1 / vote@8): sqrl-4b 64.6 / 68.8 · sqrl-9b 66.6 / 69.8 · sqrl-35b-a3b 68.7 / 70.6.

Notes from the measurement campaign:

  • sqrl-9b vote-of-8 (69.8%) is the family's cost/performance sweet spot — within 0.8 pts of anything the whole family achieves under any sampling/voting scheme, including the 35B. vote-of-4 captures ~85% of the voting gain at half the cost.
  • Vote unanimity is a strong free confidence signal: when all 8 samples agree (~60% of questions) the answer is right ~87% of the time; narrow/tied votes are right ~19-43% — useful for routing or escalation.
  • The pre-RL SFT checkpoint scores 64.0% pass@1 on the same harness; base Qwen3.5-9B scores ~56%.

How it works — the agentic protocol

The model emits exactly one action block per turn, after a brief reasoning summary:

  • <sql> SELECT ... </sql> — a read-only exploration query. Execute it against the database and feed the result back as a user turn wrapped in <observation> tags. The model continues (up to a step budget).
  • <answer> SELECT ... </answer> — the final SQL. Execute and return.

Many questions are answered directly (zero exploration turns); the model learned to explore only when seeing real data would change its answer (value-format checks, ambiguous joins).

Usage

Serve with vLLM

vllm serve feyninc/sqrl-9b --served-model-name sqrl-9b \
  --data-parallel-size 4 --gpu-memory-utilization 0.90 --max-model-len 32768

Important: do not enable a reasoning parser (e.g. --reasoning-parser qwen3). The model's post-</think> content carries the action protocol; stripping/rerouting the think block breaks it. Parse message.content — if it contains a </think>, take everything after it.

Recommended sampling: temperature 0.7, top_p 0.95 (matches training); greedy also works.

Prompt format

System prompt (fill {schema}, {evidence}, {max_steps}):

<role>
You are an expert data analyst, fluent in SQL, with a meticulous eye for
matching a question's intent to the exact tables, columns, and stored value formats of
a database.
</role>

<task>
Translate the user's natural-language question into a SQL query that answers
it, using the database schema in <schema> and any domain hints in <evidence>. You can
run read-only queries against the database to inspect it before giving your final
answer.
</task>

<database_engine>
SQLite
</database_engine>

<schema>
{schema}
</schema>

<evidence>
{evidence}
</evidence>

<protocol>
Think through the problem internally first. Then, in your response, write a
BRIEF summary of your reasoning — 2-4 sentences stating which tables and columns are
relevant, the joins and filters, and any exact value-format detail. Be decisive: state
the plan once, do not second-guess or restate. End your message with EXACTLY ONE action
block (and nothing after it):

  <sql> a read-only query to inspect the database </sql>
     Use this when uncertain and you want to see real data before answering — e.g.
     confirm a value's exact stored format, check a filter actually matches rows,
     sanity-check an intermediate result, or verify a join. You will see the result
     rows and then continue.

  <answer> your final SQL query </answer>
     Use this once you are confident. It is executed and scored, and the task ends.

Examples:
  I'll check the exact county value before filtering, since the format may vary.
  <sql> SELECT DISTINCT `County Name` FROM frpm LIMIT 10 </sql>

  The schools are in the frpm table; I'll select `School Name` and filter `County Name`
  to 'Alameda'. The schema is clear, so I can answer directly.
  <answer> SELECT `School Name` FROM frpm WHERE `County Name` = 'Alameda' </answer>
</protocol>

<rules>
- Use only the tables and columns defined in <schema>.
- Quote identifiers containing spaces or special characters with backticks.
- Return exactly the columns the question asks for — no more, no fewer.
- Use the hints in <evidence> to resolve ambiguous terms and value encodings.
- If you already know the correct query, go straight to <answer> — investigating is
  optional; only run <sql> when seeing the data would actually change your answer.
- The action block must be the LAST thing in your message; do not discuss the tags
  themselves in your reasoning.
- You have at most {max_steps} <sql> steps; after that you must give <answer>.
</rules>

First user turn:

Question: {question}

Reason about it, then give <sql> to investigate or <answer> to finish.

After executing an exploration <sql>, feed the result back as a user message:

<observation>
{tab-separated result rows, or the error message}
</observation>
Continue with <sql> or <answer>.

{schema} is a readable dump of the SQLite schema (CREATE-TABLE-like listing of tables/columns/types). {evidence} is the BIRD external-knowledge hint, or (none provided). max_steps=5 was used in training. When the step budget is exhausted, send You must finish now. Give your <answer>. as a user turn.

Minimal driver loop

import re
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")

messages = [{"role": "system", "content": system_prompt},
            {"role": "user", "content": user0}]
for step in range(6):
    r = client.chat.completions.create(model="sqrl-9b", messages=messages,
                                       temperature=0.7, top_p=0.95, max_tokens=8192)
    content = r.choices[0].message.content
    if "</think>" in content:                       # strip inline think scratchpad
        content = content.split("</think>")[-1].strip()
    messages.append({"role": "assistant", "content": content})
    ans = re.findall(r"<answer>(.*?)</answer>", content, re.S)
    if ans:
        final_sql = ans[-1].strip(); break
    sql = re.findall(r"<sql>(.*?)</sql>", content, re.S)
    if not sql:
        break
    obs = run_readonly(sql[-1].strip())             # your sqlite executor
    messages.append({"role": "user",
                     "content": f"<observation>\n{obs}\n</observation>\n"
                                "Continue with <sql> or <answer>."})

Checkpoint notes

  • This repo contains the full merged HF checkpoint (LoRA rank 32 merged into the base). Qwen3.5-9B has untied embeddings, so the merge is direct: the trained head lands in lm_head, embed_tokens is untouched. Loads with standard transformers / vLLM — no custom code beyond trust_remote_code if your transformers version requires it for Qwen3.5.
  • The vision tower is inherited from the base model unchanged. The model is usable as a standard VL checkpoint, but SQL training was text-only.
  • Text-to-SQL training data: BIRD-train and Spider-train, execution-filtered and semantically cleaned (3-model LLM-judge panel). BIRD-dev and Spider-test were never trained on.

Intended use & limitations

Built for SQLite text-to-SQL with schema + optional evidence in context. Works best with the exact prompt protocol above (it was both SFT'd and RL'd under it). Not tuned for other SQL dialects; identifier quoting follows SQLite backtick conventions. As with all text-to-SQL models, execute generated SQL read-only and validate before acting on results.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · transformers

Можно запустить

Подбираем GPU…

Класс архитектуры
Qwen3_5ForConditionalGeneration
Ревизия весов
654a17a

0 моделей