Skip to content

Commit 0039306

Browse files
authored
Merge pull request #6 from kimminyeol/feat/cbr-rag-final
Feat/cbr rag final
2 parents 95af737 + bcb41c7 commit 0039306

4 files changed

Lines changed: 71 additions & 26 deletions

File tree

core/graphs/final_agent.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# SYSTEM_PROMPT (요약)
2+
# - 이름: 관식이, 통관 챗봇, 신뢰성/책임감 강조
3+
# - 통관 관련 질문만 답변, 그 외는 정중히 거절
4+
# - 답변은 마크다운, 끝에 책임 한계 안내문구 필수
5+
6+
import re
7+
from core.shared.states.states import CustomsAgentState
8+
from core.shared.utils.llm import get_llm
9+
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
10+
11+
SYSTEM_PROMPT = """
12+
당신은 '관식이'라는 이름의 통관 챗봇입니다.
13+
14+
[페르소나]
15+
- 이름: 관식이
16+
- 특징: "한결같은 책임감으로 신뢰있는 정보를 전하는 통관 챗봇"
17+
- 사명: 국민에게 통관 지식을 정확하고 신뢰성 있게 전달
18+
19+
[역할]
20+
- 사용자의 **통관·관세 관련 질문**에 대해 **주어진 근거 자료**만 활용하여 답변합니다.
21+
- 추측하거나 임의로 정보를 생성하지 않습니다.
22+
- 통관·관세와 무관한 질문(예: 음식, 연애, 일상 상담 등)은 정중히 거절합니다.
23+
24+
[질문 분류 규칙]
25+
- 다음 키워드가 포함되면 ‘통관 관련’으로 간주합니다: 관세, 통관, HS 코드, 과세가격, 원산지, 관세법, AEO, 수입신고, 세율, 관세환급 등.
26+
- 키워드가 없더라도 질문 의미상 통관 절차·세금·신고와 직접 연관되면 ‘통관 관련’으로 처리합니다.
27+
- 위 조건에 해당하지 않으면 ‘무관한 질문’으로 간주하고 정중히 거절합니다.
28+
29+
[출력 규칙]
30+
1. 전체 출력은 **마크다운(Markdown) 형식**으로 작성합니다.
31+
2. 다음 원칙을 따릅니다:
32+
- 질문이 통관/관세 관련이 **아닌 경우**: 정중히 거절하는 짧은 메시지만 출력합니다.
33+
- 질문이 통관/관세 관련인 경우: 주어진 근거 자료(qna_agent 결과)만 활용하여 요약된 정보를 제공합니다.
34+
3. 답변 말미에 반드시 아래의 **책임 한계 안내 문구**를 포함해야 합니다.
35+
4. Chain-of-Thought(COT)는 내부 추론 과정에서만 활용하며, 최종 출력에는 포함하지 않습니다.
36+
37+
[책임 한계 안내 문구]
38+
**본 답변은 신청자가 제시한 자료만을 근거로 작성하였으며, 법적 효력을 갖는 유권해석(결정, 판단)이 아니므로 각종 신고, 불복청구 등의 증거자료로 사용할 수 없습니다.**
39+
"""
40+
41+
def final_agent(state: CustomsAgentState) -> CustomsAgentState:
42+
llm = get_llm()
43+
query = state.get("query", "")
44+
prev_reply = state.get("final_response", "")
45+
try:
46+
messages = [
47+
SystemMessage(content=SYSTEM_PROMPT),
48+
HumanMessage(content=query),
49+
AIMessage(content=prev_reply)
50+
]
51+
result = llm.invoke(messages)
52+
state["final_response"] = str(result.content) if hasattr(result, "content") else str(result)
53+
except Exception as e:
54+
# LLM 실패시 기존 답변 유지
55+
pass
56+
return state

core/graphs/workflow.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from core.customs_tracking.agent.customs_tracking_agent import customs_tracking_agent
88
from core.tariff_prediction.agent.tariff_prediction_agent import tariff_prediction_agent
99
from core.shared.router.intent_router import intent_router
10+
from core.graphs.final_agent import final_agent
1011

1112
def create_customs_graph():
1213
"""관세청 에이전트 그래프를 생성합니다."""
@@ -19,6 +20,7 @@ def create_customs_graph():
1920
workflow.add_node("customs_tracking", customs_tracking_agent)
2021
workflow.add_node("tariff_prediction", tariff_prediction_agent)
2122
workflow.add_node("qna", qna_agent)
23+
workflow.add_node("final_agent", final_agent)
2224

2325
# 시작점 설정
2426
workflow.set_entry_point("intent_router")
@@ -34,9 +36,11 @@ def create_customs_graph():
3436
}
3537
)
3638

37-
# 각 에이전트에서 종료점으로
38-
workflow.add_edge("customs_tracking", END)
39-
workflow.add_edge("tariff_prediction", END)
40-
workflow.add_edge("qna", END)
39+
# 각 에이전트에서 final_agent로
40+
workflow.add_edge("customs_tracking", "final_agent")
41+
workflow.add_edge("tariff_prediction", "final_agent")
42+
workflow.add_edge("qna", "final_agent")
43+
# final_agent에서 종료점으로
44+
workflow.add_edge("final_agent", END)
4145

4246
return workflow.compile()

core/qna/agent/test_qna_agent.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

core/shared/utils/llm.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
from langchain_openai import ChatOpenAI
2+
import os
3+
from dotenv import load_dotenv
24

35
def get_llm():
4-
return ChatOpenAI(model="gpt-4o-mini", temperature=0)
6+
load_dotenv()
7+
api_key = os.getenv("OPENAI_API_KEY")
8+
if not api_key:
9+
raise RuntimeError("OPENAI_API_KEY 환경변수 또는 .env 파일에 키가 필요합니다.")
10+
return ChatOpenAI(model="gpt-4o-mini", temperature=0, openai_api_key=api_key)

0 commit comments

Comments
 (0)