ClaimExtractor — Turning AI Conversations into Auditable Claims and Intents

ClaimExtractor is a small language model (SLM) designed for turning AI conversations into atomic, decontextualized claims and intents that downstream systems can audit, fact-check, route, and monitor.

Instead of optimizing for open-ended generation, ClaimExtractor is trained to make reliable, consistent, low-latency structured extractions. Being small compared to large language models (LLMs) is not a limitation, but an intentional design choice: ClaimExtractor is built to be cheaper, faster, and easier to deploy as a per-turn extraction layer in production systems.

Claim extraction pipeline

Resources

What ClaimExtractor does

Given a conversation (single message or multi-turn) and — optionally — a description of the AI service, ClaimExtractor extracts two structured outputs from the last message of the conversation:

  • Claims — self-contained, decontextualized factual statements, labelled with one of four subtypes:
    • Factoid — verifiable facts about the world (dates, prices, procedures, URLs, identifiers, …)
    • Capability — what the AI service can or cannot do (scope, features, limitations)
    • User Assertion — facts the user states about themselves (e.g., "My ID expired")
    • Unverifiable — common knowledge, subjective statements, marketing language, visual/UI references
  • Intents — explicit goals, requests, or actions the user wants to accomplish (extracted from user messages only)

Each extraction is decontextualized: it stands on its own without reference to the surrounding conversation, so it can be consumed directly by fact-checkers, intent routers, hallucination detectors, and audit pipelines without re-parsing history.

ClaimExtractor can be used as a per-turn extraction layer in enterprise AI deployments to convert free-form assistant and user text into structured, comparable units of information.


Show me the code

Install

pip install 'orbitals[claim-extractor-vllm]'

# Or, if you'd like to use hf as a backend
# pip install 'orbitals[claim-extractor-hf]'

Use

from orbitals.claim_extractor import ClaimExtractor

ce = ClaimExtractor(backend="vllm", model="principled-intelligence/claim-extractor-2B-q-2605")

ai_service_description = """
You are a virtual assistant for a parcel delivery service.
You can only answer questions about package tracking.
"""

assistant_message = (
    "Your package with tracking number 1234567890 is currently in transit and "
    "is expected to be delivered on December 12, 2025. If you want, I can also "
    "notify you when it is out for delivery."
)

result = ce.extract(
    assistant_message,
    ai_service_description=ai_service_description,
)

for claim in result.extractions.claims:
    print(f"[{claim.subtype}] {claim.content}")

for intent in result.extractions.intents:
    print(f"[Intent] {intent.content}")

# [Factoid] The tracking number of the user's package is 1234567890
# [Factoid] The user's package is expected to be delivered on December 12, 2025
# [Capability] The parcel delivery virtual assistant can notify the user when the package is out for delivery

Structured AI Service Description (Suggested)

from orbitals.types import AIServiceDescription
from orbitals.claim_extractor import ClaimExtractor

ce = ClaimExtractor(backend="vllm", model="principled-intelligence/claim-extractor-2B-q-2605")

ai_service_description = AIServiceDescription(
    identity_role=(
        "You are PackAssist, a virtual assistant designed to help users understand and "
        "track their parcel shipments. Your objective is to interpret tracking data and "
        "guide users through delivery-related questions."
    ),
    context=(
        "The service operates within a parcel-delivery environment where users interact "
        "to check the status of shipments sent domestically or internationally. Typical "
        "users are customers awaiting deliveries or sending parcels."
    ),
    functionalities=(
        "Retrieve tracking updates; explain the meaning of tracking events; provide "
        "estimated delivery windows; assist users in understanding delays or routing steps."
    ),
    knowledge_scope=(
        "Public tracking information, standard logistics workflows, typical transit times, "
        "and general procedures for parcel movement."
    ),
    principles=(
        "Cannot modify shipments, initiate refunds, open claims, contact drivers, or view "
        "internal logistics notes. Limited strictly to interpreting publicly available "
        "tracking data."
    ),
    website_url="https://www.trackmate-delivery.com",
)

assistant_message = (
    "Your package with tracking number 1234567890 is currently in transit and "
    "is expected to be delivered on December 12, 2025. If you want, I can also "
    "notify you when it is out for delivery."
)

result = ce.extract(assistant_message, ai_service_description=ai_service_description)

for claim in result.extractions.claims:
    print(f"[{claim.subtype}] {claim.content}")

Providing a structured AIServiceDescription (rather than a free-form string) noticeably improves extraction quality, especially the precision of Capability claims and the grounding of Factoid claims in service-specific vocabulary.


ClaimExtractor model family

Our initial family of ClaimExtractor models includes:

  • claim-extractor-4B-q-2605 Open ClaimExtractor model based on Qwen3.5-4B. Highest extraction quality.

  • claim-extractor-2B-q-2605 Open ClaimExtractor model based on a 2B Qwen3.5-2B backbone. Trades a small amount of quality for substantially lower latency and memory pressure.


How ClaimExtractor works

ClaimExtractor takes two inputs and produces one structured output.

Inputs:

  1. A conversation — anything from a single message to a multi-turn exchange. Claims and intents are extracted from the last message; earlier turns are used as context for decontextualization. The last message can be a user message (claims + intents) or an assistant message (claims only — assistants don't have intents).
  2. An optional AI Service Description — free-form string or structured AIServiceDescription object. Optional, but strongly improves quality.

Output:

A ClaimExtractorOutput whose extractions field contains:

  • claims: a list of Claim(subtype, content, evidences) objects
  • intents: a list of Intent(content, evidences) objects

Note on evidences. Every Claim and Intent is designed to carry a list of evidences — verbatim excerpts from the source message that support the extraction. The current open release does not populate evidences yet; that capability ships with the next model release. The output schema will not change — evidences will simply start being populated.


Intended use

ClaimExtractor is intended for:

  • Fact-checking pipelines — collect Factoid claims and verify them against authoritative data sources (CRM, knowledge bases, product catalogs).
  • Capability auditing — check that Capability claims made by an assistant match what the underlying system can actually do (preventing "phantom promises" that the assistant cannot fulfil).
  • Intent routing — use the Intent extracted from the last user message as the routing signal for downstream tools, agents, or human handoff.
  • Compliance & brand monitoring — flag Unverifiable claims that pattern-match banned marketing language or unsupported product claims.
  • Long-term analytics — store all extractions and run trend analysis: most common user intents, drift in capability claims over time, per-service hallucination rates.

ClaimExtractor pairs naturally with ScopeGuard: ScopeGuard decides whether a user request belongs to your AI service; ClaimExtractor characterizes what is actually being said once it does.


Inference speed and deployment

ClaimExtractor is designed to run inline on every conversation turn, so latency and throughput are first-class concerns.

The 4B size (claim-extractor-4B-q-2605) was chosen to fit comfortably on a single consumer-grade GPU (e.g., RTX 4090, widely available on cloud marketplaces). The orbitals integration enables vLLM with prefix caching, MTP speculative decoding, and language-model-only mode by default — tuned for the shape of claim-extraction traffic (long, repeated system prompts; short per-turn inputs).

The 2B variant is recommended when throughput or memory pressure dominate over absolute extraction quality.


Limitations

  • ClaimExtractor is designed for structured extraction, not for open-ended generation.
  • The current release does not populate evidences — see the note above. Plan downstream consumers around an empty evidences list for now.

Want to integrate ClaimExtractor to govern your AI? Get in touch!

If you are thinking about integrating ClaimExtractor into your pipeline to fact-check, audit, or route AI conversations, we can help. Contact us directly or write to orbitals@principled-intelligence.com to learn more about ClaimExtractor Pro or how we can support you.


Built with ❤️ by Principled Intelligence

Downloads last month
61
Safetensors
Model size
2B params
Tensor type
F32
·
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for principled-intelligence/claim-extractor-2B-q-2605

Finetuned
Qwen/Qwen3.5-2B
Finetuned
(110)
this model

Collection including principled-intelligence/claim-extractor-2B-q-2605