Neuro-Symbolic Verifier¶
director_ai.core.verification.neuro_symbolic.NeuroSymbolicVerifier
¶
NeuroSymbolicVerifier(*, neural_accept_threshold: float = 0.6, reasoning_verifier: ReasoningVerifier | None = None, run_numeric: bool = True)
Apply numeric and formal verifiers alongside a neural score.
Neural scores are useful for broad semantic plausibility. Symbolic checks are decisive where the claim is formally checkable: numeric consistency, dates, probabilities, and caller-supplied logical formulas.
director_ai.core.verification.neuro_symbolic.NeuroSymbolicVerifierInput
dataclass
¶
NeuroSymbolicVerifierInput(text: str, neural_score: float, symbolic_steps: Sequence[ReasoningStep] = (), evidence_ref: str = '')
Input bundle for neural + symbolic verification.
director_ai.core.verification.neuro_symbolic.NeuroSymbolicVerificationResult
dataclass
¶
NeuroSymbolicVerificationResult(decision: str, neural_score: float, neural_accept_threshold: float, reasons: tuple[str, ...], numeric_result: NumericVerificationResult | None = None, symbolic_verdict: ReasoningVerdict | None = None, evidence_ref: str = '', text: str = '', metadata: dict[str, Any] = dict())
Combined verification decision.
Verification Model¶
NeuroSymbolicVerifier fuses a neural plausibility score with deterministic
checks where the claim is mechanically verifiable:
- numeric/date/probability consistency through
verify_numeric() - caller-supplied logical constraints through
ReasoningVerifier - optional DPLL, Z3, or Lean-compatible formal backends through the existing formal verification interfaces
Numeric and symbolic contradictions are decisive rejects. A low neural score is a warning when symbolic checks pass, because neural uncertainty and formal inconsistency are different failure modes.
from director_ai.core import NeuroSymbolicVerifier, NeuroSymbolicVerifierInput
from director_ai.core.formal_verification import ReasoningStep, Variable
verifier = NeuroSymbolicVerifier(neural_accept_threshold=0.7)
result = verifier.verify(
NeuroSymbolicVerifierInput(
text=response,
neural_score=score.score,
symbolic_steps=(ReasoningStep("claim-a", Variable("A")),),
evidence_ref="claim://a",
)
)
Serialization redacts raw text by default. Use include_text=True only inside a
trusted tenant or forensic boundary.