Rightshold™ Sign up

Answers · AI evidence

How do I investigate a customer's complaint that our AI chatbot made something up?

Last updated

TL;DR: Preserve first, then trace. Pull the conversation and your server's record of each model call behind it (the exact request with system prompt and retrieved documents, the model the provider reports, the settings, the exact output and the provider's request id) before changing anything, because asking the bot again won't reproduce the answer and providers keep their own copies for about 30 days. Compare the customer's copy with your logged output, then find where the claim came from: if it isn't anywhere in what the model was given, the model invented it; if it is, a document or tool result was wrong or out of date; if the system prompt told the bot to say it, it's a prompt problem; if your logged output differs from what the customer saw, something after the model changed it. Each answer leads to a different fix and a different reply to the customer. If you recorded a signed receipt when the reply went out, you can check the disputed text against it in seconds.

What should I check, step by step?

1. Get the customer's copy and the time: screenshot, transcript, email or chat export. Find the conversation in your logs by time and session or account id.

  1. Pull your server-side record of every model call in that conversation: request body, the model value in the response, settings, output, response id and the provider's request id (x-request-id on OpenAI; the request-id header, a req_ value, on Anthropic). OpenAI recommends logging request ids in production and lets you set your own X-Client-Request-Id.
  2. Move fast if you need the provider. OpenAI's data controls page lists abuse-monitoring logs kept up to 30 days by default, and Anthropic says it deletes API inputs and outputs within 30 days by default. Provider support may be able to look a request up by its id while it exists; don't count on it as your record.
  3. Compare the customer's text with your logged output exactly. If they differ, find the step: post-processing, templating, translation, a cache, the chat widget, or an edited copy.
  4. Search the retrieved passages and tool results in that request for the claim. Found: pull that document's version as of that day. Not found: the model generated it. Also read the system prompt for instructions that produced it, such as an instruction to always offer a refund.
  5. Don't use a re-run as proof either way. OpenAI says model outputs are variable by nature and seed is best effort, so a clean answer today doesn't show the bad one didn't happen, and a bad one today doesn't show it's what the customer got.
  6. Save the evidence before fixing: hash the request, output and source documents, and keep the prompt-template commit. Then fix, and keep the before and after configurations so you can show what changed.
  7. Reply to the customer based on what you found. Who bears the cost of a wrong answer is a separate question; the related guide on responsibility for a chatbot's wrong information covers Moffatt v. Air Canada.

Why doesn't re-asking the chatbot the same question show what it told the customer?

Re-running uses today's model, today's documents and today's prompt template. Any of them may have changed since the complaint, and even with nothing changed, the same request can give a different answer.

How do I tell whether a chatbot invented a fact, repeated a bad source, followed its prompt or was changed afterwards?

Invented: the claim isn't in the system prompt, the conversation or any retrieved passage or tool result. This is a hallucination in the strict sense. Fixes are grounding, refusing when retrieval finds nothing, and checks on the output.

What should I log for each chatbot reply so complaints about made-up answers are quick to investigate?

Per call: the exact request (with retrieved context and tool results), the provider's request id, the model value from the response, settings, the exact output and the template commit, plus a SHA-256 of each.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “Fetch the signed AI run receipt recorded when this chatbot reply was sent, then check whether the exact text the customer says they saw matches the recorded output hash.”

One-click setup

{
  "tool": "verify_ai_run",
  "arguments": {
    "id": "air_<20 hex characters from the receipt id>"
  }
}

Rightshold doesn't connect to your chatbot, logs or model provider, and it doesn't decide whether an answer was a hallucination or who should pay for it. It checks text against receipts that were recorded. If a complaint may become a legal claim, keep the evidence as it is and talk to a lawyer before replying. Not legal advice.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'