physics-bot / app.py
sosoeun's picture
Update app.py
c99ad19 verified
# 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)