# noppakorn001/project-pdpa_assistant architecture

> Architecture diagram of the GitHub repository noppakorn001/project-pdpa_assistant, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/noppakorn001/project-pdpa_assistant
- Repository: https://github.com/noppakorn001/project-pdpa_assistant

## Overview

This repository is a Thai PDPA legal-assistant prototype with a documented six-step data and model workflow plus a Streamlit chat interface. The principal user path is query handling, retrieval and answer generation, then safety checks and a cited response. The README describes the intended integrated path, while the sampled app code includes mock PII/RAG engines; it does not establish that the UI invokes the separate production modules. Evaluation and model preparation are shown as separate branches. Some module connections are documented rather than visible in the partial excerpts.

Main entry points: [`step4_rag.py`](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step4_rag.py) (Hybrid RAG), [`step6_evaluation.py`](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step6_evaluation.py) (Evaluation framework), [`app.py`](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/app.py) (Chat UI), [`pdpa_structured_chunks.json`](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/pdpa_structured_chunks.json) (Structured chunks)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_chat["Chat experience"]
  node_ui["Chat UI<br/>[app.py]"]
  node_demo["Mock engines<br/>[app.py]"]
  node_response["Cited response<br/>[app.py]"]
end

subgraph group_knowledge["Legal knowledge"]
  node_law["PDPA source<br/>[PDPA.pdf]"]
  node_chunk["Legal chunking<br/>[step1_chunking.py]"]
  node_chunks["Structured chunks"]
  node_rag["Hybrid RAG<br/>[step4_rag.py]"]
  node_vectors[("Chroma vector store<br/>[step4_rag.py]")]
end

subgraph group_model["Model development"]
  node_sdg["Synthetic QA<br/>[step2_sdg.py]"]
  node_dataset["Training data"]
  node_tune["QLoRA/GRPO<br/>[step3_finetune.py]"]
  node_adapter["Fine-tuned adapter<br/>[step3_finetune.py]"]
  node_llm["LLM inference<br/>[step4_rag.py]"]
end

subgraph group_safety["Safety and evaluation"]
  node_guard["Guardrails pipeline"]
  node_eval["Evaluation framework"]
end

subgraph group_ops["Observability"]
  node_trace["Request logging<br/>[logging_utils.py]"]
end

node_user(("Questioner"))
node_gemini["Gemini API"]

node_user -->|"asks"| node_ui
node_ui -->|"handles query"| node_demo
node_demo -->|"starts trace"| node_trace
node_law -->|"extracts text"| node_chunk
node_chunk -->|"writes chunks"| node_chunks
node_chunks -->|"provides context"| node_sdg
node_sdg -.->|"generates QA"| node_gemini
node_sdg -->|"writes dataset"| node_dataset
node_dataset -->|"trains on"| node_tune
node_tune -->|"saves adapter"| node_adapter
node_chunks -->|"indexes legal text"| node_rag
node_rag -->|"embeds and stores"| node_vectors
node_rag -->|"retrieves chunks"| node_vectors
node_rag -->|"builds prompt"| node_llm
node_llm -->|"loads adapter"| node_adapter
node_llm -.->|"none"| node_gemini
node_ui -.->|"intended safety checks"| node_guard
node_guard -.->|"filters answer"| node_response
node_demo -->|"renders answer"| node_response
node_response -->|"returns citations"| node_user
node_eval -->|"evaluates retrieval"| node_rag
node_eval -->|"red-teams safety"| node_guard
node_eval -.->|"judges answers"| node_gemini

click node_ui "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/app.py"
click node_demo "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/app.py"
click node_law "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/PDPA.pdf"
click node_chunk "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step1_chunking.py"
click node_chunks "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/pdpa_structured_chunks.json"
click node_sdg "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step2_sdg.py"
click node_dataset "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/pdpa_synthetic_data.jsonl"
click node_tune "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step3_finetune.py"
click node_adapter "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step3_finetune.py"
click node_rag "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step4_rag.py"
click node_vectors "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step4_rag.py"
click node_llm "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step4_rag.py"
click node_guard "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step5_guardrails.py"
click node_eval "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step6_evaluation.py"
click node_trace "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/logging_utils.py"
click node_response "https://github.com/noppakorn001/project-pdpa_assistant/blob/main/app.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ui,node_demo,node_response toneBlue
class node_law,node_chunk,node_chunks,node_rag,node_vectors toneAmber
class node_sdg,node_dataset,node_tune,node_adapter,node_llm,node_gemini toneMint
class node_guard,node_eval toneRose
class node_trace,node_user toneIndigo
```

## Components

### Chat experience

- [Chat UI](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/app.py): `app.py`
- [Mock engines](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/app.py): `app.py`
- [Cited response](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/app.py): `app.py`

### Legal knowledge

- [PDPA source](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/PDPA.pdf): `PDPA.pdf`
- [Legal chunking](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step1_chunking.py): `step1_chunking.py`
- [Structured chunks](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/pdpa_structured_chunks.json): `pdpa_structured_chunks.json`
- [Hybrid RAG](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step4_rag.py): `step4_rag.py`
- [Chroma vector store](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step4_rag.py): `step4_rag.py`

### Model development

- [Synthetic QA](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step2_sdg.py): `step2_sdg.py`
- [Training data](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/pdpa_synthetic_data.jsonl): `pdpa_synthetic_data.jsonl`
- [QLoRA/GRPO](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step3_finetune.py): `step3_finetune.py`
- [Fine-tuned adapter](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step3_finetune.py): `step3_finetune.py`
- [LLM inference](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step4_rag.py): `step4_rag.py`

### Safety and evaluation

- [Guardrails pipeline](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step5_guardrails.py): `step5_guardrails.py`
- [Evaluation framework](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/step6_evaluation.py): `step6_evaluation.py`

### Observability

- [Request logging](https://github.com/noppakorn001/project-pdpa_assistant/blob/main/logging_utils.py): `logging_utils.py`

### Other components

- **Questioner**
- **Gemini API**

## Connections

- Questioner → Chat UI: asks
- Chat UI → Mock engines: handles query
- Mock engines → Request logging: starts trace
- PDPA source → Legal chunking: extracts text
- Legal chunking → Structured chunks: writes chunks
- Structured chunks → Synthetic QA: provides context
- Synthetic QA → Gemini API: generates QA
- Synthetic QA → Training data: writes dataset
- Training data → QLoRA/GRPO: trains on
- QLoRA/GRPO → Fine-tuned adapter: saves adapter
- Structured chunks → Hybrid RAG: indexes legal text
- Hybrid RAG → Chroma vector store: embeds and stores
- Hybrid RAG → Chroma vector store: retrieves chunks
- Hybrid RAG → LLM inference: builds prompt
- LLM inference → Fine-tuned adapter: loads adapter
- LLM inference → Gemini API: none
- Chat UI → Guardrails pipeline: intended safety checks
- Guardrails pipeline → Cited response: filters answer
- Mock engines → Cited response: renders answer
- Cited response → Questioner: returns citations
- Evaluation framework → Hybrid RAG: evaluates retrieval
- Evaluation framework → Guardrails pipeline: red-teams safety
- Evaluation framework → Gemini API: judges answers
