GeM bid recommendation writer
Small seq2seq model that turns a bid's structured compliance breakdown (risk level, score and the findings of an automated verification pipeline) into a short recommendation for a procurement officer, ending in one of: Recommend qualifying, Recommend disqualification, or Recommend officer review before qualifying. Every output is labelled "AI-generated, advisory only".
It runs locally — no external LLM API — and only ever sees the structured summary, never raw bidder documents.
Intended use
Advisory text for a dashboard. The officer makes the decision; the platform's rule engine and
audit log remain the record. Input format (built by ml/recommendation/findings.py):
write recommendation | risk: Non-Compliant | score: 40.0 | findings: gst_inactive status=cancelled ; mismatch:gst_trade_name document=... portal=...
Guardrail (use it)
A small generative model can occasionally state the wrong verdict, drop a finding or invent one.
The project's ml/recommendation/infer.py checks every output against the input's own findings
and falls back to deterministic template text for the same findings when the check fails. Use it
rather than raw pipeline(...) output anywhere an officer will read the result.
Training data
Generated by ml/recommendation/generate.py: 54,000 train, 3,000 validation, 3,000 test examples.
Targets are written by a template generator with varied phrasing and a concrete next step per finding (e.g. "request recent ECR challans"). All data is synthetic, so the model's language is bounded by those templates: it combines and rephrases them fluently for any mix of findings, but does not reason beyond them.
Evaluation (generated outputs on held-out synthetic bids)
Graded on what matters to an officer rather than n-gram overlap: the right verdict, every finding in the input mentioned, and no finding invented.
| Metric | Value |
|---|---|
| Correct verdict | 100.0% |
| Findings mentioned (recall) | 100.0% |
| Outputs inventing a finding | 0.0% |
| Carries the advisory label | 100.0% |
| Examples graded | 1000 |
Usage
from transformers import pipeline
write = pipeline("text2text-generation", model="HarshilDaGoat/gem-recommendation-writer")
write("write recommendation | risk: Low | score: 100.0 | findings: none", max_new_tokens=200, num_beams=4)