# 1. 필요한 도구 한꺼번에 설치 import gradio as gr from sentence_transformers import SentenceTransformer, util # 2. 모델과 데이터 준비 (딱 한 번만 실행됨) model = SentenceTransformer('jhgan/ko-sroberta-multitask') physics_kb = [ "상대성 이론: 시공간은 관찰자에 따라 상대적이며 중력에 의해 휘어질 수 있습니다.", "양자 역학: 미립자의 세계에서는 관측 전까지 여러 상태가 중첩되어 존재합니다.", "열역학 제2법칙: 고립계의 엔트로피(무질서도)는 시간이 흐를수록 항상 증가합니다.", "뉴턴의 제3법칙: 모든 작용에는 크기가 같고 방향이 반대인 반작용이 존재합니다.", "가속도: 단위 시간당 물체의 속도가 변하는 정도를 나타내는 물리량입니다.", "가속 좌표계: 가속도 운동을 하는 관찰자가 기준이 되는 좌표계로, 관성력이 나타납니다.", "각속도: 원운동 하는 물체가 단위 시간당 회전하는 각도를 의미합니다.", "간섭 무늬: 두 개 이상의 파동이 겹쳐지면서 보강되거나 상쇄되어 나타나는 밝고 어두운 무늬입니다.", "강유전체: 외부 전기장이 없어도 분극을 유지하며, 전기장에 의해 분극 방향이 바뀌는 물질입니다.", "검전기: 정전기 유도 현상을 이용하여 물체의 대전 여부를 알아내는 장치입니다.", "공명 진동수: 물체가 가진 고유 진동수와 외부 힘의 진동수가 일치하여 진폭이 최대가 되는 지점입니다.", "공전: 한 천체가 다른 천체의 주위를 일정한 궤도를 따라 도는 운동입니다.", "광양자(광자): 빛을 입자로 보았을 때의 최소 단위로, 에너지를 가진 입자입니다.", "광전 효과: 금속에 빛을 비추었을 때 전자가 튀어나오는 현상으로 빛의 입자성을 증명합니다.", "구심력: 원운동 하는 물체를 원의 중심 방향으로 끌어당기는 힘입니다.", "기전력: 회로에 전류를 흐르게 하는 원동력이 되는 전압입니다.", "단진자: 줄에 매달린 추가 중력에 의해 일정한 주기를 가지고 왕복 운동을 하는 장치입니다.", "대전체: 전기를 띠고 있는 물체를 의미합니다.", "도플러 효과: 파원과 관찰자의 상대적 운동으로 인해 소리나 빛의 진동수가 변하는 현상입니다.", "돌림힘(토크): 물체를 회전시키려는 힘의 작용으로, 힘의 크기와 팔의 길이에 비례합니다.", "드브로이파: 움직이는 모든 입자가 파동의 성질을 갖는다는 이론에서의 파동입니다.", "등가속도 운동: 가속도가 시간에 따라 변하지 않고 일정한 운동입니다.", "라디안: 원의 반지름과 호의 길이가 같을 때의 각도를 1로 정의하는 단위입니다.", "렌츠 법칙: 전자기 유도 시 유도 전류는 자기장의 변화를 방해하는 방향으로 흐릅니다.", "마찰력: 물체의 운동을 방해하는 힘으로 접촉면의 성질과 누르는 힘에 비례합니다.", "무선 인식(RFID): 전파를 이용하여 먼 거리에서 정보를 인식하는 기술입니다.", "물질파: 전자와 같은 입자가 나타내는 파동의 성질입니다.", "바이어스 전압: 반도체 소자가 작동하도록 외부에서 걸어주는 전압입니다.", "반도체: 도체와 부도체의 중간 성질을 가지며, 온도나 불순물에 의해 전기 전도성이 변합니다.", "발전기: 역학적 에너지를 전자기 유도 법칙을 이용해 전기 에너지로 바꾸는 장치입니다.", "보어 원자 모형: 전자가 특정 궤도에서만 에너지 방출 없이 회전한다는 원자 모델입니다.", "불확정성 원리: 입자의 위치와 운동량을 동시에 정확하게 측정할 수 없다는 양자 역학의 원리입니다.", "블랙홀: 중력이 극단적으로 강해 빛조차 빠져나갈 수 없는 천체입니다.", "비열: 물질 1g의 온도를 1도 올리는 데 필요한 열량입니다.", "빛의 굴절: 빛이 다른 매질로 들어갈 때 속도 차이로 인해 진행 방향이 꺾이는 현상입니다.", "상대성 이론: 시공간이 관찰자의 상태나 중력에 따라 상대적이라는 아인슈타인의 이론입니다.", "상보성 원리: 빛이나 전자가 입자성과 파동성을 동시에 가지며 상황에 따라 한 쪽이 나타난다는 원리입니다.", "소비 전력: 전기 장치가 단위 시간 동안 사용하는 전기 에너지의 양입니다.", "솔레노이드: 원통형으로 촘촘하게 감은 코일로, 전류가 흐르면 내부에서 일정한 자기장이 생깁니다.", "송전: 발전소에서 만든 전기를 수용가까지 보내는 과정입니다.", "수직 항력: 면이 물체를 수직으로 떠받치는 힘입니다.", "슈뢰딩거의 고양이: 양자 역학의 중첩 상태를 설명하기 위한 유명한 사고 실험입니다.", "스칼라량: 방향 없이 크기만으로 나타내는 물리량(질량, 시간 등)입니다.", "시공간: 시간과 공간을 분리할 수 없는 하나의 4차원적 연속체로 보는 개념입니다.", "열역학 제1법칙: 에너지는 생성되거나 소멸되지 않고 형태만 바뀐다는 에너지 보존 법칙입니다.", "열역학 제2법칙: 고립계의 엔트로피는 항상 증가하는 방향으로 일어난다는 법칙입니다.", "영의 실험: 빛의 간섭 현상을 통해 빛이 파동임을 증명한 실험입니다. ", "옴의 법칙: 전류의 세기는 전압에 비례하고 저항에 반비례한다는 법칙입니다.", "원심력: 원운동 하는 관찰자가 느끼는, 중심 밖으로 나가려는 가상의 힘입니다.", "유도 기전력: 자기장의 변화에 의해 코일에 발생하는 전압입니다.", "유전 분극: 절연체에 전기장을 가할 때 원자 내 전하가 재배치되어 전기를 띠는 현상입니다.", "이중 슬릿 실험: 전자나 빛이 두 개의 틈을 지나 간섭 무늬를 만드는 실험입니다.", "일-운동 에너지 정리: 물체에 해준 일의 양은 물체의 운동 에너지 변화량과 같다는 정리입니다.", "자기력: 자석이나 전류가 흐르는 도선 사이에서 작용하는 힘입니다.", "전기장: 전하가 주위 공간에 전기력을 미치는 공간입니다.", "전자기 유도: 자기장의 변화가 전류를 발생시키는 현상입니다.", "정전기 유도: 대전체를 가까이 할 때 물체 내부의 전하가 이동하여 전기를 띠는 현상입니다.", "중력 가속도: 지구 중력에 의해 자유 낙하 하는 물체가 얻는 가속도(약 9.8m/s²)입니다.", "케플러 제1법칙(타원 궤도 법칙): 행성은 태양을 한 초점으로 하는 타원 궤도를 돕니다. ", "터널링 효과: 입자가 에너지가 부족해도 양자 역학적 확률로 장벽을 통과하는 현상입니다.", "패러데이 법칙: 자기장의 변화가 클수록 더 큰 유도 기전력이 발생한다는 법칙입니다.", "헤르츠 실험: 실험을 통해 전자기파의 존재를 처음으로 증명한 연구입니다." ] encoded_kb = model.encode(physics_kb) # 3. 질문에 답하는 핵심 기능 (정확도 끝판왕 버전!) def physics_bot(user_question): # 전처리: 질문에서 공백, 물음표, 마침표를 다 지워버립니다. clean_q = user_question.replace(" ", "").replace("?", "").replace(".", "") # [강력 조치] 단어가 키워드와 '완전히' 일치하는지 먼저 확인 for item in physics_kb: # 콜론(:) 앞부분이 키워드입니다. keyword = item.split(":")[0].strip() clean_k = keyword.replace(" ", "") # 사용자가 입력한 게 키워드랑 똑같거나, 키워드가 질문에 포함되어 있으면 바로 출력! if clean_q == clean_k or clean_q == clean_k + "란" or clean_q == clean_k + "이뭐야": return item # 만약 위에서 못 찾으면, 그때 AI 모델(SentenceTransformer)이 비슷함을 계산합니다. query_vec = model.encode(user_question) scores = util.cos_sim(query_vec, encoded_kb)[0] best_idx = scores.argmax() return physics_kb[best_idx] # 4. ★마법의 구간: 웹 화면 만들기★ demo = gr.Interface( fn=physics_bot, inputs=gr.Textbox(label="물리에 대해 궁금한 것을 물어보세요!", placeholder="예: 엔트로피가 뭐야?"), outputs=gr.Textbox(label="AI 물리학자의 답변"), title="나만의 AI 물리 사전", description="Hugging Face 모델을 이용해 물리 지식을 알려주는 챗봇입니다." ) # 실행! (나오는 URL을 클릭하면 웹페이지가 뜹니다) demo.launch(share=True)