Improving AI Documentation Assistant Through Data Pipeline Reconstruction and LLM-Based Feedback Analysis

mintlify · Tech · 2025 · source Agentic: no · promotional bias: low · source-backed · extracted with prompt 0.5.6 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: Production monitoring and improvement of an AI documentation assistant

Mintlify's AI documentation assistant was in production with citations and code examples, but it was not performing the way the team wanted. The team needed to understand why users gave thumbs-down feedback, but feedback events were disconnected from full conversation threads and thread storage in PSQL was not queryable enough for analysis.

Constraints:

Architecture

Mintlify rebuilt its assistant feedback pipeline so negative reactions could be analyzed with full conversation context. When a feedback event is received, the server now pushes the full conversation thread to ClickHouse, and a backfill copied all historical messages with feedback from PSQL into ClickHouse. The team manually read about 100 negative conversation threads, created eight feedback categories, then used an LLM to classify a random sample of 1,000 conversations into those buckets with multi-label assignment. The analysis identified search across documentation as the assistant's biggest weakness. Mintlify then surfaced LLM-categorized conversations in the assistant insights dashboard for documentation owners and shipped UX fixes such as previous conversation threads, anchored links, mobile chat behavior, and streaming spacing.

Diagram confidence: explicit (topology described by the source).

flowchart LR
  End_user["End user"] --> Mintlify_assistant["Mintlify assistant"]
  Mintlify_assistant --> Feedback_control["Feedback control"]
  Feedback_control --> Server_feedback_handler["Server feedback handler"]
  Feedback_control --> ClickHouse_feedback_store["ClickHouse feedback store"]
  Mintlify_assistant --> Conversation_thread_store["Conversation thread store"]
  Conversation_thread_store --> Server_feedback_handler
  Conversation_thread_store --> Backfill_script["Backfill script"]
  Server_feedback_handler --> ClickHouse_conversation_analytics["ClickHouse conversation analytics"]
  ClickHouse_feedback_store --> ClickHouse_conversation_analytics
  Backfill_script --> ClickHouse_conversation_analytics
  ClickHouse_conversation_analytics --> Manual_review["Manual review"]
  Manual_review --> Feedback_taxonomy["Feedback taxonomy"]
  Feedback_taxonomy --> LLM_feedback_classifier["LLM feedback classifier"]
  LLM_feedback_classifier --> Assistant_insights_dashboard["Assistant insights dashboard"]
  Assistant_insights_dashboard --> Documentation_owners["Documentation owners"]
  Mintlify_assistant --> Assistant_UI_improvements["Assistant UI improvements"]
  Assistant_UI_improvements --> End_user
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
End user Documentation reader asking the assistant questions and giving feedback. Mintlify assistant, Feedback control
Mintlify assistant AI documentation assistant that answers from docs with citations and code examples. End user, Feedback control, Conversation thread store, Assistant UI improvements
Feedback control Thumbs-down feedback event on assistant messages. End user, Server feedback handler, ClickHouse feedback store
Server feedback handler Server-side code path that now pushes complete conversation threads to ClickHouse when feedback arrives. Feedback control, Conversation thread store, ClickHouse conversation analytics
Conversation thread store Existing PSQL-backed storage for assistant conversation threads. Mintlify assistant, Server feedback handler, Backfill script
ClickHouse feedback store Existing analytics store for feedback events. Feedback control, ClickHouse conversation analytics
Backfill script Retroactively copies messages with feedback from PSQL into ClickHouse. Conversation thread store, ClickHouse conversation analytics
ClickHouse conversation analytics Analytics store where negative-feedback conversations can be queried with full thread context. Server feedback handler, ClickHouse feedback store, Backfill script, Manual review
Manual review Human reading of about 100 negative conversation threads to create the failure taxonomy. ClickHouse conversation analytics, Feedback taxonomy
Feedback taxonomy Eight categories of assistant feedback, including couldNotFindResult and assistantNeededContext. Manual review, LLM feedback classifier
LLM feedback classifier LLM-based multi-label classifier that assigns sampled conversations to the eight feedback buckets. Feedback taxonomy, Assistant insights dashboard
Assistant insights dashboard Dashboard surface showing LLM-categorized conversations to documentation owners. LLM feedback classifier, Documentation owners
Documentation owners Teams reviewing categorized conversations to understand customer confusion and priorities. Assistant insights dashboard
Assistant UI improvements Conversation history, anchored links, mobile slide-up chat, and streaming spacing improvements. Mintlify assistant, End user

Data flow

A user interacts with the AI documentation assistant and can leave thumbs-down feedback on assistant messages. The server receives the feedback event, pushes the full conversation thread into ClickHouse, and historical feedback conversations are backfilled from PSQL. The team queries negative-feedback conversations, manually reads 100 threads to create eight categories, runs an LLM classifier over 1,000 sampled conversations, and writes categorized insights into the dashboard so documentation owners can inspect what customers are confused about.

3 supporting quotes
“Feedback events were being stored in ClickHouse, but there was no way to map them back to their original conversation thread.”article, stated
“To fix this, we updated the server so that when it receives a feedback event, it pushes the full conversation thread to ClickHouse.”article, stated
“We then took a random sample of 1,000 conversations and used an LLM to classify each one into those eight buckets.”article, stated

Why this architecture

The central fix was not a model change; it was rebuilding evaluation data so feedback could be interpreted in context. Manual review produced meaningful categories, while an LLM scaled classification to 1,000 conversations. Surfacing categorized conversations to documentation owners closed the loop from user feedback to product and docs improvement.

"With that in place, we could finally query conversations with negative feedback.

[Exploring the dataset]"

“We read through about 100 negative conversation threads and created eight categories for the different types of feedback.”article, stated
“This gives doc owners a way to sift through conversations and get a clearer view of what customers are confused about and what they care about most.”article, stated

Models used: LLM feedback classifier · Claude Sonnet 4.5 · AI-powered documentation assistant

Scale

Alternatives considered (roads not taken)

Analyze thumbs-down events without full conversation context

Rejected because: Feedback events alone did not map back to original conversations, so the team could not understand what went wrong.

“Feedback events were being stored in ClickHouse, but there was no way to map them back to their original conversation thread.”article, stated

[Exploring the dataset]"

— article, stated

Query conversation threads directly from PSQL

Rejected because: The PSQL setup stored threads in a way that made direct querying impossible.

"Our PSQL setup also stored threads in a way that made direct querying impossible.

To fix this, we updated the server"

“Previously, this was only happening on the client side. We then ran a backfill script to copy all messages with feedback from PSQL into ClickHouse.”article, stated

Manual-only analysis of negative feedback

Rejected because: Manual reading established the taxonomy, but LLM classification was needed to scale the analysis to 1,000 conversations.

“We read through about 100 negative conversation threads and created eight categories for the different types of feedback.”article, stated
“We then took a random sample of 1,000 conversations and used an LLM to classify each one into those eight buckets.”article, stated

Assume a model upgrade would fix assistant quality

Rejected because: Feedback over time suggested the Sonnet 4.5 upgrade had no major impact, pointing to search and system issues instead.

“This suggested that our model upgrade in mid October (to Sonnet 4.5) did not have a major impact and that feedback is fairly consistent across customers.”article, stated
“This highlights search across the docs as one of the assistant’s biggest weaknesses. Anecdotal feedback and our usage patterns point to the same conclusion.”article, stated

Patterns

observability-tracing (operations)

Mintlify rebuilt feedback observability so thumbs-down events are connected to complete conversation threads in ClickHouse.

“To fix this, we updated the server so that when it receives a feedback event, it pushes the full conversation thread to ClickHouse.”article, stated
“Previously, this was only happening on the client side. We then ran a backfill script to copy all messages with feedback from PSQL into ClickHouse.”article, stated

eval-driven-development (quality)

The team used negative feedback conversations, human taxonomy creation, and LLM classification to diagnose assistant weaknesses before shipping improvements.

“We wanted to start by looking into trends on thumbs down events on assistant messages to understand where the experience was breaking down.”article, stated
“We read through about 100 negative conversation threads and created eight categories for the different types of feedback.”article, stated

llm-as-judge (quality)

An LLM classified 1,000 feedback conversations into human-defined failure buckets.

“We then took a random sample of 1,000 conversations and used an LLM to classify each one into those eight buckets.”article, stated
“A thread can fall into more than one bucket. The distinction between couldNotFindResult and assistantNeededContext”article, stated

data-quality-loop (quality)

Categorized conversations are surfaced to documentation owners so user confusion can inform docs and assistant improvements.

“We expanded the assistant insights tab in the dashboard by surfacing conversations that LLMs automatically categorized.”article, stated
“This gives doc owners a way to sift through conversations and get a clearer view of what customers are confused about and what they care about most.”article, stated

rag-retrieval (knowledge-architecture)

The assistant's main weakness was search across documentation, making retrieval quality the diagnosed bottleneck.

“This highlights search across the docs as one of the assistant’s biggest weaknesses. Anecdotal feedback and our usage patterns point to the same conclusion.”article, stated

[Takeaways and improvements]"

— article, stated

batch-offline-processing (operations)

A backfill script migrated historical feedback messages from PSQL to ClickHouse so analysis could cover past conversations.

“Previously, this was only happening on the client side. We then ran a backfill script to copy all messages with feedback from PSQL into ClickHouse.”article, stated

Tradeoffs

Evaluation data architecture

Chose push full conversation threads to ClickHouse over store isolated feedback events only.

Rationale: Understanding failures required seeing complete conversation context alongside feedback.

“Feedback events were being stored in ClickHouse, but there was no way to map them back to their original conversation thread.”article, stated

[Exploring the dataset]"

— article, stated

Hybrid taxonomy workflow

Chose manual category design plus LLM classification over manual-only or LLM-only analysis.

Rationale: Humans created nuanced failure categories from 100 threads, while the LLM scaled classification to 1,000 conversations.

“We read through about 100 negative conversation threads and created eight categories for the different types of feedback.”article, stated
“We then took a random sample of 1,000 conversations and used an LLM to classify each one into those eight buckets.”article, stated

Multi-label classification

Chose allow threads to fall into more than one bucket over force exactly one failure category per conversation.

Rationale: Feedback conversations can contain multiple failure modes, so multi-label classification better preserves diagnostic detail.

“A thread can fall into more than one bucket. The distinction between couldNotFindResult and assistantNeededContext”article, stated

Search-first diagnosis

Chose focus on documentation search quality over attribute poor feedback to model quality or response generation.

Rationale: The analysis showed search was the main weakness while non-search response quality looked strong.

“This highlights search across the docs as one of the assistant’s biggest weaknesses. Anecdotal feedback and our usage patterns point to the same conclusion.”article, stated

[Takeaways and improvements]"

— article, stated

UX improvements alongside LLM diagnostics

Chose conversation history, anchored links, mobile behavior, and streaming spacing fixes over only changing retrieval or model logic.

Rationale: Assistant quality includes the surrounding interaction experience, not just answer text.

“We also shipped a handful of UI improvements and bug fixes that make the assistant feel more consistent and easier to use.”article, stated
“Users can now revisit previous conversation threads, which helps them pick up where they left off or review past answers.”article, stated

Gotchas (what bit them)

Feedback events without conversation context were not actionable.

Root cause: ClickHouse stored feedback events, but they were not mapped to the original conversation thread.

Resolution: Push full conversation threads to ClickHouse when feedback arrives.

“Feedback events were being stored in ClickHouse, but there was no way to map them back to their original conversation thread.”article, stated
“To fix this, we updated the server so that when it receives a feedback event, it pushes the full conversation thread to ClickHouse.”article, stated

Operational storage was not analysis-ready.

Root cause: Conversation threads lived in PSQL in a structure that could not be queried directly for feedback analysis.

Resolution: Backfill feedback messages into ClickHouse and use ClickHouse as the analytics layer.

"Our PSQL setup also stored threads in a way that made direct querying impossible.

To fix this, we updated the server"

“Previously, this was only happening on the client side. We then ran a backfill script to copy all messages with feedback from PSQL into ClickHouse.”article, stated

Search quality, not answer generation, was the primary weakness.

Root cause: The assistant could generate good responses when search found relevant docs, but search failed to retrieve what users needed.

Resolution: Prioritize documentation search quality rather than assuming the generation model was the bottleneck.

“This highlights search across the docs as one of the assistant’s biggest weaknesses. Anecdotal feedback and our usage patterns point to the same conclusion.”article, stated

[Takeaways and improvements]"

— article, stated

Model upgrades did not explain feedback trends.

Root cause: Assistant feedback stayed fairly consistent across customers and over time after the Sonnet 4.5 upgrade.

Resolution: Use feedback taxonomy and search diagnosis instead of treating model upgrades as the default fix.

“Looking at feedback types over time and assistant usage by subdomain did not reveal anything meaningful. This suggested that our model upgrade”article, stated
“This suggested that our model upgrade in mid October (to Sonnet 4.5) did not have a major impact and that feedback is fairly consistent across customers.”article, stated

Some questions were impossible for documentation search to answer.

Root cause: Users sometimes asked for actions or private context that could never be answered from documentation.

Resolution: Separate couldNotFindResult from assistantNeededContext in the taxonomy so retrieval failures are not mixed with impossible requests.

“The distinction between couldNotFindResult and assistantNeededContext is that the first covers questions the assistant should reasonably be able to answer”article, stated
“the second covers questions it could never answer based on the documentation (for example, “Can you send me a 2FA code to log in?”).”article, stated

Evaluation

Mintlify evaluated the assistant by reconstructing feedback data, manually reading 100 negative threads to create an eight-bucket taxonomy, and using an LLM to classify a random sample of 1,000 conversations. They compared feedback over time and by subdomain, found no meaningful pattern from those cuts, and identified search across documentation as the main weakness.

Metrics: 100 negative conversation threads manually reviewed · eight feedback categories · 1,000 conversations LLM-classified · multi-label category assignment · feedback over time · assistant usage by subdomain · search across docs identified as biggest weakness

3 supporting quotes
“We read through about 100 negative conversation threads and created eight categories for the different types of feedback.”article, stated
“We then took a random sample of 1,000 conversations and used an LLM to classify each one into those eight buckets.”article, stated
“Looking at feedback types over time and assistant usage by subdomain did not reveal anything meaningful. This suggested that our model upgrade”article, stated

Outcomes

This case is a strong example of LLMOps plumbing: the important work was not a clever prompt, but making production feedback analyzable and turning it into a dashboard loop for documentation owners. It is less useful as evidence about the assistant's retrieval architecture, which the source does not describe in detail.

"With that in place, we could finally query conversations with negative feedback.

[Exploring the dataset]"

“This highlights search across the docs as one of the assistant’s biggest weaknesses. Anecdotal feedback and our usage patterns point to the same conclusion.”article, stated
“We expanded the assistant insights tab in the dashboard by surfacing conversations that LLMs automatically categorized.”article, stated