diff --git a/ai/.gitignore b/ai/.gitignore index 8cf3b243dc..9cee807084 100644 --- a/ai/.gitignore +++ b/ai/.gitignore @@ -5,5 +5,4 @@ *.pyc __pycache__ data/ -cap30.pem -chatbot.pem +cap30.pem \ No newline at end of file diff --git a/ai/deepl_test.py b/ai/deepl_test.py deleted file mode 100644 index 5ff87e73e6..0000000000 --- a/ai/deepl_test.py +++ /dev/null @@ -1,9 +0,0 @@ -import deepl - -auth_key = 'd31a50f4-1d48-4f54-bbad-c6c63cdcffb3:fx' -translator = deepl.Translator(auth_key) - -message = '안녕하세요. 맛있는 점심 드세요~' -result = translator.translate_text(message, target_lang='KO') - -print(result.text) \ No newline at end of file diff --git a/ai/llm/__pycache__/llm_rag.cpython-312.pyc b/ai/llm/__pycache__/llm_rag.cpython-312.pyc index 6584d25978..ae6e9159b6 100644 Binary files a/ai/llm/__pycache__/llm_rag.cpython-312.pyc and b/ai/llm/__pycache__/llm_rag.cpython-312.pyc differ diff --git a/ai/llm/__pycache__/llm_rag.cpython-39.pyc b/ai/llm/__pycache__/llm_rag.cpython-39.pyc index 635cf0e24f..9eda71304d 100644 Binary files a/ai/llm/__pycache__/llm_rag.cpython-39.pyc and b/ai/llm/__pycache__/llm_rag.cpython-39.pyc differ diff --git a/ai/llm/deepl_translator.py b/ai/llm/deepl_translator.py deleted file mode 100644 index a309688901..0000000000 --- a/ai/llm/deepl_translator.py +++ /dev/null @@ -1,15 +0,0 @@ -import deepl - -class DeeplTranslator: - def __init__(self): - API_KEY = 'd31a50f4-1d48-4f54-bbad-c6c63cdcffb3:fx' - self.translator = deepl.Translator(API_KEY) - - def fuck(self, message): - result = self.translator.translate_text(message, 'ko') - return result.text - - -if __name__ == '__main__': - dl = DeeplTranslator() - dl.fuck() \ No newline at end of file diff --git a/ai/llm/llm_rag.py b/ai/llm/llm_rag.py index 26899df985..864e537f7a 100644 --- a/ai/llm/llm_rag.py +++ b/ai/llm/llm_rag.py @@ -3,9 +3,8 @@ from langchain_core.runnables import RunnablePassthrough, RunnableLambda from langchain_openai import ChatOpenAI from tavily import TavilyClient -from llm.prompt import casual_prompt, is_qna_prompt, combine_result_prompt, score_prompt +from llm.prompt import casual_prompt, is_qna_prompt, combine_result_prompt, score_prompt, translate_prompt from langchain.retrievers.multi_query import MultiQueryRetriever -import deepl import os class LLM_RAG: @@ -19,9 +18,7 @@ def __init__(self, trace = False): self.is_qna_prompt = is_qna_prompt() self.combine_result_prompt = combine_result_prompt() self.score_prompt = score_prompt() - self.deepl = deepl.Translator(os.getenv("DEEPL_API_KEY")) - self.ko_query = None - self.result_lang = None + self.translate_prompt = translate_prompt() self.notice_retriever = None self.school_retriever = None self.notice_multiquery_retriever = None @@ -97,37 +94,41 @@ def set_chain(self): self.score_route ) + self.translate_chain = ( + self.translate_prompt + | self.llm + | StrOutputParser() + ) def qna_route(self, info): if "question" in info["topic"].lower(): - self.result = self.rag_combine_chain.invoke(self.ko_query) - score = self.score_chain.invoke({"question" : self.ko_query, "answer": self.result}) - self.score_invoke_chain.invoke({"score" : score, "question": self.ko_query}) + + self.result = self.rag_combine_chain.invoke(info["question"]) + score = self.score_chain.invoke({"question" : self.question, "answer": self.result}) + self.score_invoke_chain.invoke({"score" : score, "question": self.question}) elif "casual" in info["topic"].lower(): - self.result = self.casual_answer_chain.invoke(self.question) + self.result = self.casual_answer_chain.invoke(info['question']) else: - self.result = self.rag_combine_chain.invoke(self.question) + self.result = self.rag_combine_chain.invoke(info["question"]) def score_route(self, info): if "good" in info["score"].lower(): - self.result = self.deepl.translate_text(self.result, target_lang=self.result_lang).text return self.result else: print('-- google search --') - content = self.tavily.qna_search(query='국민대학교 ' + self.ko_query) - self.result = "I couldn't find the answer, so I searched on Google.\n\n" + content - self.result = self.deepl.translate_text(self.result, target_lang=self.result_lang).text + content = self.tavily.qna_search(query='국민대학교 ' + self.question) + self.result = "답을 찾을 수 없어서 구글에 검색했습니다.\n\n" + self.result += self.translate_chain.invoke({'content' : content, 'question':self.question}) + return self.result def format_docs(self, docs): # 검색한 문서 결과를 하나의 문단으로 합쳐줍니다. return "\n\n".join(doc.page_content + '\nmetadata=' + str(doc.metadata) for doc in docs) - def query(self, question, result_lang): + def query(self, question): self.question = question - self.ko_query = self.deepl.translate_text(self.question, target_lang='ko').text - self.result_lang = result_lang self.qna_route_chain.invoke(question) return self.result diff --git a/ai/llm/prompt.py b/ai/llm/prompt.py index 584b5096ff..725da7cb6a 100644 --- a/ai/llm/prompt.py +++ b/ai/llm/prompt.py @@ -39,4 +39,13 @@ def score_prompt(): Classification:""" ) + return prompt + +def translate_prompt(): + prompt = PromptTemplate.from_template(""" + You are a translator with vast knowledge of human languages. Translate the content into the language corresponding to the question. You should only translate and never answer questions. + + question : {question} + content : {content} + result :""") return prompt \ No newline at end of file diff --git a/ai/requirements.txt b/ai/requirements.txt index 9be2df4985..ca2b5f9a34 100644 --- a/ai/requirements.txt +++ b/ai/requirements.txt @@ -6,5 +6,4 @@ langchainhub==0.1.15 beautifulsoup4==4.12.3 pypdf==4.1.0 python-dotenv==1.0.1 -langchain-text-splitters==0.0.1 -deepl \ No newline at end of file +langchain-text-splitters==0.0.1 \ No newline at end of file diff --git a/ai/run_chatbot.py b/ai/run_chatbot.py index a5fcc485b6..d097a7d41e 100644 --- a/ai/run_chatbot.py +++ b/ai/run_chatbot.py @@ -11,7 +11,6 @@ load_dotenv() os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY') -os.environ['DEEPL_API_KEY'] = os.getenv('DEEPL_API_KEY') # LangSmith 사용시 아래 주석을 해제 # os.environ['LANGCHAIN_API_KEY'] = os.getenv('LANGCHAIN_API_KEY') @@ -41,5 +40,5 @@ if q == str(0): break print('AI : ', end='') - print(llm.query(q, 'ZH')) + print(llm.query(q)) print() \ No newline at end of file diff --git a/ai/server.py b/ai/server.py index 042622d0e6..4a8ea05504 100644 --- a/ai/server.py +++ b/ai/server.py @@ -11,7 +11,6 @@ class Query(BaseModel): query: str - target_lang: str @asynccontextmanager async def lifespan(app:FastAPI): @@ -59,14 +58,18 @@ async def lifespan(app:FastAPI): async def initiate(): return "안녕하세요! 국민대학교 전용 챗봇 KUKU입니다. 국민대학교에 대한 건 모든 질문해주세요!" -@app.post("/api/chatbot") +@app.post("/query") async def query(query: Query): - return {'success': 'True', + return {'code': '200', 'message': 'success', 'response': { - 'answer': llm.query(query.query, query.target_lang) + 'answer': llm.query(query.query) }} +@app.post("/input") +async def input(data: UploadFile): + vdb.add_content(data.file) + return if __name__ == "__main__": diff --git a/ai/vectordb/__pycache__/vector_db.cpython-39.pyc b/ai/vectordb/__pycache__/vector_db.cpython-39.pyc index 3bb5d10a25..22bfb092bf 100644 Binary files a/ai/vectordb/__pycache__/vector_db.cpython-39.pyc and b/ai/vectordb/__pycache__/vector_db.cpython-39.pyc differ