LLM/çæAIã§éº»éã²ãŒã ãæ»ç¥ã§ããã®ãïŒãã£ãŠã¿ã[ççèªèç·š] ïŒGPT-4o/Gemini 2.0/Llama 3.2V 11BïŒ
麻éãèŠããããã«ã¬ãããªè±è¡£éº»éã²ãŒã ãã²ãŒã ã»ã³ã¿ãŒã§ãã£ããããµã¿ãŒã³ã§ãã£ããããŠãããã¡ã«ãCPUãããŸãã«ã匷ãã®ã§ãããã£ãŠçæAI/LLMã«éº»éã®æŠè¡èããŠããã£ããæ¥œã«è±ãããããããããïŒã
ãšæããçæAI/LLMã«éº»éã®ççãèªèãããŠè§£ãããããšè©Šã¿ãèšé²ã§ãã
çæ/LLMã§éº»éãè§£ããããããŒ

ãŸã麻éã²ãŒã ã®ç»é¢ãã¹ã¯ã·ã§ããŸããã¹ã¯ã·ã§ããæ¹æ³ã¯ã¢ããªã²ãŒã ã®å Žåã¯ã¹ã¯ãªãŒã³ã·ã§ããããµã¿ãŒã³ã®ã²ãŒã ãã¢ãŒã±ãŒãã²ãŒã ã®å Žåã¯ã«ã¡ã©ã§åçããšããŸããä»åã¯ããç²ŸåºŠãæªããã£ã¬ã³ãžã®ããããããåŸè
ã§ãã£ãŠã¿ãŸããã
åçããšã£ãããšãç»åèªèãã§ããLLMã«èªã¿èŸŒãŸããé
ç/ççïŒéº»éã®çã®äžŠã³ïŒãèªèãããŠãæŠè¡ãèããŠããããŸãã
ãã®æŠè¡ã䜿ããã®ã¯ã¬ã¬ã·ãŒéº»éã²ãŒã ã®ã¿
ãã ããã®æŠè¡ã䜿ããã®ã¯ãã¬ã€ã€ãŒã®æã¡æéå¶åºŠããªãã¬ã¬ã·ãŒéº»éã²ãŒã ã®ã¿ã§ãã
æè¿ã®éº»éã²ãŒã ïŒééã麻éãã¡ã€ãã¬ãŒã«ãªã©ïŒã¯å¯ŸäººæŠã¯ããšããCPUæŠã§ãæã¡æéã20ç§ãªã©ãšæ±ºããããŠããã®ã§ãç»åãã¹ã¯ã·ã§ããŠãæŠè¡ãAIã«èããŠããã£ãŠããããã¿ãŠçã®æã¡æ¹ã決ããã®ã20ç§å
ã«ããã®ã¯ä»ã ãšããªãé 匵ããªããšé£ãããšæããŸãã
æ€èšŒã«äœ¿ãçŽ æãšLLMã¢ãã«ãªã©
æ€èšŒã«äœ¿ãã®ã¯éº»éã²ãŒã ã®ç»é¢ãã«ã¡ã©ã§ãšã£ããã®

䜿çšããã¢ãã«
Llama 3.2V 11B (Ollama) â»è»œéã¢ãã«ãªã®ã¯åž°çã§ãã·ã³ãçšæã§ããªãã£ãã
Gemini2.0 Flash
OpenAI 4o
Llama -> Gemini -> OpenAI ã®åªå
床ã§è©ŠããŸããã
æ¬åœã¯ç¡æã®ããŒã«ã«LLM Llamaã§ããããã£ãã®ã§ãããé£ããã£ãã®ã§ç¡æã®Gemini2.0ã§ãã£ãŠãé£ãããæåŸã®é Œã¿ã®ç¶±ã®OpenAIã«ãã£ã¬ã³ãžãããšããæµãã«ãªããŸãã
麻é ççãçè§£ããã
ã§ã¯ãŸãå çšã®ç»åã®ãã¬ã€ã€ãŒåŽã®ççãèªèãããŸããã

LLMãžã®ç²ŸåºŠããããããã«èªåã®çã®ã¿ãç»åã§åã£ãŠLLMã«æž¡ããŸã

Llama3.2 Vision 11B
çµè«ãŒïŒã ãð
Ollamaã§åŒã³åºããŸãïŒMacBookAir M1 ã¡ã¢ãª16GBïŒ
ollama run llama3.2-vision:11b
>>> ãã®ç»åã¯æ¥æ¬ã®ãªãŒã麻éã²ãŒã ã®ã¹ã¯ã·ã§ç»åã§ããç»åã®äžã«ãã€ã£ãŠããèªåã®éº»éçã®åç§°ãå·Šããå³ã®é ã«ãããŠãã
... ãããmajan2cut.jpegãã®ç»åã®äžã«ãã€ã£ãŠããèªåã®éº»éçã®åç§°ã¯ãå·Šããå³ã®é ã«æ¬¡ã®éãã§ãã
1. ãäžäžã
2. ãåè¬ã
3. ãä¹è¬ã
4. ãå «è¬ã
5. ãäžè¬ã
6. ãå è¬ã
7. ãäºè¬ã
8. ãäºè¬ã
ãŸããå³åŽã«ã¯ãååãããå «åäžããšããçããã€ã£ãŠããŸãã
ã»ã»ã»è»œéã¢ãã«ãšããããšããããŸãããŸã£ãããªã«ããã£ãŠããŸããã
ããã ãšäœ¿ãç©ã«ãªããªãã§ãããã髿§èœã¢ãã«Llama 3.2 Vision (90B)ã ãšããå°ãã¯ãã·ãªã®ãããããŸããã
ãã ã90Bã§åãããšããŠãå¿
èŠãã·ã³ã¹ããã¯ãšé床ãèãããåãããšããã§å®çšçãïŒãšããç¹ã«ã¯çåãã®ãããŸãã
Gemini2.0 Flash
çµè«ãŒïŒã ãð
Gemini2.0ãåŒã³åºãã³ãŒããPythonã§äœããŸã
ããã³ããã¯ãããªæã
ãã®ç»åã¯æ¥æ¬ã®ãªãŒã麻éã²ãŒã ã®ã¹ã¯ã·ã§ç»åã§ããç»åã®äžã«ãã€ã£ãŠããèªåã®éº»éçã®åç§°ãå·Šããå³ã®é ã«ãããŠãã ããã
#https://ai.google.dev/gemini-api/docs/vision?hl=ja&lang=python
import sys
import base64
import google.generativeai as genai
# ã³ãã³ãã©ã€ã³åŒæ°ããç»åãã¹ãååŸ
image_path = sys.argv[1]
# ç»åãã¡ã€ã«ããã€ããªã¢ãŒãã§èªã¿èŸŒã
with open(image_path, "rb") as image_file:
image_data = image_file.read()
# Base64ãšã³ã³ãŒã
encoded_image = base64.b64encode(image_data).decode('utf-8')
# ã¢ãã«ã®åæå
model = genai.GenerativeModel(model_name="gemini-2.0-flash-exp")
# ããã³ãããšç»åããŒã¿ã䜿ã£ãŠçæ
prompt = "ãã®ç»åã¯æ¥æ¬ã®ãªãŒã麻éã²ãŒã ã®ã¹ã¯ã·ã§ç»åã§ããç»åã®äžã«ãã€ã£ãŠããèªåã®éº»éçã®åç§°ãå·Šããå³ã®é ã«ãããŠãã ããã"
response = model.generate_content([{'mime_type': 'image/jpeg', 'data': encoded_image}, prompt])
# ã¬ã¹ãã³ã¹ãåºå
print(response.text)python3 sample5.py majan2cut.jpeg1. äžè¬ïŒãµã³ãã³ïŒ
2. äžïŒãã¥ã³ïŒ
3. äºè¬ïŒãŠãŒãã³ïŒ
4. å è¬ïŒãªã¥ãŒãã³ïŒ
5. äžè¬ïŒããŒãã³ïŒ
6. å «è¬ïŒããŒãã³ïŒ
7. äžçïŒã€ãŒãã³ïŒ
8. äžçïŒã€ãŒãã³ïŒ
9. äºçïŒãªã£ã³ãã³ïŒ
10. äºçïŒãªã£ã³ãã³ïŒ
11. äžçŽ¢ïŒã€ãŒãœãŠïŒ
12. äžçŽ¢ïŒã€ãŒãœãŠïŒ
13. äžçŽ¢ïŒã€ãŒãœãŠïŒ
14. äžçŽ¢ïŒã€ãŒãœãŠïŒ
15. äžçïŒãµã³ãã³ïŒ
16. äžçïŒãµã³ãã³ïŒ
6. å
«è¬ïŒããŒãã³ïŒãŸã§ã®æŒ¢åã¯ããçšåºŠèªããŠãŸãããã以éã壿»
çã§ã
粟床30ïŒ
ãšãããšããã§ãããããæŒ¢åã¯èªããŠãŸãããã以å€ãçµ¶æçã§ã
ChatGPT GPT-4o
çµè«ãŒïŒã ãð
ã§ã¯é Œã¿ã®ç¶±ãæçµå µåšChatGPT4ã§ã¯ã©ãã§ãããã

ç»åã«åºã¥ããŠãå·Šããå³ã«äžŠãã§ããçã®ååã以äžã«æããŸãïŒ
äžè¬ïŒãµã³ãã³ïŒ
äžïŒãã¥ã³ïŒ
äºè¬ïŒãŠãŒãã³ïŒ
èµ€äºè¬ïŒã¢ã«ãŠãŒãã³ããã©çïŒ
äžè¬ïŒããŒãã³ïŒ
å «è¬ïŒããŒãã³ïŒ
ä¹è¬ïŒãã¥ãŒãã³ïŒã
åçïŒã¹ãŒãã³ïŒ
äºçïŒãŠãŒãã³ãèµ€ãã©ïŒ
å çïŒããŒãã³ïŒ
äºçŽ¢ïŒãªã£ã³ãœãŒïŒ
äºçŽ¢ïŒãªã£ã³ãœãŒïŒ
å «çŽ¢ïŒããŒãœãŒïŒ
ããä»ã«ç¢ºèªãããããšãããã°æããŠãã ããïŒ
å «è¬ïŒããŒãã³ïŒã®åŸããã¯ééã£ãŠããŸãããã¯ã挢åã¯èªã¿åãããå³ãé£ãããšããããšã§ãããããåçãªã©ã¯èªã¿åããŠãŸããäœçœ®ããããŠãŸãã粟床50ïŒ ãšãããšããã§ãã
ççèªèãŸãšã
Llama3.2V 11B ïŒç²ŸåºŠ0ïŒ
Gemini2.0 : 粟床30%
ChatGPT GPT-4o : 粟床40ïŒ
ãšããæ£ã
ãªçµæã§ããããããã§ã¯ã©ããããããããŸããã
ãªããšã察çãèããŸããããããã ïŒïŒã€ã®çãªãèªèã§ããã®ã§ã¯ïŒããš
麻éç äžã€ã®ã¿ãèªèããã
ãã®æç¹ã§ãçæAI/LLMã«éº»éçãèªèãããã®ã¯é£ããã®ã§ã¯ïŒããšæããâOCR 麻éâãªã©ã§æ€çŽ¢ããŠã¿ãŸããã
ãããšãã¯ãããŸã麻éçã®ãšããžãæ€åºããŠäžã€ãã€ã®éº»éçãèªèãããããšãå¿
èŠãšããç¥èŠãããŸããã
䜿ãçŽ æ

Lama3.2 Vision 11B
çµè«ãŒïŒã ãð
ãã®ç»åã®éº»éã®ã³ãã«æžããŠããæåãæš¡æ§ãèªã¿åããæåã«èµ·ãããŠãã ããã
Pythonã³ãŒããæžããŸã
import ollama
import sys
import json
from datetime import datetime, timedelta, timezone
inputImageFile = sys.argv[1]
# ç»åãè§£æããŠã¬ã¹ãã³ã¹ãååŸ
response = ollama.chat(
model='llama3.2-vision:11b',
messages=[{
'role': 'user',
'content': '''
ãã®ç»åã®éº»éã®ã³ãã«æžããŠããæåãæš¡æ§ãèªã¿åããæåã«èµ·ãããŠãã ããã
''',
'images': [inputImageFile]
}]
)
# æ¥æ¬æé倿ãšãã©ãŒããã
def convert_to_japan_time(utc_time_str):
# äœåãªå°æ°ç¹ä»¥äžãããªã
if "." in utc_time_str:
utc_time_str = utc_time_str.split(".")[0] + "Z"
# UTC圢åŒãdatetimeãªããžã§ã¯ãã«å€æããã¿ã€ã ãŸãŒã³ãæç€º
utc_time = datetime.strptime(utc_time_str, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc)
# æ¥æ¬æéïŒUTC+9ïŒã«å€æ
japan_time = utc_time.astimezone(timezone(timedelta(hours=9)))
# æ¥æ¬æéããã©ãŒããã
return japan_time.strftime("%Y-%m-%d %H:%M:%S")
# ã¬ã¹ãã³ã¹ããããã«è¡šç€º
print("Response Details:")
try:
# æéã®å€æ
created_at_japan = convert_to_japan_time(response['created_at'])
# ç§ã«å€æããŠè¡šç€º
total_duration_sec = response['total_duration'] / 1_000_000_000
load_duration_sec = response['load_duration'] / 1_000_000_000
prompt_eval_duration_sec = response['prompt_eval_duration'] / 1_000_000_000
eval_duration_sec = response['eval_duration'] / 1_000_000_000
print(f" Model: {response['model']}")
print(f" Created At (JST): {created_at_japan}")
print(f" Total Duration: {total_duration_sec:.2f}s")
print(f" Load Duration: {load_duration_sec:.2f}s")
print(f" Prompt Eval Count: {response['prompt_eval_count']}")
print(f" Prompt Eval Duration: {prompt_eval_duration_sec:.2f}s")
print(f" Eval Count: {response['eval_count']}")
print(f" Eval Duration: {eval_duration_sec:.2f}s")
content = response['message']['content']
print(content)
except json.JSONDecodeError:
print("\nError: Failed to parse 'content' as JSON.")
print(f"Raw Content: {response['message']['content']}")
except KeyError as e:
print(f"\nError: Missing key in response: {e}")
except Exception as e:
print(f"\nUnexpected Error: {e}")
python3 vision-majan2.py majan2sin.jpegãã®ç»åã«ã¯ã以äžã®ãããªæåãæš¡æ§ãå«ãŸããŸãã
* ãæ±ããåãã西ããåãã®4ã€ã®æ¹å
* ãæ±é¢šããå颚ãã西颚ããå颚ãã®4ã€ã®é¢šå
* ãäžçºããäžæããªã©ã®åœ¹ç
麻éã«ãããŠãæ±ãåã西ãåã¯ããããã®æ¹åã衚ããæ±é¢šãå颚ã西颚ãå颚ã¯ãããããã®æ¹åã«æµãã颚ã衚ããŸãã圹çã¯ãç¹å®ã®æ¡ä»¶äžã§ç¹æ®ãªåœ¹ã圢æããçã§ãã麻éã§ã¯ãåãã¬ã€ã€ãŒã¯4ã€ã®æ¹åããçãåãåããŸããããã®ç»åã«ã¯æ±ãåã西ãåã®çã®ã¿ã衚瀺ãããŠããŸãã
ãããã®æåãæš¡æ§ã¯ã麻ã®ã³ãã«æžãããŠãããã®ã§ããããã®èªã¿åãã¯ãæ±é¢šäžçºããšãªããŸãã
ååã§ãã粟床0ïŒ ã»ã»ããã³ã³ããããŸã
Gemini2.0 Flash
ãããã«Googleæ§ã®Gemini2.0ã¯ååçãããã¯èå¥ã§ããã§ããã
çµè«ãŒïŒã ãð
Google AI Studio

ã¯ããç»åã«åã£ãŠããçã¯çåïŒãã³ãºïŒã® 1çïŒã€ãŒãã³ïŒ ã§ãã
çåïŒãã³ãºïŒã¯ãååœ¢ã®æš¡æ§ãæããã麻éçã®ã°ã«ãŒãã§ãã1çã¯ããã®äžã§ãæãå°ããªæ°åã®çã§ãåã1ã€ã ãæãããŠããŸãã
çåïŒãã³ãºïŒãšãããšããã¯ãã£ãŠãŸãã8çãšèªèã§ããŠããŸãã
ã³ãŒãããå®è¡ããŠãåãã§ãã
#https://ai.google.dev/gemini-api/docs/vision?hl=ja&lang=python
import sys
import base64
import google.generativeai as genai
# ã³ãã³ãã©ã€ã³åŒæ°ããç»åãã¹ãååŸ
image_path = sys.argv[1]
# ç»åãã¡ã€ã«ããã€ããªã¢ãŒãã§èªã¿èŸŒã
with open(image_path, "rb") as image_file:
image_data = image_file.read()
# Base64ãšã³ã³ãŒã
encoded_image = base64.b64encode(image_data).decode('utf-8')
# ã¢ãã«ã®åæå
model = genai.GenerativeModel(model_name="gemini-2.0-flash-exp")
# ããã³ãããšç»åããŒã¿ã䜿ã£ãŠçæ
prompt = "ãã®ç»åã¯æ¥æ¬ã®ãªãŒã麻éã²ãŒã ã®ã¹ã¯ã·ã§ç»åã§ããç»åã®çã®åç§°ããããŠãã ããã"
response = model.generate_content([{'mime_type': 'image/jpeg', 'data': encoded_image}, prompt])
# ã¬ã¹ãã³ã¹ãåºå
print(response.text)
ChatGPT GPT-4o
æåŸã®é Œã¿ã®ç¶±GPT-4oã§ã¯ã©ãã§ããããã
çµè«âãããïŒð

ãããšOCRã®ã³ãŒããæžãåºããã®ã§æç€ºãå床ããŸã
ïŒïŒã³ãŒãã§ãªãããªãã倿ããŠã¿ãŠãã ãã
ç»åã«åºã¥ããŠå€æãããšããã®çã¯**å «çïŒãããã³ïŒ**ã®ããã«èŠããŸãã
çç±ãšããŠã¯ã以äžã®ç¹åŸŽãæããããŸãïŒçã®äžå€®ã«äžŠãã éãäžžã8åé 眮ãããŠããã
æ¥æ¬éº»éã§ã®ãçåïŒãã³ãºïŒãã®ãã¶ã€ã³ã«äŒŒãŠããŸãã
ã確èªãã ããïŒ
ãã©ããŒïŒïŒïŒ
ãã£ãŠãŸãã
ã§ã¯äžçŽ¢ã¯ã©ãã§ãããã

ããªãèãäžçŽ¢ã®ç»åãããŠãŠããŸãã
è€ããŠãããŸããã

ãŸãäœã麻éãä»ã®ããšã«ã€ããŠèãããããšãããã°ãé æ ®ãªããç¥ãããã ãããå šåã§ãæäŒãããŸãïŒðð
å§åçã«GeminiããGPT-4oãåªããŠãããšããçµæã«ãªããŸããã
ãã ãã³ãŒãããã ãšå
«çã¯ãããŸãããäžçŽ¢ãç¡çã§ãã
import base64
from openai import OpenAI
import sys
client = OpenAI()
image_path = sys.argv[1]
# https://platform.openai.com/docs/guides/vision
# Function to encode the image
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
# Getting the base64 string
base64_image = encode_image(image_path)
response = client.chat.completions.create(
model="chatgpt-4o-latest",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "ãã®ç»åã¯æ¥æ¬ã®éº»éã²ãŒã ã®ã¹ã¯ã·ã§ç»åã§ããç»åã®çã®åç§°ããããŠãã ããã",
},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},
},
],
}
],
)
print(response.choices[0])python3 sampl3.py majan2sin.jpeg(content='ãã®ç»åã«æãããŠããçã¯ã麻éçã®ã玢åïŒãœãŠãºïŒããšåŒã°ããçš®é¡ã®äžã€ã§ããå «çŽ¢ïŒãããœãŠïŒãã§ãã玢åã¯ç«¹ãæ£ã衚ããã¶ã€ã³ã§ããã®çã«ã¯8ã€ã®å³æãæãããŠããŸãã', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))
(content='ãã®ç»åã«æãããŠãã麻éçã¯ãç·äžè²ã®èæ¯ã«é³¥ã®çµµãæãããŠããŸããããã¯ãè±çãïŒãã¡ãŒãã€ïŒãšåŒã°ããç¹æ®ãªçã®ãã¡ã®äžã€ã§ã麻éã®äžéšã®å°åã«ãŒã«ãããªãšãŒã·ã§ã³ã§äœ¿çšãããŸãããã®å Žåãé³¥ãæãããŠããããšãããåéããšåŒã°ããè±çã®å¯èœæ§ããããŸãã', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))
äžçŽ¢ã¯ããã³ããã§æ¥æ¬ã®éº»éãšæå®ããŠããã«ãããããã
äžåœåŒã®éº»éãèªèãããŠããããã§ãã
ã¢ãã«ã®chatgpt-4o-latestã¯çŸåšã®ChatGPTãšåäžã®ãã®ã§ããã¯ããªã®ã§ããäžæè°ã§ã
https://platform.openai.com/docs/models#o1
åäžçèªèãŸãšã
Llama3.2V 11B ïŒç²ŸåºŠ0ïŒ
Gemini2.0 : 粟床50%
ChatGPT GPT-4o : 粟床80ïŒ
ãŸãšã
çæAI/LLMã䜿ã£ãŠéº»éçãèªèãããããšãã§ããŸããã
ãããå®çšåã«ãã£ãŠããã«ã¯ãããã°ã©ã ã³ãŒãã§éº»éçã®é
åããã©ãã©ã«ã«ããããŠãå
š13ã14æã®çãLLMã«èªèãããäžã§æŠç¥ãèããŠããããšããã¢ãããŒãã«ãªãã§ããããããŒã«ã«LLMãæåŸ
ã§ããªããšãªããšOpenAIã®AIãæ¯å13åãçžææ¹ã®æšãŠçãªã©ããããããšæ¯å20åãããã³ãŒã«ããªããšãããªããšãªããšæéãå¿é
ã§ãã
Llama3VãšGemini2ïŒç¡æã ããïŒã®ç²ŸåºŠåäžã«æåŸ
ããããšããã§ãã
