Case study · WorkZeal

Zeela

a RAG support assistant built on our own docs

One set of Markdown files runs the public help center and Zeela's search index in OpenAI. She finds the right section first, then answers from it with a link, in the customer's language.

  • 422citable sections from 139 help pages
  • 1source for the site and the assistant
  • 2commands to update after a docs change
  • 0model training on our data
WorkZeal · support assistant · RAG

How Zeela answers from our docs

Zeela is a RAG assistant (retrieval-augmented generation): before answering, she retrieves the matching sections of our help center and writes the answer only from them. One set of Markdown files feeds both the public help center and her search index in OpenAI.

BUILD TIME RUNTIME Docs in Markdown us/docs · 139 pages Diplodoc build npm run build:us Search corpus 422 section files Upload script ai-index-upload.js OpenAI Vector Store workzeal-help-us Help center site help.workzeal.com build split by ## sha diff changed only publishes Customer asks any language Chat in WorkZeal Zeela conversation App backend AiAction.cs Zeela saved prompt · OpenAI Responses API model: gpt-5-mini · web search: off tool: file_search → workzeal-help-us, top 8 instruction: search first, answer + link R · search A · top sections back G · answer + link to the exact help section
The top lane runs once per docs change and keeps the vector store in sync. The bottom lane runs on every question. The two meet in only one place: the saved prompt's file_search tool reads the store the build lane fills.

Why this is RAG

R
Retrievalfile_search finds the closest help sections in the vector store
A
Augmentedthose sections, with their links, go into the model's context
G
Generationgpt-5-mini writes the answer from them only, no guessing

No model training on our data: when the docs change, we re-upload the changed sections and the answers change the same minute.

How I built it

1Docs as code

The help center is Markdown in git, built with Diplodoc into a static site. The same files are the only source for Zeela, so the site and the assistant never disagree.

2A corpus the AI can cite

ai-index.js splits every page into one file per section. Each file starts with its menu path and a line "Link to this section: …#anchor", so any fragment the search returns knows where it came from.

3Storage in OpenAI

ai-index-upload.js pushes the corpus to an OpenAI Vector Store and updates it in place: files are compared by content hash, so a one-page edit uploads two files, not 422. The same script serves the Russian site on Yandex AI Studio.

4Chat settings

  • Saved prompt in OpenAI, called by the app by id
  • File search on the store, top 8 results
  • Search in English, answer in the user's language
  • Help-center words: "price" → "subscription payment"
  • Off-topic: decline in one line

What testing changed

Spanish questionfound nothing until the rule "always search in English"
"Deal status"answered with API JSON until the doc got a "move a deal to another stage" section
Pricingsmaller models invented "no per-user fee"; gpt-5-mini says it isn't in the docs
Cat poemkept getting written until the off-topic rule moved to the first line

Updating after a docs change

# 1. rebuild the site and the corpus
npm run build:us

# 2. sync the vector store (only changed sections go up)
OPENAI_API_KEY=… npm run ai-index:upload -w us