Technical Overview

How the Chatbot Works

A step-by-step breakdown of what happens when a technician asks a question about turbine faults

1

Technician Asks a Question

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.

Example 1: "What does alarm 176 mean on a VMP5000?"
Example 2: "I am at Kilronan with a V39 and I have got error code 1"
Example 3: "What was found on site for error 176 at DKIT?"
Example 4: [Filter: Site=DKIT, Turbine=Vestas V52] "What about error 176?"
2

Extract Key Information

The system combines filter selections (if any) with six extractors that scan the question text:

3

Look Up Data in All 3 Sources

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:

Sites
Manual (alarm codes & suggestions)
Technician Comments (MMS history)
4

Did We Find Data?

The system checks if the strict search (all filters combined) returned any results from any of the 3 sources.

Yes — Data Found

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

No — No Match

Broaden the search by progressively dropping filters:

Try 1: site + controller + make (drop turbine type)
Try 2: turbine + controller + make (drop site)
Try 3: site + make (drop controller & turbine)
Try 4: controller only (drop site, turbine, make)
Try 5: error code only (drop all 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.

5

Build the Prompt

The system assembles the full message to send to the LLM, combining:

6

Send to OpenAI (GPT-4.1)

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.

Model: gpt-4.1
Temperature: 0.3 (low = more factual, less creative)
Max tokens: 2048
Streaming: enabled (answer appears word by word)
7

Technician Gets the Answer

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.

Worked Examples

Example 1: Simple alarm code lookup with document links
1

User asks:

"What does alarm 176 mean on a VMP5000?"
2

Extraction:

Site: (none)  |  Turbine: VMP5000  |  Error codes: [176]
3

Lookup: lookup("", "VMP5000", "176") finds a match in Manual. Reference documents resolved from Google Drive. Confidence: HIGH.

4

LLM Answer:

Alarm 176 is a communication error between the ultrasonic wind sensor and the top controller. It is an auto-reset short fault. Check the US windsensor, cable, and CT3218.

Reference documents: 176 - US error, Turbine Stopped.pdf, 925482.pdf

(Source: Manual)

Example 2: Site + maintenance history
1

User asks:

"What was found on site for error 176 at DKIT?"
2

Extraction:

Site: DKIT  |  Turbine: (none)  |  Error codes: [176]
3

Lookup: lookup("DKIT", "", "176") finds results in all 3 sources. Confidence: HIGH.

Sites → DKIT, Vestas V52, Controller VMP5000, 1 turbine
Manual → Alarm 176 meanings for VMP5000 + document links
Technician Comments → DKIT T1, 2012-02-02, Controller VMP5000: "Found loose connection on auxiliary switch"
4

LLM Answer:

At DKIT T1, a loose connection was found on the auxiliary switch in the top cabinet. A new offline filter motor was also fitted and bled while on site. (Source: Technician Comments)

Example 3: Using chat filters
1

User selects filters: Site = DKIT, Turbine = Vestas V52

Then asks:

"What about error 176?"
2

Extraction: Filter overrides take priority.

Site: DKIT (from filter)  |  Turbine: Vestas V52 (from filter)  |  Error codes: [176]
3

Lookup: lookup("DKIT", "Vestas V52", "176") — all three parameters narrow the search. Results are specific to DKIT with V52 turbines. Confidence: HIGH.

4

LLM Answer: The answer is tailored to DKIT and V52 specifically, rather than showing results across all sites and turbine types.


Example 4: Broadened search fallback
1

User asks:

"I am at Kilronan with a V39 and I have got error code 1"
2

Extraction:

Site: Kilronan  |  Turbine: Vestas V39  |  Error codes: [1]
3

Strict lookup: lookup("Kilronan", "Vestas V39", "1")no results

Broadened search: Confidence drops to MEDIUM.

Try 1: lookup("Kilronan", "", "1") → found! Returns Manual data for alarm 1 + Kilronan site data
4

LLM Answer:

Alarm 1 is an "Illegal InitVal data in PROM" error. The turbine enters emergency mode. On-site: reboot the controller, upload new PROM software, and upload parameters with the parameter wizard. Note: this result is from a broadened search and may not be specific to Vestas V39. (Source: Manual)

Example 5: Controller cross-reference with frequency data
1

User asks:

"Which sites have VMP3500 and what are the most common errors there?"
2

Extraction:

Site: (none)  |  Turbine: VMP3500  |  Controller: VMP3500  |  Error codes: (none)
3

Lookup: lookup("", "VMP3500", "", ..., "VMP3500", "") finds data in all 3 sources.

Sites → Tursillagh I (23), Arigna (2), Largan Hill (9), Arigna8 (8) — all VMP3500
MMS → filtered to VMP3500 only + frequency summary: Error 181 (7x), Error 80 (4x), Error 166 (4x)...
Manual → prioritised to show meanings for the top MMS errors (181, 80, 166, etc.) with doc links
4

LLM Answer:

Sites with VMP3500: Tursillagh I (23 turbines), Arigna (2), Largan Hill (9), Arigna8 (8).

Most common errors:
1. Error 181 — Yaw CW feedback (7 occurrences). Technician: "Fitted new yaw contactor."
2. Error 80 — Low gear oil pressure (4 occurrences).
3. Error 166 — Thermoerror hydraulic motor (4 occurrences). Technician: "Found one phase dead on contactor."

(Source: Sites) (Source: Manual) (Source: Technician Comments)

How It All Fits Together

RAG = Retrieval Augmented Generation

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.

Why Not Just Use the LLM Directly?

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.

Document Links via Google Drive

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.

Confidence Signals

When an exact match fails, the system progressively relaxes filters and tells both the LLM and the technician how confident the result is.

Smart Extraction

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.

Unified Controller Names

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.

Frequency-Based Answers

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.

TechNotes: Browse Data Directly

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.