๋ฌธ์ ์ ๋ขฐ๋ & ESGยท๊ทธ๋ฆฐ์์ฑ ์ํ๋ ๋ถ์ ๋๊ตฌ
ํ๊ฒฝ ๊ด๊ณ /ESG ๋ฌธ์/์ผ๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ฌธ์ฅ ๋จ์๋ก ๋ถ์ํด ๊ทผ๊ฑฐ ๋ถ์กฑยท๋ชจํธํ ํํยท๋ฒ์ ๊ณผ์ฅ ๋ฑ์ ์ ์ํํ๊ณ , ์์ ์ํ ๋ฌธ์ฅ๋ง LLM์ผ๋ก ์ฌ์ธต ๋ถ์ํด ๋ฆฌํฌํธ๊น์ง ๋ง๋ค์ด ์ฃผ๋ ๋๊ตฌ์ ๋๋ค.
VeriAI๋ ๋ค์๊ณผ ๊ฐ์ ์ํฌํ๋ก์ฐ๋ก ๋์ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ํ ์คํธ๋ฅผ ๋ถ์ฌ๋ฃ๊ฑฐ๋, URL์ ์ ๋ ฅํ๋ฉด ๋ณธ๋ฌธ์ ์ถ์ถํฉ๋๋ค.
- ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น(
config/ad_rules.json,config/report_rules.json)์ ๋ฐ๋ผ
๊ฐ ๋ฌธ์ฅ์ ์ฆ๊ฑฐ์ฑ, ๋ชจํธ์ฑ, ๋ฒ์, ์์ , ์ธ์ด์ ์ํ, ์คํ์ ์์กด๋ ๋ฑ์ ์ ๋ํํฉ๋๋ค. - ๋ฌธ์ฅ๋ณ๋ก 0โ100 ์ฌ์ด์ ์ํ๋ ์ ์ risk์ ๋ฑ๊ธ High/Medium/Low๋ฅผ ๋ถ์ฌํฉ๋๋ค.
- ์ํ๋๊ฐ ๋์ ์์ K๊ฐ ๋ฌธ์ฅ์ ๊ณจ๋ผ OpenAI LLM์ ๋ณด๋ด,
- ํ๊ฒฝ ๊ด๊ณ ๋ชจ๋: ์ ๊ทธ๋ฆฐ์์ฑ ์ํ์ด ์๋์ง, ์ด๋ค ๊ทผ๊ฑฐ๊ฐ ์ถ๊ฐ๋์ด์ผ ํ๋์ง
- ์ผ๋ฐ ๋ณด๊ณ ์ ๋ชจ๋: ์ด๋ค ์์น/๋ฐฉ๋ฒ/ํ/์ธ์ฉ์ด ๋ถ์กฑํ์ง
๋ฅผ JSON ํํ๋ก ๋ฐ์์ต๋๋ค.
- ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ๋์๋ณด๋ Streamlit๋ก ํ์ํ๊ณ ,
CSV / PDF ๋ฆฌํฌํธ๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
VeriAI is an AI-assisted document checker for:
- ESG / environmental advertisements (greenwashing risk)
- General business / technical reports (evidence & clarity)
It:
- Splits documents into sentences
- Scores each sentence with rule-based features
- Sends only the riskiest ones to an LLM for deeper review
- Provides interactive visualizations and exports (CSV, PDF)
- ๐ 2025 ์บก์คํค ๋์์ธ ๊ฒฝ์ง๋ํ ์ฐ์์ ์์
- ๐ 2025 ์บก์คํค ๋์์ธ ๊ฒฝ์ง๋ํ ESG ์ฐ์์ ์์
- ๐ ์ผ๋ณธ ํ์ ๊ต๋ฅํ ํ๋ก์ ํธ ๋ฐํ ์ ์
ํด๋น ํ๋ก์ ํธ๋ ์ค๋ฌดยทํ์ ์ ์ผ๋ก ๋ชจ๋ ์ธ์ ๋ฐ์ ๊ฒ์ฆ๋ ํ๋ก์ ํธ์ ๋๋ค.
- ๐ฅ ์
๋ ฅ
- ํ ์คํธ ์ง์ ์ ๋ ฅ
- URL ์
๋ ฅ โ
trafilatura๋ก ๋ณธ๋ฌธ ์๋ ์ถ์ถ
- โ๏ธ ๊ท์น ๊ธฐ๋ฐ ์ ๋ ๋ถ์
- ์์นยท์ฐ๋ยทํ์คยท์ 3์ ๊ฒ์ฆ ๋ฑ ๊ทผ๊ฑฐ ์ ์(evidence_score)
- ๋ชจํธ์ด/๊ณผ์ฅ/๋ฏธ๋์์ ๋ฑ ๋ชจํธ์ฑ ์ ์(vagueness_score)
- ์ ์ฉ ๋ฒ์/์์ /์คํ์ ์ฌ์ฉ์ ๋ฐ๋ฅธ ์ํ๋
- 0โ100 ์ํ๋(risk) + High/Medium/Low ๋ผ๋ฒจ ๋ถ์ฌ
- ๐งพ ๋ ๊ฐ์ง ๋ถ์ ๋ชจ๋
ํ๊ฒฝ ๊ด๊ณ (Ad): ESGยท๊ทธ๋ฆฐ์์ฑ ์ค์ฌ ๊ท์น์ผ๋ฐ ๋ณด๊ณ ์ (Report): ์ฐ๊ตฌ/๊ธฐ์ /๋น์ฆ๋์ค ๋ณด๊ณ ์์ฉ ์ฆ๊ฑฐ์ฑ ๊ท์น
- ๐ง LLM ์ฌ์ธต ๋ถ์
- ์์ ์ํ ๋ฌธ์ฅ K๊ฐ๋ง LLM์ ์ ๋ฌ
- ๊ด๊ณ ๋ชจ๋:
risk_reasons,explanation,evidence_needed,suggested_queries๋ฑ - ๋ณด๊ณ ์ ๋ชจ๋:
issues,what_to_add(metrics/method/tables_figures/citations)๋ฑ
- ๐ ์๊ฐํ & XAI
- ๋ฌธ์ฅ๋ณ ์ํ๋ ์ค์บํฐ ํ๋กฏ
- ์ํ ์์ธ Stacked Bar ์ฐจํธ
- SHAP Waterfall Plot์ผ๋ก ์ ์๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด์ก๋์ง ์ค๋ช
- ๐ค ๋ด๋ณด๋ด๊ธฐ
- ์ ์ฒด ๊ฒฐ๊ณผ CSV ๋ค์ด๋ก๋
- ์์ฝ + LLM ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ PDF ๋ฆฌํฌํธ ์์ฑ
VeriAI๋ ๊ท์น ๊ธฐ๋ฐ ์ํ๋ ๋ถ์ + LLM ์ฌ์ธต ๋ถ์์ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์กฐ๋ก ๋์ํฉ๋๋ค.
์ ์ฒด ํ๋ฆ์ ์๋์ ๊ฐ์ต๋๋ค:
User Input (Text / URL)
โ
parsers.py
- URL ์ ๋ ฅ ์ ๋ณธ๋ฌธ ํฌ๋กค๋ง(trafilatura)
- HTML/๋ถํ์ ์์ ์ ๊ฑฐ ํ ์์ ํ ์คํธ ์ถ์ถ
โ
rules.py
- ๋ฌธ์ฅ ๋ถ๋ฆฌ
- ๊ท์น ๊ธฐ๋ฐ Feature ์ถ์ถ
(evidence, vagueness, coverage, temporal, language-risk ๋ฑ) - ๊ฐ์ค์น๋ฅผ ์ ์ฉํ์ฌ 0โ100 ์ํ๋(risk) ์ฐ์ถ
- High / Medium / Low ๋ฑ๊ธ ๋ถ๋ฅ
โ
llm.py
- ์ํ๋ ์์ K๊ฐ ๋ฌธ์ฅ ์ ๋ณ
- ๊ด๊ณ /๋ณด๊ณ ์ ๋ชจ๋์ ๋ง์ถฐ LLM์๊ฒ JSON ํ์์ผ๋ก ๋ถ์ ์์ฒญ
- ํ์ํ ์ฆ๊ฑฐ/๋ชจํธ์ฑ/๋ฌธ์ ์ ๋ฑ์ ๊ตฌ์กฐํํด ๋ฐํ
โ
report.py
- ๊ท์น ๊ธฐ๋ฐ + LLM ๋ถ์ ๊ฒฐ๊ณผ ์ข ํฉ
- PDF/CSV ๋ฆฌํฌํธ ์์ฑ(FPDF)
โ
app.py (Streamlit UI)
- ํ
์คํธ ์
๋ ฅ โ ๋ถ์ โ ์๊ฐํ(ํ/๊ทธ๋ํ/SHAP) โ ๋ฆฌํฌํธ ๋ค์ด๋ก๋๊น์ง
์ ์ฒด ์ํฌํ๋ก์ฐ๋ฅผ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ก ์ ๊ณต
- parsers.py โ URL ๋ณธ๋ฌธ ํ ์คํธ ํฌ๋กค๋ง
- rules.py โ ๊ท์น ๊ธฐ๋ฐ ์ ์ ๊ณ์ฐ (ad_rules.json / report_rules.json ์ฌ์ฉ)
- llm.py โ OpenAI API(gpt-๊ณ์ด) ๊ธฐ๋ฐ ์ฌ์ธต ๋ถ์
- report.py โ PDF/CSV ๋ฆฌํฌํธ ์์ฑ
- app.py โ Streamlit UI ๋ฐ ์ ์ฒด ํ๋ก์ธ์ค ์ค์ผ์คํธ๋ ์ด์
VeriAI์ ๊ท์น ๊ธฐ๋ฐ ์ ์ ๊ณ์ฐ์ config ํด๋์ JSON ํ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค.
์ด ํ์ผ๋ค์ ์์ ํ๋ฉด Python ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ๊ท์น์ ์ฝ๊ฒ ํ์ฅยท์กฐ์ ํ ์ ์์ต๋๋ค.
-
config/ad_rules.jsonโ ํ๊ฒฝ ๊ด๊ณ / ESG ๋ง์ผํ ๋ฌธ์ฅ์ฉ ๊ท์น ์ธํธ- ๊ณต์ ๊ฑฐ๋์์ํ์ ํ๊ฒฝ ๊ด๋ จ ํ์ยท๊ด๊ณ ์ ๊ดํ ์ฌ์ฌ์ง์นจ์์ ์ ์ํ๋ ํํ ์ ํ๊ณผ ์์ ๋ฌธ๊ตฌ๋ฅผ ์ฐธ๊ณ ํด, ๋ชจํธํ ์นํ๊ฒฝ ํํ, ๊ณผ์ฅยท์ ๋ ํํ, ๊ทผ๊ฑฐ ์๋ ํ๊ฒฝ ์ฃผ์ฅ, ํ์์ค๋ฆฝ/์์ ๊ด๋ จ ์ฉ์ด ๋ฑ์ ๋ ์์ฝ(lexicon)์ผ๋ก ์ ๋ฆฌํ์ต๋๋ค.
- ์ฃผ์ ๊ตฌ์ฑ
weights: evidence, vagueness, coverage, temporal, language, offset_risk ๋ฑ์ ๊ฐ์ค์นthresholds: High / Medium / Low ๋ฑ๊ธ์ ๋๋๋ ๊ธฐ์ค๊ฐregex: ์ซ์+๋จ์, ์ฐ๋, ๋ฒ์(scope), URL, ๊ธ์ก, ๊ฐ์ถ/์ฆ๊ฐ %, ์์ ํํ ๋ฑ์ ํจํดlexicons: vague / overclaim / future / offset_terms / greenwashing_keywords ๋ฑ ํต์ฌ ๋จ์ดยท๊ตฌ ๋ชฉ๋ก
-
config/report_rules.jsonโ ์ผ๋ฐ ๋ณด๊ณ ์ / ์ฐ๊ตฌยท๋น์ฆ๋์ค ๋ฌธ์ฅ์ฉ ๊ท์น ์ธํธ- ์ฐ๊ตฌ ๋ฐฉ๋ฒ, ํ๋ณธ, ํต๊ณ ์ ๋ณด, ์ธ์ฉยท์ฐธ๊ณ ๋ฌธํ, ํยท๊ทธ๋ฆผ ์ธ๊ธ ๋ฑ ์ฆ๊ฑฐ์ฑ Evidence ๊ด๋ จ ์์์ ์ง์คํด ์ค๊ณํ์ต๋๋ค.
- ๊ตฌ์กฐ๋
ad_rules.json๊ณผ ๋์ผํ์ง๋ง, ๋ ผ๋ฌธยท๋ณด๊ณ ์ ๋๋ฉ์ธ์ ๋ง๋ ์ ๊ท์(regex)๊ณผ ๋ ์์ฝ์ ์ฌ์ฉํฉ๋๋ค.- ์: ์ธ์ฉ ํ์([1], (Kim, 2024)), DOI, ํยท๊ทธ๋ฆผ(Figure/Table), ํต๊ณ ์งํ(p-value, CI, n=โฆ) ๋ฑ ํ์ง
์ด ๊ท์น ์ค์ ํ์ผ๋ค์ ๊ธฐ๋ฐ์ผ๋ก rules.py๊ฐ ๋ฌธ์ฅ๋ณ Feature๋ฅผ ์ถ์ถํ๊ณ ,
๊ฐ์ค์น๋ฅผ ์ ์ฉํด 0โ100 ์ฌ์ด์ ์ต์ข
์ํ๋ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- Python 3.10+
- Virtual Environment (venv)
- Streamlit โ ์น UI ๋ฐ ๊ฒฐ๊ณผ ์๊ฐํ
- Plotly / Matplotlib โ ๊ทธ๋ํ ๋ฐ ์ํ๋ ๋ถํฌ ์๊ฐํ
- SHAP โ ๊ท์น ๊ธฐ๋ฐ ์ ์ ๊ธฐ์ฌ๋ ์๊ฐํ
- OpenAI API (GPT ๊ณ์ด) โ ๊ณ ์ํ ๋ฌธ์ฅ ์ฌ์ธต ๋ถ์
- RapidFuzz โ ๋ฌธ์ฅ ๋น๊ต ๋ฐ ์ ์ฌ๋ ๊ธฐ๋ฐ ๊ฒ์ฌ
- Trafilatura โ URL ๋ณธ๋ฌธ ํฌ๋กค๋ง ๋ฐ ์ถ์ถ
- FPDF / Pillow โ PDF ๋ฆฌํฌํธ ์์ฑ ๋ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
- pandas / numpy โ ์ ์ ๊ณ์ฐ ๋ฐ ํ ์ด๋ธ ์ฒ๋ฆฌ
- json โ ๊ท์น(ad_rules/report_rules) ๋ก๋ฉ ๋ฐ ์ค์ ์ฒ๋ฆฌ
- python-dotenv โ ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ (.env)
- config/ โ ๊ท์น ๊ธฐ๋ฐ ์ค์ฝ์ด๋ง JSON ํ์ผ ์ ์ฅ
- Git / GitHub
git clone https://github.com/leenamho2000/VeriAI.git
cd VerAIpython -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activatepip install -r requirements.txtrequirements.txt์๋ ๋๋ต ๋ค์๊ณผ ๊ฐ์ ํจํค์ง๋ค์ด ํฌํจ๋ฉ๋๋ค:
- streamlit, openai, python-dotenv
- pandas, numpy, plotly, matplotlib, shap
- rapidfuzz, trafilatura, fpdf, pillow ๋ฑ
๋ฃจํธ ๋๋ ํ ๋ฆฌ์ .env ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
OPENAI_API_KEY=your_openai_api_key_here
# ์ ํ ์ต์
OPENAI_MODEL=gpt-4o-mini
OPENAI_MAX_OUT_TOKENS=1200OPENAI_API_KEY๋ ํ์์ ๋๋ค.- ํ์ํ๋ค๋ฉด ๋ชจ๋ธ๋ง/ํ ํฐ ์๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
streamlit run app.py๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ์ฃผ์๋ก ์ ์ํ ์ ์์ต๋๋ค.
1. ๋ถ์ ๋ชจ๋ ์ ํ
์ฌ์ด๋๋ฐ์์ ํ๊ฒฝ ๊ด๊ณ (Ad)๋๋ ์ผ๋ฐ ๋ณด๊ณ ์ (Report)๋ฅผ ์ ํํฉ๋๋ค.
2. ํ ์คํธ/URL ์ ๋ ฅ
- ํ ์คํธ ๋ฐ์ค์ ๋ถ์ํ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ๊ฑฐ๋
- URL์ ์
๋ ฅํ๊ณ
URL ๋ณธ๋ฌธ ๋ถ๋ฌ์ค๊ธฐ๋ฒํผ์ ๋๋ฆ ๋๋ค.
3. ๐ ๋ถ์ํ๊ธฐ ํด๋ฆญ
- ๋ฌธ์ฅ์ด ์๋ ๋ถํ ๋๊ณ , ๊ฐ ๋ฌธ์ฅ์ ๋ํ ์ํ๋/๋ฑ๊ธ/์ ์๋ค์ด ๊ณ์ฐ๋ฉ๋๋ค.
4. ๊ฒฐ๊ณผ ํ์
๊ฐ์(ํ)ํญ: ๋ฌธ์ฅ๋ณ ์ ์ ํ ์ด๋ธ + ๊ฒ์ ๊ธฐ๋ฅ๋ฌธ์ฅ๋ณ ํ์ํญ: ์ ํํ ๋ฌธ์ฅ์ ๋ํ ๊ท์น ํํธ, SHAP Waterfall Plot ๋ฑ ์์ธํ ๋ถ์์๊ฐํํญ: ์ํ๋ ๋ถํฌ, ๊ตฌ์ฑ์์ ๊ธฐ์ฌ๋ ๋ฐ ์ฐจํธ
5. LLM ํ์ฒ๋ฆฌ & ๋ฆฌํฌํธ
๋ด๋ณด๋ด๊ธฐํญ์์ - Top-K ์ํ ๋ฌธ์ฅ์ ๊ธฐ์ค์ผ๋ก LLM ๋ถ์ ์คํ (๊ด๊ณ /๋ณด๊ณ ์ ๋ชจ๋์ ๋ง๊ฒ) - ์ ์ฒด ๊ฒฐ๊ณผ CSV ๋ค์ด๋ก๋ - PDF ๋ฆฌํฌํธ ์์ฑ ๋ฐ ๋ค์ด๋ก๋
๊ฐ ๋ฌธ์ฅ์ ์๋์ ๊ฐ์ ์์๋ก๋ถํฐ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- Evidence score 0-16
- ์์น + ๋จ์, ์ฐ๋, ํ์ค/๋ฐฉ๋ฒ๋ก , ์ 3์ ๊ฒ์ฆ, URL/์ธ์ฆ/๊ธ์ก ์ ๋ณด ๋ฑ
- Vagueness score 0-16
- ๋ชจํธํ ESG ๋ง์ผํ ์ฉ์ด, ๊ณผ์ฅ ํํ, ๋ฏธ๋ ์์ , ๊ทธ๋ฆฐ์์ฑ ํซ ํค์๋ ๋ฑ
- Coverage / Temporal / Language / Offset
- "์ ์ฌ/์ ์ ํ/์ ์ธ๊ณ" ์์ ๋ฒ์ ๊ณผ์ฅ
- ๊ธฐํยท๋ง์ผ์คํค ์์ด ๋ชฉํ๋ง ์ธ๊ธ
- ๊ณผ์ฅยทํ์ธ ํํ, ์คํ์ ์์กด ๋ฑ์ ๋ํ ์ํ๋
์ด ํผ์ฒ๋ค์ ๊ฐ์คํฉํด 0-100 ์ฌ์ด์ ์ํ๋ risk๋ฅผ ๋ง๋ค๊ณ , ์๊ณ๊ฐ์ ๋ฐ๋ผ High / Medium / Low ๋ผ๋ฒจ์ ๋ถ์ฌํฉ๋๋ค.
- ํ๊ฒฝ ๊ด๊ณ ๋ชจ๋ Ad
risk_reasons: ๋ชจํธ์ด, ๋ฒ์๊ณผ๋, ๊ทผ๊ฑฐ๋ถ์กฑ, ๋ฏธ๋์์ ยท๊ณํ๋ถ์ฌ ๋ฑexplanation: ์ ๊ทธ ๋ฌธ์ฅ์ด ๊ทธ๋ฆฐ์์ฑ ์ํ์ด ์๋์ง ์์evidence_needed: ํ์ํ ์์น/๊ธฐ์ค์ฐ๋/๋ฒ์/์ธ๋ถ๊ฒ์ฆ ๋ฑsuggested_queries: ๊ฒ์ฆยท๊ทผ๊ฑฐ ํ๋ณด๋ฅผ ์ํ ๊ฒ์ ์ฟผ๋ฆฌ
- ์ผ๋ฐ ๋ณด๊ณ ์ ๋ชจ๋ Report
issues: weasel word, ๊ทผ๊ฑฐ/์ถ์ฒ ๋ถ์ฌ, ํ๋ณธ ์ ๋ณด ๋ถ์กฑ ๋ฑwhat_to_add.metrics/method/tables_figures/citations: ์ด๋ค ์งํยท๋ฐฉ๋ฒยทํ/๊ทธ๋ฆผยท์ธ์ฉ์ ์ถ๊ฐํด์ผ ํ๋์ง ๊ตฌ์กฐํ๋ ์ ์
์ด ๊ฒฐ๊ณผ๋ PDF ๋ฆฌํฌํธ์๋ ํจ๊ป ํฌํจ๋ฉ๋๋ค.
- URL + PDF + ์ด๋ฏธ์ง OCR ๋ฑ ์ ๋ ฅ ์ฑ๋ ํ์ฅ
- ๊ด๊ณ /๋ณด๊ณ ์ ์ธ์ ์๋ก์ด ๋ถ์ ๋ชจ๋ ์ถ๊ฐ
- AI ๊ธฐ๋ฐ ์๋ ์์ฝ ๋ฐ ๋ฆฌํฌํธ ํ ํ๋ฆฟ ๊ณ ๋ํ
- ์ฌ์ฉ์ ๊ณ์ /ํ์คํ ๋ฆฌ ์ ์ฅ ๊ธฐ๋ฅ
- AWS/GCP ๊ธฐ๋ฐ ์น ์๋น์ค ํํ๋ก ๋ฐฐํฌ
- ๊ท์น ์ธํธ(ad_rules, report_rules) ์ง์ ์ ๋ฐ์ดํธ
์ด ํ๋ก์ ํธ๋ MIT License ํ์ ๋ฐฐํฌ๋ฉ๋๋ค.
์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ๊ณ ํ์ธ์.
- Maintainer: Namho Lee
- Email: leenamho2000@gmail.com
- Github: https://github.com/leenamho2000


