Nova — AI legal chatbot for Vietnamese securities
GraphRAG chatbot for Vietnamese securities and law — LLM dependency at 5% or less, no answers without evidence

Context
NOVA is a GraphRAG chatbot for Vietnam's securities and legal domain, designed over 4,781 legal document nodes with LLM query dependency held at 5% or less so it never answers without evidence. We developed a legal and financial information chatbot for customers and employees of Shinhan Securities Vietnam (SSV). Financial and legal answers must be accurate and accompanied by evidence, while investment recommendations must be blocked for regulatory reasons.
Problem
General-purpose LLM chatbots generate plausible but incorrect answers and cannot provide supporting legal provisions. Having an LLM generate database queries directly also poses significant risks to security, cost, and accuracy.
What we did
- Designed a GraphRAG architecture combining a Neo4j knowledge graph, vector search, and Claude API.
- Split query generation into 3 stages—template matching, parameter DSL, and LLM Text2Cypher—to reduce LLM dependency to 5% or less.
- Applied hallucination detection (grounding score) and 3-stage investment recommendation blocking logic to the pipeline.
- Externalized domain logic into YAML packages so another industry could be supported without code changes.
- Designed a financial ontology with 17 nodes and 21 relationships, combining FinQA, FIBO, and FinDKG.
Results
| Metric | Value | Notes |
|---|---|---|
| Legal document nodes | 4,781 records | Neo4j LegalDocument |
| Legal embeddings | 20,094 records | multilingual-e5-large, approximately 174 minutes |
| Unit tests | 122/122 passed | Based on the domain package refactoring |
| Text2Cypher dependency | 5% or less | Templates 80% · DSL 15% |
| Workbench API | 32 endpoints | Ontology · pipeline · metrics · feedback |
| On-premise payback period | 9~10 months | Estimated initial investment ₩100M, annual savings ₩130M |
Timeline · Scale · Stack
- Timeline: Design began in 2026-03 → legal embeddings and on-premise proposal in 2026-05
- Scale: 7 Docker Compose containers (Neo4j 5 · Redis 7 · PostgreSQL 16 · API · worker · beat · Nginx), 18 PostgreSQL tables
- Stack: Python · FastAPI · Neo4j · PostgreSQL+pgvector · Redis · Claude API · Docker · GraphRAG
What this case shows
In domains where errors are unacceptable, we use the LLM only as the final step in retrieval and assembly. We do not provide answers that cannot be accompanied by evidence.
Project details
July 15, 2026
2 min read