All work
Case study · 02

SOQ

An AI proposal assistant that turns an RFQ into a shortlisted team and a drafted Statement of Qualifications.

React + ViteFlaskMongoDBFAISS + Sentence TransformersGroq LLMLangChain
SOQ
Overview

SOQ (the RFQ-to-SOQ assistant) is an AI-assisted proposal-generation platform for engineering and consulting services. A user uploads a Request for Qualifications or Proposal, and the system analyses it, finds matching professionals from a resume database, lets the user pick nominees, and generates a Statement of Qualifications draft they can edit, verify, and export. It combines document parsing, semantic search, LLM-based summarisation, and a wizard-style chat UI into one workflow — tailored for geotechnical and engineering-services proposals.

The challenge

Responding to an RFQ/RFP is slow, manual work: someone has to read the whole document, pull out the real requirements, hunt through resumes for people who actually fit the skills, experience, and registrations being asked for, and then assemble a polished, on-template SOQ. SOQ had to compress that end-to-end effort — requirement extraction, candidate matching, and drafting — into a guided flow that produces a professional, editable response rather than a generic chatbot answer.

How it works
  1. 01

    RFQ upload & analysis

    The user uploads an RFQ as PDF or DOCX; the Flask backend saves it, extracts the text, and sends it to the LLM with a structured prompt that returns a clean HTML summary — broken into sections like experience requirements, project scope, required skills and certifications, technical requirements, evaluation criteria, team size, and client details. The document is also indexed for later question-answering.

  2. 02

    Resume matching by semantic search

    Resumes stored per person are extracted, combined, chunked, and vectorised with Sentence Transformers, with embeddings held in a FAISS index. The RFQ is turned into a job-description-style query and run against that index, returning ranked candidates with structured detail — experience, education, registrations, skills, certifications, projects, and per-facet match percentages — rather than keyword hits.

  3. 03

    Shortlist & nominee selection

    Matches surface as cards showing each candidate’s score, skills, certifications, projects, location, and education, with the RFQ text visually highlighted against them. The user reviews the ranked shortlist and selects the nominees to put forward, with the selection held in Redux state through the rest of the workflow.

  4. 04

    SOQ draft generation

    From the selected people and the RFQ analysis, the system assembles a full SOQ draft — blending firm description, a prompt letter, project-experience tables, and references from static sources with AI-generated sections for services, personnel and equipment, quality assurance, staffing, and workload approach. The result comes back as HTML rendered in a live preview.

  5. 05

    Chat editing, verification & export

    The user refines the draft with chat-style prompts — the backend revises the existing SOQ HTML and supports regenerate/undo — and can ask questions about the original RFQ via RAG over the indexed document. A page-limit check evaluates the draft against the RFQ’s limits, and the finished HTML converts to a downloadable Word (DOCX) file.

What we built
01

Automatic RFQ requirement extraction

Instead of a human reading the whole document, the platform parses an uploaded RFQ/RFP and returns a structured summary of exactly what the opportunity asks for — scope, required skills, certifications, technical requirements, evaluation criteria, and team size.

02

Semantic candidate matching

Matching uses vector similarity over resume embeddings, not keyword lookup, and only surfaces people who clear multiple thresholds across overall fit, skills, certifications, and projects — with a preference for professional-engineer registrations, so the shortlist reflects genuine suitability.

03

Template-driven SOQ drafting

The generator fuses firm information, letter templates, and curated project-experience and staffing content with AI-written sections, producing a polished, correctly-structured SOQ response rather than free-form text.

04

Conversational editing & RFQ Q&A

A chat interface lets users revise the draft in plain language (with regenerate and undo), and ask questions about the source RFQ answered via retrieval-augmented generation grounded in the uploaded document.

05

Compliance check & Word export

A page-limit endpoint checks the draft against the RFQ’s stated limits, and the final SOQ exports to DOCX — delivering a submission-ready document straight out of the tool.

Under the hood
01

Flask backend & document pipeline

A Python Flask API handles uploads, text extraction (PyPDF2 / pdfplumber / pypdf and python-docx), LLM prompting, SOQ assembly, and export. ReportLab and htmldocx handle document generation, converting the generated HTML into downloadable Word files.

02

Semantic search stack

Sentence Transformers generate resume and RFQ embeddings, FAISS provides fast vector similarity search, and LangChain orchestrates the retrieval and prompting — powered by the Groq LLM API for fast summarisation and generation.

03

MongoDB data layer

A MongoDB database (resume_database) stores parsed resumes and candidate profiles, exposed through a paginated, searchable resumes API that supports sorting and search across names, positions, locations, skills, certifications, and education.

04

React + Vite wizard UI

The frontend is a React (Vite) app with Redux Toolkit state, React Router, Tailwind CSS, and PrimeReact, presenting a step-wise chat workflow — RFQ chat, summary, matching professionals, selected professionals, and SOQ preview — with Framer Motion for the interface polish.

Have a project like this?

Tell us what you're building — thirty minutes with an engineer, not a salesperson.