<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Harshad S R</title>
    <description>The latest articles on DEV Community by Harshad S R (@harshad_sr_).</description>
    <link>https://dev.to/harshad_sr_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4149794%2F4f9b7c96-b98b-4012-88f1-6d5e3d5caf58.png</url>
      <title>DEV Community: Harshad S R</title>
      <link>https://dev.to/harshad_sr_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshad_sr_"/>
    <language>en</language>
    <item>
      <title>The Missing Feedback Loop Behind Our Support Agent</title>
      <dc:creator>Harshad S R</dc:creator>
      <pubDate>Tue, 29 Sep 2026 13:55:49 +0000</pubDate>
      <link>https://dev.to/harshad_sr_/the-missing-feedback-loop-behind-our-support-agent-5dh5</link>
      <guid>https://dev.to/harshad_sr_/the-missing-feedback-loop-behind-our-support-agent-5dh5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp800vlqpxsu6x9efu567.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp800vlqpxsu6x9efu567.png" alt=" " width="512" height="414"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F55t7fz4n2gtczcahjn7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F55t7fz4n2gtczcahjn7w.png" alt=" " width="512" height="507"&gt;&lt;/a&gt;&lt;br&gt;
The Missing Feedback Loop Behind Our Support Agent&lt;/p&gt;

&lt;p&gt;An AI support agent can produce a convincing answer and still fail at one important job: learning from what actually happened.&lt;/p&gt;

&lt;p&gt;That was the problem behind ResolveIQ. A support agent could analyze a customer issue and generate a recommendation, but a recommendation alone does not create useful experience. If an action succeeds, the system should be able to use that experience later. If it fails, that outcome should matter too.&lt;/p&gt;

&lt;p&gt;We built ResolveIQ around that feedback loop: recall relevant support experiences, use them to ground a new recommendation, record the real outcome, and retain that experience for future cases.&lt;/p&gt;

&lt;p&gt;The memory layer is powered by Hindsight by Vectorize.&lt;/p&gt;

&lt;p&gt;The Problem: An Agent That Could Answer but Couldn't Learn&lt;/p&gt;

&lt;p&gt;The first distinction we made was between context and experience.&lt;/p&gt;

&lt;p&gt;A language model can reason over information in its current prompt. It can also produce a plausible support response without knowing whether a similar recommendation worked before.&lt;/p&gt;

&lt;p&gt;Imagine a customer reports a 504 Gateway Timeout during a large analytics export. A model can suggest increasing a timeout, reducing the export size, checking infrastructure, or retrying the request. Those suggestions may be reasonable, but the model does not automatically know which approach worked for a previous customer with the same problem.&lt;/p&gt;

&lt;p&gt;For support, that historical evidence matters.&lt;/p&gt;

&lt;p&gt;ResolveIQ therefore treats previous support cases as usable experience rather than simply keeping them as an archive.&lt;/p&gt;

&lt;p&gt;How ResolveIQ Works&lt;/p&gt;

&lt;p&gt;ResolveIQ uses a React/Vite frontend and a Python/FastAPI backend.&lt;/p&gt;

&lt;p&gt;The core workflow is:&lt;/p&gt;

&lt;p&gt;Customer Issue&lt;br&gt;
      ↓&lt;br&gt;
Hindsight Recall&lt;br&gt;
      ↓&lt;br&gt;
Historical Support Context&lt;br&gt;
      ↓&lt;br&gt;
Groq Recommendation&lt;br&gt;
      ↓&lt;br&gt;
Action Taken&lt;br&gt;
      ↓&lt;br&gt;
Verified Outcome&lt;br&gt;
      ↓&lt;br&gt;
Hindsight Retain&lt;br&gt;
      ↓&lt;br&gt;
Future Recall&lt;/p&gt;

&lt;p&gt;The frontend sends a customer issue to the backend resolution workflow. The backend recalls relevant experiences from Hindsight and provides that context to the recommendation agent.&lt;/p&gt;

&lt;p&gt;After the support worker applies the recommendation, the outcome is recorded through the outcome workflow.&lt;/p&gt;

&lt;p&gt;That second step is what closes the loop.&lt;/p&gt;

&lt;p&gt;[Insert Screenshot 1: ResolveIQ main interface]&lt;/p&gt;

&lt;p&gt;Adding Hindsight as the Memory Layer&lt;/p&gt;

&lt;p&gt;We used the Hindsight Python client directly in the backend. The recall operation is intentionally small:&lt;/p&gt;

&lt;p&gt;with Hindsight(base_url=base_url, api_key=api_key) as client:&lt;br&gt;
    response = client.recall(&lt;br&gt;
        bank_id=target_bank,&lt;br&gt;
        query=query&lt;br&gt;
    )&lt;/p&gt;

&lt;p&gt;The returned memories are normalized into a predictable structure before being passed into the rest of the application.&lt;/p&gt;

&lt;p&gt;This separation keeps memory operations inside the memory layer while allowing the resolution workflow to decide how retrieved experience should influence a new support case.&lt;/p&gt;

&lt;p&gt;The memory bank is configurable through HINDSIGHT_BANK_ID, with resolveiq-support as the default.&lt;/p&gt;

&lt;p&gt;For more background, see Hindsight documentation and Vectorize's agent memory guide.&lt;/p&gt;

&lt;p&gt;Recall Before Reasoning&lt;/p&gt;

&lt;p&gt;The most important part of the workflow happens before the LLM generates a recommendation.&lt;/p&gt;

&lt;p&gt;ResolveIQ first retrieves relevant experiences:&lt;/p&gt;

&lt;p&gt;recalled_memories = recall_similar_cases(&lt;br&gt;
    query=customer_issue,&lt;br&gt;
    bank_id=bank_id&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;context_text = _format_memories_for_prompt(&lt;br&gt;
    recalled_memories&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;Those memories are then included in the model's prompt alongside the current customer issue.&lt;/p&gt;

&lt;p&gt;The recommendation workflow is instructed to use the supplied historical experiences as historical evidence and not invent previous support cases.&lt;/p&gt;

&lt;p&gt;That changes the role of the model. Instead of asking the model to guess a solution from general knowledge, we ask it to reason over retrieved experience and communicate limitations when the evidence is insufficient.&lt;/p&gt;

&lt;p&gt;Illustrative UI visualization of Hindsight recall; replace with a real runtime screenshot before publication.&lt;/p&gt;

&lt;p&gt;A Real Example: The 504 Gateway Timeout&lt;/p&gt;

&lt;p&gt;We used a 504 Gateway Timeout during a large analytics export as a representative support case.&lt;/p&gt;

&lt;p&gt;ResolveIQ recalled five memories for the case. One recalled experience described an intermittent 504 problem during large analytics exports. The stored experience included a concrete resolution involving streaming CSV responses, increasing the reverse-proxy timeout, and verifying successful exports of 100,000 rows in 34 seconds.&lt;/p&gt;

&lt;p&gt;That is more useful than simply retrieving a previous question containing the words “504 Gateway Timeout.”&lt;/p&gt;

&lt;p&gt;The historical experience contains an action and a verification result.&lt;/p&gt;

&lt;p&gt;The recommendation agent can use that context while still distinguishing historical evidence from its current recommendation.&lt;/p&gt;

&lt;p&gt;[Insert Screenshot 3: Recommendation based on recalled experience]&lt;/p&gt;

&lt;p&gt;Turning Outcomes Into Memory&lt;/p&gt;

&lt;p&gt;Recall alone would not create a learning loop.&lt;/p&gt;

&lt;p&gt;After a support worker takes an action, ResolveIQ records the action, outcome, and verification result. The backend turns those fields into a structured support experience:&lt;/p&gt;

&lt;p&gt;memory_content = (&lt;br&gt;
    f"Customer Support Case Experience:\n"&lt;br&gt;
    f"Customer Issue: {customer_issue.strip()}\n"&lt;br&gt;
    f"Action Taken: {action_taken.strip()}\n"&lt;br&gt;
    f"Outcome: {outcome.strip()}\n"&lt;br&gt;
    f"Verification Result: {result.strip()}"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;It then retains that experience in Hindsight:&lt;/p&gt;

&lt;p&gt;response = client.retain(&lt;br&gt;
    bank_id=target_bank,&lt;br&gt;
    content=memory_content,&lt;br&gt;
    context="Customer Support Resolution Outcome",&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;We deliberately did not want to store only “Resolved.”&lt;/p&gt;

&lt;p&gt;A future agent needs to know what happened, what was done, and why the result was considered successful. That makes the stored experience useful when another similar issue arrives.&lt;/p&gt;

&lt;p&gt;Illustrative UI visualization of recording an outcome and retaining it; replace with a real runtime screenshot before publication.&lt;/p&gt;

&lt;p&gt;What Changed With the Feedback Loop&lt;/p&gt;

&lt;p&gt;Without the feedback loop, the architecture is roughly:&lt;/p&gt;

&lt;p&gt;Issue → LLM → Recommendation&lt;/p&gt;

&lt;p&gt;The recommendation ends with the interaction.&lt;/p&gt;

&lt;p&gt;With ResolveIQ, the workflow becomes:&lt;/p&gt;

&lt;p&gt;Issue&lt;br&gt;
  ↓&lt;br&gt;
Recall previous experience&lt;br&gt;
  ↓&lt;br&gt;
Recommendation&lt;br&gt;
  ↓&lt;br&gt;
Real-world action&lt;br&gt;
  ↓&lt;br&gt;
Verified outcome&lt;br&gt;
  ↓&lt;br&gt;
Retain experience&lt;br&gt;
  ↓&lt;br&gt;
Recall it later&lt;/p&gt;

&lt;p&gt;The second design gives future requests access to evidence created by previous requests.&lt;/p&gt;

&lt;p&gt;That is the part we found most interesting about Hindsight. The value is not simply that the system can remember text. The application can connect a recommendation to the result that followed it and make that experience available to later decisions.&lt;/p&gt;

&lt;p&gt;Keeping the LLM Grounded&lt;/p&gt;

&lt;p&gt;ResolveIQ uses Groq for recommendation generation, with the model configurable through GROQ_MODEL.&lt;/p&gt;

&lt;p&gt;The recommendation prompt is organized around:&lt;/p&gt;

&lt;p&gt;Understanding of the Issue&lt;/p&gt;

&lt;p&gt;Relevant Previous Experience&lt;/p&gt;

&lt;p&gt;Recommended Action&lt;/p&gt;

&lt;p&gt;Why the Action is Recommended&lt;/p&gt;

&lt;p&gt;Confidence &amp;amp; Limitations&lt;/p&gt;

&lt;p&gt;Verification Note&lt;/p&gt;

&lt;p&gt;Hindsight and the LLM therefore have different responsibilities.&lt;/p&gt;

&lt;p&gt;Hindsight retrieves experience.&lt;/p&gt;

&lt;p&gt;The LLM reasons over that experience.&lt;/p&gt;

&lt;p&gt;The application then asks the support worker to verify the actual result.&lt;/p&gt;

&lt;p&gt;That separation makes the learning loop easier to understand and test.&lt;/p&gt;

&lt;p&gt;What We Learned&lt;/p&gt;

&lt;p&gt;Memory is useful only when it changes a future decision&lt;/p&gt;

&lt;p&gt;Storing previous interactions is not enough. The useful test is whether a later case can retrieve something relevant and use it to produce a better-grounded recommendation.&lt;/p&gt;

&lt;p&gt;Outcomes are more valuable than unanswered conversations&lt;/p&gt;

&lt;p&gt;A support conversation can tell us what someone tried. A verified outcome tells us what happened after they tried it. That distinction influenced our retention format.&lt;/p&gt;

&lt;p&gt;Verification belongs in the memory&lt;/p&gt;

&lt;p&gt;We store the verification result with the action and outcome. For technical support, “we changed the timeout” is weaker evidence than “we changed the timeout and verified successful exports.”&lt;/p&gt;

&lt;p&gt;Retrieval should precede reasoning&lt;/p&gt;

&lt;p&gt;We chose an explicit recall → context → reasoning workflow rather than asking the LLM to independently guess what might be relevant. This makes the source of historical context visible in the application.&lt;/p&gt;

&lt;p&gt;Memory does not remove human verification&lt;/p&gt;

&lt;p&gt;ResolveIQ does not treat recalled experience as unquestionable truth. A previous successful resolution can still be wrong for a new environment. That is why the workflow records the actual outcome separately.&lt;/p&gt;

&lt;p&gt;Limitations and Next Steps&lt;/p&gt;

&lt;p&gt;The current implementation is deliberately focused.&lt;/p&gt;

&lt;p&gt;It does not automatically evaluate recommendation quality or decide whether a recorded outcome is trustworthy. The support worker supplies the action, outcome, and verification result.&lt;/p&gt;

&lt;p&gt;The next improvements we would consider are automated evaluation of recommendation relevance and outcome quality, operator tools for correcting or annotating memories, stronger end-to-end testing, and production monitoring.&lt;/p&gt;

&lt;p&gt;Those additions would help answer a harder question: not only whether an agent remembers, but whether its accumulated experience is actually improving its decisions.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;The biggest change in ResolveIQ was not adding another prompt to the support agent.&lt;/p&gt;

&lt;p&gt;It was adding a place for experience to go after the prompt was finished.&lt;/p&gt;

&lt;p&gt;Hindsight gives the system the memory operations we needed: recall relevant experience before reasoning and retain verified outcomes after a support case.&lt;/p&gt;

&lt;p&gt;That turns the architecture from:&lt;/p&gt;

&lt;p&gt;Question → Answer&lt;/p&gt;

&lt;p&gt;into:&lt;/p&gt;

&lt;p&gt;Question → Experience → Recommendation → Outcome → New Experience&lt;/p&gt;

&lt;p&gt;For us, that missing feedback loop was the difference between an agent that could answer support questions and an agent designed to learn from what happened next.&lt;/p&gt;

&lt;p&gt;Hindsight on GitHub · Hindsight Docs · Vectorize Agent Memory&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>python</category>
      <category>react</category>
    </item>
  </channel>
</rss>
