--- license: apache-2.0 base_model: Qwen/Qwen3-8B library_name: transformers pipeline_tag: text-generation language: - en --- # TabRankNaive Qwen3-8B, fine-tuned for **single-call generative listwise table reranking**. Given a question and a list of candidate tables, it reads them all in one prompt and returns the full ranking in a single generation — no pairwise scoring, no cross-encoder passes. ![TabRank: question and candidate tables go into a single Qwen3-8B call, which reasons and emits a ranked list](tabrank_task.png) This checkpoint is the **Answer-Only** variant: fine-tuned to output the ranking directly with no reasoning trace, so it's the fastest of the three objectives at inference. Related: [TabRank](https://huggingface.co/AdarshSingh7647/TabRank) (same data, reasoning-conditioned, our best method) · [TabRankStandardSFT](https://huggingface.co/AdarshSingh7647/TabRankStandardSFT) (same data, standard CoT SFT). ## Input / output format **Input** — a chat message with the question followed by each candidate table, labeled `### Table 1`, `### Table 2`, ...: ```text Question: Which table shows 2022 quarterly revenue by region? ### Table 1 | Region | Q1 2022 | Q2 2022 | Q3 2022 | Q4 2022 | |---|---|---|---|---| | North America | 120 | 134 | 128 | 145 | | Europe | 88 | 91 | 95 | 102 | ### Table 2 | Product | Units Sold | Year | |---|---|---| | Widget A | 4200 | 2021 | ### Table 3 | Region | Headcount | |---|---| | North America | 340 | ``` **Output** — a single JSON object with the ranked, one-indexed candidate positions, best first: ```json {"ranked_tables": [1, 3, 2]} ``` Map the numbers back to your own table ids to get the reranked list — position `1` in the output is `### Table 1` from the input, etc. ## Evaluation This card does not publish a verified results table for the Answer-Only objective on this training mix — earlier published numbers for this checkpoint could not be confirmed against source eval logs, so they're left out rather than risk repeating an error. For a fully-verified comparison, see [TabRankStandardSFT](https://huggingface.co/AdarshSingh7647/TabRankStandardSFT) and [TabRank](https://huggingface.co/AdarshSingh7647/TabRank), which include in-distribution results (SQA, TAT-QA, HybridQA, TabFact, NQ-Tables) and out-of-distribution results on 7 benchmarks from the [IBM table-text-ir-evaluation suite](https://huggingface.co/collections/ibm-research/table-text-ir-evaluation). Source eval code and logs: [GitHub](https://github.com/AdarshSingh7647/TabRanker). ## Usage with vLLM ```python from vllm import LLM, SamplingParams from transformers import AutoTokenizer repo = "AdarshSingh7647/TabRankNaive" tok = AutoTokenizer.from_pretrained(repo) llm = LLM(model=repo, dtype="bfloat16", max_model_len=32768) system = ("You are a table relevance expert. Given a question and a set of candidate tables " "rank them from most to least useful for answering the question. Output exactly " "JSON with key ranked_tables.") user = "Question: ...\n\n### Table 1\n...\n\n### Table 2\n...\n" msgs = [{"role": "system", "content": system}, {"role": "user", "content": user}] text = tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True) out = llm.generate([text], SamplingParams(temperature=0.6, top_p=0.95, max_tokens=2048)) print(out[0].outputs[0].text) ``` ## Usage with Transformers ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer repo = "AdarshSingh7647/TabRankNaive" tok = AutoTokenizer.from_pretrained(repo) model = AutoModelForCausalLM.from_pretrained(repo, torch_dtype=torch.bfloat16, device_map="auto") system = ("You are a table relevance expert. Given a question and a set of candidate tables " "rank them from most to least useful for answering the question. Output exactly " "JSON with key ranked_tables.") user = "Question: ...\n\n### Table 1\n...\n\n### Table 2\n...\n" msgs = [{"role": "system", "content": system}, {"role": "user", "content": user}] text = tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True) inputs = tok(text, return_tensors="pt").to(model.device) out = model.generate(**inputs, max_new_tokens=2048, temperature=0.6, top_p=0.95, do_sample=True) print(tok.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)) ``` Full training and eval code: [github.com/AdarshSingh7647/TabRanker](https://github.com/AdarshSingh7647/TabRanker). ## Model details * Base model: Qwen3-8B * Method: LoRA rank 16, merged into base weights * Precision: bfloat16, ~16 GB * Training data: NQ Tables + MultiTabQA ## Citation ```bibtex @misc{singh2026tabrank, title={TabRank: Chain-of-Thought Distillation for Table Re-Rankers}, author={Adarsh Singh and Kushal Raj Bhandari and Jianxi Gao and Soham Dan and Vivek Gupta}, year={2026}, eprint={2607.25182}, archivePrefix={arXiv}, primaryClass={cs.CL}, url={https://arxiv.org/abs/2607.25182} } ``` The MultiTabQA data in this checkpoint's training mix comes from RAG over Tables: ```bibtex @misc{zou2025ragtableshierarchicalmemory, title={RAG over Tables: Hierarchical Memory Index, Multi-Stage Retrieval, and Benchmarking}, author={Jiaru Zou and Dongqi Fu and Sirui Chen and Xinrui He and Zihao Li and Yada Zhu and Jiawei Han and Jingrui He}, year={2025}, eprint={2504.01346}, archivePrefix={arXiv}, primaryClass={cs.CL}, url={https://arxiv.org/abs/2504.01346} } ```