Inspiration
An investigator rarely lacks data; they lack connections between data. A complaint sits in a scanned FIR, the phone trail sits in a telecom export, the money trail sits in a bank statement, and the only thing joining them is a name that may be spelled three ways — or shared by two different people. Reading each source in isolation hides the person who shows up quietly in all three.
Large language models seem like the obvious fix, but a chat model dropped on top of case files creates a worse problem: it will happily produce a confident, fluent, uncited story. In an investigative setting a plausible invention is more dangerous than no answer. We wanted the opposite design: an AI that is allowed to say only what it can point to.
What it does
PSCYPHER loads FIRs (including scanned and handwritten ones), CDR-style call records and financial transactions into a single graph, then lets an investigator work with it three ways:
- Explore – centrality, communities, strongest-evidence paths, 12 explainable anomaly detectors and multilayer link prediction.
- Ask – a Nemotron agent calls ten graph tools (entity lookup, exact relationship totals, FIR search, path finding, predicted links, privacy-screened web context) and answers in a fixed
HEADLINE / RECORD / FIR / INFERENCE / CAVEATlayout. - Verify – a citation verifier checks every cited file and
file.csv row Nagainst the evidence actually loaded and flags anything it cannot find.
The tagline of the interface is the design rule: AI proposes, evidence supports, a human verifies. Scores are explicitly leads, never verdicts.
How we built it
Right model for each job on Nebius Token Factory. We use the OpenAI-compatible Token Factory endpoint and route by role:
| Role | Model | Why |
|---|---|---|
| Specialists (×3, parallel) | Nemotron 3 Nano 30B-A3B | cheap, fast, runs concurrently |
| Agent / chat / fallback extraction | Nemotron 3 Super 120B-A12B | reliable tool calling and reasoning |
| Evidence evaluator | Super by default (Ultra-swappable via one env var) | synthesis quality |
| Scanned/handwritten FIR OCR | Nemotron 3 Nano Omni | vision + structured output |
Graph + analytics. NetworkX holds the case graph. Repeated calls or transfers between the same pair collapse into one weighted edge while every raw record keeps its source file and row. Relationship strength (call seconds, rupees) is log-compressed and min-max scaled per relation so different units are comparable:
$$w_i = 0.2 + 0.8\,\frac{\ln(1+x_i)-\min_j \ln(1+x_j)}{\max_j \ln(1+x_j)-\min_j \ln(1+x_j)}$$
Entities get a transparent, non-probabilistic Evidence Association Score
$$S(v)=100\,(0.30\,N+0.25\,A+0.20\,R+0.15\,F+0.10\,L)$$
combining network influence, anomaly signals, relationship strength, FIR corroboration and link-prediction signal.
Link prediction. One layer per relation type; Common Neighbours, Jaccard, Adamic–Adar and Personalized PageRank features are blended across layers and fed to logistic regression, evaluated with stratified k-fold cross-validation (ROC-AUC, Average Precision).
Agent safety rails. A citation verifier, a strict answer template, exact-total tools so the model never has to do arithmetic from memory, and a web-search privacy guard that blocks any outbound query containing case names, FIR wording, phone/account/UPI/IFSC/vehicle identifiers before a single byte leaves the machine.
Parallelism. The three specialist roles run concurrently via a thread pool; the UI reports wall-clock versus the sequential-equivalent time, and one failing specialist degrades gracefully instead of aborting the analysis.
Challenges we ran into
- Our own evaluation was lying to us. The first link-prediction scorer fit a classifier and then scored it on the same rows, and computed features with the held-out edges still in the graph. Both are leakage. We rebuilt it: remove test edges first, compute features from the training graph only, and score with cross-validated predictions; a separate production model is refit on the full graph purely for ranking new candidates.
- Reasoning models spend tokens thinking. Replies were sometimes empty because the budget was consumed by hidden reasoning. We raised the output budget, strip
<think>blocks, and fall back gracefully when JSON mode is refused. - Identity is the hard part. Names collide. Auto-merging homonyms would silently fuse two people into one suspect, so exact, unique matches are auto-confirmed, ambiguous ones go to a human review queue, and an FIR mention never creates an edge by itself.
- Web search can leak a case. Giving an agent a search tool is an exfiltration risk. The privacy guard screens queries first, never echoes the blocked text, and labels results as external, not evidence.
- Making numbers trustworthy. LLMs are unreliable at summing. Any "how much / how many" question is routed to a deterministic
relationship_summarytool.
What we learned
- Smaller Nemotron models are excellent for fan-out work; the larger model earns its cost on tool-calling and synthesis.
- A citation verifier changes behaviour more than any prompt wording — it makes "I can't support that" the cheap path.
- Honest evaluation beats impressive evaluation. We built a harness that scores against planted ground truth and reports hallucinated-citation rate, latency, tokens and cost per model.
- Separating observed from inferred in the output format makes review dramatically faster.
What's next
Swap the evaluator to a Nemotron Ultra-class model, add a provenance ledger for source records, role-based access and audit logs, and larger multi-case benchmarks.
All demo data is synthetic. PSCYPHER is decision support, not a guilt detector.
Log in or sign up for Devpost to join the conversation.