[{"data":1,"prerenderedAt":887},["ShallowReactive",2],{"blog-/blog/building-production-ai-agents":3,"related-posts-/blog/building-production-ai-agents":886},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"image":11,"categories":12,"author":16,"readingTime":17,"body":18,"_type":880,"_id":881,"_source":882,"_file":883,"_stem":884,"_extension":885},"/blog/building-production-ai-agents","blog",false,"","Building Production AI Agents with LangChain and LangGraph","Lessons from building enterprise AI agents at TransUnion — from NLP-to-SQL to multi-agent orchestration, RAG pipelines, and production LLMOps with MLFlow.","2026-02-11","/images/projects/ai-agents.jpg",[13,14,15],"ai-engineering","langchain","llmops","Ayush Jaipuriar","12 min read",{"type":19,"children":20,"toc":862},"root",[21,29,42,49,54,99,104,110,133,142,149,159,212,217,223,235,454,466,472,485,491,535,541,574,580,585,593,599,632,638,643,676,688,694,699,732,738,791,797,802,835,856],{"type":22,"tag":23,"props":24,"children":25},"element","p",{},[26],{"type":27,"value":28},"text","AI demos are everywhere. Production AI agents are not. The gap between a ChatGPT wrapper and a system that handles thousands of enterprise queries daily — with reliability, cost control, and sub-second latency — is enormous.",{"type":22,"tag":23,"props":30,"children":31},{},[32,34,40],{"type":27,"value":33},"Over the past year at TransUnion, I've been leading the ",{"type":22,"tag":35,"props":36,"children":37},"strong",{},[38],{"type":27,"value":39},"Insights AI Agent Team",{"type":27,"value":41},", building agents that operate on proprietary financial data at scale. This post shares the architectural patterns, tooling decisions, and hard-won lessons from that journey.",{"type":22,"tag":43,"props":44,"children":46},"h2",{"id":45},"why-enterprise-ai-agents-are-different",[47],{"type":27,"value":48},"Why Enterprise AI Agents Are Different",{"type":22,"tag":23,"props":50,"children":51},{},[52],{"type":27,"value":53},"Most AI agent tutorials show a single LLM call with a tool. Enterprise agents face a fundamentally different reality:",{"type":22,"tag":55,"props":56,"children":57},"ul",{},[58,69,79,89],{"type":22,"tag":59,"props":60,"children":61},"li",{},[62,67],{"type":22,"tag":35,"props":63,"children":64},{},[65],{"type":27,"value":66},"Reliability requirements",{"type":27,"value":68},": A hallucinated SQL query against a production database isn't a fun demo bug — it's a compliance incident.",{"type":22,"tag":59,"props":70,"children":71},{},[72,77],{"type":22,"tag":35,"props":73,"children":74},{},[75],{"type":27,"value":76},"Cost at scale",{"type":27,"value":78},": GPT-4 at $30/1M output tokens across thousands of daily queries adds up. You need tiered model strategies.",{"type":22,"tag":59,"props":80,"children":81},{},[82,87],{"type":22,"tag":35,"props":83,"children":84},{},[85],{"type":27,"value":86},"Latency budgets",{"type":27,"value":88},": Dashboards need answers in seconds, not the 30+ seconds a naive agent chain takes.",{"type":22,"tag":59,"props":90,"children":91},{},[92,97],{"type":22,"tag":35,"props":93,"children":94},{},[95],{"type":27,"value":96},"Data sensitivity",{"type":27,"value":98},": Financial data can't leave your VPC. Self-hosted models and careful prompt design are non-negotiable.",{"type":22,"tag":23,"props":100,"children":101},{},[102],{"type":27,"value":103},"These constraints shaped every architectural decision we made.",{"type":22,"tag":43,"props":105,"children":107},{"id":106},"the-agent-architecture-langgraph-supervisor-pattern",[108],{"type":27,"value":109},"The Agent Architecture: LangGraph Supervisor Pattern",{"type":22,"tag":23,"props":111,"children":112},{},[113,115,124,126,131],{"type":27,"value":114},"We use ",{"type":22,"tag":116,"props":117,"children":121},"a",{"href":118,"rel":119},"https://langchain-ai.github.io/langgraph/",[120],"nofollow",[122],{"type":27,"value":123},"LangGraph",{"type":27,"value":125}," — LangChain's graph-based orchestration framework — to build a ",{"type":22,"tag":35,"props":127,"children":128},{},[129],{"type":27,"value":130},"supervisor-routed multi-agent system",{"type":27,"value":132},". Here's the high-level structure:",{"type":22,"tag":23,"props":134,"children":135},{},[136],{"type":22,"tag":137,"props":138,"children":141},"img",{"alt":139,"src":140},"LangGraph supervisor architecture showing routing to NLP-to-SQL, RAG, Knowledge Graph, and Anomaly Detector agents.","../../images/diagrams/langgraph-supervisor-architecture.svg",[],{"type":22,"tag":143,"props":144,"children":146},"h3",{"id":145},"why-a-supervisor-not-a-single-monolithic-agent",[147],{"type":27,"value":148},"Why a supervisor, not a single monolithic agent?",{"type":22,"tag":23,"props":150,"children":151},{},[152,157],{"type":22,"tag":35,"props":153,"children":154},{},[155],{"type":27,"value":156},"Separation of concerns.",{"type":27,"value":158}," Each agent is a specialist:",{"type":22,"tag":55,"props":160,"children":161},{},[162,172,182,192,202],{"type":22,"tag":59,"props":163,"children":164},{},[165,170],{"type":22,"tag":35,"props":166,"children":167},{},[168],{"type":27,"value":169},"NLP-to-SQL Agent",{"type":27,"value":171},": Translates natural language questions into SQL queries against our data warehouse. Uses schema-aware prompting and query validation before execution.",{"type":22,"tag":59,"props":173,"children":174},{},[175,180],{"type":22,"tag":35,"props":176,"children":177},{},[178],{"type":27,"value":179},"RAG Q&A Agent",{"type":27,"value":181},": Retrieval-augmented generation over internal documentation and research reports. Uses FAISS for vector search with chunk-level citation tracking.",{"type":22,"tag":59,"props":183,"children":184},{},[185,190],{"type":22,"tag":35,"props":186,"children":187},{},[188],{"type":27,"value":189},"Knowledge Graph Agent",{"type":27,"value":191},": Builds and queries Neo4j graphs for entity relationship exploration — \"Show me all companies connected to X through Y.\"",{"type":22,"tag":59,"props":193,"children":194},{},[195,200],{"type":22,"tag":35,"props":196,"children":197},{},[198],{"type":27,"value":199},"Anomaly Detection Agent",{"type":27,"value":201},": Identifies missing patterns and statistical outliers in time-series financial data.",{"type":22,"tag":59,"props":203,"children":204},{},[205,210],{"type":22,"tag":35,"props":206,"children":207},{},[208],{"type":27,"value":209},"Dashboard Generation Agent",{"type":27,"value":211},": Produces Apache Superset dashboard configurations from natural language requests.",{"type":22,"tag":23,"props":213,"children":214},{},[215],{"type":27,"value":216},"The supervisor classifies intent in a single cheap LLM call, then routes to the appropriate specialist. This keeps each agent's prompt focused and its tool set minimal — both critical for reliability.",{"type":22,"tag":143,"props":218,"children":220},{"id":219},"graph-state-and-conditional-routing",[221],{"type":27,"value":222},"Graph State and Conditional Routing",{"type":22,"tag":23,"props":224,"children":225},{},[226,228,233],{"type":27,"value":227},"LangGraph gives us ",{"type":22,"tag":35,"props":229,"children":230},{},[231],{"type":27,"value":232},"stateful, conditional execution graphs",{"type":27,"value":234}," — far more control than a simple chain:",{"type":22,"tag":236,"props":237,"children":241},"pre",{"className":238,"code":239,"language":240,"meta":7,"style":7},"language-python shiki shiki-themes github-light github-dark","from langgraph.graph import StateGraph, END\n\nworkflow = StateGraph(AgentState)\n\n# Add nodes (each is an agent or processing step)\nworkflow.add_node(\"supervisor\", supervisor_node)\nworkflow.add_node(\"nlp_to_sql\", nlp_sql_agent)\nworkflow.add_node(\"rag_qa\", rag_agent)\nworkflow.add_node(\"knowledge_graph\", kg_agent)\nworkflow.add_node(\"anomaly_detector\", anomaly_agent)\n\n# Conditional routing from supervisor\nworkflow.add_conditional_edges(\n    \"supervisor\",\n    route_by_intent,\n    {\n        \"sql_query\": \"nlp_to_sql\",\n        \"document_qa\": \"rag_qa\",\n        \"entity_search\": \"knowledge_graph\",\n        \"anomaly_check\": \"anomaly_detector\",\n        \"done\": END,\n    },\n)\n","python",[242],{"type":22,"tag":243,"props":244,"children":245},"code",{"__ignoreMap":7},[246,257,267,276,284,293,302,311,320,329,338,346,355,364,373,382,391,400,409,418,427,436,445],{"type":22,"tag":247,"props":248,"children":251},"span",{"class":249,"line":250},"line",1,[252],{"type":22,"tag":247,"props":253,"children":254},{},[255],{"type":27,"value":256},"from langgraph.graph import StateGraph, END\n",{"type":22,"tag":247,"props":258,"children":260},{"class":249,"line":259},2,[261],{"type":22,"tag":247,"props":262,"children":264},{"emptyLinePlaceholder":263},true,[265],{"type":27,"value":266},"\n",{"type":22,"tag":247,"props":268,"children":270},{"class":249,"line":269},3,[271],{"type":22,"tag":247,"props":272,"children":273},{},[274],{"type":27,"value":275},"workflow = StateGraph(AgentState)\n",{"type":22,"tag":247,"props":277,"children":279},{"class":249,"line":278},4,[280],{"type":22,"tag":247,"props":281,"children":282},{"emptyLinePlaceholder":263},[283],{"type":27,"value":266},{"type":22,"tag":247,"props":285,"children":287},{"class":249,"line":286},5,[288],{"type":22,"tag":247,"props":289,"children":290},{},[291],{"type":27,"value":292},"# Add nodes (each is an agent or processing step)\n",{"type":22,"tag":247,"props":294,"children":296},{"class":249,"line":295},6,[297],{"type":22,"tag":247,"props":298,"children":299},{},[300],{"type":27,"value":301},"workflow.add_node(\"supervisor\", supervisor_node)\n",{"type":22,"tag":247,"props":303,"children":305},{"class":249,"line":304},7,[306],{"type":22,"tag":247,"props":307,"children":308},{},[309],{"type":27,"value":310},"workflow.add_node(\"nlp_to_sql\", nlp_sql_agent)\n",{"type":22,"tag":247,"props":312,"children":314},{"class":249,"line":313},8,[315],{"type":22,"tag":247,"props":316,"children":317},{},[318],{"type":27,"value":319},"workflow.add_node(\"rag_qa\", rag_agent)\n",{"type":22,"tag":247,"props":321,"children":323},{"class":249,"line":322},9,[324],{"type":22,"tag":247,"props":325,"children":326},{},[327],{"type":27,"value":328},"workflow.add_node(\"knowledge_graph\", kg_agent)\n",{"type":22,"tag":247,"props":330,"children":332},{"class":249,"line":331},10,[333],{"type":22,"tag":247,"props":334,"children":335},{},[336],{"type":27,"value":337},"workflow.add_node(\"anomaly_detector\", anomaly_agent)\n",{"type":22,"tag":247,"props":339,"children":341},{"class":249,"line":340},11,[342],{"type":22,"tag":247,"props":343,"children":344},{"emptyLinePlaceholder":263},[345],{"type":27,"value":266},{"type":22,"tag":247,"props":347,"children":349},{"class":249,"line":348},12,[350],{"type":22,"tag":247,"props":351,"children":352},{},[353],{"type":27,"value":354},"# Conditional routing from supervisor\n",{"type":22,"tag":247,"props":356,"children":358},{"class":249,"line":357},13,[359],{"type":22,"tag":247,"props":360,"children":361},{},[362],{"type":27,"value":363},"workflow.add_conditional_edges(\n",{"type":22,"tag":247,"props":365,"children":367},{"class":249,"line":366},14,[368],{"type":22,"tag":247,"props":369,"children":370},{},[371],{"type":27,"value":372},"    \"supervisor\",\n",{"type":22,"tag":247,"props":374,"children":376},{"class":249,"line":375},15,[377],{"type":22,"tag":247,"props":378,"children":379},{},[380],{"type":27,"value":381},"    route_by_intent,\n",{"type":22,"tag":247,"props":383,"children":385},{"class":249,"line":384},16,[386],{"type":22,"tag":247,"props":387,"children":388},{},[389],{"type":27,"value":390},"    {\n",{"type":22,"tag":247,"props":392,"children":394},{"class":249,"line":393},17,[395],{"type":22,"tag":247,"props":396,"children":397},{},[398],{"type":27,"value":399},"        \"sql_query\": \"nlp_to_sql\",\n",{"type":22,"tag":247,"props":401,"children":403},{"class":249,"line":402},18,[404],{"type":22,"tag":247,"props":405,"children":406},{},[407],{"type":27,"value":408},"        \"document_qa\": \"rag_qa\",\n",{"type":22,"tag":247,"props":410,"children":412},{"class":249,"line":411},19,[413],{"type":22,"tag":247,"props":414,"children":415},{},[416],{"type":27,"value":417},"        \"entity_search\": \"knowledge_graph\",\n",{"type":22,"tag":247,"props":419,"children":421},{"class":249,"line":420},20,[422],{"type":22,"tag":247,"props":423,"children":424},{},[425],{"type":27,"value":426},"        \"anomaly_check\": \"anomaly_detector\",\n",{"type":22,"tag":247,"props":428,"children":430},{"class":249,"line":429},21,[431],{"type":22,"tag":247,"props":432,"children":433},{},[434],{"type":27,"value":435},"        \"done\": END,\n",{"type":22,"tag":247,"props":437,"children":439},{"class":249,"line":438},22,[440],{"type":22,"tag":247,"props":441,"children":442},{},[443],{"type":27,"value":444},"    },\n",{"type":22,"tag":247,"props":446,"children":448},{"class":249,"line":447},23,[449],{"type":22,"tag":247,"props":450,"children":451},{},[452],{"type":27,"value":453},")\n",{"type":22,"tag":23,"props":455,"children":456},{},[457,459,464],{"type":27,"value":458},"The key insight: ",{"type":22,"tag":35,"props":460,"children":461},{},[462],{"type":27,"value":463},"the graph is the architecture",{"type":27,"value":465},". Adding a new agent type means adding a node and a routing condition — not rewriting the entire system.",{"type":22,"tag":43,"props":467,"children":469},{"id":468},"nlp-to-sql-the-hardest-simple-problem",[470],{"type":27,"value":471},"NLP-to-SQL: The Hardest \"Simple\" Problem",{"type":22,"tag":23,"props":473,"children":474},{},[475,477,483],{"type":27,"value":476},"Translating natural language to SQL sounds straightforward until you try it against a schema with 200+ tables and proprietary column names like ",{"type":22,"tag":243,"props":478,"children":480},{"className":479},[],[481],{"type":27,"value":482},"cr_scr_v2_adj",{"type":27,"value":484},".",{"type":22,"tag":143,"props":486,"children":488},{"id":487},"what-works",[489],{"type":27,"value":490},"What works",{"type":22,"tag":492,"props":493,"children":494},"ol",{},[495,505,515,525],{"type":22,"tag":59,"props":496,"children":497},{},[498,503],{"type":22,"tag":35,"props":499,"children":500},{},[501],{"type":27,"value":502},"Schema-aware prompting",{"type":27,"value":504},": We inject only the relevant table schemas (not the entire warehouse) based on the user's question. A lightweight classifier picks the top 3–5 relevant tables.",{"type":22,"tag":59,"props":506,"children":507},{},[508,513],{"type":22,"tag":35,"props":509,"children":510},{},[511],{"type":27,"value":512},"Query validation layer",{"type":27,"value":514},": Before execution, generated SQL is parsed and validated — checking for valid table/column references, preventing dangerous operations (DROP, DELETE), and enforcing row limits.",{"type":22,"tag":59,"props":516,"children":517},{},[518,523],{"type":22,"tag":35,"props":519,"children":520},{},[521],{"type":27,"value":522},"Few-shot examples per domain",{"type":27,"value":524},": Instead of generic SQL examples, we maintain domain-specific few-shot banks. \"What's the default rate for segment X?\" maps to very different SQL than \"Compare revenue across quarters.\"",{"type":22,"tag":59,"props":526,"children":527},{},[528,533],{"type":22,"tag":35,"props":529,"children":530},{},[531],{"type":27,"value":532},"Iterative correction",{"type":27,"value":534},": If a query fails, the error message is fed back to the LLM for self-correction — but with a maximum retry count to prevent infinite loops.",{"type":22,"tag":143,"props":536,"children":538},{"id":537},"what-doesnt-work",[539],{"type":27,"value":540},"What doesn't work",{"type":22,"tag":55,"props":542,"children":543},{},[544,554,564],{"type":22,"tag":59,"props":545,"children":546},{},[547,552],{"type":22,"tag":35,"props":548,"children":549},{},[550],{"type":27,"value":551},"Dumping the entire schema into the prompt",{"type":27,"value":553},": Context window pollution. The model gets confused by irrelevant tables.",{"type":22,"tag":59,"props":555,"children":556},{},[557,562],{"type":22,"tag":35,"props":558,"children":559},{},[560],{"type":27,"value":561},"Zero-shot SQL generation for complex joins",{"type":27,"value":563},": Multi-table joins with proprietary naming require examples. Period.",{"type":22,"tag":59,"props":565,"children":566},{},[567,572],{"type":22,"tag":35,"props":568,"children":569},{},[570],{"type":27,"value":571},"Trusting the output without validation",{"type":27,"value":573},": Always validate. Always.",{"type":22,"tag":43,"props":575,"children":577},{"id":576},"rag-at-enterprise-scale",[578],{"type":27,"value":579},"RAG at Enterprise Scale",{"type":22,"tag":23,"props":581,"children":582},{},[583],{"type":27,"value":584},"Our RAG pipeline handles internal research reports, compliance documents, and analyst notes. The architecture:",{"type":22,"tag":23,"props":586,"children":587},{},[588],{"type":22,"tag":137,"props":589,"children":592},{"alt":590,"src":591},"RAG pipeline showing Query to Embedding to FAISS Retrieval to Reranking to LLM Generation to Citation.","../../images/diagrams/rag-enterprise-pipeline.svg",[],{"type":22,"tag":143,"props":594,"children":596},{"id":595},"key-decisions",[597],{"type":27,"value":598},"Key decisions",{"type":22,"tag":55,"props":600,"children":601},{},[602,612,622],{"type":22,"tag":59,"props":603,"children":604},{},[605,610],{"type":22,"tag":35,"props":606,"children":607},{},[608],{"type":27,"value":609},"Chunk size matters enormously.",{"type":27,"value":611}," We settled on ~500 tokens with 50-token overlap after testing showed that smaller chunks improved retrieval precision for specific questions, while larger chunks helped with context-heavy answers. There's no universal right answer — test on your data.",{"type":22,"tag":59,"props":613,"children":614},{},[615,620],{"type":22,"tag":35,"props":616,"children":617},{},[618],{"type":27,"value":619},"Reranking is non-negotiable.",{"type":27,"value":621}," FAISS retrieval alone gives you the top-K similar chunks, but similarity ≠ relevance. A lightweight cross-encoder reranker (running locally) dramatically improved answer quality.",{"type":22,"tag":59,"props":623,"children":624},{},[625,630],{"type":22,"tag":35,"props":626,"children":627},{},[628],{"type":27,"value":629},"Citation tracking builds trust.",{"type":27,"value":631}," Every generated answer includes references to the specific document chunks used. Enterprise users won't trust an AI that can't show its sources.",{"type":22,"tag":43,"props":633,"children":635},{"id":634},"llmops-with-mlflow",[636],{"type":27,"value":637},"LLMOps with MLFlow",{"type":22,"tag":23,"props":639,"children":640},{},[641],{"type":27,"value":642},"Deploying an agent is the easy part. Keeping it reliable in production is where MLFlow becomes essential:",{"type":22,"tag":55,"props":644,"children":645},{},[646,656,666],{"type":22,"tag":59,"props":647,"children":648},{},[649,654],{"type":22,"tag":35,"props":650,"children":651},{},[652],{"type":27,"value":653},"Experiment tracking",{"type":27,"value":655},": Every prompt template change, model swap, or parameter tweak is logged as an experiment. We can compare accuracy, latency, and cost across configurations.",{"type":22,"tag":59,"props":657,"children":658},{},[659,664],{"type":22,"tag":35,"props":660,"children":661},{},[662],{"type":27,"value":663},"Model registry",{"type":27,"value":665},": Production-promoted models are versioned and tagged. Rolling back a bad deployment is a one-line operation.",{"type":22,"tag":59,"props":667,"children":668},{},[669,674],{"type":22,"tag":35,"props":670,"children":671},{},[672],{"type":27,"value":673},"Monitoring",{"type":27,"value":675},": We track token usage, latency percentiles, error rates, and user satisfaction signals. Drift detection alerts us when answer quality degrades — usually because the underlying data schema changed.",{"type":22,"tag":23,"props":677,"children":678},{},[679,681,686],{"type":27,"value":680},"The pattern: ",{"type":22,"tag":35,"props":682,"children":683},{},[684],{"type":27,"value":685},"treat your prompts like code and your models like deployments.",{"type":27,"value":687}," Version everything. Test everything. Monitor everything.",{"type":22,"tag":43,"props":689,"children":691},{"id":690},"tools-that-accelerate-development",[692],{"type":27,"value":693},"Tools That Accelerate Development",{"type":22,"tag":23,"props":695,"children":696},{},[697],{"type":27,"value":698},"Beyond the core stack, these tools have meaningfully accelerated our development velocity:",{"type":22,"tag":55,"props":700,"children":701},{},[702,712,722],{"type":22,"tag":59,"props":703,"children":704},{},[705,710],{"type":22,"tag":35,"props":706,"children":707},{},[708],{"type":27,"value":709},"Claude Code",{"type":27,"value":711}," (with subagents and hooks): For scaffolding new agent types, writing test fixtures, and exploring unfamiliar APIs. The subagent pattern — delegating research to one agent while implementation continues in another — maps surprisingly well to how I think about agent development itself.",{"type":22,"tag":59,"props":713,"children":714},{},[715,720],{"type":22,"tag":35,"props":716,"children":717},{},[718],{"type":27,"value":719},"Cursor AI",{"type":27,"value":721},": For rapid prototyping and refactoring. The codebase-aware suggestions significantly reduce boilerplate.",{"type":22,"tag":59,"props":723,"children":724},{},[725,730],{"type":22,"tag":35,"props":726,"children":727},{},[728],{"type":27,"value":729},"LangSmith",{"type":27,"value":731},": LangChain's tracing tool. Invaluable for debugging multi-step agent runs where you need to see exactly which tool was called with which arguments and what the LLM's reasoning was at each step.",{"type":22,"tag":43,"props":733,"children":735},{"id":734},"key-takeaways",[736],{"type":27,"value":737},"Key Takeaways",{"type":22,"tag":492,"props":739,"children":740},{},[741,751,761,771,781],{"type":22,"tag":59,"props":742,"children":743},{},[744,749],{"type":22,"tag":35,"props":745,"children":746},{},[747],{"type":27,"value":748},"Start with the supervisor pattern.",{"type":27,"value":750}," Even if you only have one agent type today, the routing infrastructure pays for itself when you add the second.",{"type":22,"tag":59,"props":752,"children":753},{},[754,759],{"type":22,"tag":35,"props":755,"children":756},{},[757],{"type":27,"value":758},"Validate everything the LLM generates.",{"type":27,"value":760}," SQL, API calls, graph queries — never execute without validation.",{"type":22,"tag":59,"props":762,"children":763},{},[764,769],{"type":22,"tag":35,"props":765,"children":766},{},[767],{"type":27,"value":768},"Invest in observability early.",{"type":27,"value":770}," You can't improve what you can't measure. MLFlow + LangSmith give you the instrumentation you need.",{"type":22,"tag":59,"props":772,"children":773},{},[774,779],{"type":22,"tag":35,"props":775,"children":776},{},[777],{"type":27,"value":778},"Optimize for cost, not just quality.",{"type":27,"value":780}," Use cheap models for classification and routing; reserve expensive models for generation. A tiered approach can cut costs 60–80% without meaningful quality loss.",{"type":22,"tag":59,"props":782,"children":783},{},[784,789],{"type":22,"tag":35,"props":785,"children":786},{},[787],{"type":27,"value":788},"Domain-specific few-shot examples outperform generic prompting.",{"type":27,"value":790}," Every. Single. Time.",{"type":22,"tag":43,"props":792,"children":794},{"id":793},"whats-next",[795],{"type":27,"value":796},"What's Next",{"type":22,"tag":23,"props":798,"children":799},{},[800],{"type":27,"value":801},"We're actively exploring:",{"type":22,"tag":55,"props":803,"children":804},{},[805,815,825],{"type":22,"tag":59,"props":806,"children":807},{},[808,813],{"type":22,"tag":35,"props":809,"children":810},{},[811],{"type":27,"value":812},"Agentic workflows with human-in-the-loop",{"type":27,"value":814},": For high-stakes decisions, routing to a human reviewer before execution.",{"type":22,"tag":59,"props":816,"children":817},{},[818,823],{"type":22,"tag":35,"props":819,"children":820},{},[821],{"type":27,"value":822},"Fine-tuned smaller models",{"type":27,"value":824},": Replacing GPT-4 calls with domain-fine-tuned 7B models for specific, well-defined tasks.",{"type":22,"tag":59,"props":826,"children":827},{},[828,833],{"type":22,"tag":35,"props":829,"children":830},{},[831],{"type":27,"value":832},"Multi-modal agents",{"type":27,"value":834},": Incorporating chart and image understanding for richer analysis.",{"type":22,"tag":23,"props":836,"children":837},{},[838,840,846,848,855],{"type":27,"value":839},"If you're building production AI agents and want to compare notes, I'd love to connect — reach out via the ",{"type":22,"tag":116,"props":841,"children":843},{"href":842},"/contact",[844],{"type":27,"value":845},"contact page",{"type":27,"value":847}," or find me on ",{"type":22,"tag":116,"props":849,"children":852},{"href":850,"rel":851},"https://linkedin.com/in/ayush-jaipuriar",[120],[853],{"type":27,"value":854},"LinkedIn",{"type":27,"value":484},{"type":22,"tag":857,"props":858,"children":859},"style",{},[860],{"type":27,"value":861},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":7,"searchDepth":259,"depth":259,"links":863},[864,865,869,873,876,877,878,879],{"id":45,"depth":259,"text":48},{"id":106,"depth":259,"text":109,"children":866},[867,868],{"id":145,"depth":269,"text":148},{"id":219,"depth":269,"text":222},{"id":468,"depth":259,"text":471,"children":870},[871,872],{"id":487,"depth":269,"text":490},{"id":537,"depth":269,"text":540},{"id":576,"depth":259,"text":579,"children":874},[875],{"id":595,"depth":269,"text":598},{"id":634,"depth":259,"text":637},{"id":690,"depth":259,"text":693},{"id":734,"depth":259,"text":737},{"id":793,"depth":259,"text":796},"markdown","content:blog:1.building-production-ai-agents.md","content","blog/1.building-production-ai-agents.md","blog/1.building-production-ai-agents","md",[],1776575850649]