Spaces:
Sleeping
Sleeping
| """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, | |
| }, | |
| } | |