Module 7 Lesson 4: Validation Nodes
The zero-trust agent. How to implement verification steps that ensure output quality before finishing.
Validation Nodes: The Quality Gatekeeper
In Module 3, we discussed the Critic and Validator pattern. Now, we learn how to implement it technically within a LangGraph. A Validation Node is a checkpoint that occurs after the "Working" node but before the "End" node.
1. The "Zero Trust" Architecture
In high-stakes software, we assume the LLM might hallucinate.
- The Worker Node: Writes the code.
- The Validation Node: Runs
mypyorpyteston the code. - The Edge: If tests fail, it sends the error log back to the Worker Node for fixing.
2. Visualizing the Validation Cycle
graph LR
Draft[Node: Generate Python Script] --> Validate[Node: Run Unit Tests]
Validate --> Router{Test Pass?}
Router -- No --> Draft
Router -- Yes --> END
3. Types of Validation
A. Format Validation
Does the output match our required JSON schema?
def validate_json(state: State):
content = state["messages"][-1].content
try:
json.loads(content)
return {"is_valid": True}
except:
return {"messages": ["Error: Please return only valid JSON."], "is_valid": False}
B. Logical Validation (The Critic)
Is the answer factually consistent with our documents?
- This uses a separate "Judge" LLM prompt.
4. Avoiding the "Infinite Fixing" Loop
If the Validator keeps rejecting the output, the agent might get stuck.
- Solution: After 3 failed validations, the graph should route to a Human-in-the-Loop node or return a "Partial success" error instead of continuing the loop.
5. Code Example: Defining the Conditional Path
workflow.add_node("generator", generate_code)
workflow.add_node("validator", run_unit_tests)
workflow.add_edge("generator", "validator")
workflow.add_conditional_edges(
"validator",
lambda state: "fixing" if not state["is_valid"] else "success",
{
"fixing": "generator",
"success": END
}
)
Key Takeaways
- Validation Nodes significantly increase the reliability of agentic pipelines.
- Structured checks (JSON, Pydantic, Code tests) are superior to simple LLM "guessing."
- Validation errors should be fed back to the generator as Helpful Context.
- Always guard against Validation Loops using state counters.