LLMs  

Combining LangGraph and RAG for Enterprise Compliance

Moving Large Language Models (LLMs) into regulated industries such as finance, healthcare, and legal requires a fundamental shift in mindset. In these environments, an AI agent cannot simply be "smart"; it must be grounded, traceable, and strictly controlled.

Standard Retrieval-Augmented Generation (RAG) pipelines often fall short here. A basic RAG chain retrieves documents and generates an answer, but it lacks the ability to self-correct, enforce compliance guardrails, or pause for human approval.

To build a true Regulated Agent, we must combine the grounding power of RAG with the deterministic, stateful orchestration of LangGraph.

To illustrate this end-to-end, we will explore a high-stakes, real-time use case: Automated Anti-Money Laundering (AML) Alert Adjudication.

The Use Case: Real-Time AML Alert Adjudication

In modern banking, transaction monitoring systems generate thousands of AML alerts daily. For example, a customer who usually spends $500 locally suddenly wires $45,000 to a high-risk jurisdiction.

A human compliance analyst must investigate each alert. They must:

  • Review the customer's KYC (Know Your Customer) profile.

  • Analyze historical transaction patterns.

  • Consult internal Standard Operating Procedures (SOPs) and regulatory guidelines.

  • Decide whether to dismiss the alert (False Positive) or escalate it to file a Suspicious Activity Report (SAR).

The goal is to build a LangGraph-powered Regulated Agent that ingests these alerts in real time, uses Agentic RAG to gather context, drafts an adjudication decision, and seamlessly hands off to a human for final approval.

Why Standard RAG Fails in Regulated Environments

If we used a simple LangChain RAG chain for this, we would face three critical failures:

  • The Hallucination Risk: The LLM might invent a regulatory rule that doesn't exist to justify closing an alert.

  • The "Dead End" Retrieval: If the first retrieval doesn't yield enough context, a standard chain simply generates a low-quality answer. It can't say, "I need to look up the customer's specific business category first."

  • No Audit Trail: Regulators (like FinCEN or the FCA) require a step-by-step explanation of why a decision was made. A simple prompt-in/text-out chain leaves no structural audit trail.

The Solution: LangGraph + Agentic RAG

LangGraph solves these issues by treating the agent as a State Machine. We define strict nodes for our RAG and reasoning steps, use deterministic edges for compliance guardrails, and utilize LangGraph's native persistence for auditability.

1. Defining the State

In LangGraph, the State is the single source of truth. For our AML Agent, the state must capture the entire lifecycle of the investigation.

from typing import TypedDict, Annotated, List
from langgraph.graph.message import add_messages

class AMLAgentState(TypedDict):
    alert_id: str
    transaction_details: dict
    messages: Annotated[list, add_messages]  # LLM conversation history
    retrieved_kyc_data: dict
    retrieved_sop_docs: List[dict]
    llm_reasoning: str
    proposed_decision: str  # "Dismiss" or "Escalate"
    confidence_score: float
    human_reviewer_feedback: str

2. The Graph Architecture

We construct a StateGraph with specific nodes. Notice how we mix LLM nodes (probabilistic) with Python function nodes (deterministic).

Node A: Triage & Agentic RAG (The Investigator)

Instead of a single retrieval step, this node uses an LLM to perform Agentic RAG. It looks at the alert, decides what data it needs, retrieves it, and evaluates whether it has enough information.

Action:

  • Queries the Vector DB for internal AML SOPs.

  • Queries the SQL database for the customer's KYC profile.

Edge:

  • If the retrieved SOPs don't explicitly cover the transaction type, the LLM generates a new query and retrieves again (a loop).

  • If sufficient information is available, it routes to Node B.

Node B: Adjudication & Citation (The Analyst)

The LLM drafts the decision.

Crucially, we use a strict prompt requiring inline citations.

Prompt Constraint

"You must cite the specific SOP section or KYC data point for every claim. If you cannot find a regulatory basis to dismiss the alert, you MUST escalate it."

Node C: Deterministic Guardrails (The Compliance Officer)

This is a pure Python node (no LLM). It enforces hard business rules that the LLM cannot override.

Logic

  • If transaction_amount > 100,000, force proposed_decision = "Escalate".

  • If the customer is on the internal PEP (Politically Exposed Persons) list, force proposed_decision = "Escalate".

  • Check whether the LLM's citations actually exist in the retrieved_sop_docs. If not, flag the response for regeneration.

Node D: Human-in-the-Loop (The Final Sign-Off)

Using LangGraph's interrupt, the graph pauses. The state is saved to a database.

A UI displays:

  • The alert

  • The retrieved documents

  • The LLM's reasoning

  • The proposed decision

to a human analyst.

Action

The human can:

  • Approve

  • Reject

  • Edit the decision

Their feedback is written back into the human_reviewer_feedback state key.

Node E: Finalization & SAR Generation

The graph resumes, incorporates human feedback, generates the final JSON payload for the bank's core compliance system, and archives the state.

Deep Dive: LangGraph Features That Enable Regulation

To make this architecture truly regulated, we rely on three specific LangGraph features.

1. The Checkpointer (Immutable Audit Trail)

In a regulated environment, you must prove what the AI did at every step.

By attaching a PostgresSaver checkpointer to the graph, LangGraph automatically saves a snapshot of the State at every node transition.

Regulatory Benefit

If a regulator asks,

"Why did you close Alert #12345?"

you don't just show them the final output.

You query the checkpoint database and show them:

  • The exact SOP document retrieved at 10:01 AM

  • The LLM's reasoning at 10:02 AM

  • The human approval at 10:05 AM

2. Native Interrupts (Human-in-the-Loop)

LangGraph's interrupt_before=["human_review"] natively supports pausing execution.

Regulatory Benefit

The AI is legally prohibited from filing a SAR or closing a high-risk alert without human sign-off.

LangGraph makes this a structural guarantee of the architecture, not just a prompt instruction.

The graph literally cannot proceed past the interrupt node without external input.

3. Conditional Edges (Hard Guardrails)

While the LLM handles the fuzzy work of reading SOPs, the edges handle the hard math and logic.

Regulatory Benefit

We never ask the LLM,

"Is this transaction over $10,000?"

LLMs are bad at math.

Instead, we use a Python function in the edge condition:

if state["transaction_amount"] > 10000:
    return "escalate_node"

This ensures deterministic compliance with hard regulatory thresholds.

65

The Real-Time Execution Flow

Here is how this plays out in real time when a streaming transaction triggers an alert.

10:00:00

The transaction monitoring system fires Alert #992.

LangGraph initializes the state.

10:00:02

Node A (RAG) retrieves:

  • The customer's KYC profile (they are a software consultant).

  • SOP Section 4.1 (High-risk jurisdictions).

10:00:05

Node B (Adjudication) reasons:

"Customer is a software consultant, but the wire is to a shell company in a high-risk jurisdiction. SOP 4.1 requires enhanced due diligence for this. I lack the EDD documents. Proposing Escalation."

10:00:06

Node C (Guardrails):

  • Verifies the transaction amount ($45,000 > $10,000 threshold).

  • Confirms escalation.

10:00:07

Node D (Interrupt):

  • The graph pauses.

  • The state is saved to PostgreSQL.

  • An alert is pushed to the compliance officer's dashboard.

10:15:00

The compliance officer:

  • Reviews the UI.

  • Agrees with the LLM's reasoning.

  • Adds a note:

"Confirmed shell company link via external news."

  • Clicks Approve Escalation.

10:15:01

LangGraph resumes.

It:

  • Updates the state with the human note.

  • Executes Node E.

  • Formats the final SAR JSON.

  • Sends it to the regulatory reporting gateway.

Summary: The Blueprint for Regulated AI

Building an AI agent for a regulated industry is an exercise in managing the tension between LLM flexibility and regulatory rigidity.

By combining RAG with LangGraph, we achieve the best of both worlds.

  • RAG ensures the LLM's knowledge is grounded in proprietary, up-to-date, and accurate enterprise data, mitigating hallucinations.

  • LangGraph wraps that RAG in a deterministic, stateful, and auditable state machine. It ensures that hard compliance rules are never bypassed, human oversight is structurally mandated, and every single step of the AI's reasoning is permanently recorded for regulatory scrutiny.

In the enterprise, the AI that wins isn't the one that can do the most; it's the one that can be trusted to do exactly what it is supposed to do, every single time.