A step-by-step breakdown of what happens when a technician asks a question about turbine faults
The user types a question into the chat interface. They can optionally pre-select a site and turbine type using the filter dropdowns above the chat, which narrows all lookups to that context.
The system combines filter selections (if any) with six extractors that scan the question text:
The lookup(site, turbineType, errorCode, keywords, controller, make, turbineNumber) function searches all three data sources simultaneously using all extracted parameters. A unified VMP controller naming system (e.g. VMP5000, VMP3500) links across all sources:
The system checks if the strict search (all filters combined) returned any results from any of the 3 sources.
Combine results from all matching sources into one context block. For multi-code queries (e.g. "difference between 169 and 172"), each code's results are appended separately.
Confidence: HIGH
Broaden the search by progressively dropping filters:
Uses the first combination that returns results. If all fail, a comment keyword search is tried (preserving site/controller context first, then broadening). Confidence level is communicated to the LLM so it can inform the technician.
The system assembles the full message to send to the LLM, combining:
The assembled prompt is sent to OpenAI's GPT-4.1 model via the API. The LLM reads the retrieved data and generates an answer grounded only in that data. The response streams back to the user word by word.
The answer appears in the chat interface with:
The technician can also browse all data directly in the TechNotes page, which provides filterable tables for all three data sources with date range filtering, controller filtering, and more.
User asks:
Extraction:
Lookup: lookup("", "VMP5000", "176") finds a match in Manual. Reference documents resolved from Google Drive. Confidence: HIGH.
LLM Answer:
User asks:
Extraction:
Lookup: lookup("DKIT", "", "176") finds results in all 3 sources. Confidence: HIGH.
LLM Answer:
User selects filters: Site = DKIT, Turbine = Vestas V52
Then asks:
Extraction: Filter overrides take priority.
Lookup: lookup("DKIT", "Vestas V52", "176") — all three parameters narrow the search. Results are specific to DKIT with V52 turbines. Confidence: HIGH.
LLM Answer: The answer is tailored to DKIT and V52 specifically, rather than showing results across all sites and turbine types.
User asks:
Extraction:
Strict lookup: lookup("Kilronan", "Vestas V39", "1") → no results
Broadened search: Confidence drops to MEDIUM.
LLM Answer:
User asks:
Extraction:
Lookup: lookup("", "VMP3500", "", ..., "VMP3500", "") finds data in all 3 sources.
LLM Answer:
Instead of the LLM making up answers, we first retrieve relevant data from Galetech's actual records, then the LLM generates an answer using only that data.
GPT-4 does not know Galetech's fault codes, site names, or maintenance history. By feeding it the real data, we get accurate, grounded answers.
387 Vestas Service DVD PDFs are hosted on Google Drive. When the Manual references a document, the system resolves the filename to a clickable Drive link so technicians can open the original PDF directly.
When an exact match fails, the system progressively relaxes filters and tells both the LLM and the technician how confident the result is.
Six extractors parse site, turbine type, controller (VMP), manufacturer, turbine number (e.g. T1), and error codes. "VMP5000", "5000", and "V52" all resolve to the same controller type.
All data sources use standardised VMP-prefixed controller names (VMP3500, VMP5000, VMP5000.2). This lets the system cross-reference manual meanings, technician comments, and site data through a single controller identifier.
For "most common" questions, the system computes actual error frequency counts from MMS data and prioritises manual entries to match, so answers are data-driven, not guesswork.
Technicians can also browse all data in filterable tables via the TechNotes page, with filters for site, turbine type, controller, manufacturer, error code, and date range.