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

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.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.