This prompt is built for security operations center (SOC) analysts, threat intelligence teams, and detection engineers who need to convert unstructured threat reports, blog posts, and advisories into structured, machine-readable relationship objects. The core job-to-be-done is ingesting narrative threat data—such as a vendor report describing a new malware variant targeting a specific vulnerability—and producing STIX 2.1-compatible relationship records that can be directly loaded into a SIEM, threat intelligence platform (TIP), or graph database. The ideal user understands cybersecurity entities (threat actors, malware families, CVEs, indicators of compromise) and needs consistent, auditable extraction rather than ad-hoc parsing.
Prompt
Domain-Specific Relationship Extraction Prompt for Cybersecurity

When to Use This Prompt
Defines the ideal job-to-be-done, user profile, and operational boundaries for the cybersecurity relationship extraction prompt.
Use this prompt when the input text contains identifiable cybersecurity entities and explicit or strongly implied relationships between them. For example, a sentence like 'APT29 exploited CVE-2023-23397 to deploy GooseEgg malware' contains a clear actor-target-technique chain that the prompt is designed to capture with confidence scores and source attribution. The prompt also handles Traffic Light Protocol (TLP) markings, ensuring that extracted relationships carry the appropriate sharing boundaries. However, do not use this prompt for general entity extraction without relationship context, or for reports where threat context is absent—such as generic IT documentation or policy papers. It is also unsuitable for extracting relationships from highly fragmented data like raw netflow or DNS logs, where the relationship signal requires statistical inference rather than natural language understanding.
Before deploying this prompt, ensure your pipeline validates the output against a STIX 2.1 schema, checks for hallucinated relationship types, and routes low-confidence extractions to human review. The prompt assumes the input text is in English and contains sufficient context to disambiguate entity references. For multi-document or cross-report relationship extraction, pair this prompt with an entity resolution step to normalize threat actor names and malware aliases before linking. If your use case involves regulated data or operational alerting, always require human approval before extracted relationships are committed to production knowledge graphs or automated blocking rules.
Use Case Fit
Where this cybersecurity relationship extraction prompt works, where it fails, and the operational conditions required before putting it into a production pipeline.
Good Fit: Structured Threat Intel Ingestion
Use when: ingesting finished threat reports, CERT advisories, or structured blog posts into a STIX-compliant graph database. Why: the prompt expects narrative prose with explicit threat actor, malware, vulnerability, and infrastructure mentions. Guardrail: pre-filter source documents for relevance before extraction to avoid wasted inference on non-cyber content.
Bad Fit: Raw Logs or IDS Alerts
Avoid when: feeding raw syslog, Suricata alerts, or unstructured netflow directly to the prompt. Why: the prompt is designed for narrative text, not machine-generated event streams. Relationships extracted from atomic alerts will be hallucinated or missing critical context. Guardrail: route raw telemetry through a SIEM correlation engine first; use this prompt only on aggregated, human-readable summaries.
Required Inputs
Must provide: a threat report text body, a target STIX relationship type vocabulary, and a TLP marking for the output. Optional but recommended: a list of known false-positive patterns specific to your threat landscape. Guardrail: if the source text lacks explicit relationship verbs (e.g., 'uses', 'targets', 'exploits'), the prompt should be instructed to return an empty relationship set rather than guessing.
Operational Risk: TLP and Classification Leakage
What to watch: the model may generate relationships that imply a higher classification or TLP level than the source document warrants, or it may fail to propagate TLP markings to every output record. Guardrail: enforce a post-extraction validation step that compares each output relationship's TLP against the input document's marking and strips or quarantines mismatches before graph insertion.
Operational Risk: Adversarial Report Poisoning
What to watch: threat reports can contain deliberate misinformation, typosquatted domains, or crafted narratives designed to pollute threat intelligence graphs. Guardrail: never auto-ingest extracted relationships into a production knowledge graph without human review for high-confidence edges. Implement a confidence threshold below which relationships are flagged for analyst triage rather than automated insertion.
Operational Risk: Entity Normalization Drift
What to watch: the same threat actor may be referred to by multiple aliases (e.g., 'APT29', 'Cozy Bear', 'The Dukes') across reports, leading to duplicate or fragmented graph nodes. Guardrail: pair this extraction prompt with a canonical entity resolution step that maps extracted names to a maintained threat actor registry before creating new graph nodes.
Copy-Ready Prompt Template
A copy-ready prompt for extracting STIX-compatible cybersecurity relationship objects from threat reports, with domain-specific false positive patterns and TLP-aware confidence scoring.
This prompt template is designed to extract structured relationship objects from cybersecurity threat reports, intelligence bulletins, and incident write-ups. It produces STIX-compatible relationship objects that link threat actors, malware, vulnerabilities, and infrastructure, with explicit TLP markings and calibrated confidence scores. The template includes domain-specific false positive patterns—such as coincidental IP co-occurrence or vendor marketing associations—that security analysts must account for when automating extraction pipelines.
textYou are a cybersecurity relationship extraction system. Your task is to read the provided threat report text and extract all meaningful relationships between cybersecurity entities. Produce a JSON array of relationship objects following the schema defined below. ## INPUT [THREAT_REPORT_TEXT] ## ENTITY TYPES TO EXTRACT RELATIONSHIPS BETWEEN - threat-actor (APT groups, criminal groups, hacktivist collectives) - malware (strains, families, variants, tools) - vulnerability (CVE identifiers, exploit techniques, weakness classes) - infrastructure (IP addresses, domains, URLs, ASNs, hosting providers) - campaign (named intrusion sets, attack campaigns) - sector (targeted industry verticals) ## RELATIONSHIP TYPES TO EXTRACT - uses (actor uses malware, actor uses infrastructure) - targets (actor targets sector, campaign targets sector) - exploits (malware exploits vulnerability, actor exploits vulnerability) - attributed-to (campaign attributed-to actor) - communicates-with (malware communicates-with infrastructure) - mitigates (patch mitigates vulnerability) - indicates (infrastructure indicates malware, infrastructure indicates campaign) - associated-with (actor associated-with actor, malware associated-with malware) ## OUTPUT SCHEMA Return a JSON array of relationship objects. Each object must have these fields: { "source_entity": { "type": "string (one of the entity types above)", "value": "string (the extracted entity name or identifier)", "source_span": "string (exact text from the report that mentions this entity)" }, "target_entity": { "type": "string", "value": "string", "source_span": "string" }, "relationship_type": "string (one of the relationship types above)", "confidence": "string (one of: high, medium, low)", "confidence_rationale": "string (brief explanation of why this confidence level was assigned)", "tlp": "string (one of: RED, AMBER, GREEN, WHITE, derived from the report's TLP marking or inferred from content sensitivity)", "evidence_snippet": "string (the exact sentence or paragraph that supports this relationship)", "is_historical": "boolean (true if the relationship describes past activity no longer active, false if current or ongoing)", "first_seen": "string or null (ISO 8601 date if mentioned, otherwise null)", "last_seen": "string or null (ISO 8601 date if mentioned, otherwise null)" } ## CONFIDENCE GUIDELINES - high: The relationship is explicitly stated in the text with clear attribution (e.g., 'APT29 used CozyBear malware') - medium: The relationship is implied or inferred from strong contextual evidence (e.g., infrastructure patterns, tool overlap) - low: The relationship is speculative, based on weak indicators, or mentioned with hedging language (e.g., 'possibly linked', 'may be associated') ## DOMAIN-SPECIFIC FALSE POSITIVE PATTERNS TO AVOID Do NOT extract relationships in these cases: 1. Coincidental IP co-occurrence: Two threat actors mentioned in the same paragraph without explicit connection language. 2. Vendor marketing associations: Statements like 'Our product protects against X and Y' do not imply X is related to Y. 3. Hypothetical scenarios: Descriptions of what an actor 'could' or 'might' do without evidence they have done it. 4. Generic sector references: 'Targets the energy sector' without naming a specific campaign or actor is not a relationship. 5. Shared tooling without attribution: Multiple actors using the same open-source tool does not imply actor-to-actor association unless explicitly stated. 6. Temporal coincidence: Two events occurring in the same timeframe without causal or operational linkage. ## CONSTRAINTS - Extract only relationships that are supported by explicit evidence in the text. - If no relationships are found, return an empty array []. - Do not invent entity names, CVE identifiers, or infrastructure values not present in the text. - Preserve the original text in source_span and evidence_snippet fields exactly as written. - If the report has a TLP marking, use it. If not, infer TLP from content sensitivity: detailed IoCs with active exploitation = AMBER, general threat descriptions = GREEN, public summaries = WHITE. - For each relationship, include at least one evidence_snippet that directly supports the connection. - Return ONLY the JSON array. No markdown fences, no explanatory text. ## EXAMPLES Example 1: Input: 'APT29 has been observed deploying WellMess malware against COVID-19 vaccine research organizations since 2020.' Output: [ { "source_entity": { "type": "threat-actor", "value": "APT29", "source_span": "APT29" }, "target_entity": { "type": "malware", "value": "WellMess", "source_span": "WellMess malware" }, "relationship_type": "uses", "confidence": "high", "confidence_rationale": "Explicitly stated with direct attribution and observed activity.", "tlp": "AMBER", "evidence_snippet": "APT29 has been observed deploying WellMess malware against COVID-19 vaccine research organizations since 2020.", "is_historical": false, "first_seen": "2020-01-01", "last_seen": null }, { "source_entity": { "type": "threat-actor", "value": "APT29", "source_span": "APT29" }, "target_entity": { "type": "sector", "value": "COVID-19 vaccine research", "source_span": "COVID-19 vaccine research organizations" }, "relationship_type": "targets", "confidence": "high", "confidence_rationale": "Explicitly stated targeting with observed deployment activity.", "tlp": "AMBER", "evidence_snippet": "APT29 has been observed deploying WellMess malware against COVID-19 vaccine research organizations since 2020.", "is_historical": false, "first_seen": "2020-01-01", "last_seen": null } ] Example 2: Input: 'Multiple threat groups including APT41 and Winnti Group have targeted the telecommunications sector. Our security suite protects against both.' Output: [ { "source_entity": { "type": "threat-actor", "value": "APT41", "source_span": "APT41" }, "target_entity": { "type": "sector", "value": "telecommunications", "source_span": "telecommunications sector" }, "relationship_type": "targets", "confidence": "medium", "confidence_rationale": "Targeting stated but without specific campaign or incident details.", "tlp": "GREEN", "evidence_snippet": "Multiple threat groups including APT41 and Winnti Group have targeted the telecommunications sector.", "is_historical": false, "first_seen": null, "last_seen": null }, { "source_entity": { "type": "threat-actor", "value": "Winnti Group", "source_span": "Winnti Group" }, "target_entity": { "type": "sector", "value": "telecommunications", "source_span": "telecommunications sector" }, "relationship_type": "targets", "confidence": "medium", "confidence_rationale": "Targeting stated but without specific campaign or incident details.", "tlp": "GREEN", "evidence_snippet": "Multiple threat groups including APT41 and Winnti Group have targeted the telecommunications sector.", "is_historical": false, "first_seen": null, "last_seen": null } ] // Note: No actor-to-actor relationship extracted because the vendor marketing statement 'Our security suite protects against both' is a false positive pattern.
To adapt this template, replace [THREAT_REPORT_TEXT] with the actual report content. If your target graph database or SIEM requires a different schema, modify the OUTPUT SCHEMA fields while preserving the confidence rationale and evidence snippet requirements—these are critical for auditability. For production pipelines, add a post-extraction validation step that checks every relationship against the false positive patterns list using a secondary classifier or rule-based filter. When processing reports with mixed TLP markings, extract the highest applicable marking per relationship rather than applying a single document-wide TLP. Always log extraction failures and empty arrays separately so you can distinguish between reports with no relationships and extraction errors.
Prompt Variables
Required and optional inputs for the Domain-Specific Relationship Extraction Prompt for Cybersecurity. Each placeholder must be populated before the prompt is assembled and sent to the model. Validation notes describe how to check that the input is fit for purpose before execution.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[SOURCE_TEXT] | Unstructured threat report text to extract relationships from | APT29 leveraged CVE-2023-42793 against a European diplomatic entity, deploying a custom backdoor tracked as GRAPEVINE. | Must be non-empty string; max 8000 tokens; check for encoding issues (UTF-8); strip non-printable characters before insertion |
[RELATIONSHIP_TYPES] | Allowed relationship predicates for extraction | ["uses", "targets", "mitigates", "attributed-to", "exploits", "communicates-with", "drops"] | Must be valid JSON array of strings; each value must match a STIX 2.1 relationship type; reject empty array; validate against controlled vocabulary before prompt assembly |
[ENTITY_TYPES] | Entity categories to recognize in source text | ["threat-actor", "malware", "vulnerability", "indicator", "identity", "campaign", "infrastructure"] | Must be valid JSON array; values must match STIX 2.1 SCO types; at least one type required; warn if types overlap with [RELATIONSHIP_TYPES] |
[TLP_MARKING] | Traffic Light Protocol marking for output sensitivity | TLP:AMBER | Must be one of TLP:RED, TLP:AMBER, TLP:GREEN, TLP:CLEAR; reject unknown values; log TLP:RED usage for audit |
[CONFIDENCE_THRESHOLD] | Minimum confidence score for including a relationship in output | 0.65 | Must be float between 0.0 and 1.0; values below 0.5 produce noisy output; values above 0.9 may suppress true positives; validate as numeric before prompt assembly |
[OUTPUT_SCHEMA] | JSON schema the output must conform to | See STIX 2.1 Relationship SDO schema with custom extensions for confidence and evidence | Must be valid JSON Schema draft-07 or later; validate schema syntax before insertion; reject schemas missing required fields (type, id, relationship_type, source_ref, target_ref) |
[MAX_RELATIONSHIPS] | Upper bound on extracted relationships to prevent runaway output | 25 | Must be positive integer; recommended range 10-50 for threat reports; values above 100 risk token exhaustion; enforce with post-extraction truncation if exceeded |
[FALSE_POSITIVE_PATTERNS] | Domain-specific patterns that should suppress extraction | ["researchers believe", "could potentially", "unconfirmed reports", "speculated that"] | Must be valid JSON array of strings; each pattern is case-insensitive regex; test against known false positive examples before deployment; empty array allowed but increases noise |
Implementation Harness Notes
How to wire the domain-specific cybersecurity relationship extraction prompt into a production application with validation, retries, logging, and human review.
This prompt is designed to be called from an application layer, not used as a standalone chat. The typical integration pattern is: fetch a threat report or intelligence document, inject it into the [SOURCE_TEXT] placeholder along with the [TARGET_ONTOLOGY] and [TLP_MARKING] parameters, call the model, validate the output against the expected STIX-compatible relationship schema, and route low-confidence or malformed results to a human review queue. The application should own document chunking if the source exceeds the model's context window—split by section or paragraph, extract relationships per chunk, and deduplicate in post-processing using the source_span and relationship_id fields.
Validation and retry logic is critical because cybersecurity workflows cannot tolerate hallucinated threat actor associations or missing infrastructure links. After the model returns, validate that every relationship object contains required fields: source_ref, target_ref, relationship_type, confidence, source_span, and tlp. Check that relationship_type values match the allowed taxonomy from [TARGET_ONTOLOGY]—unexpected types should trigger a retry with the error message injected into [PREVIOUS_ERRORS]. Set a maximum of two retries before routing to human review. For confidence thresholds, route any relationship with confidence below 0.7 to a review queue, and flag any batch where more than 20% of relationships fall below threshold as a potential document quality or prompt mismatch issue. Log every extraction attempt with the model version, prompt hash, source document identifier, and validation outcome for auditability.
Model choice and tool integration depend on your deployment constraints. For classified or air-gapped environments, use an on-premises model with strong instruction-following and JSON mode support. For unclassified threat intelligence, GPT-4o or Claude 3.5 Sonnet with structured outputs enabled provide reliable schema adherence. If your pipeline ingests STIX bundles directly, wire the validated relationship objects into a STIX 2.1 bundle generator—do not ask the model to produce the full bundle wrapper, only the relationship objects. For graph database ingestion, transform the validated relationships into Cypher MERGE statements in the application layer, using the source_ref and target_ref as lookup keys against existing node identifiers. Never pass raw model output directly to a graph write operation without schema validation and duplicate detection.
Common failure modes to instrument for: the model may extract relationships from hypothetical or historical examples embedded in the threat report rather than from the report's primary narrative—watch for relationships where source_span points to a background or example section. The model may also over-extract by linking every mentioned entity pair, producing a dense graph with low-confidence noise edges. Mitigate this by including explicit negative examples in [FEW_SHOT_EXAMPLES] that show when NOT to extract a relationship. Finally, monitor for taxonomy drift where new threat actor aliases or malware families appear that don't map to your [TARGET_ONTOLOGY]—log unmapped values and feed them into your ontology update process rather than forcing the model to guess a mapping. The application should emit metrics on extraction volume, confidence distribution, validation failure rate, and review queue depth to detect degradation early.
Expected Output Contract
Defines the exact structure, types, and validation rules for the STIX-compatible relationship objects produced by the prompt. Use this contract to build downstream ingestion validators and to detect malformed or incomplete outputs before they enter a graph database or SIEM.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
relationship_type | string (enum) | Must match one of the allowed STIX 2.1 relationship types (e.g., 'uses', 'targets', 'mitigates', 'indicates', 'attributed-to'). Reject any value not in the predefined enum list. | |
source_ref | string (STIX ID) | Must be a valid STIX 2.1 identifier (e.g., 'threat-actor--...', 'malware--...'). Regex check: ^[a-z-]+--[0-9a-fA-F-]{36}$. Must correspond to an entity extracted from the source text. | |
target_ref | string (STIX ID) | Must be a valid STIX 2.1 identifier. Must not be identical to source_ref. Must correspond to an entity extracted from the source text. | |
confidence | integer (0-100) | Must be an integer between 0 and 100 inclusive. A value of 0 indicates the model has no confidence. If the model cannot determine a score, it must default to null, not 0, to distinguish absence from zero confidence. | |
description | string | If present, must be a non-empty string summarizing the evidence for the relationship. Must not exceed 500 characters. Null is allowed when no descriptive context is available. | |
source_evidence | array of objects | Must contain at least one object with 'quote' (string, exact text from source) and 'span' (object with 'start' and 'end' integer offsets). Validate that the quoted text exists at the given span in the original [INPUT_TEXT]. | |
object_marking_refs | array of strings | If present, must contain valid TLP marking definitions (e.g., 'marking-definition--613f2e26-407d-48c7-9eca-b8e91df99dc9' for TLP:RED). Default to 'marking-definition--94868c89-18c2-464b-8b2a-1c5e4c8e8e7e' for TLP:CLEAR if not specified by [TLP_LEVEL]. | |
external_references | array of objects | If present, each object must have a 'source_name' (string) and 'url' (string) or 'external_id' (string). Validate URL format if provided. Null is allowed. |
Common Failure Modes
Cybersecurity relationship extraction fails in predictable ways. These are the most common production failure modes and the specific guardrails that catch them before they corrupt downstream threat intelligence.
Hallucinated Threat Actor Aliases
What to watch: The model invents plausible-sounding APT group names or aliases not present in the source text, especially when the report mentions an unnamed actor. Guardrail: Require exact source-span citation for every threat actor label. Add a validator that rejects any actor name not appearing verbatim in the input or in an allowed canonical alias list.
Infrastructure-IOC Role Confusion
What to watch: The model extracts an IP or domain but assigns the wrong relationship type—labeling a C2 server as a phishing landing page, or a legitimate CDN node as attacker infrastructure. Guardrail: Include a confidence field per relationship and flag any infrastructure assignment where the source text contains ambiguous or hedging language. Route low-confidence infrastructure relationships to human review.
Temporal Scope Drift
What to watch: The model extracts a relationship that was true historically but is presented as currently active, or conflates a past campaign with an ongoing one. Guardrail: Require a first_seen and last_seen timestamp on every relationship, defaulting to the report publication date when the source is silent. Add a validator that rejects relationships with no temporal grounding.
TLP and Classification Leakage
What to watch: The model extracts a relationship from a TLP:AMBER report but fails to propagate the TLP marking to the output relationship object, risking downstream dissemination violations. Guardrail: Make TLP marking a required field on every extracted relationship. Add a post-extraction check that rejects any relationship object missing a TLP value or carrying a marking inconsistent with the source document header.
Vulnerability-CVE Over-Association
What to watch: The model links a threat actor to every CVE mentioned in the same report, even when the text only describes the actor exploiting one specific vulnerability. Guardrail: Require explicit exploit evidence in the source span for every exploits relationship. Add a validator that checks whether the CVE and actor appear in the same sentence or adjacent sentences with an active exploitation verb.
Campaign Fragmentation and Duplication
What to watch: The model creates multiple distinct campaign nodes for what is actually a single named operation, or merges unrelated campaigns because they share a malware family. Guardrail: Normalize campaign names against a controlled vocabulary before ingestion. Add a deduplication step that flags relationships referencing campaign names not in the canonical list and routes them for analyst disambiguation.
Evaluation Rubric
Use this rubric to test the quality of extracted cybersecurity relationships before integrating them into a STIX-compatible graph or SIEM. Each criterion targets a known failure mode in threat intelligence extraction.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
STIX Relationship Type Validity | Every relationship object maps to a valid STIX 2.1 relationship type (e.g., 'uses', 'targets', 'attributed-to', 'mitigates') | Output contains a relationship type not in the allowed STIX enum or uses a generic placeholder like 'related-to' | Validate the [RELATIONSHIP_TYPE] field against a hardcoded STIX relationship enum list |
Entity Grounding | Both [SOURCE_REF] and [TARGET_REF] correspond to STIX objects explicitly extracted from the [INPUT_TEXT] with a defined [ENTITY_ID] | A relationship references an entity ID that was not extracted from the text or was hallucinated | Cross-reference relationship endpoints against the set of extracted entity IDs from the same document |
Confidence Calibration | [CONFIDENCE] is an integer from 0-100, where scores below 50 indicate explicit uncertainty language in the source text | High confidence (e.g., 90) is assigned to a relationship described with speculative language like 'may have been' or 'possibly' | Use an LLM-as-judge to compare the [CONFIDENCE] score against the hedging language in the [EVIDENCE_SNIPPET] |
TLP Marking Adherence | The [TLP] field is set to one of the four canonical values: 'TLP:RED', 'TLP:AMBER', 'TLP:GREEN', or 'TLP:CLEAR' | The [TLP] field is missing, null, or contains a non-standard value like 'TLP:WHITE' | Validate the [TLP] field with a simple string match against the four allowed TLP values |
False Positive Pattern Avoidance | The output does not extract a relationship for known false positive patterns, such as vulnerability scanning noise or generic OSINT tool mentions | A relationship is extracted for a common network scanner (e.g., 'nmap') targeting a generic IP, which is a known noisy false positive | Maintain a blocklist of low-fidelity indicators and check if [SOURCE_REF] or [TARGET_REF] matches a blocklist entry |
Evidence Completeness | Every relationship includes a non-empty [EVIDENCE_SNIPPET] that is a verbatim quote from the [INPUT_TEXT] supporting the relationship | The [EVIDENCE_SNIPPET] is an empty string, a hallucinated summary, or a quote that does not support the stated relationship | Use a substring check to verify the [EVIDENCE_SNIPPET] exists within the [INPUT_TEXT] |
Null Relationship Handling | The output returns an empty list if no threat relationships are present in the [INPUT_TEXT], rather than forcing a low-confidence guess | A relationship is generated for a document that is purely a policy statement or a list of IOCs with no relational context | Test with a negative case document containing only a malware hash list and assert that the output list is empty |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Use the base prompt with a frontier model (GPT-4o, Claude 3.5 Sonnet) and minimal post-processing. Focus on getting the STIX relationship structure right before adding validation layers. Run a small batch of threat reports and manually review every output.
codeExtract cybersecurity relationships from [THREAT_REPORT]. Output JSON with: source_ref, target_ref, relationship_type, confidence (0-100), description, source_snippet.
Watch for
- Relationship type drift (e.g.,
usesvsexploitsvstargetsfor the same pair) - Missing TLP markings on extracted relationships
- Confidence scores that don't match evidence strength
- Hallucinated CVE IDs or threat actor names not present in source text

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us