<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ByMoin — Agentic AI Developer Blog</title><description>Technical writing on agentic AI architecture, production ML systems, and the engineering decisions that separate pilots from deployed systems. By Moin Dalal.</description><link>https://bymoin.com</link><atom:link href="https://bymoin.com/rss.xml" rel="self" type="application/rss+xml"/><language>en-us</language><managingEditor>hello@bymoin.com (Moin Dalal)</managingEditor><webMaster>hello@bymoin.com (Moin Dalal)</webMaster><item><title>Connect AI Agents to Company Tools with MCP</title><link>https://bymoin.com/blog/connecting-ai-agents-to-company-tools-with-mcp</link><guid isPermaLink="true">https://bymoin.com/blog/connecting-ai-agents-to-company-tools-with-mcp</guid><description>Why every AI tool integration becomes a custom job, and how an MCP gateway adds authentication, rate limiting and caching in one place.</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><category>MCP</category><category>AI integration</category><category>enterprise AI</category><category>API gateway</category><author>hello@bymoin.com (Moin Dalal)</author><content:encoded><![CDATA[<p>To connect AI agents to company tools, use the Model Context Protocol (MCP) as the one shared way for models to call tools, and put a single gateway in front of those tools. The gateway checks who is calling, adds login keys at the last moment, and limits how often each session can call. Adding the next tool then takes a short settings file, not new code.</p>
<p>Every time you connect an AI tool to a company system, it is a custom job. Connect an AI model that reads and writes text (language model) to Salesforce, and you write custom code. Connect it to Jira, and you write different custom code. Connect it to an in-house database, and you write a third kind. Now multiply that by every model, every tool and every team. The work grows much faster than the number of parts. Each new model or tool does not add one job. It adds a job for every model or tool already there.</p>
<p>MCP, a shared standard, fixes the first half of that problem. It sets one way for AI models to talk to outside tools. But a standard for how systems talk (protocol) is only a set of rules. Someone still has to build the front door, check who is calling, limit how often they call, and make the whole thing safe for a large company. This post explains how, using <a href="https://bymoin.com/work/nexus">Nexus</a>, a gateway for MCP I am designing (not built yet, October 2026).</p>
<h2>What does a gateway change?</h2>
<p>Without a gateway, every agent talks to every tool directly. Passwords and keys are spread across many codebases. Each connection handles errors in its own way. And nobody has one place to see or limit what the agents are doing.</p>
<p>A gateway sits between any AI model and any company tool. One gateway, one standard, and no custom code per tool. Agents speak MCP to the gateway. The gateway deals with the messy details of each system behind it (backend). The key gain is that security and control now live in one place.</p>
<figure><img src="https://bymoin.com/blog/connecting-ai-agents-to-company-tools-with-mcp/mcp-gateway.svg" alt="Diagram: sales, support and report agents connect to one MCP gateway, which handles logins, rate limits, caching and the tool list before reaching the CRM, database, tickets and files."><figcaption>One door to every tool: the gateway holds the keys, limits and tool list.</figcaption></figure>
<h2>The building blocks</h2>
<h3>The core gateway</h3>
<p>Nexus, my planned gateway (not built yet, October 2026, so this post describes the design, not results), is a small web server built with a Python web framework (FastAPI), that will follow the MCP rules. It will take tool requests from any app that speaks MCP. It will send each one to the right system and return a tidy answer. It will also check that each request is well formed before passing it on.</p>
<p>I chose FastAPI for three reasons. It handles many requests at once without waiting on each one (async). It writes a machine-readable description of every request it accepts (OpenAPI) for free. And MCP tool definitions fit neatly into its data-checking library (Pydantic). Each request also carries its login details cleanly through a built-in way of handing shared pieces to each request (dependency injection).</p>
<h3>Logins the model never sees</h3>
<p>Company tools need login details: keys for program access (API keys, OAuth tokens), or shared service accounts. The rule that matters most is simple. <strong>The AI model should never see them.</strong> If a key shows up in the text sent to the model (prompt) or in a tool result, it can leak into logs, chat records or an attacker’s output.</p>
<p>Nexus will add the login details at the last moment. The model asks for a tool, and only then, just before the call goes out, Nexus attaches the key. The keys are stored encrypted in a database (PostgreSQL), and they can be rotated on a schedule. From the model’s side, it asks for an action and gets a result. It never touches a secret.</p>
<h3>Limits that protect your systems</h3>
<p>Agents can be over-eager. A loop or a badly behaved session can hit a system with thousands of calls. Nexus will cap how many calls each session may make in a given time (rate limiting), so no single session can swamp the systems behind it.</p>
<p>Those caps are kept in a fast shared memory store (Redis), not inside each copy of the gateway. That matters at scale. When several copies of Nexus run behind a traffic splitter (load balancer), the caps must be shared across all of them. A counter kept inside each copy would let a busy session dodge its cap by spreading calls across copies.</p>
<h3>Saved answers that save money and time</h3>
<p>Many agents ask the same question at the same moment. If ten agents ask for the same Jira ticket within thirty seconds, only one request should reach Jira. Nexus will keep a short-lived copy of recent answers (cache). That cuts repeat calls, shortens the wait for an answer (latency) and keeps you inside your usage limits.</p>
<h3>A tool list that makes new tools cheap</h3>
<p>New tools are added by writing a short settings file in a simple text format (YAML). You write the tool’s name, what it does, the shape of the data it accepts (schema), how it logs in, and the web address it calls (endpoint). Nexus then builds the MCP tool definition for you. Adding a new company tool takes minutes, not days. That is the whole point of the design: the cost of the next connection stops growing.</p>
<h2>Deployment: run where your data lives</h2>
<p>Companies run in the cloud, on their own servers, or a mix of both. So the gateway has to run anywhere. It ships as a sealed, ready-to-run package (Docker container). Each tool connection can run as its own small helper package next to the gateway (sidecar), with its own parts. That way, a problem in one connection cannot break another.</p>
<h2>Security questions to ask of any gateway</h2>
<p>Whether you build one or buy one, ask these:</p>
<ul>
<li><strong>Where do keys live, and can the model ever see them?</strong></li>
<li><strong>Is there a cap per session, and is it shared across every copy?</strong></li>
<li><strong>Can I add or remove a tool without restarting everything?</strong></li>
<li><strong>Can I see every call each agent made, and who made it?</strong> The last one is why the ability to see what a live system is doing (observability) matters. A gateway sees every tool call, so it is a natural place to feed a monitoring system like the one in <a href="https://bymoin.com/blog/monitoring-and-evaluating-production-ai">monitoring and evaluating production AI</a>.</li>
</ul>
<h2>What should you measure?</h2>
<p>When Nexus is built, the numbers to watch are: how many tools it connects, the typical (median) response time, how long a new tool takes to add, and how many sessions it holds at once. The one I care about most is how fast a new tool goes in. It shows whether the design really stopped the cost from growing.</p>
<h2>When you do not need a gateway</h2>
<p>If you have one model and one or two tools, a direct connection is simpler. A gateway would add moving parts you do not need. The case for a gateway grows with the number of models, tools and teams. It also grows with how much you care about keys, limits and seeing what happens.</p>
<h2>The short version</h2>
<p>Use MCP as the standard, and put one gateway between your models and your tools. Keep keys out of the model’s sight. Share call limits across every copy. Save repeat answers. And add new tools through a settings file instead of new code. The next connection becomes a short file, not a project.</p>
<p>The full design is in the <a href="https://bymoin.com/work/nexus">Nexus case study</a>. If you are connecting agents to company tools and want to do it safely, <a href="https://bymoin.com/go/book">book a call</a>.</p>]]></content:encoded></item><item><title>Qualify Inbound Leads with AI, Without Blind Trust</title><link>https://bymoin.com/blog/how-to-qualify-inbound-leads-with-ai</link><guid isPermaLink="true">https://bymoin.com/blog/how-to-qualify-inbound-leads-with-ai</guid><description>A practical guide to AI lead qualification: a deterministic gate, a model that explains its reasoning, and routing that decides the next step in seconds.</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><category>lead qualification</category><category>AI agents</category><category>n8n</category><category>lead generation</category><author>hello@bymoin.com (Moin Dalal)</author><content:encoded><![CDATA[<p>To qualify inbound leads with AI safely, run cheap fixed rules first to drop junk, then ask a model to score what is left and show its reasons. Let that score pick the next step, and keep a person in charge of the calls that matter. This is how I built <a href="https://bymoin.com/catalog/speed-to-lead">CAT-01, the Instant Lead Agent</a>.</p>
<p>Inbound leads go cold while they wait. Someone fills in your form, opens a chat or sends an email. Then they wait. By the time your team reads the message, decides if it is worth a call and writes back, the buyer has often talked to someone else. A slow first reply lowers your chance of ever winning that lead. That is the problem, and it is why so many teams put an AI model in front of their inbox.</p>
<p>Most teams make the same mistake. They hand every message to a model, ask it to “qualify the lead”, and hope. When the model gets it wrong, nobody can see why. When the message is junk, they still pay for a model call to find that out. This post shows a better way to qualify leads with AI. I used it to build <a href="https://bymoin.com/catalog/speed-to-lead">CAT-01, the Instant Lead Agent</a>.</p>
<h2>What are you actually deciding?</h2>
<p>Qualification sounds like one decision. It is really three:</p>
<ol>
<li><strong>Is this a real, readable enquiry?</strong> An empty form, a garbled paste or an obvious bot is not a lead. You do not need judgment here. You need a check.</li>
<li><strong>How good is the lead?</strong> This is where AI earns its keep. “We need this live by next month. We have approved the budget.” means something very different from “just curious what you do”, even when both come through the same form.</li>
<li><strong>What should happen next?</strong> A strong lead might get a booked call right away. A weak one might get a polite reply and nothing more. Someone has to decide, and they should decide the same way every time.</li>
</ol>
<p>If you put all three into one big instruction to the model (prompt), you cannot check its answer. If you split them, each step uses the right tool: plain rules for the first, a model for the second and a routing table for the third.</p>
<figure><img src="https://bymoin.com/blog/how-to-qualify-inbound-leads-with-ai/qualification-flow.svg" alt="Diagram: a new lead from a form, chat or email goes through a rule check. The check sets failures aside at no AI cost. The AI gives every other lead a verdict with its reason, and the system routes it as hot, warm or not a fit."><figcaption>The whole flow: a rule check, one AI verdict with its reason, then routing by tier.</figcaption></figure>
<h2>Step one: a deterministic gate</h2>
<p>Each channel sends messages in its own shape: a web form looks different from a chat widget or an email. Before the model sees anything, turn every message into one standard shape (normalise). That shape holds who sent it, how to reach them, what they said and where it came from.</p>
<p>This clean-up step also works as a gate. It follows fixed rules and always gives the same answer for the same input (deterministic). If a message is broken, the gate stops it before it reaches the model and sets it aside for a person to check. You spend nothing on a model call to learn that the message was broken.</p>
<p>This helps in two ways. First, your costs stay predictable, because you only pay the model to judge messages that deserve it. Second, you can tell your failures apart. “The message was broken” and “the model was unsure” are different problems, and you want to see which one happened.</p>
<p>Keep the gate boring. You should be able to read its code in a minute, not take it on trust.</p>
<h2>Step two: a model that shows its reasoning</h2>
<p>Every message that passes the gate goes to a live AI model, which reads the lead’s own words. A bare score is not enough. The model should give you three things:</p>
<ul>
<li><strong>A tier</strong>: hot, warm or spam.</li>
<li><strong>A budget score</strong>, so you can see how the model read the money signals in the message.</li>
<li><strong>Its reason, in plain English.</strong></li>
</ul>
<p>Most teams skip the reason, yet the reason is what makes the system usable. Say the model marks a lead warm and your salesperson disagrees. The reason shows exactly what the model read into the message. Maybe it fixed on one phrase. Maybe it missed a deadline the lead mentioned in passing. Either way, you now argue about evidence instead of shrugging at a black box.</p>
<p>The same model call also drafts a personal first reply. This is where the speed comes from. Your team no longer starts from a blank page. They already have a draft that mentions what the person asked about. They can send it as it is, tweak it or throw it away. Either way, the first reply goes out in minutes, not hours.</p>
<h2>Step three: let the tier decide the next move</h2>
<p>Once the model sets a tier, the next step should follow on its own. In CAT-01 a hot lead can become a record in your sales contact system (CRM), a held booking slot, a WhatsApp or email follow-up and an alert to your team. A lead that is not a fit gets a polite reply instead of silence. That protects your reputation better than ignoring them, and it costs less than a long back-and-forth.</p>
<p>Look at what this does to your team’s job. Nobody sorts the inbox by urgency (triage) any more. They look at a short list the system has already sorted. Each lead comes with a reason and a reply ready to go. Your people spend their time on the leads that need a person.</p>
<h2>Keep a human in the loop where it counts</h2>
<p>Automation does not mean removing people. Match the amount of freedom you give the system to the cost of a mistake:</p>
<ul>
<li><strong>Drafting a reply</strong> costs little if it goes wrong, because a person reads it before it goes out. Automate it.</li>
<li><strong>Alerting your team</strong> costs little too. Automate it.</li>
<li><strong>Sending a message to a stranger under your name, with no review</strong> costs a lot if it goes wrong. Start with a draft. Remove the review only after you have watched the system get it right for a while.</li>
</ul>
<p>I apply the same rule to my own contact form. My plan: the agent labels each message and drafts a reply for me to review. It never replies to the visitor by itself.</p>
<h2>Why I built it on n8n</h2>
<p>I built the whole CAT-01 agent in a visual workflow tool (n8n) that shows each step, so you can open it and read it. I chose it for ownership. The workflow ships as a bundle that runs on the client’s own server, so the client owns the data and the logic. Changing a routing rule does not need a developer. If your qualification logic lives inside a vendor’s black box, every change becomes a support ticket. If it lives in a workflow you can read, your sales manager can change it.</p>
<h2>What should you measure?</h2>
<p>If you build something like this, track three numbers from day one:</p>
<ul>
<li><strong>Time to first reply.</strong> The whole system exists to shrink this number.</li>
<li><strong>How often a person overrides the tier.</strong> If people override it often, the model’s reasoning is off, and its written reasons show you where.</li>
<li><strong>How many messages the gate sets aside.</strong> A sudden jump usually means a form or connection upstream has broken, long before anyone complains.</li>
</ul>
<h2>The short version</h2>
<p>Split the decisions. A deterministic gate catches broken input. A model that explains itself judges quality. A routing step turns the verdict into action. Keep a person in charge wherever a mistake costs a lot. Do that, and every new lead gets a thoughtful reply in seconds instead of going cold in your inbox.</p>
<p>Want to see it work on your own lead messages? The <a href="https://bymoin.com/catalog/speed-to-lead">CAT-01 case study</a> explains how to request a private demo link. If you are working on a similar problem, <a href="https://bymoin.com/go/book">book a call</a> and we can talk it through.</p>]]></content:encoded></item><item><title>Monitoring Production AI: Drift and Hallucinations</title><link>https://bymoin.com/blog/monitoring-and-evaluating-production-ai</link><guid isPermaLink="true">https://bymoin.com/blog/monitoring-and-evaluating-production-ai</guid><description>AI systems degrade silently. How to trace every call, score answer quality automatically and alert on quality, not just uptime.</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><category>AI observability</category><category>LLM evaluation</category><category>hallucinations</category><category>monitoring</category><author>hello@bymoin.com (Moin Dalal)</author><content:encoded><![CDATA[<p>To monitor AI in production, watch the answers, not just the servers. Record every step, score the answers for quality and for made-up facts (hallucinations), and alert when those scores slip. A server can be perfectly healthy while its answers get worse every week.</p>
<p>AI systems get worse quietly. A model that was right 95% of the time last month might be right 78% of the time today, and nobody notices until customers complain. Most teams watch their servers: how busy the processor is (CPU), how much memory is used, and whether the site is up. They do not watch how the AI behaves. Are the answers still good? How often does it make things up? Is it finding the right documents? A server can be perfectly healthy while the answers it gives slowly get worse.</p>
<p>What is missing is a clear view of what the live system is doing (observability). Not for the servers, but for the AI itself. The question it must answer is simple: is the system still giving good answers? This post shows how to build that view, based on <a href="https://bymoin.com/work/sentinel">Sentinel</a>, the monitoring platform I am designing for chains of AI steps (pipelines). Sentinel is planned, not built yet (October 2026), so this post describes the design, not results.</p>
<h2>Why does ordinary monitoring miss it?</h2>
<p>Normal monitoring answers two questions: is it up, and is it fast? Both can be true while quality falls apart. Here are a few ways that happens:</p>
<ul>
<li><strong>A data source changes shape.</strong> The step that looks up documents to answer from (retrieval) starts returning weaker matches for one topic. Answers get vaguer, but no error is ever raised.</li>
<li><strong>A model or its instructions change.</strong> Behaviour shifts in small ways that pass a quick manual check.</li>
<li><strong>The questions change.</strong> Users start asking things the system was never tuned for. Quality drops on exactly the traffic that is growing.</li>
</ul>
<p>None of these sets off an uptime alarm. You find out from a customer, which is the most costly way to find out.</p>
<h2>Three layers of monitoring</h2>
<p>Sentinel is designed to plug into any system built on a large AI text model (LLM) with a few lines of tracking code. It will give you three layers.</p>
<figure><img src="https://bymoin.com/blog/monitoring-and-evaluating-production-ai/monitoring-layers.svg" alt="Diagram: three monitoring layers around an AI system: record every step as traces, score a sample of answers with evaluation, and alert on dashboards when a score drops below its threshold."><figcaption>Three layers: record every step, score the answers, alert on a named drop.</figcaption></figure>
<h3>Layer one: record every step</h3>
<p>Every model call, every tool the agent uses and every choice it makes is saved as a step-by-step record, using an open-source tracing tool (LangFuse). Each record holds the full question and answer, how long the answer took (latency), how many word pieces it used (tokens), and any labels you add. Without these records you cannot investigate anything, because you cannot see what the system actually did.</p>
<p>Two things matter here. First, coverage. If some calls are not recorded, the blind spots are exactly where problems hide, so Sentinel aims to record everything. Second, cost. Tracking that slows the system down gets switched off. So Sentinel’s tracking has to add so little time per call that nobody has a reason to turn it off.</p>
<h3>Layer two: score the answers</h3>
<p>Records tell you what happened. Scoring tells you whether it was good. Automatic checkers run on a sample of the records. They check four things: is the answer backed by the sources, is it on topic, did it follow the instructions, and is it in the right format?</p>
<p>Each check returns a score in a fixed format. This is where a data-checking library (Pydantic) earns its place. When a checker rates an answer, I need a proper score, not a sentence that might say “7/10”, “seven out of ten” or “pretty good”. Forcing a fixed shape on the output (schema) means scores can be averaged, tracked over time and compared day to day.</p>
<p>Checking a sample is a deliberate choice. Scoring every record with a model is expensive. A sample gives a reliable picture of quality at a fraction of the cost. And when something looks off, you can check more.</p>
<h3>Layer three: alerts and dashboards</h3>
<p>When a quality score crosses a limit you set, an alert goes out. The key is being specific. “Something is wrong” does not tell anyone what to do. A useful alert looks like this: for finance questions, the share of relevant documents found dropped below 85% over the last four hours. That tells you where to look and roughly when it started.</p>
<p>The dashboards are fed by web addresses the server answers (endpoints) built with a Python web framework (FastAPI). They update live over a connection that stays open (WebSocket), so you watch quality move as it happens instead of reading yesterday’s report.</p>
<h2>Where the data lives is a design choice</h2>
<p>Many large companies cannot send these records to an outside online service (SaaS). The records hold full questions and answers, which may include customer details or private business data. That is why I chose LangFuse for this project. It is open source and can run on the client’s own servers, so they keep full control of the data.</p>
<p>The records are stored in a database (PostgreSQL), because the data is naturally linked. Steps belong to records, records belong to sessions, and sessions belong to users. That database handles those links well. It also has flexible columns for extra labels (JSONB) and fast lookups by time.</p>
<h2>Check for made-up answers on their own</h2>
<p>An answer that sounds right but is not supported by the source, a hallucination, deserves its own score. The way to catch it is to compare the answer with the documents the system actually found. If a claim is not backed by those documents, flag it.</p>
<p>You can also put a check in the live path, not just in monitoring. In the design for <a href="https://bymoin.com/work/athena">Athena</a>, a planned system, a checking agent reviews every answer against the source data before the user sees it. Sentinel would then watch how often that checker rejects answers, and why. A rising rejection rate is an early warning that something earlier in the chain has changed. The post on <a href="https://bymoin.com/blog/multi-agent-systems-for-business-intelligence">multi-agent systems for business intelligence</a> explains that design in more depth.</p>
<h2>Where should you start?</h2>
<p>You do not need to build everything at once. In order of value:</p>
<ol>
<li><strong>Record everything.</strong> Start saving a step-by-step record of every call. You cannot score what you did not record.</li>
<li><strong>Pick two or three quality questions</strong> that fit your product, such as “is the answer backed by the documents found?”. Score a sample of records against them.</li>
<li><strong>Set one alert per quality score</strong>, for one topic or feature. A single overall average can hide a local problem.</li>
<li><strong>Review the failures every week.</strong> The worst-scored records show you what to fix next.</li>
</ol>
<h2>Mistakes to avoid</h2>
<ul>
<li><strong>Alerting on averages only.</strong> A healthy overall average can hide one broken topic.</li>
<li><strong>Scores written as sentences.</strong> If checkers return prose, you cannot track them.</li>
<li><strong>Heavy tracking code.</strong> If it makes answers noticeably slower, someone will remove it.</li>
<li><strong>Sending private records to a service you do not control</strong> when your data rules forbid it.</li>
</ul>
<h2>The short version</h2>
<p>Watch the quality of the answers, not just the health of the servers. Record every call cheaply. Score a sample with checkers that return fixed-format scores. And alert on specific drops, with the topic and the time window attached. Do this, and quiet decline stops being quiet.</p>
<p>The full design, including the reasons behind each tool, is in the <a href="https://bymoin.com/work/sentinel">Sentinel case study</a>. If your AI system is already live and you are not sure how it is really doing, <a href="https://bymoin.com/go/book">book a call</a>.</p>]]></content:encoded></item><item><title>Multi-Agent Systems for Business Intelligence</title><link>https://bymoin.com/blog/multi-agent-systems-for-business-intelligence</link><guid isPermaLink="true">https://bymoin.com/blog/multi-agent-systems-for-business-intelligence</guid><description>Why one chatbot cannot answer business questions reliably, and how a router, retriever, analyst and validator give verified answers.</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><category>multi-agent systems</category><category>business intelligence</category><category>LangGraph</category><category>RAG</category><author>hello@bymoin.com (Moin Dalal)</author><content:encoded><![CDATA[<p>A team of AI agents gives safer answers about business data than one chatbot because each agent has one job: one routes the question, one finds the data, one analyses it, and one checks every number against the source. That last check catches confident wrong numbers before anyone acts on them.</p>
<p>Getting answers from company data is broken for most businesses. Self-serve reporting tools for business data (BI tools) promised to open data up to everyone. Instead they brought more complexity: dashboards that only their makers understand, database questions (SQL queries) that take days to write, and findings that arrive too late to act on.</p>
<p>The obvious fix is to put a chatbot on top of the data, so anyone can ask questions in plain English. Teams try it, and it fails in a predictable way. The chatbot answers with confidence, the answer sounds right, and some of the numbers are made up. With business data, a confident wrong number is worse than no answer, because someone makes a decision with it.</p>
<p>This post explains why a team of AI agents fixes this, using a system I am designing as the example: <a href="https://bymoin.com/work/athena">Athena</a>. Athena is planned, not built yet (October 2026), so this post describes the design, not results.</p>
<h2>Why is one model the wrong shape?</h2>
<p>A single model asked a business question has to do four jobs at once. It has to work out what is being asked, find the right data, think it through, and check its own work. Models are bad at the last one. Asking a model to grade its own answer while it writes it mostly produces agreement.</p>
<p>The fix is to split the jobs and give each one to a part that does only that. That is what “multi-agent” really means in business. It is not about having many models for the sake of it. It is about splitting duties, the same reason a finance team has one person who prepares the numbers and a different person who reviews them.</p>
<h2>The four roles</h2>
<p>Athena will have four agents working together, each with its own role. They are wired up with a tool for building agent flows as a map of steps (LangGraph).</p>
<figure><img src="https://bymoin.com/blog/multi-agent-systems-for-business-intelligence/agent-graph.svg" alt="Diagram: a question goes to a router, which sends simple lookups down a fast path and the rest to a retriever, an analyst and a validator; an answer that fails a check loops back to the retriever."><figcaption>Four agents in a fixed graph, with a retry loop when a number fails its check.</figcaption></figure>
<p><strong>The Router</strong> sorts each question by what it is after, how hard it is, and which data it needs. A simple lookup goes down a fast path. A hard question goes through the full chain of steps (pipeline). This one choice is meant to make routine questions faster, because most questions do not need the heavy machinery.</p>
<p><strong>The Retriever</strong> finds the right data, from both tidy tables and loose documents. It runs two kinds of search at once. One is search by meaning, using a database of number-based fingerprints for text (vector search in Qdrant). The other is exact keyword search, using a classic word-scoring method (BM25). Each covers the other’s blind spot. Search by meaning understands loose, everyday wording but can miss exact matches. Imagine a user asking for “Q3 2024 revenue for product SKU-4421”. A search that only looks at meaning (semantic search) might return similar products. Keyword search catches the exact product code (SKU). The two result lists are then merged by rank.</p>
<p><strong>The Analyst</strong> takes the data found and turns it into insight, using a large OpenAI model (GPT-4o). This is not just a summary. The agent looks for trends, flags anything unusual and makes comparisons. Every claim is tied to specific data points, with sources.</p>
<p><strong>The Validator</strong> checks the Analyst’s work against the source data. It checks the numbers, flags claims that are not backed up, and gives each answer a confidence score. This agent is the reason the answers can be trusted. It catches answers that sound right but are not supported by the data (hallucinations) before users see them.</p>
<p>Because the Validator is a separate step with a separate job, it can be strict in a way that a model checking itself never is.</p>
<h2>Why a fixed map beats a free-for-all</h2>
<p>A common pitch in this space is a crowd of agents that work out among themselves who does what. I chose LangGraph over other agent tools, such as two popular team-of-agents frameworks (CrewAI, AutoGen), for one main reason: it keeps clear track of where the work is up to.</p>
<p>LangGraph lets you draw the flow as a fixed map of steps. Each step passes along data in a known shape, branches follow clear rules, and progress is saved as it goes. When the Analyst fails, you want a retry rule that does the same thing every time (deterministic), not an agent deciding for itself what to try next. Live systems need failures you can predict. When something breaks at three in the morning, you want to say exactly which step failed and what the system did about it.</p>
<p>The trade-off is that you design the flow up front instead of letting agents make it up. For business questions that is the right trade, because the flow is mostly known: understand, find, analyse, check.</p>
<h2>Two kinds of search are not optional</h2>
<p>Teams new to finding documents for an AI to answer from (retrieval) often start with search by meaning alone, because it demos well. It handles vague questions beautifully. Then someone asks about a specific product code, date or account number, and it returns something similar instead of the thing they asked for.</p>
<p>Business data is full of exact codes and numbers. Any system that answers questions about it needs both kinds of search. That is why the Retriever uses both Qdrant and BM25 instead of picking one.</p>
<h2>You cannot fix what you cannot see</h2>
<p>A team of agents has more places to go wrong than a single model call. So a clear view of what the live system is doing (observability) is part of the design, not an extra. Every step in Athena will be recorded from start to finish with a tracing tool (LangSmith), showing, per agent and per question: how many word pieces it used (tokens), how relevant the data found was, how often the Validator rejected an answer and why, and how long each step took (latency).</p>
<p>That is more than logging. It is a structured view that feeds back into improving the system. When search quality drops for one area of data, I know within hours, not weeks. If you want to build that layer on its own, the companion post on <a href="https://bymoin.com/blog/monitoring-and-evaluating-production-ai">monitoring and evaluating production AI</a> covers it.</p>
<h2>What to measure</h2>
<p>When Athena is built, three numbers will matter: how often the data found is relevant, how many made-up answers the checker catches, and how long a typical answer takes. The most telling is the second. Catching nearly all made-up answers is what makes the rest usable, because analysts will only rely on a system that rarely lies to them.</p>
<h2>When do you not need this?</h2>
<p>A team of agents means more moving parts to build and run. If your questions are narrow, your data is small and a mistake is cheap, one well-instructed model may be enough. The case for several agents grows as three things grow: the variety of questions, the size and mess of the data, and the cost of a wrong answer.</p>
<h2>The short version</h2>
<p>Do not ask one model to understand, find, think and check itself. Split the work into a router, a finder, an analyst and an independent checker. Connect them with a fixed map of steps. Search by both meaning and keywords. And record everything. You get answers people can act on.</p>
<p>The full design, with the technical choices behind each part, is in the <a href="https://bymoin.com/work/athena">Athena case study</a>. If you have a similar problem, <a href="https://bymoin.com/go/book">book a call</a> and we can look at your data together.</p>]]></content:encoded></item><item><title>Why I Built ByMoin: Architecting Enterprise Agentic AI</title><link>https://bymoin.com/blog/why-i-built-bymoin</link><guid isPermaLink="true">https://bymoin.com/blog/why-i-built-bymoin</guid><description>I&apos;m Moin Dalal, an Agentic AI Developer &amp; Architect. Discover why I build production-grade agentic AI systems and my vision for AI architecture.</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><category>bymoin</category><category>AI architecture</category><category>agentic AI</category><category>solo architect</category><category>indie consulting</category><author>hello@bymoin.com (Moin Dalal)</author><content:encoded><![CDATA[<p>ByMoin is where I, Moin Dalal, show the AI agents I design and build for companies: systems that plan and carry out tasks on their own and run for real, not just in a demo. The name means “by Moin Dalal”, one accountable person behind every piece of work.</p>
<p>Welcome to ByMoin. I’m Moin Dalal, an Agentic AI Developer &amp; Architect, and this site is my home base. ByMoin is more than a portfolio. It is my personal signature on the AI systems I design and build for companies. These are AI agents that can plan and carry out tasks on their own, and they are built to run for real, not just in a demo.</p>
<h2>Why I Built ByMoin</h2>
<p>The name is deliberate. ByMoin means “by Moin Dalal”. It is a signature on every piece of work I produce. When you see the ByMoin name, you are looking at work I have personally designed, built and shipped. Many agencies hand out the same template to every client. ByMoin is a promise of the opposite: one person who is accountable, and work done with care.</p>
<p>As an Agentic AI Developer &amp; Architect, my aim is simple. I build AI agent systems that companies actually put to work. We are past the days of fragile chatbots and weekend experiments. The companies I work with need AI that grows with them, keeps working, and fits deeply into their existing tools. It has to solve hard, day-to-day business problems. ByMoin exists to deliver that level of engineering.</p>
<h2>The Tools I Trust</h2>
<p>ByMoin starts with picking the right building blocks. You won’t find thin layers over someone else’s product here. Instead, I use proven tools that make real AI design possible:</p>
<ul>
<li><strong>Agent flows</strong>: I use a tool for mapping an agent’s work as a flow of steps (LangGraph) to coordinate agents that remember where they are and can loop back (orchestration). It lets me lay out complex, multi-step work with the precision a company needs.</li>
<li><strong>Better instructions</strong>: Hand-writing instructions for a model is fragile. Tuning them with code is the better path. I use a framework that improves those instructions automatically (DSPy) to replace trial and error with a steady, repeatable method.</li>
<li><strong>Tool use</strong>: Building an agent is easy. Building one you can rely on is hard. A shared standard for how agents use outside tools (MCP) gives agents clear, fixed ways to use tools. That makes them sturdy and gives the same result for the same input (deterministic).</li>
<li><strong>Your own models</strong>: Some companies need to run their own models on their own servers. For them, I use an engine for running AI models fast on your own hardware (vLLM). It handles many requests at once (throughput) and answers quickly (latency), as ByMoin’s standards require.</li>
</ul>
<figure><img src="https://bymoin.com/blog/why-i-built-bymoin/project-path.svg" alt="Diagram: a ByMoin project runs through four steps, design, build, deploy and monitor, with one architect owning every step."><figcaption>One architect owns every step, from the first diagram to the monitored system.</figcaption></figure>
<h2>What will you find on ByMoin?</h2>
<p>This site is a living record of my work and what I learn along the way. It is where I document the path from idea to a live system.</p>
<p>Here you will find detailed <a href="https://bymoin.com/work">case studies of my work</a>, showing how I solve specific business problems. For example, you can explore the design behind <a href="https://bymoin.com/work/athena">Athena</a>, a business intelligence system on my roadmap (planned, not built yet). You’ll also find deep dives into AI design, and regular blog posts on the trade-offs that come with building AI agents.</p>
<h2>What Drives Me</h2>
<p>My work has always been about closing the gap between what a technology could do and what it actually does for a business. What drives me is the impact of a well-designed system. I love taking a messy, complex business process and designing an AI agent system for it that simply works.</p>
<p>ByMoin is where that passion comes together. If you want to learn more about my own story, see the <a href="https://bymoin.com/about">about me</a> page.</p>
<p>In the end, ByMoin is a promise. The AI system you invest in will be built with intent, backed by deep know-how, and signed by Moin Dalal. Thank you for visiting, and I look forward to sharing more of this journey with you.</p>]]></content:encoded></item></channel></rss>