Skip to content

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.