æ°ããåºãGemma4-E2B-QATã詊ããŠã¿ã
ã¯ããã«
2026幎6æ5æ¥ãGoogleã QAT(Quantization-Aware Training) ãšããææ³ã§æé©åããGemma4ãšã㊠Gemma4 QAT ã¢ãã«ããªãªãŒã¹ããŸãããQATã¢ãã«ã¯ã¢ãã€ã«åããããã€ã¹ããã¯PCåããŸã§5ã€ã®ãµã€ãºãçšæãããŠããŸããä»åã¯ãã®äžã§æå°ãµã€ãºã® Gemma4-E2B-QAT ã Ollama + Open WebUI ã®ç°å¢ã§å®éã«è©ŠããŠã¿ãŸãã
Gemma4-E2B-QATã®ç޹ä»
Gemma4-E2B-QATã¯ãGemma4ããã¡ããªãŒã®æå°ã¢ãã«ãQATã§æé©åããã¢ãã«ã«ãªããŸããããã¹ãã»ç»åã»é³å£°ã®ãã«ãã¢ãŒãã«å ¥åã«å¯Ÿå¿ããŠããŸãã
QATã¯éååãèæ ®ããŠãã¬ãŒãã³ã°ããææ³ã«ãªã£ãŠãããéåžžã®ãã¬ãŒãã³ã°åŸéåå(PTQ)ããã粟床å£åãæãã€ã€ã¢ãã«ãµã€ãºãå€§å¹ ã«åæžããããšãã§ããŸããå質ãšããŠã¯ãPTQã®ããŒã¹ã©ã€ã³ãšæ¯èŒããŠQATã®ã»ããå šäœçã«é«ãå質ãå®çŸã§ããŠãããšã®ããšã§ãã
å®è¡ç°å¢
ä»åã¯ãDockerç°å¢ã§ Ollama ãš Open WebUI ãçšæããŠåãããŠã¿ãŸãã
ãªã Ollamaã§æäŸãããŠãã Gemma4-E2B-QAT ã¯QATã«ããã¢ãã«ãµã€ãºãçŽ4.3GBãŸã§å§çž®ãããŠãããGPUç¡ãã§ãåäœå¯èœãªã®ã§CPUæšè«ã§æ€èšŒããŸãã
PCã¹ããã¯
| é ç® | ã¹ãã㯠|
|---|---|
| OS | Windows (WSL2) |
| CPU | Intel Core i7 (第11äžä»£) |
| ã¡ã¢ãª | 16GB |
ããŒã«
| é ç® | ããŒãžã§ã³ |
|---|---|
| Ollama | 0.30.7 |
| Open WebUI | latest (mainã€ã¡ãŒãž) |
çšæããComposeãã¡ã€ã«
services:
ollama:
image: ollama/ollama:0.30.7
container_name: ollama
volumes:
- ollama:/root/.ollama
ports:
- "11434:11434"
restart: unless-stopped
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
depends_on:
- ollama
restart: unless-stopped
volumes:
ollama:
ã»ããã¢ããã¯ä»¥äžã®ã³ãã³ãã§å®äºããŸãã
# ã³ã³ããèµ·å
docker compose up -d
# ã¢ãã«ã®ããŠã³ããŒã(5~10åãããããããšæããŸã)
docker exec ollama ollama pull gemma4:e2b-it-qat
ã»ããã¢ããã³ãã³ãå®è¡åŸããã©ãŠã¶ã§ http://localhost:3000 ã«ã¢ã¯ã»ã¹ãããšãäžèšå³ã®ããã«Open WebUIã®ç®¡çè ã¢ã«ãŠã³ããæ±ããããŸããã¢ã«ãŠã³ããäœæããã°ããã«äœ¿ãå§ããããŸãã

å®éã«è©ŠããŠã¿ã
ããã¹ãçæãç»åèªèã顿ãšããŠããã€ãããã³ããã詊ããŠã¿ãŸããã
ããã¹ãçæ
以äžã®è¡šã«èšèŒãããæåã®æ°ãäžãããæ°å€ã®æ¯èŒããæŒç®ããã³ãŒãçæãã®è³ªåã«å¯ŸããŠæ£ããåçã§ãããã©ãã詊ããŠã¿ãŸããã
| 質å | æçµçãªåç | æ£è§£ / äžæ£è§£ |
|---|---|---|
| strawberryã®rãæ°ã㊠| ãstrawberryãã®äžã®ãrãã¯ãå šéšã§ 2〠ã§ãã | äžæ£è§£ |
| 5.11ãš5.9ã®æ°å€ãæ¯èŒã㊠| 5.11 㯠5.9 ãããå°ããã§ãã (5.11 < 5.9) | æ£è§£ |
| 1204*1402ã¯ïŒ | 1204Ã1402=1,688,008 | æ£è§£ |
| Pythonã§ãããããã®ããã°ã©ã ãæžã㊠| â»çæã³ãŒãã¯Appendixã«èšèŒ | æ£è§£ |
ãæåã®æ°ãäžããã®è³ªåã«ã¯æ£ããåçãã§ããŸããã§ãããAIãèŠæãšãã質åã®åçã¯ãã¯ãé£ããã§ãããã®åé¢ããæ°å€ã®æ¯èŒããæŒç®ããã³ãŒãçæãã®è³ªåã«ã¯æ£ããåçããããšãã§ããŸããã
ç»åèªè
ç§ãæå±ããŠãããæ ªåŒäŒç€Ÿã¡ã³ããŒãº AIãã©ãŒãªãŒã«ã«ã³ãããŒãã®ç޹ä»ããŒãžãã¹ã¯ãªãŒã³ã·ã§ããããç»åã顿ãšããç»åå ã®æåãæ€åºã§ãããã詊ããŠã¿ãŸããã

質å:
ç»åã«æžãããŠããæåãæœåºããŠãã ãã
åç:
å·ŠåŽã®æ¯æŽå
容ã«ã€ããŠ
ã»åŒç€Ÿã®çæAI掻çšãæšé²ãã解決ã«å°ããŸãã
Phase.01
ã»ååŒç°å¢ãšèª²é¡ãå
±æãã解決ã«å°ããŸãã
ã»çæAIå°å
¥ã®æ§ç¯ã»éçšãæ¯æŽããå°å
¥ãæšé²ããŸãã
Phase.02
芪é¢ä¿æ¹åAI (RAG) ã®æ§ç¯
ã»RAGã®æ§ç¯ãšç²ŸåºŠæ€èšŒçµã¿èŸŒã¿
ã»ã¢ããªã®å
šç€Ÿå±éã«åãæºå
ã»ã¢ããªèŠä»¶èšèš
Phase.03
瀟å
é¢ä¿æ¹åAI (RAG) ã®æ§ç¯
ã»ç€Ÿå
é¢ä¿æ¹åAI (RAG) ãçšããçæAIã¢ããªã®æ§æ³ãå°å
¥
ã»å°å
¥ããã¢ããªã®æŽ»çšè©äŸ¡ã»éçšç¶æ³ã®æ¹å
ç»åå ã«ããäžéšã®ããã¹ãã®æœåºã¯ã§ããŠããããã«èŠããŸãããæ§é åãèæ ®ããŠæœåºã§ããªããšãã課é¡ã¯ããããã§ããã
é床ããã³ã¡ã¢ãªäœ¿çšéã«é¢ããŠ
å ã»ã©è©Šããããã¹ãçæãšç»åèªèããããã§é床ãšã¡ã¢ãªäœ¿çšéã確èªããã®ã§è¡šã«ãŸãšããŸãã
| é ç® | å ¥ååŠçé床 (ããŒã¯ã³/ç§) | çæåŠçé床 (ããŒã¯ã³/ç§) | ã¡ã¢ãªäœ¿çšé (GB) |
|---|---|---|---|
| ããã¹ãçæ | 115ã135 | 18.1ã19.2 | 8.2~8.4 |
| ç»åèªè | 50~54 | 17.5~19 | 8.3~8.5 |
é床ã«é¢ããŠã¯ãCPUã§åãããå²ã«ã¯ããããã®é床ã«ãªã£ããšæããŸãããããã¹ãçæãšç»åèªèã®å·®ç°ãšããŠã¯ãã¯ãå ¥ååŠçé床ã«éãããããç»åãå ¥åãããšåŠçè² è·ãé«ãé床ãèœã¡ããšãã£ãçµæã«ãªããŸãããã¡ã¢ãªäœ¿çšéã¯ã©ã¡ããåçšåºŠã§16GBã®ã¡ã¢ãªã§ããã°å€å°äœè£ãããããã§ãã
ãŸãšã
Gemma4-E2B-QATã¯ãQATã«ããéååæé©åã«ãã£ãŠã¢ãã«ãµã€ãºãçŽ4.3GBãŸã§å§çž®ãããŠãããããã§ã16GBã¡ã¢ãªã®ãã·ã³ã§ãCPUæšè«ã§åäœãããããšãã§ããŸããã
ããã¹ãçæã»ç»åèªèã詊ããŠã¿ãŸããããäž¡æ¹ãšããããè¯ããšããæãã§ã¯ãªããããããã®ç²ŸåºŠãšããã®ãæ£çŽãªææ³ã§ãããã ãä»å詊ããã¢ãã«ãã¹ããŒããã©ã³ãIoTããã€ã¹åãã«æäŸããè¶ è»œéã¢ãã«ã§ãã£ããããä»ã®äžäœã¢ãã«ã䜿çšããã°ãã£ãšãã粟床ãåºããšæããŸããèå³ãããã°ãã²è©ŠããŠã¿ãŠãã ããã
Appendix: çæãããããããããã°ã©ã
ãããããããã°ã©ã
import random
def get_user_choice():
"""ãŠãŒã¶ãŒã«ãã°ãŒãããã§ãããããŒãã®ãããããéžæããã颿°"""
print("\n--- ãããããã²ãŒã éå§ ---")
while True:
# éžæè¢ã衚瀺
print("\nããªãã¯ã©ã¡ããéžã³ãŸããïŒ")
print("1: ã°ãŒ (Rock)")
print("2: ãã§ã (Scissors)")
print("3: ã㌠(Paper)")
choice = input("æ°åãå
¥åããŠãã ãã (1, 2, 3): ")
if choice == '1':
return "ã°ãŒ"
elif choice == '2':
return "ãã§ã"
elif choice == '3':
return "ããŒ"
else:
print("ç¡å¹ãªå
¥åã§ãã1, 2, 3ã®ãããããå
¥åããŠãã ããã")
def get_computer_choice():
"""ã³ã³ãã¥ãŒã¿ãŒãã©ã³ãã ã«éžæããæ (ã°ãŒããã§ããããŒ) ãè¿ã颿°"""
options = ["ã°ãŒ", "ãã§ã", "ããŒ"]
# 0ãŸãã¯1, 2ã®å Žåã¯ãªã¹ãããã©ã³ãã ã«èŠçŽ ãéžã¶
return random.choice(options)
def determine_winner(user_choice, computer_choice):
"""ãŠãŒã¶ãŒã®éžæãšã³ã³ãã¥ãŒã¿ãŒã®éžæãæ¯èŒããåæãå€å®ãã颿°"""
print("\n--- çµæçºè¡š ---")
print(f"ããªã: {user_choice}")
print(f"ã³ã³ãã¥ãŒã¿ãŒ: {computer_choice}")
# åç¹ã®å ŽåïŒã°ãŒ vs ã°ãŒãªã©ïŒã¯åŒãåããšãã
if user_choice == computer_choice:
return "åŒãåãïŒãŸãææŠããŠãã ããã"
# ãŠãŒã¶ãŒã®åã¡ãã¿ãŒã³å€å®
elif (user_choice == "ã°ãŒ" and computer_choice == "ãã§ã") or \
(user_choice == "ãã§ã" and computer_choice == "ããŒ") or \
(user_choice == "ããŒ" and computer_choice == "ã°ãŒ"):
return f"ð ããã§ãšãããããŸãïŒããªã㯠{user_choice} ã§åã¡ãŸããïŒ ð"
# ã³ã³ãã¥ãŒã¿ãŒã®åã¡ãã¿ãŒã³å€å® (äžèšã®æ¡ä»¶ä»¥å€ã¯ã³ã³ãã¥ãŒã¿ãŒã®åã¡)
else:
return f"ð¢ æ®å¿µãªãããã³ã³ãã¥ãŒã¿ãŒã® {computer_choice} ã«è² ããŸãããé 匵ã£ãŠãã ããã"
# ã¡ã€ã³åŠç
if __name__ == "__main__":
user_move = get_user_choice()
computer_move = get_computer_choice()
result = determine_winner(user_move, computer_move)
print(result)
Discussion