import os from openai import OpenAI import time import subprocess gpt_api_key = os.environ['OPENAI_API_KEY'] sys_prompt = os.environ['SYSTEM_PROMPT'] client = OpenAI(api_key=gpt_api_key) model_name = "ft:gpt-3.5-turbo-1106:personal::8oksosTP" ###함수 #어시스턴트 응답 생성 함수 def assistant_choice(assistantid,text): # assistant retrieve 불러오기 assistant = client.beta.assistants.retrieve(assistantid) # message thread 만들기 thread = client.beta.threads.create() # message 추가하기 message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content=text, ) # 실행하기 run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id, ) # 기다리기 print("run을 실행합니다.") while True: if run.status == "completed": break run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id) # print(run) # print("실행 중...") time.sleep(5) # 결과 출력하기 messages = client.beta.threads.messages.list(thread_id=thread.id) gpt_answer = messages.data[0].content[0].text.value return gpt_answer #gpt응답 생성 함수 def fine_function_gpt(state, state_chatbot, text): if text=="": return state, state_chatbot, state_chatbot messages = state + [{'role': 'user','content': text}] res =client.chat.completions.create( model=model_name, messages=messages, temperature=0.6, top_p=1, frequency_penalty=0, presence_penalty=0 ) msg = res.choices[0].message.content print(msg) if msg == "커튼 구매옵션": msg = assistant_choice("asst_ni23TayvHjxOarAxVTDODm91",text) elif msg == "블라인드 구매옵션": msg = assistant_choice("asst_qc85Yh4LjKqWMxlDakHcXsFs",text) new_state = [{'role': 'user','content': text}, {'role': 'assistant','content': msg}] state = state + new_state # 내부적으로 기능 state_chatbot = state_chatbot + [(text, msg)] # 화면에 보이는 기능 print(state) return state, state_chatbot, state_chatbot #상담 시작 버튼 def start_def(m): if m == []: return [],[],[("상담을 진행할 제품을 선택해주세요!","")] else: text=f"{m} 문의드립니다." message = [{'role': 'system','content': sys_prompt}, {'role': 'user','content': text}, {'role': 'assistant','content': "안녕하세요 고객님~ 무엇을 도와드릴까요?"} ] state_chatbot = [("...", "안녕하세요. 고객님! 무엇을 도와드릴까요?")] # 튜플 return message,state_chatbot,state_chatbot with gr.Blocks(theme='JohnSmith9982/small_and_pretty') as demo: state = gr.State([]) #gpt 호출 시 사용하는 message state_chatbot = gr.State([]) #gr.chatbot의 상태를 업로드하는 채팅기록 with gr.Row(): gr.HTML("""

마리하우스 챗봇

""") with gr.Row(): with gr.Column(scale=6): md = gr.Dropdown(["커튼","블라인드"],type="value",label="제품 선택", info="원하는 상담 제품을 골라주세요!") with gr.Column(scale=4): gr.HTML("""

확인

""") start_btn = gr.Button("시작하기") with gr.Column(scale=1): gr.HTML("""

다크모드 전환

""") toggle_dark = gr.Button(value="Toggle Dark") toggle_dark.click(None, js="""() => { document.body.classList.toggle('dark'); document.querySelector('gradio-container').style.backgroundColor = 'var(--color-background-primary)' } """ ) with gr.Row(): with gr.Column(scale=1): chatbot = gr.Chatbot(elem_id='메세지창',height=650) txt = gr.Textbox(show_label=False,placeholder='메세지를 입력해주세요!') txt_btn = gr.Button("메세지 보내기") txt_btn.click(fine_function_gpt, [state, state_chatbot, txt], [state, state_chatbot, chatbot]) txt_btn.click(lambda: '', None, txt) txt.submit(fine_function_gpt, [state, state_chatbot, txt], [state, state_chatbot, chatbot]) # 텍스트 박스에서 enter시 전송 txt.submit(lambda: '', None, txt) start_btn.click(start_def, inputs= [md], outputs = [state, state_chatbot, chatbot]) demo.launch(debug=True)