{
  "slug": "retrieval-attribution-logging-in-production",
  "title": "How to Log RAG Retrieval in Production for Debugging Agent Answers",
  "description": "How to log RAG retrieval in production so a wrong agent answer can be debugged: per-retrieval fields, what reached the context window versus what the model cited, privacy by hashes and IDs, and retention and sampling choices.",
  "kind": "sub",
  "order": 5,
  "target_query": "how to log RAG retrieval in production for debugging agent answers",
  "secondary_queries": [
    "rag evaluation",
    "log retrieved chunks llm",
    "rag debugging in production",
    "which documents did the llm use"
  ],
  "tags": [
    "agents",
    "observability",
    "rag",
    "retrieval",
    "logging",
    "debugging",
    "production"
  ],
  "published": "2026-10-01",
  "updated": "2026-10-01",
  "words": 1543,
  "estimated_tokens": 2052,
  "premium": false,
  "rights": {
    "access": "free",
    "note": "Editorial guides are always free and never part of the licensed corpus.",
    "license": "https://changegamer.ai/license.xml",
    "pricing": "https://changegamer.ai/api/pricing.json",
    "payment": "https://changegamer.ai/api/payment.json"
  },
  "license": "https://changegamer.ai/license.xml",
  "citation": "ChangeGamer (2026-10-01). How to Log RAG Retrieval in Production for Debugging Agent Answers. ChangeGamer. https://changegamer.ai/articles/retrieval-attribution-logging-in-production (updated 2026-10-01).",
  "bibtex": "@misc{changegamer_retrieval_attribution_logging_in_production, title = {How to Log RAG Retrieval in Production for Debugging Agent Answers}, publisher = {ChangeGamer}, year = {2026}, url = {https://changegamer.ai/articles/retrieval-attribution-logging-in-production}, note = {Updated 2026-10-01}}",
  "canonical": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production",
  "markdown": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production.md",
  "takeaways": [
    "A production RAG retrieval log should record, per retrieval span, the query as issued and as rewritten, the index and its version, the returned document IDs with scores, and chunk-text hashes.",
    "Logging only what a retrieval step returned is not enough for debugging, because an operator also needs to know which chunks actually reached the model context window and which the answer cited.",
    "The purpose of a retrieval log is to show which runbook branch applies to a bad answer: a retrieval miss, where nothing relevant came back, or ignored context, where relevant text was present but unused.",
    "Retrieval logs should store document IDs and content hashes by default instead of raw chunk text, so the log stays useful for debugging without becoming a second copy of sensitive source data.",
    "No resource in the ChangeGamer corpus names retrieval-attribution logging as a practice, so the field list in this article is reasoned design built on the span model, not a published standard."
  ],
  "outline": [
    {
      "depth": 2,
      "text": "What should one retrieval span record?",
      "anchor": "what-should-one-retrieval-span-record",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#what-should-one-retrieval-span-record"
    },
    {
      "depth": 2,
      "text": "Why log both the issued and the rewritten query?",
      "anchor": "why-log-both-the-issued-and-the-rewritten-query",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#why-log-both-the-issued-and-the-rewritten-query"
    },
    {
      "depth": 2,
      "text": "Why record the index version and embedding model?",
      "anchor": "why-record-the-index-version-and-embedding-model",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#why-record-the-index-version-and-embedding-model"
    },
    {
      "depth": 2,
      "text": "What proves a chunk reached the context window?",
      "anchor": "what-proves-a-chunk-reached-the-context-window",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#what-proves-a-chunk-reached-the-context-window"
    },
    {
      "depth": 2,
      "text": "How do you tell which chunks the model used?",
      "anchor": "how-do-you-tell-which-chunks-the-model-used",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#how-do-you-tell-which-chunks-the-model-used"
    },
    {
      "depth": 2,
      "text": "What must the log show to pick the right runbook branch?",
      "anchor": "what-must-the-log-show-to-pick-the-right-runbook-branch",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#what-must-the-log-show-to-pick-the-right-runbook-branch"
    },
    {
      "depth": 2,
      "text": "What should the log keep out?",
      "anchor": "what-should-the-log-keep-out",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#what-should-the-log-keep-out"
    },
    {
      "depth": 2,
      "text": "How long should you keep retrieval logs, and should you sample?",
      "anchor": "how-long-should-you-keep-retrieval-logs-and-should-you-sample",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#how-long-should-you-keep-retrieval-logs-and-should-you-sample"
    },
    {
      "depth": 2,
      "text": "What does ChangeGamer itself log?",
      "anchor": "what-does-changegamer-itself-log",
      "url": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production#what-does-changegamer-itself-log"
    }
  ],
  "faq": [
    {
      "question": "What should I log for each RAG retrieval call?",
      "answer": "Log the query as issued and as rewritten, the index name and version, the returned document IDs with their scores and ranks, a hash of each chunk text, and which chunks were placed in the prompt. Add the trace ID so the retrieval span links to its parent run."
    },
    {
      "question": "Should I store the full retrieved text in my logs?",
      "answer": "Not by default. Store document IDs and content hashes, and fetch the text from the source system when you need it. Raw chunk text in logs duplicates source data into a store with different access rules, so keep full text only for a deliberately chosen, access-controlled subset."
    },
    {
      "question": "How do I tell a retrieval miss from the model ignoring good context?",
      "answer": "Check whether a chunk containing the answer appears in the logged context for that run. If no such chunk was retrieved or placed in the prompt, it is a retrieval miss. If it was in the prompt and the answer still contradicts it, the model ignored its context."
    },
    {
      "question": "Do I need to log every retrieval, or can I sample?",
      "answer": "Write the retrieval span for every run at the tracing layer, because an unlogged run cannot be investigated later. Sampling belongs downstream, where you choose which logged runs get scored by a judge or reviewed by a person, as the cluster pillar describes."
    },
    {
      "question": "Is retrieval-attribution logging an OpenTelemetry standard?",
      "answer": "No published standard defines it. Per the agent-observability resource's July 2026 check, the OpenTelemetry GenAI conventions, which carry Development status, treat a retrieval step as a span, and the specific fields to keep on that span are a design choice you make for your own pipeline."
    }
  ],
  "body": "A retrieval log earns its place by letting you say, for one bad answer, which part of the pipeline failed. [The pillar](/articles/agent-observability-and-evaluation) defines retrieval-attribution logging in one section; this article designs the log itself, field by field. It stops at the point where diagnosis hands off: causes and fixes belong to the [RAG failure modes runbook](/articles/rag-failure-modes-runbook), and metrics and golden sets belong to [evaluating RAG systems](/articles/evaluating-rag-systems). Span attribute names are covered in [agent observability for reliability](/articles/agent-observability-for-reliability).\n\nOne hedge applies throughout. No resource in the ChangeGamer corpus names retrieval-attribution logging. The [agent-observability resource](/resources/agent-observability) says a trace is one run and a span is one step, including a retrieval, and the fields below are reasoned design on top of that model as of 1 October 2026, not a standard.\n\n## What should one retrieval span record?\n\nOne retrieval span should record the query, the index, the candidates returned, and the fate of each candidate, because those four answers are what a post-incident reader needs. The fields below are a starting set, not a schema anyone has published.\n\n| Field | Why it earns a place |\n|---|---|\n| `trace_id`, parent span ID | Links the retrieval to the run and to the model call that consumed it |\n| Query as issued | What the caller or agent actually asked |\n| Query as rewritten | What was sent to the index after rewriting or decomposition |\n| Index name and index version | Tells you which snapshot answered, and whether it was the one you meant |\n| Embedding model identifier | Query and document vectors must come from the same model |\n| Returned document IDs, rank, score | The candidate list, in order, with the number that ranked it |\n| Chunk-text hash per candidate | Proves which exact text version was returned without storing the text |\n| Reranker output order, if any | Shows whether reranking promoted or buried the relevant chunk |\n| Placed in context (yes/no, position) | Separates \"retrieved\" from \"the model saw it\" |\n| Cited in answer (yes/no) | Separates \"the model saw it\" from \"the model used it\" |\n\nThe [rag-retrieval-for-agents resource](/resources/rag-retrieval-for-agents) is the reason the rewritten-query and reranker rows exist. It describes agentic retrieval where a model rewrites or decomposes the query, and a pipeline that fetches a wide candidate set and reranks it to a small one. Each of those steps changes what the model sees, so each needs a trace of its output.\n\n## Why log both the issued and the rewritten query?\n\nLog both because a rewrite can lose the very term the answer depends on, and only the pair shows it. The rag-retrieval-for-agents resource describes query rewriting and decomposition as a way to address vocabulary mismatch and multi-part questions. A rewrite is also a model call that can drop a qualifier or product name.\n\nIf only the rewritten query is stored, a retrieval that looks reasonable on its own can hide a faulty rewrite. If only the original is stored, you cannot tell whether the index was asked the right thing. With decomposition, record each sub-query as its own span under one parent so the fan-out stays readable.\n\n## Why record the index version and embedding model?\n\nRecord the index version and embedding model because \"the index returned the wrong chunk\" is unanswerable if you cannot say which index, built when, with which embedder. The [embeddings-vector-search resource](/resources/embeddings-vector-search) states that query and document vectors only work together if they come from the same model, so swapping models forces a full re-index.\n\nA version identifier is therefore the difference between \"retrieval regressed\" and \"retrieval ran against an index built before the source changed\". If staleness is your suspect, pair this field with the checks in [RAG index freshness](/articles/rag-index-freshness).\n\n## What proves a chunk reached the context window?\n\nA logged flag set at prompt-assembly time proves it, because retrieval output and prompt content are separate stages that can diverge. The rag-retrieval-for-agents resource lists assemble-context as its own pipeline stage with its own failure modes: a token-budget overflow, lost-in-the-middle placement, and contradictory chunks.\n\nSo the assembly step should write back to the retrieval span, per candidate:\n\n- **Included or dropped**, and a reason code such as budget or deduplication.\n- **Position** in the final prompt, since placement can matter independently of rank.\n- **The hash of the text actually inserted**, which should match the hash from retrieval unless something edited the chunk on the way.\n\nWithout this write-back, a chunk that was retrieved but trimmed for budget looks identical in the log to one the model read and ignored. Those two lead to different branches of the runbook.\n\n## How do you tell which chunks the model used?\n\nRecord citations when your answer format has them, and treat the result as evidence about use rather than proof. If the model is asked to cite chunk IDs, log the IDs it returned and compare them with the placed set. A cited chunk was at least referenced. An uncited chunk may still have shaped the answer.\n\nWhere the format has no citations, do not invent an attribution score and present it as fact. You can still log the placed set, which supports the question that matters most for triage: was the relevant text in front of the model at all?\n\n## What must the log show to pick the right runbook branch?\n\nThe log must show whether a chunk containing the correct answer was retrieved, placed in the context, and cited, and the first stage where that chain breaks tells you the branch. This is the entire diagnostic job of the log; what to do on each branch lives in the runbook.\n\n| What the log shows | Branch |\n|---|---|\n| No candidate contains the answer, whatever the rank | Retrieval miss: the problem is upstream of generation |\n| A relevant candidate was returned but dropped before the prompt | Assembly problem: retrieved, never seen |\n| A relevant chunk was in the prompt and the answer contradicts or ignores it | Ignored context: the problem is in generation |\n| The relevant chunk was in the prompt and cited, and the answer is still wrong | The source text or its freshness, not the pipeline |\n\nTo use the table you need a way to decide that a chunk \"contains the answer\". For one incident, a person reading the stored text or the source document by ID is enough. At scale that judgment is evaluation work, covered in [evaluating RAG systems](/articles/evaluating-rag-systems), and the [evaluating-ai-agents resource](/resources/evaluating-ai-agents) is explicit that step-level scoring pinpoints failures such as bad tool selection versus bad arguments. Retrieval deserves the same step-level view.\n\n## What should the log keep out?\n\nBy default the log should keep out raw chunk text and raw user queries, storing IDs and hashes instead. The agent-observability resource says to redact PII before logging tool-call inputs and notes that prompt and completion bodies are off by default in OpenTelemetry for PII safety. Retrieved chunks are the same kind of payload.\n\nIDs and hashes give you most of the debugging value. The ID lets you fetch the current source text, and the hash tells you whether that text still matches what the model saw. A mismatch is itself a finding: the source changed after the run. Where you must keep text for a subset of runs, treat that store as sensitive, with its own access control. The handling rules are in [data privacy and PII for AI agents](/articles/data-privacy-and-pii-for-ai-agents).\n\n## How long should you keep retrieval logs, and should you sample?\n\nKeep every retrieval span at the tracing layer and decide retention by what your incident process needs, since no corpus resource sets a retention window or a sampling rate. The pillar's split applies: trace everything, then sample at the screening stage, because an unlogged run cannot be investigated, scored or reviewed later.\n\nTwo practical rules follow from reasoning, not from a published source:\n\n- **Keep cheap fields longer than expensive ones.** IDs, scores, versions and hashes are small. Raw text, if kept at all, should expire first.\n- **Preserve a run on demand.** When an incident opens, freeze the relevant traces so ordinary expiry cannot delete them, then let the frozen runs feed the loop in [turning an incident into an evaluation test case](/articles/incident-to-eval-fixture-loop).\n\n## What does ChangeGamer itself log?\n\nChangeGamer logs page fetches, not retrieval attribution, and it has no retrieval step to attribute. As of 1 October 2026, the corpus export in `changegamer/src/pages/api/corpus.jsonl.ts` (lines 16-64) maps the static `resources` array to NDJSON on each request, with no query, index or ranking. The only access log is `logAccess` in `changegamer/worker/index.ts` (lines 185-196), which writes four strings to Analytics Engine: category, slug, outcome and a user agent truncated to 100 characters.\n\n`scripts/crawler-stats.mjs` aggregates that log into per-crawler counts and a top-slug table, and its own output header states that a crawl \"does not mean the page was used in an answer\" (lines 143-146 of the script's report template). That is the same gap this article is about, seen from the publisher's side: a fetch record shows what was read, not what a model did with it. The field design above is therefore not ChangeGamer's own practice.",
  "cluster": {
    "id": "agent-observability-evaluation",
    "title": "Agent observability and evaluation",
    "description": "How to observe and evaluate an AI agent already live in production — tracing spans for tool calls and retrieval steps, judge-based screening versus human acceptance of live output, online metrics, cost telemetry, and incident postmortems that feed evaluation fixtures — not the pre-ship, CI-gating evaluation methodology already owned by evaluating-ai-agents-in-ci, and not the trace/span field mechanics already owned by agent-observability-for-reliability, both in the completed agent-reliability cluster.",
    "status": "complete",
    "pillar": {
      "slug": "agent-observability-and-evaluation",
      "title": "AI Agent Observability and the Production Evaluation Playbook",
      "description": "AI agent observability and evaluation once an agent is already live: tracing spans, retrieval-attribution logs, judge-based screening vs. human acceptance, online metrics, cost telemetry, and incident postmortems that feed evaluation fixtures.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/agent-observability-and-evaluation",
      "markdown": "https://changegamer.ai/articles/agent-observability-and-evaluation.md",
      "json": "https://changegamer.ai/api/articles/agent-observability-and-evaluation.json"
    },
    "articles": [
      {
        "slug": "multi-agent-trace-propagation",
        "title": "Distributed Tracing for Multi-Agent AI Systems",
        "description": "How trace ID propagation actually works across a multi-agent handoff, why handoff and delegation need different trace shapes, and why an orchestrator-level trace can hide a failed leg of a fan-out.",
        "kind": "sub",
        "order": 1,
        "html": "https://changegamer.ai/articles/multi-agent-trace-propagation",
        "markdown": "https://changegamer.ai/articles/multi-agent-trace-propagation.md",
        "json": "https://changegamer.ai/api/articles/multi-agent-trace-propagation.json"
      },
      {
        "slug": "llm-as-judge-screening-in-production",
        "title": "Designing an LLM-as-Judge Pipeline for Production AI Agents",
        "description": "An operator playbook for screening live AI agent output with an LLM judge: a confidence/stakes routing architecture to a human queue, continuous live-traffic rubric design, and per-bias mitigations for position, verbosity, and self-preference.",
        "kind": "sub",
        "order": 2,
        "html": "https://changegamer.ai/articles/llm-as-judge-screening-in-production",
        "markdown": "https://changegamer.ai/articles/llm-as-judge-screening-in-production.md",
        "json": "https://changegamer.ai/api/articles/llm-as-judge-screening-in-production.json"
      },
      {
        "slug": "agent-cost-telemetry-in-production",
        "title": "How to Track AI Agent Costs in Production",
        "description": "How to track AI agent costs in production: version your price table, separate cached from uncached tokens, keep failed runs in the books, attribute shared costs, reconcile against the invoice, and alert on rate of spend.",
        "kind": "sub",
        "order": 3,
        "html": "https://changegamer.ai/articles/agent-cost-telemetry-in-production",
        "markdown": "https://changegamer.ai/articles/agent-cost-telemetry-in-production.md",
        "json": "https://changegamer.ai/api/articles/agent-cost-telemetry-in-production.json"
      },
      {
        "slug": "incident-to-eval-fixture-loop",
        "title": "How to Turn an AI Agent Incident into an Evaluation Test Case",
        "description": "How to turn an AI agent incident into an evaluation test case: freeze the trace, redact it, minimize it to the failing decision, label the expected outcome with a trusted oracle, prove it fails then passes, and retire it later.",
        "kind": "sub",
        "order": 4,
        "html": "https://changegamer.ai/articles/incident-to-eval-fixture-loop",
        "markdown": "https://changegamer.ai/articles/incident-to-eval-fixture-loop.md",
        "json": "https://changegamer.ai/api/articles/incident-to-eval-fixture-loop.json"
      },
      {
        "slug": "retrieval-attribution-logging-in-production",
        "title": "How to Log RAG Retrieval in Production for Debugging Agent Answers",
        "description": "How to log RAG retrieval in production so a wrong agent answer can be debugged: per-retrieval fields, what reached the context window versus what the model cited, privacy by hashes and IDs, and retention and sampling choices.",
        "kind": "sub",
        "order": 5,
        "html": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production",
        "markdown": "https://changegamer.ai/articles/retrieval-attribution-logging-in-production.md",
        "json": "https://changegamer.ai/api/articles/retrieval-attribution-logging-in-production.json"
      },
      {
        "slug": "online-feedback-signals-for-ai-agents",
        "title": "How to Measure AI Agent Quality from Live User Feedback",
        "description": "How to measure AI agent quality from live user feedback: why explicit ratings are sparse and biased, how re-asks, abandonment and escalations mislead, and how to join each signal to a trace and route it to review.",
        "kind": "sub",
        "order": 6,
        "html": "https://changegamer.ai/articles/online-feedback-signals-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/online-feedback-signals-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/online-feedback-signals-for-ai-agents.json"
      },
      {
        "slug": "online-agent-metrics-and-drift-monitoring",
        "title": "How to Detect Quality Drift in a Production AI Agent",
        "description": "How to detect quality drift in a production AI agent: baseline aggregate signals, alert on a diff against the baseline, and separate a prompt, model or tool-version change from a shift in traffic mix.",
        "kind": "sub",
        "order": 7,
        "html": "https://changegamer.ai/articles/online-agent-metrics-and-drift-monitoring",
        "markdown": "https://changegamer.ai/articles/online-agent-metrics-and-drift-monitoring.md",
        "json": "https://changegamer.ai/api/articles/online-agent-metrics-and-drift-monitoring.json"
      },
      {
        "slug": "sampling-and-retention-of-agent-traces",
        "title": "How to Sample and Retain Production AI Agent Traces",
        "description": "How to sample and retain production AI agent traces: head vs tail sampling, keep-all-errors plus a random baseline, whole-trace decisions for multi-agent runs, retention tiers and redaction before the clock starts.",
        "kind": "sub",
        "order": 8,
        "html": "https://changegamer.ai/articles/sampling-and-retention-of-agent-traces",
        "markdown": "https://changegamer.ai/articles/sampling-and-retention-of-agent-traces.md",
        "json": "https://changegamer.ai/api/articles/sampling-and-retention-of-agent-traces.json"
      },
      {
        "slug": "crash-safe-run-start-records-for-agent-traces",
        "title": "How to Keep Trace Data When an AI Agent Crashes Mid-Run",
        "description": "How to keep trace data when an AI agent crashes mid-run: write a small run-start record outside the trace buffer, detect orphans, count them as unknown outcomes, and force-decide on shutdown.",
        "kind": "sub",
        "order": 9,
        "html": "https://changegamer.ai/articles/crash-safe-run-start-records-for-agent-traces",
        "markdown": "https://changegamer.ai/articles/crash-safe-run-start-records-for-agent-traces.md",
        "json": "https://changegamer.ai/api/articles/crash-safe-run-start-records-for-agent-traces.json"
      },
      {
        "slug": "choosing-an-llm-observability-backend",
        "title": "How to Choose an LLM Observability Platform for AI Agents",
        "description": "How to choose an LLM observability platform: decide on OTel-native ingestion, self-host versus cloud, export portability, redaction hooks and retention support before comparing vendors.",
        "kind": "sub",
        "order": 10,
        "html": "https://changegamer.ai/articles/choosing-an-llm-observability-backend",
        "markdown": "https://changegamer.ai/articles/choosing-an-llm-observability-backend.md",
        "json": "https://changegamer.ai/api/articles/choosing-an-llm-observability-backend.json"
      },
      {
        "slug": "redacting-sensitive-data-from-agent-traces",
        "title": "How to Redact PII From AI Agent Traces: Placement, Testing and Cleanup",
        "description": "How to redact PII from AI agent traces in practice: where the redactor sits in the pipeline, what to do per span field, how to test it with seeded fake PII, and how to clean up after a leak.",
        "kind": "sub",
        "order": 11,
        "html": "https://changegamer.ai/articles/redacting-sensitive-data-from-agent-traces",
        "markdown": "https://changegamer.ai/articles/redacting-sensitive-data-from-agent-traces.md",
        "json": "https://changegamer.ai/api/articles/redacting-sensitive-data-from-agent-traces.json"
      }
    ]
  },
  "navigation": {
    "pillar": {
      "slug": "agent-observability-and-evaluation",
      "title": "AI Agent Observability and the Production Evaluation Playbook",
      "description": "AI agent observability and evaluation once an agent is already live: tracing spans, retrieval-attribution logs, judge-based screening vs. human acceptance, online metrics, cost telemetry, and incident postmortems that feed evaluation fixtures.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/agent-observability-and-evaluation",
      "markdown": "https://changegamer.ai/articles/agent-observability-and-evaluation.md",
      "json": "https://changegamer.ai/api/articles/agent-observability-and-evaluation.json"
    },
    "previous": {
      "slug": "incident-to-eval-fixture-loop",
      "title": "How to Turn an AI Agent Incident into an Evaluation Test Case",
      "description": "How to turn an AI agent incident into an evaluation test case: freeze the trace, redact it, minimize it to the failing decision, label the expected outcome with a trusted oracle, prove it fails then passes, and retire it later.",
      "kind": "sub",
      "order": 4,
      "html": "https://changegamer.ai/articles/incident-to-eval-fixture-loop",
      "markdown": "https://changegamer.ai/articles/incident-to-eval-fixture-loop.md",
      "json": "https://changegamer.ai/api/articles/incident-to-eval-fixture-loop.json"
    },
    "next": {
      "slug": "online-feedback-signals-for-ai-agents",
      "title": "How to Measure AI Agent Quality from Live User Feedback",
      "description": "How to measure AI agent quality from live user feedback: why explicit ratings are sparse and biased, how re-asks, abandonment and escalations mislead, and how to join each signal to a trace and route it to review.",
      "kind": "sub",
      "order": 6,
      "html": "https://changegamer.ai/articles/online-feedback-signals-for-ai-agents",
      "markdown": "https://changegamer.ai/articles/online-feedback-signals-for-ai-agents.md",
      "json": "https://changegamer.ai/api/articles/online-feedback-signals-for-ai-agents.json"
    }
  },
  "resources": [
    {
      "slug": "agent-observability",
      "html": "https://changegamer.ai/resources/agent-observability",
      "markdown": "https://changegamer.ai/resources/agent-observability.md",
      "json": "https://changegamer.ai/api/resources/agent-observability.json"
    },
    {
      "slug": "rag-retrieval-for-agents",
      "html": "https://changegamer.ai/resources/rag-retrieval-for-agents",
      "markdown": "https://changegamer.ai/resources/rag-retrieval-for-agents.md",
      "json": "https://changegamer.ai/api/resources/rag-retrieval-for-agents.json"
    },
    {
      "slug": "evaluating-ai-agents",
      "html": "https://changegamer.ai/resources/evaluating-ai-agents",
      "markdown": "https://changegamer.ai/resources/evaluating-ai-agents.md",
      "json": "https://changegamer.ai/api/resources/evaluating-ai-agents.json"
    },
    {
      "slug": "embeddings-vector-search",
      "html": "https://changegamer.ai/resources/embeddings-vector-search",
      "markdown": "https://changegamer.ai/resources/embeddings-vector-search.md",
      "json": "https://changegamer.ai/api/resources/embeddings-vector-search.json"
    }
  ]
}