kcsc-mcp / src /practical_concepts.py
nicefree19's picture
Upload 105 files
0ee3c92 verified
Raw
History Blame Contribute Delete
39.2 kB
"""Concept-level planning for practical construction-standard questions.
The retrieval stack is intentionally code-centric, but real field questions
often start from practical terms that do not appear as a standard title. This
module maps those terms to a conservative bundle of likely standards and to an
answer contract that clients can expose before making final judgments.
"""
from __future__ import annotations
from typing import Any
from src.standard_codes import canonical_doc_type, normalize_standard_code
TRANSFER_BEAM_CODES = [
{
"code": "KDS 14 20 24",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ์ŠคํŠธ๋Ÿฟ-ํƒ€์ด๋ชจ๋ธ ๊ธฐ์ค€",
"role": "D-region, ๊นŠ์€๋ณด, ํ•˜์ค‘ ๋ถˆ์—ฐ์†๋ถ€์˜ ํž˜ ์ „๋‹ฌ ๋ชจ๋ธ ๊ฒ€ํ† ",
"parent_doc_score": 0.88,
},
{
"code": "KDS 14 20 22",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ์ „๋‹จ ๋ฐ ๋น„ํ‹€๋ฆผ ์„ค๊ณ„๊ธฐ์ค€",
"role": "์ „๋‹จ, ์‚ฌ์ธ์žฅ ๊ท ์—ด, ์ „๋‹จ๋ณด๊ฐ• ๊ฒ€ํ† ",
"parent_doc_score": 0.84,
},
{
"code": "KDS 14 20 20",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ํœจ ๋ฐ ์••์ถ• ์„ค๊ณ„๊ธฐ์ค€",
"role": "ํœจ, ์••์ถ•, ๋‹จ๋ฉด ๊ฐ•๋„ ๋ฐ ์‚ฌ์šฉ์„ฑ ๊ฒ€ํ† ",
"parent_doc_score": 0.82,
},
{
"code": "KDS 14 20 50",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ์ฒ ๊ทผ์ƒ์„ธ ์„ค๊ณ„๊ธฐ์ค€",
"role": "์ „์ด๋ถ€ ์ฒ ๊ทผ ์ƒ์„ธ, ๋ณด๊ฐ•๊ทผ ๋ฐฐ์น˜, ํ”ผ๋ณต ๊ฒ€ํ† ",
"parent_doc_score": 0.78,
},
{
"code": "KDS 14 20 52",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ์ •์ฐฉ ๋ฐ ์ด์Œ ์„ค๊ณ„๊ธฐ์ค€",
"role": "์ฃผ๊ทผ ์ •์ฐฉ, ์ด์Œ ์œ„์น˜, ์ •์ฐฉ ์„ฑ๋Šฅ ๊ฒ€ํ† ",
"parent_doc_score": 0.76,
},
{
"code": "KDS 41 17 00",
"title": "๊ฑด์ถ•๋ฌผ ๋‚ด์ง„์„ค๊ณ„๊ธฐ์ค€",
"role": "์ „์ด์ธต, ์ˆ˜์ง ๋ถˆ์—ฐ์†, ๋‚ด์ง„ ์„ฑ๋Šฅ ๊ฒ€ํ† ",
"parent_doc_score": 0.72,
},
{
"code": "KDS 17 10 00",
"title": "๋‚ด์ง„์„ค๊ณ„ ์ผ๋ฐ˜",
"role": "๋‚ด์ง„ ์ผ๋ฐ˜ ์›์น™ ๋ฐ ์ค‘์š”๋„ ๊ฒ€ํ† ",
"parent_doc_score": 0.69,
},
{
"code": "KCS 14 20 11",
"title": "์ฒ ๊ทผ๊ณต์‚ฌ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์ฒ ๊ทผ ์กฐ๋ฆฝ, ๋ฐฐ๊ทผ ๊ฐ„๊ฒฉ, ์ •์ฐฉยท์ด์Œ ์‹œ๊ณต ๊ฒ€์ธก",
"parent_doc_score": 0.66,
},
{
"code": "KCS 14 20 12",
"title": "๊ฑฐํ‘ธ์ง‘ ๋ฐ ๋™๋ฐ”๋ฆฌ๊ณต์‚ฌ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์ „์ด๋ณด ํ•˜๋ถ€ ๋™๋ฐ”๋ฆฌ, ์ธก์••, ํ•ด์ฒด ์ „ ๊ฐ•๋„ ํ™•์ธ",
"parent_doc_score": 0.64,
},
{
"code": "KCS 14 20 10",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "ํƒ€์„ค, ๋‹ค์ง, ์–‘์ƒ, ์‹œ๊ณต์ด์Œ ๋ฐ ํ’ˆ์งˆ๊ด€๋ฆฌ",
"parent_doc_score": 0.62,
},
]
WEATHER_CONCRETE_CODES = [
{
"code": "KCS 14 20 40",
"title": "ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ๋ณด์˜จ์–‘์ƒ, ์ดˆ๊ธฐ๋™ํ•ด ๋ฐฉ์ง€, ์˜จ๋„๊ด€๋ฆฌ",
"parent_doc_score": 0.88,
},
{
"code": "KCS 14 20 41",
"title": "์„œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์„œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ์ตœ๊ณ ์˜จ๋„, ์žฌ๋ฃŒ ์˜จ๋„ ์ €๊ฐ, ์Šต์œค์–‘์ƒ",
"parent_doc_score": 0.86,
},
{
"code": "KCS 14 20 10",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์ผ๋ฐ˜ ํƒ€์„ค, ๋‹ค์ง, ์–‘์ƒ ๋ฐ ํ’ˆ์งˆ๊ด€๋ฆฌ",
"parent_doc_score": 0.78,
},
{
"code": "KCS 10 40 00",
"title": "๊ฑด์„ค๊ณต์‚ฌ ์‹œํ—˜๊ธฐ์ค€",
"role": "์ฝ˜ํฌ๋ฆฌํŠธ ํ’ˆ์งˆ์‹œํ—˜ ๋ฐ ๊ฒ€์‚ฌ ์ ˆ์ฐจ",
"parent_doc_score": 0.68,
},
]
CONCRETE_DEFECT_CODES = [
{
"code": "KCS 14 20 10",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "๊ท ์—ด, ์žฌ๋ฃŒ๋ถ„๋ฆฌ, ๊ณฐ๋ณด ๋“ฑ ์‹œ๊ณต ๊ฒฐํ•จ์˜ ์กฐ์‚ฌ์™€ ๋ณด์ˆ˜ ์‹œ๋ฐฉ",
"parent_doc_score": 0.88,
},
{
"code": "KCS 10 40 00",
"title": "๊ฑด์„ค๊ณต์‚ฌ ์‹œํ—˜๊ธฐ์ค€",
"role": "์ฝ”์–ด, ๋น„ํŒŒ๊ดด, ๊ฐ•๋„ ๋ฐ ํ’ˆ์งˆ์‹œํ—˜ ์ ˆ์ฐจ",
"parent_doc_score": 0.74,
},
{
"code": "KCS 10 10 15",
"title": "ํ’ˆ์งˆ๊ด€๋ฆฌ",
"role": "๋ถ€์ ํ•ฉ, ํ’ˆ์งˆ๊ธฐ๋ก, ์žฌ๊ฒ€์ธก ๋ฐ ์Šน์ธ ์ ˆ์ฐจ",
"parent_doc_score": 0.72,
},
{
"code": "KDS 14 20 90",
"title": "๊ธฐ์กด ์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ๋ฌผ์˜ ์•ˆ์ „์„ฑ ํ‰๊ฐ€๊ธฐ์ค€",
"role": "๊ฐ•๋„ ๋ฏธ๋‹ฌ ๋˜๋Š” ์†์ƒ ๊ตฌ์กฐ๋ฌผ์˜ ์•ˆ์ „์„ฑ ํ‰๊ฐ€",
"parent_doc_score": 0.7,
},
{
"code": "KDS 14 20 10",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ํ•ด์„๊ณผ ์„ค๊ณ„ ์›์น™",
"role": "๊ตฌ์กฐ ์„ฑ๋Šฅ ์žฌํ‰๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์˜ ์„ค๊ณ„ ์›์น™",
"parent_doc_score": 0.66,
},
]
CONCRETE_CRACK_CODES = [
{
"code": "KCS 14 20 10",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "๊ท ์—ด ์กฐ์‚ฌ, ๋ณด์ˆ˜, ์žฌ์‹œ๊ณต ํŒ๋‹จ์˜ ๊ธฐ๋ณธ ์‹œ๋ฐฉ",
"parent_doc_score": 0.88,
},
{
"code": "KDS 14 20 30",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ์‚ฌ์šฉ์„ฑ ์„ค๊ณ„๊ธฐ์ค€",
"role": "ํ—ˆ์šฉ๊ท ์—ดํญ, ์‚ฌ์šฉ์„ฑ, ๋‚ด๊ตฌ์„ฑ ๊ฒ€ํ† ",
"parent_doc_score": 0.78,
},
{
"code": "KDS 14 20 90",
"title": "๊ธฐ์กด ์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ๋ฌผ์˜ ์•ˆ์ „์„ฑ ํ‰๊ฐ€๊ธฐ์ค€",
"role": "๊ตฌ์กฐ ๊ท ์—ด ๋˜๋Š” ์†์ƒ ๋ถ€์žฌ์˜ ์•ˆ์ „์„ฑ ํ‰๊ฐ€",
"parent_doc_score": 0.74,
},
{
"code": "KCS 10 40 00",
"title": "๊ฑด์„ค๊ณต์‚ฌ ์‹œํ—˜๊ธฐ์ค€",
"role": "๊ท ์—ด ๊นŠ์ด, ๋น„ํŒŒ๊ดด, ์ฝ”์–ด ๋“ฑ ์‹œํ—˜ ์ ˆ์ฐจ",
"parent_doc_score": 0.68,
},
{
"code": "KCS 10 10 15",
"title": "ํ’ˆ์งˆ๊ด€๋ฆฌ",
"role": "๋ถ€์ ํ•ฉ, ์žฌ์‹œํ—˜, ๋ณด์ˆ˜ ์Šน์ธ ๊ธฐ๋ก",
"parent_doc_score": 0.64,
},
{
"code": "KCS 41 40 17",
"title": "๋ˆ„์ˆ˜๋ณด์ˆ˜ ๊ณต์‚ฌ",
"role": "๋ˆ„์ˆ˜ ๊ท ์—ด์ผ ๋•Œ์˜ ์ฐจ์ˆ˜ยท์ฃผ์ž… ๋ณด์ˆ˜",
"parent_doc_score": 0.56,
},
]
CONCRETE_HONEYCOMB_CODES = [
{
"code": "KCS 14 20 10",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์žฌ๋ฃŒ๋ถ„๋ฆฌ, ํ‘œ๋ฉด๊ฒฐํ•จ, ๊ณฐ๋ณด ๋ณด์ˆ˜ ํŒ๋‹จ",
"parent_doc_score": 0.88,
},
{
"code": "KCS 14 20 12",
"title": "๊ฑฐํ‘ธ์ง‘ ๋ฐ ๋™๋ฐ”๋ฆฌ๊ณต์‚ฌ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "๊ฑฐํ‘ธ์ง‘, ํƒ€์„ค๋ฉด, ํƒˆํ˜• ํ›„ ๊ฒฐํ•จ ์›์ธ ํ™•์ธ",
"parent_doc_score": 0.72,
},
{
"code": "EXCS 14 20 13",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ(๋ถ€๋Œ€์‹œ์„คํŽธ)",
"role": "๊ณ ์†๋„๋กœ ๋ถ€๋Œ€์‹œ์„ค ์ฝ˜ํฌ๋ฆฌํŠธ ๊ฒฐํ•จ ๋ณด์ˆ˜",
"parent_doc_score": 0.66,
},
{
"code": "KCS 14 20 30",
"title": "์ˆ˜๋ฐ€ ์ฝ˜ํฌ๋ฆฌํŠธ",
"role": "๋ˆ„์ˆ˜ยท์ˆ˜๋ฐ€์„ฑ์ด ๊ด€๋ จ๋œ ๊ฒฐํ•จ ๋ณด์ˆ˜",
"parent_doc_score": 0.6,
},
{
"code": "KCS 14 20 23",
"title": "ํด๋ฆฌ๋จธ ์‹œ๋ฉ˜ํŠธ ์ฝ˜ํฌ๋ฆฌํŠธ",
"role": "ํด๋ฆฌ๋จธ ์‹œ๋ฉ˜ํŠธ๊ณ„ ๋ณด์ˆ˜์žฌ๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ",
"parent_doc_score": 0.56,
},
]
CONCRETE_STRENGTH_SHORTFALL_CODES = [
{
"code": "KCS 14 20 10",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์••์ถ•๊ฐ•๋„ ํ’ˆ์งˆ์‹œํ—˜, ๊ฐ•๋„ ๋ฏธ๋‹ฌ ์‹œ ์กฐ์น˜",
"parent_doc_score": 0.88,
},
{
"code": "KDS 14 20 90",
"title": "๊ธฐ์กด ์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ๋ฌผ์˜ ์•ˆ์ „์„ฑ ํ‰๊ฐ€๊ธฐ์ค€",
"role": "๊ฐ•๋„ ๋ฏธ๋‹ฌ ๋ถ€์žฌ์˜ ๊ตฌ์กฐ ์•ˆ์ „์„ฑ ํ‰๊ฐ€",
"parent_doc_score": 0.82,
},
{
"code": "KDS 14 20 20",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ํœจ ๋ฐ ์••์ถ• ์„ค๊ณ„๊ธฐ์ค€",
"role": "๋ถ€์žฌ ํœจยท์••์ถ• ๋‚ด๋ ฅ ์žฌ๊ฒ€ํ† ",
"parent_doc_score": 0.74,
},
{
"code": "KDS 14 20 10",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ ํ•ด์„๊ณผ ์„ค๊ณ„ ์›์น™",
"role": "์žฌํ‰๊ฐ€ ํ•ด์„๊ณผ ์„ค๊ณ„ ์›์น™",
"parent_doc_score": 0.7,
},
{
"code": "KCS 10 40 00",
"title": "๊ฑด์„ค๊ณต์‚ฌ ์‹œํ—˜๊ธฐ์ค€",
"role": "์ฝ”์–ด, ๋น„ํŒŒ๊ดด, ์žฌ์‹œํ—˜ ์ ˆ์ฐจ",
"parent_doc_score": 0.66,
},
{
"code": "KCS 10 10 15",
"title": "ํ’ˆ์งˆ๊ด€๋ฆฌ",
"role": "๋ถ€์ ํ•ฉ ์ฒ˜๋ฆฌ, ์‹œํ—˜์„ฑ์ ์„œ, ์Šน์ธ ๊ธฐ๋ก",
"parent_doc_score": 0.62,
},
]
CONCRETE_WINTER_DAMAGE_CODES = [
{
"code": "KCS 14 20 40",
"title": "ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์ดˆ๊ธฐ๋™ํ•ด, ๋ณด์˜จ์–‘์ƒ, ๊ฐ€์—ด์„ค๋น„ ์ค‘๋‹จ ๋Œ€์‘",
"parent_doc_score": 0.9,
},
{
"code": "KCS 14 20 10",
"title": "์ผ๋ฐ˜์ฝ˜ํฌ๋ฆฌํŠธ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์ผ๋ฐ˜ ์–‘์ƒ, ๊ฒฐํ•จ ๋ณด์ˆ˜, ํ’ˆ์งˆ๊ด€๋ฆฌ",
"parent_doc_score": 0.78,
},
{
"code": "KCS 10 40 00",
"title": "๊ฑด์„ค๊ณต์‚ฌ ์‹œํ—˜๊ธฐ์ค€",
"role": "๋™ํ•ด ํ”ผํ•ด ๊นŠ์ด์™€ ๊ฐ•๋„ ์ €ํ•˜ ์‹œํ—˜",
"parent_doc_score": 0.68,
},
{
"code": "KCS 10 10 15",
"title": "ํ’ˆ์งˆ๊ด€๋ฆฌ",
"role": "๋ถ€์ ํ•ฉ, ์žฌ์‹œํ—˜, ๋ณด์ˆ˜ ์Šน์ธ ์ ˆ์ฐจ",
"parent_doc_score": 0.64,
},
{
"code": "KDS 14 20 90",
"title": "๊ธฐ์กด ์ฝ˜ํฌ๋ฆฌํŠธ๊ตฌ์กฐ๋ฌผ์˜ ์•ˆ์ „์„ฑ ํ‰๊ฐ€๊ธฐ์ค€",
"role": "๋™ํ•ด๋กœ ๊ตฌ์กฐ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์˜์‹ฌ๋˜๋Š” ๊ฒฝ์šฐ",
"parent_doc_score": 0.62,
},
{
"code": "EXCS 14 20 40",
"title": "ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ",
"role": "๊ณ ์†๋„๋กœ ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ํ˜„์žฅ",
"parent_doc_score": 0.58,
},
{
"code": "EXCS 14 20 45",
"title": "ํ•œ์ค‘์ฝ˜ํฌ๋ฆฌํŠธ(๋ถ€๋Œ€์‹œ์„คํŽธ)",
"role": "๊ณ ์†๋„๋กœ ๋ถ€๋Œ€์‹œ์„ค ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ํ˜„์žฅ",
"parent_doc_score": 0.56,
},
]
EARTH_RETAINING_EMERGENCY_CODES = [
{
"code": "KDS 21 30 00",
"title": "๊ฐ€์„คํ™๋ง‰์ด ์„ค๊ณ„๊ธฐ์ค€",
"role": "๊ฐ€์„คํ™๋ง‰์ด ์•ˆ์ •์„ฑ, ๋ฐฐ๋ฉด ์นจํ•˜, ๊ตฌ์กฐ ์žฌ๊ฒ€ํ† ",
"parent_doc_score": 0.88,
},
{
"code": "KCS 21 30 00",
"title": "๊ฐ€์„คํ™๋ง‰์ด๊ณต์‚ฌ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "๊ตด์ฐฉ ์ค‘ ๊ณ„์ธก, ์‹œ๊ณต๊ด€๋ฆฌ, ์ด์ƒ ๋ฐœ์ƒ ์‹œ ์กฐ์น˜",
"parent_doc_score": 0.8,
},
{
"code": "KCS 11 30 45",
"title": "์ง€๋ฐ˜ ๊ทธ๋ผ์šฐํŒ… ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "์ฐจ์ˆ˜ ์ฃผ์ž…, ๋ณด๊ฐ• ๊ทธ๋ผ์šฐํŒ…, ์ฃผ์ž…์žฌ ํ’ˆ์งˆ๊ด€๋ฆฌ",
"parent_doc_score": 0.76,
},
{
"code": "KDS 11 10 15",
"title": "์ง€๋ฐ˜๊ณ„์ธก",
"role": "์ง€๋ฐ˜๊ณ„์ธก ์„ค๊ณ„, ๊ด€๋ฆฌ๊ธฐ์ค€์น˜, ๊ณ„์ธก ๊ณ„ํš",
"parent_doc_score": 0.72,
},
{
"code": "KCS 11 10 15",
"title": "์‹œ๊ณต ์ค‘ ์ง€๋ฐ˜๊ณ„์ธก",
"role": "์‹œ๊ณต ์ค‘ ๊ณ„์ธก, ๊ฒฝ๋ณด, ํ•œ๊ณ„์น˜ ์ดˆ๊ณผ ๋Œ€์‘",
"parent_doc_score": 0.7,
},
{
"code": "KCS 10 10 15",
"title": "ํ’ˆ์งˆ๊ด€๋ฆฌ",
"role": "๋น„์ƒ์กฐ์น˜ ๊ธฐ๋ก, ๊ฐ๋ฆฌ ๋ณด๊ณ , ์žฌ๊ฒ€์ธก ์ ˆ์ฐจ",
"parent_doc_score": 0.64,
},
]
CAST_IN_PLACE_PILE_CODES = [
{
"code": "KCS 11 50 10",
"title": "ํ˜„์žฅํƒ€์„ค ์ฝ˜ํฌ๋ฆฌํŠธ๋ง๋š ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "๊ตด์ฐฉ ๋ฐ”๋‹ฅ ์Šฌ๋ผ์ž„ ์ œ๊ฑฐ, ์ฝ˜ํฌ๋ฆฌํŠธ ํƒ€์„ค, ๋‘๋ถ€์ •๋ฆฌ",
"parent_doc_score": 0.88,
},
{
"code": "EXCS 11 50 10",
"title": "ํ˜„์žฅํƒ€์„ค ์ฝ˜ํฌ๋ฆฌํŠธ ๋ง๋š(์ „๋ฌธ)",
"role": "๊ณ ์†๋„๋กœ ํ˜„์žฅํƒ€์„ค๋ง๋š ์Šฌ๋ผ์ž„ ๊ฒ€์‚ฌ ๋ฐ ํ’ˆ์งˆ๊ด€๋ฆฌ",
"parent_doc_score": 0.82,
},
{
"code": "KDS 11 50 15",
"title": "๊นŠ์€๊ธฐ์ดˆ ์„ค๊ณ„๊ธฐ์ค€",
"role": "๋ง๋š ์ง€์ง€๋ ฅ๊ณผ ์„ ๋‹จ ์ง€์ง€ ์กฐ๊ฑด์˜ ์„ค๊ณ„ ์žฌ๊ฒ€ํ† ",
"parent_doc_score": 0.72,
},
{
"code": "KCS 10 40 00",
"title": "๊ฑด์„ค๊ณต์‚ฌ ์‹œํ—˜๊ธฐ์ค€",
"role": "์Šฌ๋ผ์ž„, ์ฝ˜ํฌ๋ฆฌํŠธ ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ธก ์‹œํ—˜",
"parent_doc_score": 0.64,
},
{
"code": "KCS 14 20 43",
"title": "์ˆ˜์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ",
"role": "ํŠธ๋ ˆ๋ฏธ, ์•ˆ์ •์•ก, ์ˆ˜์ค‘ ํƒ€์„ค ํ’ˆ์งˆ๊ด€๋ฆฌ",
"parent_doc_score": 0.6,
},
{
"code": "KCS 11 50 40",
"title": "๋ง๋š์žฌํ•˜์‹œํ—˜",
"role": "์ง€์ง€๋ ฅ ํ™•์ธ๊ณผ ์žฌํ•˜์‹œํ—˜ ๊ณ„ํš",
"parent_doc_score": 0.56,
},
]
BOLT_CONNECTION_DEFECT_CODES = [
{
"code": "KCS 14 31 25",
"title": "๋ณผํŠธ์ ‘ํ•ฉ ๋ฐ ํ•€ ์—ฐ๊ฒฐ ํ‘œ์ค€์‹œ๋ฐฉ",
"role": "๊ณ ์žฅ๋ ฅ๋ณผํŠธ ์กฐ์ž„, ์žฌ์ฒด๊ฒฐ, ๋ถˆ๋Ÿ‰ ๋ณผํŠธ ๊ต์ฒด",
"parent_doc_score": 0.88,
},
{
"code": "KCS 41 31 25",
"title": "๊ฑด์ถ•๋ฌผ ๊ฐ•๊ตฌ์กฐ๊ณต์‚ฌ ๊ณ ์žฅ๋ ฅ๋ณผํŠธ ์ ‘ํ•ฉ ๋ฐ ์—ฐ๊ฒฐ",
"role": "๊ฑด์ถ• ์ฒ ๊ณจ ๊ณ ์žฅ๋ ฅ๋ณผํŠธ ์ฒด๊ฒฐ ๊ฒ€์‚ฌ์™€ ์กฐ์ž„ ๊ด€๋ฆฌ",
"parent_doc_score": 0.82,
},
{
"code": "KDS 14 31 25",
"title": "๊ฐ•๊ตฌ์กฐ ์—ฐ๊ฒฐ ์„ค๊ณ„๊ธฐ์ค€",
"role": "์ฒด๊ฒฐ๋ ฅ ๋ถ€์กฑ ๋˜๋Š” ๊ต์ฒด ์‹œ ์ ‘ํ•ฉ๋ถ€ ๊ตฌ์กฐ ์•ˆ์ „์„ฑ ๊ฒ€ํ† ",
"parent_doc_score": 0.72,
},
{
"code": "KCS 14 31 05",
"title": "๊ฐ•๊ตฌ์กฐ๊ณต์‚ฌ ์ผ๋ฐ˜์‚ฌํ•ญ",
"role": "๊ฐ•๊ตฌ์กฐ ์กฐ๋ฆฝ, ์‹œ๊ณต์˜ค์ฐจ, ๊ฒ€์‚ฌ ์ผ๋ฐ˜์‚ฌํ•ญ",
"parent_doc_score": 0.66,
},
]
CONCEPT_PACKS: list[dict[str, Any]] = [
{
"id": "transfer_beam",
"title": "์ „์ด๋ณด/์ „์ด๋ถ€์žฌ ๊ธฐ์ค€ ๊ฒ€ํ† ",
"triggers": [
"์ „์ด๋ณด",
"์ „์ด ๋ณด",
"์ „์ด๋ถ€์žฌ",
"์ „์ด ๋ถ€์žฌ",
"์ „์ด์ธต",
"ํ•˜์ค‘์ „์ด",
"ํ•˜์ค‘ ์ „์ด",
"transfer beam",
"transfer girder",
],
"canonical_terms": [
"์ „์ด๋ณด",
"์ „์ด๋ถ€์žฌ",
"๊นŠ์€๋ณด",
"D-region",
"์ŠคํŠธ๋Ÿฟ-ํƒ€์ด๋ชจ๋ธ",
"์ˆ˜์ง ๋ถˆ์—ฐ์†",
"ํ•˜์ค‘ ์ „๋‹ฌ",
],
"code_bundle": TRANSFER_BEAM_CODES,
"missing_conditions": [
"์ƒ๋ถ€ ๊ธฐ๋‘ฅยท๋ฒฝ์ฒด์˜ ์ถ•๋ ฅ, ์ „๋‹จ๋ ฅ, ๋ชจ๋ฉ˜ํŠธ์™€ ํ•˜์ค‘ ์กฐํ•ฉ",
"์ „์ด๋ณด ๊ฒฝ๊ฐ„, ํญ, ์ถค, ์ง€์  ์กฐ๊ฑด๊ณผ ์ „์ด์ธต ์œ„์น˜",
"์ „์ด๋ณด๊ฐ€ ๊นŠ์€๋ณด ๋˜๋Š” D-region์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํ•˜ ์กฐ๊ฑด",
"์ฝ˜ํฌ๋ฆฌํŠธ ์„ค๊ณ„๊ธฐ์ค€์••์ถ•๊ฐ•๋„์™€ ์ฒ ๊ทผ ํ•ญ๋ณต๊ฐ•๋„",
"์ฃผ๊ทผ ์ •์ฐฉ ๊ฐ€๋Šฅ ๊ธธ์ด, ์ด์Œ ์œ„์น˜, ์ ˆ๊ณกยทํ์‡„์Šคํ„ฐ๋Ÿฝ ์ƒ์„ธ",
"๊ฑด์ถ•๋ฌผ ๋‚ด์ง„๋“ฑ๊ธ‰, ์ˆ˜์ง ๋ถˆ์—ฐ์† ์—ฌ๋ถ€, ์ค‘์š”๋„ ๊ณ„์ˆ˜",
"์‹œ๊ณต ์ค‘ ๋™๋ฐ”๋ฆฌ ์กด์น˜ ๊ณ„ํš, ํƒ€์„ค ์ˆœ์„œ, ์‹œ๊ณต์ด์Œ ์œ„์น˜",
],
"compliance_checklist": [
"์ „์ด๋ณด๋ฅผ ๋‹จ์ˆœ ๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ ํ•˜์ค‘ ์ „๋‹ฌ ๊ฒฝ๋กœ๊ฐ€ ๊ธ‰๋ณ€ํ•˜๋Š” ๋ถ€์žฌ๋กœ ๋ณด๊ณ  load path๋ฅผ ๋จผ์ € ํ™•์ธ",
"๊นŠ์€๋ณด/D-region์ด๋ฉด ์ŠคํŠธ๋Ÿฟ-ํƒ€์ด๋ชจ๋ธ ์ ์šฉ ํ•„์š”์„ฑ์„ ๋ณ„๋„๋กœ ํŒ๋‹จ",
"์ „๋‹จ ํŒŒ๊ดด๊ฐ€ ์ง€๋ฐฐํ•˜์ง€ ์•Š๋„๋ก ์ „๋‹จ๋ณด๊ฐ•, ์ ˆ์ ๋ถ€ ์••์ถ•, ์ŠคํŠธ๋Ÿฟ ์••์ถ•์‘๋ ฅ์„ ํ™•์ธ",
"์ฃผ๊ทผ๊ณผ ๋ณด๊ฐ•๊ทผ์˜ ์ •์ฐฉยท์ด์Œ์ด ์ „์ด๋ถ€ ์œ„ํ—˜ ๋‹จ๋ฉด์— ๋ชฐ๋ฆฌ์ง€ ์•Š๋„๋ก ์ƒ์„ธ ๊ฒ€ํ† ",
"์ „์ด์ธต์ด ๋‚ด์ง„์ƒ ์ˆ˜์ง ๋ถˆ์—ฐ์†์„ ๋งŒ๋“ค๋ฉด ๋‚ด์ง„ ๊ธฐ์ค€์˜ ์ถ”๊ฐ€ ๊ฒ€ํ† ๋ฅผ ์ˆ˜ํ–‰",
"๋Œ€๋‹จ๋ฉด ํƒ€์„ค, ์˜จ๋„๊ท ์—ด, ๋‹ค์ง, ์–‘์ƒ, ๋™๋ฐ”๋ฆฌ ํ•ด์ฒด ์ „ ๊ฐ•๋„ ํ™•์ธ์„ ์‹œ๊ณต๊ณ„ํš์— ๋ฐ˜์˜",
],
"high_risk": True,
},
{
"id": "weather_concrete",
"title": "ํ•œ์ค‘/์„œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ์˜จ๋„๊ด€๋ฆฌ",
"triggers": [
"ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ",
"ํ•œ์ค‘์ฝ˜ํฌ๋ฆฌํŠธ",
"์„œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ",
"์„œ์ค‘์ฝ˜ํฌ๋ฆฌํŠธ",
"๊ณต๊ตฌ๋ฆฌ",
"๋™ํ•ด",
"์ดˆ๊ธฐ๋™ํ•ด",
"๋ณด์˜จ์–‘์ƒ",
"์—ดํ’๊ธฐ",
"์‡„๋น™",
"์–ผ์Œ๋ฌผ",
"35๋„",
"์ตœ๊ณ  ์˜จ๋„",
"์ตœ๊ณ ์˜จ๋„",
"์Šต์œค์–‘์ƒ",
],
"canonical_terms": [
"ํ•œ์ค‘์ฝ˜ํฌ๋ฆฌํŠธ",
"์„œ์ค‘์ฝ˜ํฌ๋ฆฌํŠธ",
"๋ณด์˜จ์–‘์ƒ",
"์ดˆ๊ธฐ๋™ํ•ด",
"์ตœ๊ณ ์˜จ๋„",
"์Šต์œค์–‘์ƒ",
"์žฌ๋ฃŒ ์˜จ๋„",
],
"code_bundle": WEATHER_CONCRETE_CODES,
"missing_conditions": [
"์ฝ˜ํฌ๋ฆฌํŠธ ํƒ€์„ค ์‹œ ์™ธ๊ธฐ ์˜จ๋„, ์ฝ˜ํฌ๋ฆฌํŠธ ์˜จ๋„, ํ’์†๊ณผ ์ƒ๋Œ€์Šต๋„",
"๋ณด์˜จ ๋˜๋Š” ๋ƒ‰๊ฐ ์–‘์ƒ ๋ฐฉ๋ฒ•๊ณผ ์œ ์ง€ ์‹œ๊ฐ„",
"๋ฐฐํ•ฉ, ์‹œ๋ฉ˜ํŠธ ์ข…๋ฅ˜, ํ˜ผํ™”์ œ ์‚ฌ์šฉ ์—ฌ๋ถ€",
"์ดˆ๊ธฐ ๊ฐ•๋„ ๋ฐœํ˜„ ํ™•์ธ์šฉ ๊ณต์‹œ์ฒด ๋˜๋Š” ํ˜„์žฅ ์–‘์ƒ ์‹œํ—˜ ๊ฒฐ๊ณผ",
"๋™ํ•ด ๋˜๋Š” ๊ณ ์˜จ ํ”ผํ•ด๊ฐ€ ์˜์‹ฌ๋˜๋Š” ํ‘œ๋ฉด ๊นŠ์ด์™€ ๊ฐ•๋„ ์ €ํ•˜ ๋ฒ”์œ„",
],
"compliance_checklist": [
"ํ•œ์ค‘/์„œ์ค‘ ์—ฌ๋ถ€๋ฅผ ๋จผ์ € ๋ถ„๋ฅ˜ํ•˜๊ณ  ํ•ด๋‹น ํŠน์ˆ˜ ์ฝ˜ํฌ๋ฆฌํŠธ ์‹œ๋ฐฉ์„ ์šฐ์„  ์ ์šฉ",
"ํƒ€์„ค ์ „ ์žฌ๋ฃŒ ์˜จ๋„, ์šด๋ฐ˜ ์‹œ๊ฐ„, ํ˜„์žฅ ์˜จ๋„ ์กฐ๊ฑด์„ ๊ธฐ๋ก",
"๋ณด์˜จ์–‘์ƒ ๋˜๋Š” ์Šต์œค์–‘์ƒ ๊ณ„ํš์„ ํ’ˆ์งˆ์‹œํ—˜ ๊ณ„ํš๊ณผ ์—ฐ๊ฒฐ",
"๋™ํ•ดยท๊ณ ์˜จ ํ”ผํ•ด๊ฐ€ ์˜์‹ฌ๋˜๋ฉด ์ž„์˜ ๋ณด์ˆ˜ ์ „์— ๊ฐ•๋„ ๋ฐ ๊นŠ์ด ์กฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰",
"์˜จ๋„ ๊ด€๋ จ ์ˆ˜์น˜ ๊ธฐ์ค€์€ ๊ฒ€์ƒ‰๋œ ์กฐํ•ญ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ๋‹จ์ •",
],
"high_risk": True,
},
{
"id": "concrete_crack_response",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ ๊ท ์—ด ์กฐ์‚ฌ/๋ณด์ˆ˜ ๋Œ€์‘",
"triggers": [
"๊ท ์—ด",
"๊ท ์—ด๋ณด์ˆ˜",
"๊ท ์—ด ๋ณด์ˆ˜",
"๊ท ์—ดํญ",
"ํ—ˆ์šฉ๊ท ์—ดํญ",
"์†Œ์„ฑ์ˆ˜์ถ•",
"๊ฑด์กฐ์ˆ˜์ถ•",
"ํฌ๋ž™",
"์—ํญ์‹œ ์ฃผ์ž…",
"์ˆ˜์ง€ ์ฃผ์ž…",
"์ดˆ์ŒํŒŒ",
],
"canonical_terms": [
"๊ท ์—ด",
"๊ท ์—ด๋ณด์ˆ˜",
"๊ท ์—ดํญ",
"ํ—ˆ์šฉ๊ท ์—ดํญ",
"๋น„ํŒŒ๊ดด์‹œํ—˜",
"ํ’ˆ์งˆ์‹œํ—˜",
"์•ˆ์ „์„ฑ ํ‰๊ฐ€",
],
"code_bundle": CONCRETE_CRACK_CODES,
"missing_conditions": [
"์ตœ๋Œ€ ๊ท ์—ดํญ, ๊ธธ์ด, ๊นŠ์ด์™€ ์ง„ํ–‰์„ฑ ์—ฌ๋ถ€",
"๊ท ์—ด ์œ„์น˜, ๊ตฌ์กฐ ๋ถ€์žฌ ์—ฌ๋ถ€, ๋ˆ„์ˆ˜ ๋™๋ฐ˜ ์—ฌ๋ถ€",
"์žฌ๋ น, ์–‘์ƒ ์กฐ๊ฑด, ์˜จ๋„ ์ด๋ ฅ๊ณผ ์ˆ˜์ถ• ๊ฐ€๋Šฅ์„ฑ",
"์ดˆ์ŒํŒŒ, ์ฝ”์–ด, ๋ฐ˜๋ฐœ๊ฒฝ๋„ ๋“ฑ ์‹œํ—˜ ๊ฒฐ๊ณผ",
"๋ณด์ˆ˜์žฌ ์ข…๋ฅ˜, ์ฃผ์ž… ๊ฐ€๋Šฅ ๊ท ์—ดํญ, ๋ฐ”ํƒ• ๊ฑด์กฐ ์ƒํƒœ",
],
"compliance_checklist": [
"๊ท ์—ด์„ ํ‘œ๋ฉด ํ•˜์ž, ๋ˆ„์ˆ˜ ๊ท ์—ด, ๊ตฌ์กฐ ๊ท ์—ด๋กœ ๋จผ์ € ๋ถ„๋ฅ˜",
"๊ท ์—ด ์ง€๋„์™€ ํญยท๊นŠ์ด ์ธก์ • ๊ธฐ๋ก์„ ํ™•๋ณด",
"๊ตฌ์กฐ ๊ท ์—ด ๋˜๋Š” ์ง„ํ–‰์„ฑ ๊ท ์—ด์ด๋ฉด KDS ์•ˆ์ „์„ฑ ํ‰๊ฐ€๋กœ ํ™•๋Œ€",
"๋ˆ„์ˆ˜ ๊ท ์—ด์€ ๋ˆ„์ˆ˜๋ณด์ˆ˜ ์‹œ๋ฐฉ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ๋ณ„๋„ ํ™•์ธ",
"๋ณด์ˆ˜ ํ›„ ์žฌ๊ฒ€์ธก๊ณผ ๊ฐ๋ฆฌ ์Šน์ธ ๊ธฐ๋ก์„ ๋‚จ๊น€",
],
"high_risk": True,
},
{
"id": "concrete_honeycomb_response",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ ๊ณฐ๋ณด/์žฌ๋ฃŒ๋ถ„๋ฆฌ ํ•˜์ž ๋Œ€์‘",
"triggers": [
"๊ณฐ๋ณด",
"ํ—ˆ๋‹ˆ์ปด",
"honeycomb",
"์žฌ๋ฃŒ๋ถ„๋ฆฌ",
"์žฌ๋ฃŒ ๋ถ„๋ฆฌ",
"ํ‘œ๋ฉด๊ฒฐํ•จ",
"ํ‘œ๋ฉด ๊ฒฐํ•จ",
"์ž๊ฐˆ ๋…ธ์ถœ",
"์ž๊ฐˆ์ด ๋…ธ์ถœ",
"ํƒˆํ˜• ํ›„",
"๋ณด์ˆ˜์šฉ ๋ชจ๋ฅดํƒ€๋ฅด",
"๋ฌด์ˆ˜์ถ• ๋ชจ๋ฅดํƒ€๋ฅด",
],
"canonical_terms": [
"์žฌ๋ฃŒ๋ถ„๋ฆฌ",
"ํ‘œ๋ฉด๊ฒฐํ•จ",
"๋‹ค์ง€๊ธฐ",
"๊ฑฐํ‘ธ์ง‘",
"๋ณด์ˆ˜์šฉ ๋ชจ๋ฅดํƒ€๋ฅด",
"ํ’ˆ์งˆ๊ด€๋ฆฌ",
],
"code_bundle": CONCRETE_HONEYCOMB_CODES,
"missing_conditions": [
"๊ฒฐํ•จ ๊นŠ์ด, ๋ฉด์ ๊ณผ ์ฒ ๊ทผ ๋…ธ์ถœ ๋˜๋Š” ํ”ผ๋ณต ์†์‹ค ์—ฌ๋ถ€",
"๋‚ด๋ ฅ ๋ถ€์žฌ์ธ์ง€ ๋น„๊ตฌ์กฐ ๋งˆ๊ฐ์ธ์ง€์˜ ๊ตฌ๋ถ„",
"์ˆ˜๋ฐ€์„ฑ ๋˜๋Š” ๋ˆ„์ˆ˜์™€ ๊ด€๋ จ๋œ ๋ถ€์œ„์ธ์ง€ ์—ฌ๋ถ€",
"๊ฑฐํ‘ธ์ง‘, ๋‹ค์ง, ํƒ€์„ค ๋†’์ด์™€ ์žฌ๋ฃŒ๋ถ„๋ฆฌ ์›์ธ ๊ธฐ๋ก",
"๋ณด์ˆ˜ ๋ชจ๋ฅดํƒ€๋ฅด์˜ ์š”๊ตฌ ๊ฐ•๋„์™€ ์ ‘์ฐฉ ์„ฑ๋Šฅ",
],
"compliance_checklist": [
"๊ฒฐํ•จ ๊นŠ์ด๊ฐ€ ์ฒ ๊ทผ๊นŒ์ง€ ๋„๋‹ฌํ–ˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธ",
"๋‚ด๋ ฅ ๋ถ€์žฌ ๋˜๋Š” ๋ˆ„์ˆ˜ ๋ถ€์œ„์ด๋ฉด ์ž„์˜ ํŒจ์นญ ์ „์— ๊ตฌ์กฐยท๋ฐฉ์ˆ˜ ๊ฒ€ํ† ๋กœ ํ™•๋Œ€",
"๋ถˆ๋Ÿ‰๋ถ€ ์ œ๊ฑฐ, ๋ฐ”ํƒ• ์ฒ˜๋ฆฌ, ๋ณด์ˆ˜์žฌ ์ถฉ์ „, ์–‘์ƒ ๊ณ„ํš์„ ์‹œ๋ฐฉ๊ณผ ์—ฐ๊ฒฐ",
"๋ณด์ˆ˜ ํ›„ ์žฌ๊ฒ€์ธก๊ณผ ์‚ฌ์ง„๋Œ€์ง€, ์Šน์ธ ๊ธฐ๋ก์„ ๋‚จ๊น€",
],
"high_risk": True,
},
{
"id": "concrete_strength_shortfall_response",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ ์••์ถ•๊ฐ•๋„ ๋ฏธ๋‹ฌ/์žฌํ‰๊ฐ€ ๋Œ€์‘",
"triggers": [
"์••์ถ•๊ฐ•๋„",
"์„ค๊ณ„๊ธฐ์ค€์••์ถ•๊ฐ•๋„",
"๊ฐ•๋„ ๋ฏธ๋‹ฌ",
"๊ฐ•๋„๋ฏธ๋‹ฌ",
"์ฝ”์–ด ๊ฐ•๋„",
"์ฝ”์–ด๊ฐ•๋„",
"์ฝ”์–ด",
"๋น„ํŒŒ๊ดด",
"์Šˆ๋ฏธํŠธ",
"์Šˆ๋ฏธํŠธํ•ด๋จธ",
"fck",
"๋ถˆํ•ฉ๊ฒฉ",
"๋ถ€์ ํ•ฉ",
"์žฌ์‹œํ—˜",
],
"canonical_terms": [
"์••์ถ•๊ฐ•๋„",
"์„ค๊ณ„๊ธฐ์ค€์••์ถ•๊ฐ•๋„",
"์ฝ”์–ด๊ฐ•๋„",
"๋น„ํŒŒ๊ดด์‹œํ—˜",
"๋ถ€์ ํ•ฉ",
"์žฌ์‹œํ—˜",
"์•ˆ์ „์„ฑ ํ‰๊ฐ€",
],
"code_bundle": CONCRETE_STRENGTH_SHORTFALL_CODES,
"missing_conditions": [
"ํ‘œ์ค€์–‘์ƒ ๋˜๋Š” ํ˜„์žฅ์–‘์ƒ ๊ณต์‹œ์ฒด ๊ตฌ๋ถ„",
"์ฝ”์–ด ๊ฐœ์ˆ˜, ์ง๊ฒฝ, ์ฑ„์ทจ ์œ„์น˜์™€ ์‹œํ—˜ ์žฌ๋ น",
"๋น„ํŒŒ๊ดด์‹œํ—˜ ๋ณด์ •์‹๊ณผ ์ฝ”์–ด ๊ฐ•๋„ ๋ณด์ •๊ฐ’",
"๊ฐ•๋„ ๋ฏธ๋‹ฌ์ด ๊ตญ๋ถ€์ธ์ง€ ๋™์ผ ํƒ€์„ค ๋กœํŠธ ์ „์ฒด์ธ์ง€ ์—ฌ๋ถ€",
"ํ•ด๋‹น ๋ถ€์žฌ์˜ ์‹ค์ œ ํ•˜์ค‘ ๋ถ€๋‹ด๊ณผ ๊ตฌ์กฐ ์•ˆ์ „์„ฑ ์žฌํ‰๊ฐ€ ์กฐ๊ฑด",
],
"compliance_checklist": [
"๊ฐ•๋„ ๋ฏธ๋‹ฌ์€ ๋‹จ์ˆœ ๋ณด์ˆ˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ’ˆ์งˆ ๋ถ€์ ํ•ฉ์œผ๋กœ ๊ธฐ๋ก",
"์‹œํ—˜ ๋ฐฉ๋ฒ•๊ณผ ๊ณต์‹œ์ฒด ์กฐ๊ฑด์„ ๋จผ์ € ๊ฒ€์ฆ",
"์ฃผ์š” ๊ตฌ์กฐ ๋ถ€์žฌ์ด๋ฉด KDS ์•ˆ์ „์„ฑ ํ‰๊ฐ€ ๋ฐ ๋ถ€์žฌ ๋‚ด๋ ฅ ์žฌ๊ฒ€ํ† ๋กœ ํ™•๋Œ€",
"๋น„ํŒŒ๊ดด์‹œํ—˜๋งŒ์œผ๋กœ ํ•ฉ๊ฒฉ ํŒ์ •์„ ๋‹จ์ •ํ•˜์ง€ ์•Š๊ณ  ์ฝ”์–ด ๋“ฑ ๋ณด์ • ๊ทผ๊ฑฐ๋ฅผ ํ™•์ธ",
"๋ณด๊ฐ•ยท์ฒ ๊ฑฐยท์‚ฌ์šฉ์ œํ•œ ํŒ๋‹จ์€ ์ฑ…์ž„๊ธฐ์ˆ ์ž ์Šน์ธ ์ ˆ์ฐจ๋กœ ์ฒ˜๋ฆฌ",
],
"high_risk": True,
},
{
"id": "concrete_winter_damage_response",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ ๋™ํ•ด ํ”ผํ•ด/ํ•œ์ค‘ ์–‘์ƒ ์‚ฌ๊ณ  ๋Œ€์‘",
"triggers": [
"๋™ํ•ด",
"๋™ํ•ด ํ”ผํ•ด",
"์ดˆ๊ธฐ๋™ํ•ด",
"ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ",
"ํ•œ์ค‘์ฝ˜ํฌ๋ฆฌํŠธ",
"๋ณด์˜จ์–‘์ƒ",
"์–‘์ƒ์˜จ๋„",
"๊ฐ€์—ด์„ค๋น„",
"์—ดํ’๊ธฐ",
"๋™๊ฒฐ",
"๊ณต๊ธฐ์—ฐํ–‰",
"5 MPa",
],
"canonical_terms": [
"ํ•œ์ค‘์ฝ˜ํฌ๋ฆฌํŠธ",
"์ดˆ๊ธฐ๋™ํ•ด",
"๋™ํ•ด ํ”ผํ•ด",
"๋ณด์˜จ์–‘์ƒ",
"์–‘์ƒ์˜จ๋„",
"์••์ถ•๊ฐ•๋„",
"ํ’ˆ์งˆ์‹œํ—˜",
],
"code_bundle": CONCRETE_WINTER_DAMAGE_CODES,
"missing_conditions": [
"ํƒ€์„ค ์ผ์‹œ, ์™ธ๊ธฐ ์˜จ๋„, ์ฝ˜ํฌ๋ฆฌํŠธ ์˜จ๋„์™€ ๋ณด์˜จ ์ค‘๋‹จ ์‹œ๊ฐ„",
"์–‘์ƒ ๋ฐฉ๋ฒ•, ๊ฐ€์—ด์„ค๋น„ ์ƒํƒœ์™€ ๊ธ‰์—ด ์ค‘๋‹จ ๊ธฐ๋ก",
"์ดˆ๊ธฐ ๊ฐ•๋„ ๋˜๋Š” ์ ์‚ฐ์˜จ๋„ ๋“ฑ ์„ฑ์ˆ™๋„ ๊ทผ๊ฑฐ",
"ํ˜ผํ™”์ œ, ๊ณต๊ธฐ๋Ÿ‰, ๋ฌผ-๊ฒฐํ•ฉ์žฌ๋น„์™€ ๋ฐฐํ•ฉ ์กฐ๊ฑด",
"๋™ํ•ด ์˜์‹ฌ ๊นŠ์ด, ํ˜„์žฌ ์ฝ”์–ด/๋น„ํŒŒ๊ดด ๊ฐ•๋„ ๊ฒฐ๊ณผ",
],
"compliance_checklist": [
"๋™ํ•ด ์˜์‹ฌ ๊ตฌ๊ฐ„์˜ ํ›„์† ๊ณต์ •์„ ์ค‘์ง€ํ•˜๊ณ  ์˜จ๋„ ์ด๋ ฅ๋ถ€ํ„ฐ ํ™•๋ณด",
"ํ•œ์ค‘ ์ฝ˜ํฌ๋ฆฌํŠธ ์‹œ๋ฐฉ์˜ ๋ณด์˜จ์–‘์ƒ๊ณผ ์ดˆ๊ธฐ ๊ฐ•๋„ ๊ธฐ์ค€์„ ์šฐ์„  ํ™•์ธ",
"ํ”ผํ•ด ๊นŠ์ด์™€ ๊ฐ•๋„ ์ €ํ•˜ ๋ฒ”์œ„๋Š” ์‹œํ—˜ ๊ทผ๊ฑฐ๋กœ ํŒ๋‹จ",
"๊ตฌ์กฐ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉด KDS ์•ˆ์ „์„ฑ ํ‰๊ฐ€๋กœ ํ™•๋Œ€",
"๋ณด์ˆ˜์žฌ ์ฃผ์ž… ๋˜๋Š” ํ‘œ๋ฉด ๋ณด์ˆ˜๋Š” ํ”ผํ•ด ๊นŠ์ด ํŒ์ • ํ›„ ์Šน์ธ ์ ˆ์ฐจ๋กœ ์ฒ˜๋ฆฌ",
],
"high_risk": True,
},
{
"id": "concrete_defect_response",
"title": "์ฝ˜ํฌ๋ฆฌํŠธ ๊ท ์—ด/๊ณฐ๋ณด/๊ฐ•๋„๋ฏธ๋‹ฌ ํ•˜์ž ๋Œ€์‘",
"triggers": [
"๊ณฐ๋ณด",
"์žฌ๋ฃŒ๋ถ„๋ฆฌ",
"์žฌ๋ฃŒ ๋ถ„๋ฆฌ",
"honeycomb",
"๊ท ์—ด",
"ํฌ๋ž™",
"์†Œ์„ฑ์ˆ˜์ถ•",
"๊ฐ•๋„ ๋ฏธ๋‹ฌ",
"๊ฐ•๋„๋ฏธ๋‹ฌ",
"์ฝ”์–ด ๊ฐ•๋„",
"์Šˆ๋ฏธํŠธ",
"๋น„ํŒŒ๊ดด",
"ํ•˜์ž๋ณด์ˆ˜",
"๋ณด์ˆ˜ ์ ˆ์ฐจ",
"์—ํญ์‹œ ์ฃผ์ž…",
"์ˆ˜์ง€ ์ฃผ์ž…",
],
"canonical_terms": [
"์ฝ˜ํฌ๋ฆฌํŠธ ๊ฒฐํ•จ",
"์žฌ๋ฃŒ๋ถ„๋ฆฌ",
"๊ท ์—ด๋ณด์ˆ˜",
"์ฝ”์–ด๊ฐ•๋„",
"๋น„ํŒŒ๊ดด์‹œํ—˜",
"ํ’ˆ์งˆ๊ด€๋ฆฌ",
"์•ˆ์ „์„ฑ ํ‰๊ฐ€",
],
"code_bundle": CONCRETE_DEFECT_CODES,
"missing_conditions": [
"๊ฒฐํ•จ์˜ ์œ„์น˜, ํญ, ๊นŠ์ด, ๋ฉด์ ๊ณผ ์ฒ ๊ทผ ๋…ธ์ถœ ์—ฌ๋ถ€",
"๊ตฌ์กฐ ๋ถ€์žฌ์ธ์ง€ ๋น„๊ตฌ์กฐ ๋งˆ๊ฐ์ธ์ง€์˜ ๊ตฌ๋ถ„",
"์žฌ๋ น, ์–‘์ƒ ์กฐ๊ฑด, ํ‘œ์ค€/ํ˜„์žฅ ์–‘์ƒ ๊ณต์‹œ์ฒด ๊ฐ•๋„",
"์ฝ”์–ด ์ฑ„์ทจ, ๋ฐ˜๋ฐœ๊ฒฝ๋„, ์ดˆ์ŒํŒŒ ๋“ฑ ์‹œํ—˜ ๋ฐฉ๋ฒ•๊ณผ ๋ณด์ •๊ฐ’",
"๋ณด์ˆ˜์žฌ ์ข…๋ฅ˜, ์š”๊ตฌ ๊ฐ•๋„, ์ ‘์ฐฉ์„ฑ, ์ฃผ์ž… ๊ฐ€๋Šฅ ๊ท ์—ดํญ",
"๊ฐ๋ฆฌ ์ง€์ , ๋ถˆํ•ฉ๊ฒฉ ํŒ์ •, ์‚ฌ์šฉ ์ œํ•œ ๋“ฑ ํ˜„์žฅ ์กฐ์น˜ ์ƒํƒœ",
],
"compliance_checklist": [
"ํ•˜์ž ๋ถ€์œ„ ์‚ฌ์šฉ ๋˜๋Š” ํ›„์† ๊ณต์ •์„ ๋ฉˆ์ถ”๊ณ  ๊ตฌ์กฐ ์˜ํ–ฅ ๊ฐ€๋Šฅ์„ฑ์„ ๋จผ์ € ํŒ๋‹จ",
"๊ท ์—ดํญยท๊นŠ์ดยท์ง„ํ–‰์„ฑ ๋ฐ ์žฌ๋ฃŒ๋ถ„๋ฆฌ ๊นŠ์ด๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์‚ฌ์ง„๋Œ€์ง€๋ฅผ ํ™•๋ณด",
"๊ฐ•๋„ ๋ฏธ๋‹ฌ์ด๋‚˜ ์ฃผ์š” ๋ถ€์žฌ ์†์ƒ์ด๋ฉด KDS ์•ˆ์ „์„ฑ ํ‰๊ฐ€ ๊ธฐ์ค€๊นŒ์ง€ ํ™•๋Œ€",
"๋ณด์ˆ˜์žฌ ์‹œ๊ณต ์ „ ๋ฐ”ํƒ• ์ฒ˜๋ฆฌ, ๊ฑด์กฐ ์ƒํƒœ, ์ฃผ์ž…์„ฑ, ์–‘์ƒ ์กฐ๊ฑด์„ ํ™•์ธ",
"๋ณด์ˆ˜ ํ›„ ์žฌ๊ฒ€์ธก๊ณผ ์Šน์ธ ๊ธฐ๋ก์„ ๋‚จ๊ธฐ๊ณ  ์ž„์˜ ํ•ฉ๊ฒฉ ํŒ์ •์„ ํ”ผํ•จ",
],
"high_risk": True,
},
{
"id": "earth_retaining_emergency",
"title": "๊ฐ€์„คํ™๋ง‰์ด ์นจํ•˜/์‹ฑํฌํ™€/๋น„์ƒ ์ฐจ์ˆ˜ ๋Œ€์‘",
"required_any": [
"ํ™๋ง‰์ด",
"๊ฐ€์„คํ™๋ง‰์ด",
"๊ตด์ฐฉ",
"๋ฐฐ๋ฉด",
"์ง€๋ฐ˜",
"์ฐจ์ˆ˜",
"๊ณ„์ธก",
],
"triggers": [
"ํ™๋ง‰์ด",
"๊ฐ€์„คํ™๋ง‰์ด",
"์”ฝํฌํ™€",
"์‹ฑํฌํ™€",
"์ง€๋ฐ˜์นจํ•˜",
"์ง€๋ฐ˜ ์นจํ•˜",
"๋ฐฐ๋ฉด์นจํ•˜",
"๋ฐฐ๋ฉด ์นจํ•˜",
"๊ณ„์ธก๊ธฐ",
"๋ณ€ํ˜•๊ณ„",
"์œ„ํ—˜ ๋‹จ๊ณ„",
"๋น„์ƒ์ฐจ์ˆ˜",
"์ฐจ์ˆ˜ ์ฃผ์ž…",
"๋ถ•๊ดด",
],
"canonical_terms": [
"๊ฐ€์„คํ™๋ง‰์ด",
"๋ฐฐ๋ฉด์นจํ•˜",
"์ง€๋ฐ˜์นจํ•˜",
"๊ณ„์ธก๊ด€๋ฆฌ",
"์ฐจ์ˆ˜ ๊ทธ๋ผ์šฐํŒ…",
"์•ˆ์ „์„ฑ ์žฌ๊ฒ€ํ† ",
],
"code_bundle": EARTH_RETAINING_EMERGENCY_CODES,
"missing_conditions": [
"๊ตด์ฐฉ ๊นŠ์ด, ๋ฒฝ์ฒด ํ˜•์‹, ์ง€๋ณด๊ณต ๋‹จ๊ณ„์™€ ๊ตด์ฐฉ ์ง„ํ–‰๋ฅ ",
"์นจํ•˜ ์œ„์น˜, ํฌ๊ธฐ, ์ง„ํ–‰ ์†๋„์™€ ๊ณ„์ธก๊ธฐ ํ•œ๊ณ„์น˜ ์ดˆ๊ณผ ์—ฌ๋ถ€",
"์ง€ํ•˜์ˆ˜์œ„ ๋ณ€ํ™”, ๋ˆ„์ˆ˜๋Ÿ‰, ํ† ์‚ฌ ์œ ์‹ค ๋˜๋Š” ๊ณต๋™ ๋ฐœ์ƒ ์—ฌ๋ถ€",
"์ธ์ ‘ ๊ตฌ์กฐ๋ฌผ ๊ธฐ์ดˆ ํ˜•์‹, ์ด๊ฒฉ๊ฑฐ๋ฆฌ, ๊ท ์—ด ์ƒํƒœ",
"๊ธด๊ธ‰ ์ฐจ์ˆ˜ ์ฃผ์ž…์žฌ, ์ฃผ์ž… ์••๋ ฅ, ์ฃผ์ž… ๋ฒ”์œ„์™€ ์•ˆ์ „ ํ†ต์ œ ๊ณ„ํš",
],
"compliance_checklist": [
"์ธ๋ช…๊ณผ ๊ตํ†ต ์•ˆ์ „์„ ๋จผ์ € ํ†ต์ œํ•˜๊ณ  ๊ตด์ฐฉ ๋ฐ ์ธ์ ‘ ์ž‘์—…์„ ์ค‘์ง€",
"๊ณ„์ธก๊ฐ’, ์นจํ•˜ ๊ท ์—ด, ์ง€ํ•˜์ˆ˜ ์œ ์ถœ๋Ÿ‰์„ ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ๊ธฐ๋ก",
"๊ฐ€์„คํ™๋ง‰์ด ๊ตฌ์กฐ ์•ˆ์ •์„ฑ์€ KDS, ํ˜„์žฅ ์กฐ์น˜์™€ ๊ณ„์ธก ๊ด€๋ฆฌ๋Š” KCS๋กœ ๋ถ„๋ฆฌ ๊ฒ€ํ† ",
"์ฐจ์ˆ˜ ์ฃผ์ž…์€ ์ง€๋ฐ˜ ๊ทธ๋ผ์šฐํŒ… ์‹œ๋ฐฉ์˜ ์žฌ๋ฃŒยท์••๋ ฅยทํ’ˆ์งˆ๊ด€๋ฆฌ์™€ ์—ฐ๊ฒฐ",
"์‘๊ธ‰ ๋ณต๊ตฌ ํ›„ ์žฌ๊ตด์ฐฉ ์ „ ์ฑ…์ž„๊ธฐ์ˆ ์ž ์Šน์ธ๊ณผ ์ถ”๊ฐ€ ๊ณ„์ธก ๊ณ„ํš์„ ํ™•๋ณด",
],
"high_risk": True,
},
{
"id": "cast_in_place_pile_slime",
"title": "ํ˜„์žฅํƒ€์„ค๋ง๋š ์Šฌ๋ผ์ž„/RCD ํ’ˆ์งˆ๊ด€๋ฆฌ",
"required_any": [
"๋ง๋š",
"ํ˜„์žฅํƒ€์„ค",
"RCD",
"rcd",
"์Šฌ๋ผ์ž„",
],
"triggers": [
"ํ˜„์žฅํƒ€์„ค๋ง๋š",
"ํ˜„์žฅํƒ€์„ค ๋ง๋š",
"RCD",
"rcd",
"์Šฌ๋ผ์ž„",
"์„ ๋‹จ์Šฌ๋ผ์ž„",
"์„ ๋‹จ ์Šฌ๋ผ์ž„",
"๋‘๋ถ€์ •๋ฆฌ",
"๋ง๋š ๋‘๋ถ€",
"๋ฐ”๋‹ฅ๊ตด์ฐฉ",
],
"canonical_terms": [
"ํ˜„์žฅํƒ€์„ค ์ฝ˜ํฌ๋ฆฌํŠธ๋ง๋š",
"์„ ๋‹จ ์Šฌ๋ผ์ž„",
"๊ตด์ฐฉ ๋ฐ”๋‹ฅ",
"์ฝ˜ํฌ๋ฆฌํŠธ ํƒ€์„ค",
"๋‘๋ถ€์ •๋ฆฌ",
"๊ฒ€์ธก",
],
"code_bundle": CAST_IN_PLACE_PILE_CODES,
"missing_conditions": [
"๋ง๋š ์ง๊ฒฝ, ๊นŠ์ด, ์ง€์ง€์ธต๊ณผ RCD/์˜ฌ์ผ€์ด์‹ฑ ๋“ฑ ๊ตด์ฐฉ ๊ณต๋ฒ•",
"์Šฌ๋ผ์ž„ ์ธก์ • ๋ฐฉ๋ฒ•, ์ธก์ • ์‹œ์ , ํ—ˆ์šฉ ๋‘๊ป˜ ํŒ๋‹จ ๊ทผ๊ฑฐ",
"๊ณต๋ฒฝ ์•ˆ์ •์•ก ์‚ฌ์šฉ ์—ฌ๋ถ€์™€ ์•ˆ์ •์•ก ํ’ˆ์งˆ",
"์ฝ˜ํฌ๋ฆฌํŠธ ํƒ€์„ค ์ „ ์ฒญ์†Œ ๋ฐฉ๋ฒ•๊ณผ ๊ฒ€์ธก ๊ธฐ๋ก",
"๋‘๋ถ€์ •๋ฆฌ ๋†’์ด, ์ฒ ๊ทผ๋ง ์†์ƒ ์—ฌ๋ถ€, ์žฌํ•˜์‹œํ—˜ ๊ณ„ํš",
],
"compliance_checklist": [
"๊ตด์ฐฉ ์™„๋ฃŒ ํ›„ ์ฝ˜ํฌ๋ฆฌํŠธ ํƒ€์„ค ์ „ ์Šฌ๋ผ์ž„ ์ œ๊ฑฐ์™€ ๊ฒ€์ธก์„ ๋จผ์ € ํ™•์ธ",
"๊ณ ์†๋„๋กœ ํ˜„์žฅ์ด๋ฉด EXCS ์ „๋ฌธ์‹œ๋ฐฉ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ณ„์•ฝ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ",
"์„ ๋‹จ ์ง€์ง€๋ ฅ ์˜์‹ฌ ์‹œ ์„ค๊ณ„๊ธฐ์ค€์˜ ์ง€์ง€๋ ฅ ๊ฒ€ํ† ์™€ ์‹œํ—˜ ๊ณ„ํš์œผ๋กœ ํ™•๋Œ€",
"๋‘๋ถ€์ •๋ฆฌ ์ค‘ ์ฒ ๊ทผยท๋ง๋š ๋ณธ์ฒด ์†์ƒ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณด์ˆ˜ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ๋‘ ",
],
"high_risk": True,
},
{
"id": "bolt_connection_defect",
"title": "๊ณ ์žฅ๋ ฅ๋ณผํŠธ ์ฒด๊ฒฐ๋ถˆ๋Ÿ‰/์žฌ์ฒด๊ฒฐ ๋Œ€์‘",
"required_any": [
"๋ณผํŠธ",
"๊ณ ์žฅ๋ ฅ",
"ํ•€ํ…Œ์ผ",
"์ฒด๊ฒฐ",
"์กฐ์ž„",
"๋‚˜์‚ฌ์‚ฐ",
],
"triggers": [
"๊ณ ์žฅ๋ ฅ ๋ณผํŠธ",
"๊ณ ์žฅ๋ ฅ๋ณผํŠธ",
"T/S ๋ณผํŠธ",
"T/S๋ณผํŠธ",
"ts๋ณผํŠธ",
"ํ•€ํ…Œ์ผ",
"์ฒด๊ฒฐ๋ ฅ ๋ถ€์กฑ",
"์ฒด๊ฒฐ๋ ฅ๋ถ€์กฑ",
"์กฐ์ž„ํ† ํฌ",
"๋ณธ์กฐ์ž„",
"์žฌ์ฒด๊ฒฐ",
"์•ผ๋งˆ",
"๋‚˜์‚ฌ์‚ฐ",
"๋ณผํŠธ ๊ต์ฒด",
],
"canonical_terms": [
"๊ณ ์žฅ๋ ฅ๋ณผํŠธ",
"๋ณผํŠธ์ ‘ํ•ฉ",
"์กฐ์ž„ํ† ํฌ",
"์ฒด๊ฒฐ๊ฒ€์‚ฌ",
"์žฌ์ฒด๊ฒฐ",
"์ ‘ํ•ฉ๋ถ€ ์•ˆ์ „์„ฑ",
],
"code_bundle": BOLT_CONNECTION_DEFECT_CODES,
"missing_conditions": [
"๋ณผํŠธ ์ข…๋ฅ˜, ๊ฐ•๋„ ๋“ฑ๊ธ‰, ๋งˆ์ฐฐ์ ‘ํ•ฉ/์ง€์••์ ‘ํ•ฉ ๊ตฌ๋ถ„",
"ํ•€ํ…Œ์ผ ํŒŒ๋‹จ ์ƒํƒœ, ํ† ํฌ๋ Œ์น˜ ๊ฒ€๊ต์ •, ์ฒด๊ฒฐ ์ˆœ์„œ",
"๋‚˜์‚ฌ์‚ฐ ์†์ƒ, ์™€์…” ์ƒํƒœ, ์žฌ์‚ฌ์šฉ ์—ฌ๋ถ€",
"์ ‘ํ•ฉ๋ฉด ๋งˆ์ฐฐ๋ฉด ์ฒ˜๋ฆฌ์™€ ๊ตฌ๋ฉ ์˜ค์ฐจ",
"๊ต์ฒด ์ค‘ ์ž„์‹œ ์ง€์ง€์™€ ์ฃผ๋ณ€ ๋ณผํŠธ ์‘๋ ฅ ์žฌ๋ถ„๋ฐฐ ๊ฒ€ํ†  ํ•„์š”์„ฑ",
],
"compliance_checklist": [
"๋ถˆ๋Ÿ‰ ์ฒด๊ฒฐ๋ถ€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์ถ”๊ฐ€ ํ•˜์ค‘์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ํ†ต์ œ",
"์‹œ๊ณต ์‹œ๋ฐฉ์˜ ๊ฒ€์‚ฌยท์žฌ์ฒด๊ฒฐยท๊ต์ฒด ๊ธฐ์ค€๊ณผ ์„ค๊ณ„๊ธฐ์ค€์˜ ์ ‘ํ•ฉ๋ถ€ ์•ˆ์ „์„ฑ์„ ๋ถ„๋ฆฌ ๊ฒ€ํ† ",
"์žฌ์‚ฌ์šฉ ๊ธˆ์ง€ ๋Œ€์ƒ๊ณผ ์ฒด๊ฒฐ ์žฅ๋น„ ๊ฒ€๊ต์ • ์ƒํƒœ๋ฅผ ํ™•์ธ",
"๊ต์ฒด ํ›„ ์ „์ˆ˜ ๋˜๋Š” ํ‘œ๋ณธ ๊ฒ€์‚ฌ ๋ฒ”์œ„๋ฅผ ๊ฐ๋ฆฌ ์Šน์ธ ์ ˆ์ฐจ๋กœ ํ™•์ •",
],
"high_risk": True,
},
]
def detect_query_concepts(query: str, scenario: str | None = None) -> list[dict[str, Any]]:
"""Return concept packs whose practical trigger terms appear in the query."""
text = f"{query or ''} {scenario or ''}".lower()
detected: list[dict[str, Any]] = []
for pack in CONCEPT_PACKS:
if pack.get("id") == "concrete_defect_response":
continue
required_any = [term.lower() for term in pack.get("required_any", [])]
if required_any and not any(term in text for term in required_any):
continue
hits = [term for term in pack["triggers"] if term.lower() in text]
if not hits:
continue
detected.append({
"id": pack["id"],
"title": pack["title"],
"matched_terms": hits,
"canonical_terms": list(pack["canonical_terms"]),
"code_bundle": [dict(item) for item in pack["code_bundle"]],
"missing_conditions": list(pack["missing_conditions"]),
"compliance_checklist": list(pack["compliance_checklist"]),
"high_risk": bool(pack.get("high_risk")),
})
return detected
def concept_code_bundle(concepts: list[dict[str, Any]]) -> list[dict[str, Any]]:
"""Flatten concept code bundles, preserving first occurrence order."""
bundle: list[dict[str, Any]] = []
seen: set[str] = set()
for concept in concepts:
for entry in concept.get("code_bundle", []):
code = normalize_standard_code(entry.get("code"))
if not code or code in seen:
continue
seen.add(code)
item = dict(entry)
item["code"] = code
item["concept_id"] = concept.get("id", "")
item["concept_title"] = concept.get("title", "")
bundle.append(item)
return bundle
def augment_parent_candidates(
parent_candidates: list[dict[str, Any]],
query: str,
*,
parent_limit: int,
scenario: str | None = None,
) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
"""Prepend concept-derived standard candidates for recognized practical terms."""
concepts = detect_query_concepts(query, scenario)
if not concepts:
return parent_candidates[:parent_limit], []
augmented: list[dict[str, Any]] = []
seen: set[str] = set()
rank = 1
for entry in concept_code_bundle(concepts):
code = entry["code"]
if code in seen:
continue
seen.add(code)
augmented.append({
"code": code,
"doc_type": canonical_doc_type(code, entry.get("doc_type", "")),
"name": entry.get("title", ""),
"parent_rank": rank,
"parent_doc_score": float(entry.get("parent_doc_score", 0.7)),
"concept_id": entry.get("concept_id", ""),
"concept_title": entry.get("concept_title", ""),
"concept_role": entry.get("role", ""),
})
rank += 1
if augmented:
return augmented[:parent_limit], concepts
for item in parent_candidates:
code = normalize_standard_code(item.get("code"))
if not code or code in seen:
continue
seen.add(code)
copied = dict(item)
copied["code"] = code
copied["parent_rank"] = rank
augmented.append(copied)
rank += 1
if len(augmented) >= parent_limit:
break
return augmented[:parent_limit], concepts
def expand_query_for_concepts(query: str, concepts: list[dict[str, Any]]) -> str:
"""Append canonical concept terms so clause search can find standard wording."""
terms: list[str] = []
for concept in concepts:
for term in concept.get("canonical_terms", []):
if term not in terms:
terms.append(term)
if not terms:
return query
tail = " ".join(terms)
return f"{query} {tail}".strip()
def build_answer_contract(
query: str,
scenario: str | None,
results: list[dict[str, Any]],
) -> dict[str, Any]:
"""Build a user-facing practical review contract from concepts and evidence."""
concepts = detect_query_concepts(query, scenario)
if not concepts:
return {
"query_concepts": [],
"basis_review_plan": [],
"missing_conditions": [],
"compliance_checklist": [],
"evidence_expectation": {"expected_code_bundle": [], "covered_codes": [], "missing_bundle_codes": []},
"basis_evidence": [],
"answer_outline": {
"standard_priority": [],
"required_inputs": [],
"compliance_workflow": [],
"evidence_cautions": ["๊ฒ€์ƒ‰๋œ ์กฐํ•ญ ๊ทผ๊ฑฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ธฐ์ค€๋ช…, ์ˆ˜์น˜, ์ ํ•ฉ์„ฑ ํŒ๋‹จ์„ ํ™•์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."],
},
}
expected_bundle = concept_code_bundle(concepts)
expected_codes = [entry["code"] for entry in expected_bundle]
covered_codes = []
for result in results:
code = normalize_standard_code(result.get("code"))
if code and code in expected_codes and code not in covered_codes:
covered_codes.append(code)
missing_conditions: list[str] = []
compliance_checklist: list[str] = []
for concept in concepts:
for item in concept.get("missing_conditions", []):
if item not in missing_conditions:
missing_conditions.append(item)
for item in concept.get("compliance_checklist", []):
if item not in compliance_checklist:
compliance_checklist.append(item)
basis_review_plan = [
f"{entry['code']} - {entry.get('role') or entry.get('title', '')}"
for entry in expected_bundle[:8]
]
covered_code_set = set(covered_codes)
missing_bundle_codes = [code for code in expected_codes if code not in covered_code_set]
from src.standard_links import resolve_standard_link
basis_evidence = []
for entry in expected_bundle:
link_fields = resolve_standard_link(entry["code"])
basis_evidence.append({
"code": entry["code"],
"title": entry.get("title", ""),
"role": entry.get("role", ""),
"evidence_status": "covered" if entry["code"] in covered_code_set else "missing",
**link_fields,
})
evidence_cautions = []
if missing_bundle_codes:
evidence_cautions.append(
"๊ฒ€์ƒ‰ trace๊ฐ€ ์—†๋Š” ํ›„๋ณด ๊ธฐ์ค€์€ ์ตœ์ข… ์ˆ˜์น˜๋‚˜ ์ ํ•ฉ์„ฑ ํŒ๋‹จ์— ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ถ”๊ฐ€ ์กฐํ•ญ ๊ฒ€์ƒ‰์œผ๋กœ ๋ณด๊ฐ•ํ•ฉ๋‹ˆ๋‹ค."
)
evidence_cautions.append(
f"์ถ”๊ฐ€ ํ™•์ธ ํ›„๋ณด: {', '.join(missing_bundle_codes[:8])}"
)
else:
evidence_cautions.append("concept ๊ธฐ์ค€ ๋ฌถ์Œ์˜ ์ฃผ์š” ํ›„๋ณด๊ฐ€ ๋ชจ๋‘ ๊ฒ€์ƒ‰ trace๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
return {
"query_concepts": [
{
"id": concept["id"],
"title": concept["title"],
"matched_terms": concept["matched_terms"],
"canonical_terms": concept["canonical_terms"],
"high_risk": concept["high_risk"],
}
for concept in concepts
],
"basis_review_plan": basis_review_plan,
"missing_conditions": missing_conditions,
"compliance_checklist": compliance_checklist,
"evidence_expectation": {
"expected_code_bundle": expected_codes,
"covered_codes": covered_codes,
"missing_bundle_codes": missing_bundle_codes,
},
"basis_evidence": basis_evidence,
"answer_outline": {
"standard_priority": basis_review_plan,
"required_inputs": missing_conditions,
"compliance_workflow": compliance_checklist,
"evidence_cautions": evidence_cautions,
},
}