<?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: Lakshman Pandey</title>
    <description>The latest articles on DEV Community by Lakshman Pandey (@lakshman-ai).</description>
    <link>https://dev.to/lakshman-ai</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%2F4083111%2F17080243-fee6-4d95-91eb-d1211324b905.png</url>
      <title>DEV Community: Lakshman Pandey</title>
      <link>https://dev.to/lakshman-ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lakshman-ai"/>
    <language>en</language>
    <item>
      <title>How I Built a NIST AI RMF-Compliant RAG System for Regulated Domains</title>
      <dc:creator>Lakshman Pandey</dc:creator>
      <pubDate>Tue, 18 Aug 2026 11:15:09 +0000</pubDate>
      <link>https://dev.to/lakshman-ai/how-i-built-a-nist-ai-rmf-compliant-rag-system-for-regulated-domains-jch</link>
      <guid>https://dev.to/lakshman-ai/how-i-built-a-nist-ai-rmf-compliant-rag-system-for-regulated-domains-jch</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a NIST AI RMF-Compliant Production RAG System
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;By Lakshman Pandey | August 2026&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I shipped a production RAG (retrieval-augmented generation) system serving UK arts and culture clients. This article documents how the system implements NIST AI Risk Management Framework controls, with real decisions, trade-offs, and measurable outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designed for low-risk retrieval-grounded use cases&lt;/li&gt;
&lt;li&gt;All decisions documented in ADRs (Architecture Decision Records)&lt;/li&gt;
&lt;li&gt;Costs $0.003-0.005 per query, $25/month infrastructure&lt;/li&gt;
&lt;li&gt;EU data residency (GDPR-ready)&lt;/li&gt;
&lt;li&gt;Eval framework prevents quality degradation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The System
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: Streamlit Cloud&lt;/li&gt;
&lt;li&gt;Vector DB: Supabase pgvector (EU-West-2)&lt;/li&gt;
&lt;li&gt;Embeddings: Voyage AI (1024 dimensions)&lt;/li&gt;
&lt;li&gt;LLM: Claude Haiku 4.5 (direct REST API)&lt;/li&gt;
&lt;li&gt;Observability: Langfuse&lt;/li&gt;
&lt;li&gt;Integration: MCP server for Claude Desktop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Risk Profile: LOW&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieval-grounded (not generative by itself)&lt;/li&gt;
&lt;li&gt;No model training or fine-tuning&lt;/li&gt;
&lt;li&gt;Human review possible before deployment&lt;/li&gt;
&lt;li&gt;No safety-critical decisions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  NIST AI RMF Implementation
&lt;/h2&gt;

&lt;p&gt;The NIST framework has 4 functions: GOVERN, MAP, MEASURE, MANAGE. Here's how the production system implements each.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. GOVERN: Establishing Governance Structure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Requirement:&lt;/strong&gt; Define roles, responsibilities, and decision-making authority for AI risk management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision Authority:&lt;/strong&gt; Solo architect with client stakeholder approval loops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Governance (ADR-001):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decided: Use Supabase pgvector in EU-West-2 (London)&lt;/li&gt;
&lt;li&gt;Why: UK public-sector cultural clients require UK/EU data residency for GDPR compliance&lt;/li&gt;
&lt;li&gt;Risk: Vendor dependency on Supabase&lt;/li&gt;
&lt;li&gt;Mitigation: Eval framework + ADR ensures reversibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stakeholder Roles:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer: Lakshman (me) — system architecture, data pipeline, deployment&lt;/li&gt;
&lt;li&gt;Client: UK public-sector stakeholder — approve governance policies, validate output quality&lt;/li&gt;
&lt;li&gt;Operations: Future (TBD) — monitoring, alert response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Policy:&lt;/strong&gt; All user data stays in EU. API calls to Claude/Voyage are transient (no data stored in US).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measurement:&lt;/strong&gt; Langfuse audit trail logs every query's origin and destination.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. MAP: Identify AI Risks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Requirement:&lt;/strong&gt; Identify risks specific to the AI system's context, design, and use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk Inventory:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Mitigation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hallucination&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;LLM generating answers beyond retrieved context&lt;/td&gt;
&lt;td&gt;Prompt constraints (answer only from sources) + eval suite thresholds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedding Quality Drift&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Voyage model updates degrade retrieval&lt;/td&gt;
&lt;td&gt;Phase 2 eval baseline (context recall 0.98) prevents regression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Drift&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Corpus content changes over time&lt;/td&gt;
&lt;td&gt;Scheduled re-eval (monthly) against golden questions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor Outage&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Supabase/Voyage API downtime&lt;/td&gt;
&lt;td&gt;Documented fallback to Ollama (local, offline)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PII Leakage&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;User data in prompts&lt;/td&gt;
&lt;td&gt;(Future) Microsoft Presidio redaction at ingestion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Injection&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;User query attempts to jailbreak system&lt;/td&gt;
&lt;td&gt;Input validation + output validation (present but basic)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Risk Rating:&lt;/strong&gt; OVERALL = LOW-RISK&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieval-grounded (not generative-primary)&lt;/li&gt;
&lt;li&gt;Small, controlled corpus (108 documents)&lt;/li&gt;
&lt;li&gt;Limited stakeholders (internal + client team)&lt;/li&gt;
&lt;li&gt;No real-time safety-critical decisions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. MEASURE: Establish Metrics &amp;amp; Monitoring
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Requirement:&lt;/strong&gt; Define metrics to assess AI system performance and risk throughout the lifecycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eval Framework (Phase 2):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built Ragas-based evaluation suite with 18 golden questions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;Threshold&lt;/th&gt;
&lt;th&gt;Current Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Faithfulness&lt;/td&gt;
&lt;td&gt;0.42&lt;/td&gt;
&lt;td&gt;&amp;gt; 0.50&lt;/td&gt;
&lt;td&gt;Pending re-run with Voyage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Precision&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;td&gt;&amp;gt; 0.65&lt;/td&gt;
&lt;td&gt;✅ Passing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Recall&lt;/td&gt;
&lt;td&gt;0.98&lt;/td&gt;
&lt;td&gt;&amp;gt; 0.95&lt;/td&gt;
&lt;td&gt;✅ Passing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer Relevancy&lt;/td&gt;
&lt;td&gt;0.64&lt;/td&gt;
&lt;td&gt;&amp;gt; 0.60&lt;/td&gt;
&lt;td&gt;✅ Passing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why these metrics?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faithfulness: Detects hallucination (answers consistent with sources)&lt;/li&gt;
&lt;li&gt;Context Precision: Ensures retrieved chunks are actually relevant&lt;/li&gt;
&lt;li&gt;Context Recall: Ensures good chunks aren't missed&lt;/li&gt;
&lt;li&gt;Answer Relevancy: Ensures answer matches the question&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Observability (Phase 3):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Langfuse integration traces every production query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trace_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rag_query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What are the current content guidelines?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Based on sources [1][2]..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cost_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0031&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latency_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1250&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost Per Query:&lt;/strong&gt; $0.0005 (embedding) + $0.003 (generation) = $0.0031&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latency Target:&lt;/strong&gt; &amp;lt; 2 seconds (currently ~1.2s)&lt;/p&gt;




&lt;h3&gt;
  
  
  4. MANAGE: Implement Risk Mitigation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Requirement:&lt;/strong&gt; Manage identified risks through safeguards, monitoring, and response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current Safeguards:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prompt Engineering: System prompt enforces "answer only from sources" constraint&lt;/li&gt;
&lt;li&gt;Error Handling: Try-catch blocks prevent crashes; errors logged to Langfuse&lt;/li&gt;
&lt;li&gt;Rate Limiting: (Future) Add max queries/hour per session&lt;/li&gt;
&lt;li&gt;Cost Ceiling: (Future) Hard cap on monthly spend per client&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Code Evidence:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# phase3-deployment/app.py, lines 52-58
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.anthropic.com/v1/messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-haiku-4-5-20251001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Answer using ONLY the sources below. &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;If answer not in sources, say so.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;Q: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Future Safeguards (Phase 4):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Human-in-the-loop approval gate for sensitive queries&lt;/li&gt;
&lt;li&gt;Prompt caching to reduce costs by 25-50%&lt;/li&gt;
&lt;li&gt;Microsoft Presidio for PII redaction&lt;/li&gt;
&lt;li&gt;CI/CD regression gate (eval suite must pass before deploy)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Trade-offs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ADR-001: Supabase vs Self-Hosted PostgreSQL
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Decision:&lt;/strong&gt; Cloud-managed Supabase pgvector (EU)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gain: Managed backups, EU residency, zero DevOps&lt;/li&gt;
&lt;li&gt;Cost: Vendor lock-in, moderate migration cost if Supabase changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this trade-off wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team of one (no DevOps capacity)&lt;/li&gt;
&lt;li&gt;Clients demand EU data residency&lt;/li&gt;
&lt;li&gt;Long-term value of EU compliance &amp;gt; switching cost&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ADR-002: Voyage AI vs Ollama
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Decision:&lt;/strong&gt; Cloud API (Voyage) vs local (Ollama)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gain: Cloud-native, 1024 dims (better quality), managed updates&lt;/li&gt;
&lt;li&gt;Cost: $0.0001 per embedding, vendor dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this trade-off wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scales to 10 clients without infrastructure changes&lt;/li&gt;
&lt;li&gt;Quality improvement (1024 vs 768 dims) is measurable&lt;/li&gt;
&lt;li&gt;Cost per query is sub-penny&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ADR-003: Direct REST Calls vs Anthropic SDK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Decision:&lt;/strong&gt; Manual HTTP calls (requests lib) vs SDK&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gain: Works on Python 3.14, fewer dependencies, explicit control&lt;/li&gt;
&lt;li&gt;Cost: No type hints, manual error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this trade-off wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.14 breaks SDKs (httpx/httpcore incompatibility)&lt;/li&gt;
&lt;li&gt;Direct API calls = future-proof&lt;/li&gt;
&lt;li&gt;Explicit contract = easier to debug&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Measuring Against NIST
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GOVERN:&lt;/strong&gt; ✅ Documented roles, EU data residency, stakeholder approval&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAP:&lt;/strong&gt; ✅ Risk inventory, low-risk classification, identified mitigations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MEASURE:&lt;/strong&gt; ✅ Eval framework (Phase 2), Langfuse tracing (Phase 3), cost monitoring&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MANAGE:&lt;/strong&gt; ⚠️ Basic error handling, prompt constraints; future human-in-the-loop + spend ceiling&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance Status:&lt;/strong&gt; COMPLIANT with NIST for low-risk use case. Future enhancements (Phase 4) will strengthen MANAGE function.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Data Residency First: For UK public-sector clients, EU hosting is table-stakes. Chose Supabase before other factors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evaluate Everything: Phase 2 eval framework caught that naive keyword-matching underperforms vector search. Measuring &amp;gt; assuming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Direct API &amp;gt; SDKs for Stability: Python 3.14 broke 4 versions of the Anthropic SDK. Direct HTTP calls worked immediately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cost Transparency Builds Trust: Langfuse tracing makes per-query costs visible. Clients appreciate this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document Decisions, Not Just Code: ADRs explain WHY, not just HOW. Critical for onboarding + architectural clarity.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What's Next (Phase 4)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Human-in-the-loop approval for high-risk queries&lt;/li&gt;
&lt;li&gt;Prompt caching (25-50% cost savings)&lt;/li&gt;
&lt;li&gt;PII redaction at ingestion (Microsoft Presidio)&lt;/li&gt;
&lt;li&gt;CI/CD regression gates (eval must pass)&lt;/li&gt;
&lt;li&gt;Re-run Phase 2 evals with Voyage embeddings (prove quality parity)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ADR-001: Supabase pgvector (EU data residency)&lt;/li&gt;
&lt;li&gt;ADR-002: Voyage AI embeddings (production-grade, cloud-native)&lt;/li&gt;
&lt;li&gt;ADR-003: Direct REST API (Python 3.14 stability)&lt;/li&gt;
&lt;li&gt;Phase 2 Eval: Ragas framework + 18 golden questions&lt;/li&gt;
&lt;li&gt;Phase 3 System: Live production deployment&lt;/li&gt;
&lt;li&gt;NIST AI RMF: &lt;a href="https://www.nist.gov/itl/ai-risk-management-framework" rel="noopener noreferrer"&gt;https://www.nist.gov/itl/ai-risk-management-framework&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Supabase pgvector: &lt;a href="https://supabase.com/docs/guides/database/extensions/pgvector" rel="noopener noreferrer"&gt;https://supabase.com/docs/guides/database/extensions/pgvector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Voyage AI: &lt;a href="https://docs.voyageai.com/docs/embeddings" rel="noopener noreferrer"&gt;https://docs.voyageai.com/docs/embeddings&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude API: &lt;a href="https://docs.anthropic.com/en/api/getting-started" rel="noopener noreferrer"&gt;https://docs.anthropic.com/en/api/getting-started&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;Lakshman Pandey is a Senior Technical Lead specializing in AI Solutions Architecture for content-rich, regulated domains (UK public sector, cultural institutions, education). 13+ years full-stack development (Drupal, Python, Node.js). Currently building RAG systems that balance innovation with governance requirements.&lt;/p&gt;

&lt;p&gt;GitHub: code-lakshman/ai&lt;/p&gt;

</description>
      <category>ai</category>
      <category>governance</category>
      <category>nist</category>
      <category>rag</category>
    </item>
  </channel>
</rss>
