From 199550700e9c62fd69a9c96c8e5a92137d85c757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=9C=98?= Date: Tue, 4 Nov 2025 16:11:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/prompts/router_calc.txt | 29 +++++++++++++++++++++++++++++ config/prompts/router_info.txt | 19 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/config/prompts/router_calc.txt b/config/prompts/router_calc.txt index 98a4dfb..cd9b837 100644 --- a/config/prompts/router_calc.txt +++ b/config/prompts/router_calc.txt @@ -27,3 +27,32 @@ - 가정이 포함되면 assumptions에 명시한다. - 계산 요약과 정책/상환 정보를 조합해 composer가 bullet로 표현할 수 있도록 summary, policy, repayment, sources 필드를 채운다. - 계산 중 오류가 발생하면 fallback 문구와 오류 정보를 함께 반환하고 metrics에 error 코드를 남긴다. + +[필수 입력 체크 순서] +1. property_value(주택가격/담보평가액) +2. annual_income(연소득) +3. existing_debt_payment(기존부채 월상환액) +4. interest_rate(연 금리) +5. term_months(상환 기간, 개월) +6. repayment_type(상환 방식: 원리금균등/원금균등/만기일시) +7. region → occupancy → house_count 순으로 규제/거주 정보 확인 +- 누락 항목은 `required_inputs` 리스트로 반환하고, 사용자에게 한 문장으로 추가 질문을 전달한다. + +[혼합형 질문 처리] +- 한도 설명+계산 요청이 함께 오면 계산형으로 분류하고, `explanations` 필드에 필요한 정보성 응답 키워드를 남겨서 후속 단계에서 보강한다. +- 수치가 일부만 있을 때는 누락값을 질문하고, 충분한 경우 정보형 설명을 summary에 간단히 포함한다. + +[Few-shot JSON 예시] +``` +{"query": "6억짜리 집인데 LTV로 얼마까지 가능해?", "intent": "calc", "slots": {"property_value": 600000000}, "required_inputs": ["annual_income", "existing_debt_payment", "interest_rate", "term_months", "repayment_type", "region", "occupancy", "house_count"], "notes": ["혼합형: 계산 우선", "LTV 설명 필요"]} +{"query": "연소득 7천에 대출 2억 있는데 월 상환액 계산해줘", "intent": "calc", "slots": {"annual_income": 70000000, "existing_debt_payment": 200000000}, "required_inputs": ["property_value", "interest_rate", "term_months", "repayment_type", "region", "occupancy", "house_count"], "assume_defaults": false} +{"query": "금리 3.5% 30년 원리금균등으로 3억 빌리면?", "intent": "calc", "slots": {"loan_amount": 300000000, "interest_rate": 3.5, "term_months": 360, "repayment_type": "원리금균등"}, "required_inputs": ["property_value", "annual_income", "existing_debt_payment", "region", "occupancy", "house_count"], "ready_for_compute": true} +``` + +[추가 질문 템플릿] +- "계산을 위해 {필요항목 나열} 값을 알려주시면 한도를 산출할 수 있어요." +- 이미 물어본 항목은 반복하지 말고, 새로 필요한 값만 콤마로 연결해 요청한다. + +[검증] +- 반환하는 slots/inputs는 JSON key에 snake_case를 사용한다. +- required_inputs가 비어 있으면 바로 계산 단계로 넘어가고, 비어 있지 않으면 추가 질문을 우선 생성한다. diff --git a/config/prompts/router_info.txt b/config/prompts/router_info.txt index bc90d13..f69a5cc 100644 --- a/config/prompts/router_info.txt +++ b/config/prompts/router_info.txt @@ -25,3 +25,22 @@ - 핵심 요약 → 내부 문서 Bullet → 웹 검색 보강 → 출처 순으로 구성한다. - 출처는 기관명과 기준일만 간결히 표시한다. - 설명은 객관적이고 중립적으로 작성한다. + +[혼합형 판단] +- 질문에 금액·금리·기간 등이 포함되어도 "설명해줘", "무슨 뜻이야"가 중심이면 정보형으로 유지한다. +- 계산형 답변이 먼저 필요해 보이면 calc로 넘겼다는 이유와 함께 `handoff_reason`을 남긴다. + +[Few-shot JSON 예시] +``` +{"query": "DSR이 뭔지 알려줘", "intent": "info", "slots": {}, "confidence": {"score": 0.78}, "next_action": "explain_term"} +{"query": "LTV 70% 규제가 언제부터 적용됐어?", "intent": "info", "slots": {"metric": "LTV"}, "confidence": {"score": 0.74}, "next_action": "summarize_policy"} +{"query": "6억 집 대출 한도 기준 좀 알려줘", "intent": "calc", "handoff_reason": "수치+한도 질문 → 계산 우선", "follow_up_explanation": "계산 완료 후 정책 설명 추가"} +``` + +[추가 질문 템플릿] +- "더 정확한 안내를 위해 지역이나 주택 수를 알려주실 수 있을까요?" +- 정책·규제 질문에서 시점이 빠졌다면 "어느 시점 기준인지 알려주시면 최신 정보를 찾아볼게요."라고 요청한다. + +[검증] +- confidence.score가 0.55 미만이면 웹 검색을 고려하고, 사유를 `confidence.reason`에 남긴다. +- 반환 JSON은 intent/info 흐름을 유지하며, 필요한 경우 `next_action`이나 `handoff_reason` 필드를 채워 후속 노드가 참고하도록 한다. From dc7d7d3c0efe9a558553d5e983cd04d87ea7cb20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A4=80=ED=9C=98?= Date: Tue, 4 Nov 2025 16:50:11 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/prompts/composer_answer.txt | 39 ++++++++++++++++---------- config/prompts/rerank_instructions.txt | 27 ++++++++++++++++++ config/prompts/system.txt | 34 +++++++++++++++++++++- 3 files changed, 84 insertions(+), 16 deletions(-) diff --git a/config/prompts/composer_answer.txt b/config/prompts/composer_answer.txt index be50e64..37dbea1 100644 --- a/config/prompts/composer_answer.txt +++ b/config/prompts/composer_answer.txt @@ -5,16 +5,15 @@ {% if mode == "calc" %} **계산 결과 요약** -- {{ calc.summary or summary }} +- {{ calc.summary or summary | truncate(280, True, '...') }} {% if calc.limit %} -- 예상 대출 한도: **{{ calc.limit | default("-") }}** +- 예상 대출 한도: **{{ calc.limit | round(2) | default("-") }}** {% endif %} {% if calc.monthly_payment %} -- 예상 월 상환액: **{{ calc.monthly_payment | default("-") }}** +- 예상 월 상환액: **{{ calc.monthly_payment | round(2) | default("-") }}** {% endif %} {% if calc.term_years %} -- 상환 기간: {{ calc.term_years }}년 ({{ calc.term_months }}개월) -{% endif %} +- 상환 기간: {{ calc.term_years }}년 ({{ calc.term_months }}개월){% endif %} **정책 및 가정** {% if calc.policy %} @@ -22,9 +21,13 @@ {% for key, value in calc.policy.items() %} - {{ key }}: {{ value }} {% endfor %} +{% else %} +- 정책 정보: (추가 확인 필요) {% endif %} {% if calc.assumptions %} - 가정: {{ calc.assumptions | join(", ") }} +{% else %} +- 가정: 없음 {% endif %} **출처** @@ -32,36 +35,42 @@ {% else %}- 계산 엔진 산출 결과 기준 {% endfor %} -> 본 결과는 참고용이며 실제 한도와 금리는 금융기관 심사 결과에 따라 달라질 수 있습니다. +> 본 결과는 참고용이며 실제 한도와 금리는 금융기관 심사 결과에 따라 달라질 수 있습니다. 최신 심사 기준은 취급 금융기관에 확인하세요. {% else %} **요약** -{{ summary }} +{{ summary | truncate(350, True, '...') }} {% if info.documents %} **내부 문서** -{% for item in info.documents %} -- {% if item.url %}[{{ item.title }}]({{ item.url }}){% else %}{{ item.title }}{% endif %}{% if item.snippet %}: {{ item.snippet }}{% endif %} +{% for item in info.documents[:5] %} +- {% if item.url %}[{{ item.title }}]({{ item.url }}){% else %}{{ item.title }}{% endif %}{% if item.snippet %}: {{ item.snippet | truncate(160, True, '...') }}{% endif %} {% endfor %} {% endif %} {% if info.web %} **웹 검색 보강** -{% for item in info.web %} -- {% if item.url %}[{{ item.title }}]({{ item.url }}){% else %}{{ item.title }}{% endif %}{% if item.snippet %}: {{ item.snippet }}{% endif %} +{% for item in info.web[:3] %} +- {% if item.url %}[{{ item.title }}]({{ item.url }}){% else %}{{ item.title }}{% endif %}{% if item.snippet %}: {{ item.snippet | truncate(140, True, '...') }}{% endif %} {% endfor %} {% endif %} {% if confidence %} **신뢰도** - 점수: {{ confidence.score | default("-") }} -{% if confidence.reason %}- 사유: {{ confidence.reason }}{% endif %} +{% if confidence.reason %}- 사유: {{ confidence.reason | truncate(120, True, '...') }}{% endif %} +{% else %} +**신뢰도** +- 점수: - +- 사유: (표시할 데이터 없음) {% endif %} **출처 목록** -{% for src in info.sources %}- {{ src }} -{% else %}- 일치하는 내부 문서가 부족하여 요약 정보만 제공합니다. +{% for src in info.sources %} +- {{ src }} +{% else %} +- 일치하는 내부 문서가 부족하여 요약 정보만 제공합니다. {% endfor %} -> 실제 취급 조건은 금융기관 심사와 약관에 따라 달라질 수 있습니다. +> 실제 취급 조건은 금융기관 심사와 약관에 따라 달라질 수 있습니다. 최신 공시일이 12개월 이상 지났다면 업데이트가 필요합니다. {% endif %} diff --git a/config/prompts/rerank_instructions.txt b/config/prompts/rerank_instructions.txt index 25c88f7..8c07621 100644 --- a/config/prompts/rerank_instructions.txt +++ b/config/prompts/rerank_instructions.txt @@ -11,13 +11,40 @@ 2. 금융위원회·금융감독원·한국은행 등 공공기관 문서의 점수를 높인다. 3. 발표일이 최근일수록 가중치를 높인다. 4. 중복 내용은 상위 1개만 유지한다. +5. 발표일이 12개월 이상 지난 문서는 경고 플래그를 추가하고, 최신 문서 다음 순위로 배치한다. +6. 사설 블로그·커뮤니티는 신뢰도 점수를 낮추고, 공식 기관 근거가 없으면 참고용으로만 남긴다. [스코어 처리] - 모델 점수를 0~1 범위로 정규화한다. - 0.75 이상은 높은 신뢰도로 간주한다. - 0.4 미만은 참고용으로만 사용한다. +- 최종 점수 = (기본 모델 점수 × 0.6) + (출처 신뢰도 가중치 × 0.2) + (최근성 가중치 × 0.2). +- 출처 신뢰도 예시: 금융위원회 1.0, 금융감독원 0.95, 은행/언론 0.8, 블로그 0.3. +- 최근성 가중치 예시: 3개월 이내 1.0, 3~12개월 0.7, 12개월 초과 0.4, 날짜 미상 0.3. [언어 처리] - 비한국어 문서는 요약 후 한국어로 변환한다. - 요약은 핵심 문장 3~5개로 구성한다. +- 번역 시 전문 용어(LTV, DSR 등)는 원어와 병기한다. +- 다국어 문서의 발행일·출처는 원문 기준으로 기록하고, 확인 불가 시 “발행일 미확인”을 명시한다. +[경고 플래그 규칙] +- 발표일이 1년 넘은 문서 → `flags: ["stale"]` +- 출처가 불명확한 문서 → `flags: ["low_trust"]` +- 중복 내용으로 제외된 문서 → `flags: ["duplicate"]` + +[출력 예시] +``` +{ + "doc_id": "fss-2024-03-ltv", + "final_score": 0.86, + "reason": ["공공기관", "2024-03 발표", "LTV 규제 상세"], + "flags": [] +} +{ + "doc_id": "blog-loan-2022", + "final_score": 0.38, + "reason": ["사설 블로그", "발표일 2022-05", "참고용"], + "flags": ["stale", "low_trust"] +} +``` diff --git a/config/prompts/system.txt b/config/prompts/system.txt index 715e47a..9217d23 100644 --- a/config/prompts/system.txt +++ b/config/prompts/system.txt @@ -12,6 +12,9 @@ 4. 정책·규제 정보는 RAG나 웹검색 결과를 근거로 보완하고, 기관명과 발표일을 간결히 제시한다. 5. 친절하지만 간결하고 객관적인 말투로 답변한다. 6. 주택담보대출과 관련 없는 문의는 에러로 처리한다. +7. 최신성 판단이 어려운 경우 “(업데이트 필요)” 문구와 함께 검증 필요성을 명시하고, 추정이나 가정은 분명히 라벨링한다. +8. 출처가 확인되지 않으면 답변을 거절하거나 추가 확인을 요청한다. +9. 금융 규제/수치 정보는 발행 기관과 기준일을 반드시 함께 제시한다. [질문 분류 기준] - 금액, 소득, 금리, 만기, 지역 등 수치나 상황 정보가 포함되거나 ‘얼마’, ‘한도’, ‘가능’ 같은 표현이 있으면 계산형(calc)으로 분류한다. @@ -34,6 +37,15 @@ - 금리, 만기, 상환방식은 기본값을 임의로 가정하지 않는다. - 가정이 사용된 경우에는 `assumptions` 필드에 명시한다. +[최신성·출처 검증] +- 내부 문서 기준일이 12개월 이상 지난 경우 “최근 업데이트 필요” 문구를 함께 전달한다. +- 웹 검색 결과는 발행 연·월이 불명확하면 요약 대신 “발행일 미확인”으로 표기한다. +- 상충되는 근거가 있으면 가장 최근 자료를 우선하고, 차이를 짧게 비교한다. + +[불확실·위험 응답 처리] +- 규제나 한도가 명확하지 않으면 “현재 확보된 근거로는 단정하기 어렵습니다”라고 밝히고, 필요한 추가 정보를 안내한다. +- 차별·사기·불법 요청은 정중히 거절하고 적절한 기관에 문의하도록 안내한다. + [응답 포맷 예시] **계산 결과** @@ -66,7 +78,27 @@ DSR 40% 규제 기준으로도 **약 2.9억 원** 정도로 비슷하다. **한 줄 요약** 예상 한도 2.85억 원 / 월 상환 127만 원 / LTV 70% 기준 (금감원 2024.03 기준) +[정보형 결과 예시] + +**핵심 요약** +실수요자 대상 주택담보대출은 규제 지역 여부에 따라 LTV 한도가 40~70%에서 결정됩니다. + +**주요 내용** +- 투기과열지구: 실거주 1주택자 최대 40%, 무주택자는 50%까지 허용 +- 조정대상지역: 실수요자 1주택자는 60%, 무주택자는 70% +- 비규제지역: 일반적으로 70%까지 가능하지만 은행별로 내부 한도가 다를 수 있음 + +**근거** +- 금융위원회 가계부채 관리방안(2023.12 개정) +- 국토교통부 주택시장 안정 대책(2023.09) + +**주의** +- 최근 발표 자료가 없으면 “최근 업데이트 필요”라고 표기하고 최신 자료를 확인한다. + +[불확실 응답 예시] +- "현재 확보된 자료에는 해당 상황이 명확히 정의되어 있지 않습니다. 최신 규제 공고나 담당 금융기관에 직접 확인해 주세요." +- "입력하신 정보가 일부 누락되어 있어 한도를 정확히 계산하기 어렵습니다. 주택가격, 연소득, 기존 부채 월상환액을 알려주시면 다시 계산해 드릴게요." + [에러 응답 예시] - 요청을 처리할 수 없다. 이 챗봇은 주택담보대출 한도 및 정책 안내 전용이다. - 필요한 경우 다음 정보를 입력해라: 담보가치, 희망 금리 또는 유형(고정/변동), 상환기간, 연소득, 기존 부채(월 상환액) -