1- from typing import List , Dict , Any
2-
3- from langchain_core .messages import SystemMessage
4- from langchain_openai import OpenAIEmbeddings
5-
61from core .shared .states .states import CustomsAgentState
7- from core .shared . utils . llm import get_llm
2+ from core .qna . main import RAGSystem
83
9- # RAG 에이전트용 더미 데이터베이스
10- class CustomsRAG :
11- def __init__ (self , vector_db_path : str = "customs_faiss.index" , csv_path : str = "customs_data.csv" ):
12- """
13- FAISS 벡터DB와 CSV 데이터를 로드합니다.
14- 실제 구현에서는 이미 생성된 벡터DB를 로드한다고 가정
15- """
16- self .embeddings = OpenAIEmbeddings ()
17- # 더미로 설정 - 실제로는 faiss.read_index(vector_db_path)
18- self .vector_db = None
19- self .documents = [] # 실제로는 CSV에서 로드
20-
21- # 더미 데이터
22- self .dummy_documents = [
23- {"content" : "관세는 외국 상품을 수입할 때 부과되는 세금입니다." , "category" : "관세기본" },
24- {"content" : "통관은 물품이 세관을 통과하는 절차입니다." , "category" : "통관절차" },
25- {"content" : "FTA 협정국에서 수입하는 경우 관세 혜택을 받을 수 있습니다." , "category" : "FTA" },
26- ]
27-
28- def search_similar_documents (self , query : str , k : int = 3 ) -> List [Dict [str , Any ]]:
29- """유사한 문서를 검색합니다."""
30- # 실제로는 FAISS 검색을 수행
31- # query_vector = self.embeddings.embed_query(query)
32- # scores, indices = self.vector_db.search(query_vector, k)
33-
34- # 더미 검색 결과
35- return self .dummy_documents [:k ]
36-
374def qna_agent (state : CustomsAgentState ) -> CustomsAgentState :
38- """QNA RAG 에이전트"""
39- rag = CustomsRAG ()
40- llm = get_llm ()
41-
42- # 유사 문서 검색
43- similar_docs = rag .search_similar_documents (state ["query" ])
5+ """QNA RAG 에이전트 - 실제 RAG 시스템 사용"""
446
45- # 검색된 문서들을 컨텍스트로 구성
46- context = "\n " .join ([f"- { doc ['content' ]} " for doc in similar_docs ])
7+ # RAG 시스템 초기화 및 데이터베이스 설정
8+ rag_system = RAGSystem ()
9+ rag_system .setup_database ()
4710
48- rag_prompt = f"""
49- 다음 관세청 관련 정보를 참고하여 사용자의 질문에 정확하고 도움이 되는 답변을 제공해주세요.
50-
51- 참고 정보:
52- { context }
53-
54- 사용자 질문: { state ["query" ]}
55-
56- 답변:
57- """
11+ # RAG 시스템을 사용하여 답변 생성
12+ answer = rag_system .search_and_generate (
13+ query = state ["query" ],
14+ top_k = 5 ,
15+ show_details = False
16+ )
5817
59- result = llm .invoke ([SystemMessage (content = rag_prompt )])
60-
61- state ["final_response" ] = result .content
18+ state ["final_response" ] = answer
6219 state ["intermediate_results" ]["qna" ] = {
63- "retrieved_docs " : similar_docs ,
64- "response " : result . content
20+ "response " : answer ,
21+ "query " : state [ "query" ]
6522 }
6623
24+
6725 return state
0 commit comments