
ãé åžãèªåå°çš LLM APIãµãŒã㌠Ver2 ïœLlama-cppã§ç¡å¶éã®APIïœ
ããã«ã¡ã¯Rcatã§ãã
ååã®èšäºã§ãCPUæŒç®ã§ãAIããã¹ãããŸãããããã¡ãã®èšäºã§VRAMã¢ã³ã¹ã¿ãŒãã·ã³ãæã«å
¥ããŸããã®ã§ãè€æ°ã®ã¢ãã«ãåæã«èªã¿èŸŒãã§ããŒãã§ããããã«å€æŽããŸããã®ã§ç޹ä»ããŸãã
ã¯ããã«
å©çšèŠçŽ
æ å ±ãäœåã®æŽ»çšæã¯äºåã«å©çšèŠçŽãã確èªãã ããã
ã³ã¡ã³ãã«ã€ããŠ
å©çšèŠçŽã®ã¬ã€ãã©ã€ã³ã確èªã®äžã³ã¡ã³ãããŠãã ããã
åã£ãŠããªãã³ã¡ã³ãã¯åé€ããŸãã
æŠèŠ
ãšããžAIã£ãŠäœ?
ãšããžãšã¯å
端ã®ããšã§ããã€ãŸã倧ããªãµãŒããŒã§ã¯ãªããåã
ã®ç«¯æ«ã®äžã§åãAIãšããæå³ã«ãªããŸãã
ãšã¯ããããããã«ã¢ãã€ã«ç«¯æ«ã§åãããšããã®ã¯ãªããªããªã®ã§ãä»åã¯å人ãæã£ãŠããããœã³ã³ããšããžãšå®çŸ©ããŸãã
ã¹ããã§ãæè¿ã¯åããŸããããããªãã«é«æ§èœãªã¹ããŒããã©ã³ã§ããããã«å€å°ã®ã¹ãã¬ã¹ããããŸãã
ããããããããªãŒããã«é£ãããã®ã§ãã¹ããã§åããæå³ãä»ã®ãšããã¯ããŸããªãæ°ãããŸãã
仿§
ä»åäœæããAIãµãŒããŒã®ä»æ§ã¯æ¬¡ã®éãã§ãã
èšèª
Python
OS
Windows11
Linux (Ubuntu)
ã€ã³ã¿ãŒãã§ãŒã¹
WEB API
WEBãã©ãŠã¶
ã³ãã³ãã©ã€ã³(è€æ°ãã¹ãã®ãµãŒããŒãšãããã廿¢)
察å¿ããã»ããµ
CPU (Intel N100, Ryzen5 3600, Ryzen AI MAX+395ã§ç¢ºèªæžã¿)
GPU (CUDA, RCOmã§ç¢ºèªæžã¿)
(ã©ã€ãã©ãªçã«ã¯NPUãè¡ããããã)
ã©ã€ãã©ãª
llama-cpp-python
ã¢ãã«
ã¢ãã«ã«é¢ããŠã¯ãã³ãããŒã¯èšäºãã確èªãã ããã
ãã®ä»
ã¹ã±ãŒã«ã¢ãŠãå¯èœ
åãããŒã«ã«ãããã¯ãŒã¯äžã«ããã®ããã°ã©ã ãå®è¡ããŠããããœã³ã³ãããã°ãjobãç§»è²ããããšãå¯èœã§ããå±¥æŽã®æé ãå¯èœ
ãã£ããå±¥æŽãæé ããããšã§åçã®æ¹åãèªå°ã§ããŸãKVãã£ãã·ã¥ã®ä¿æãå¯èœ
é·æã·ã¹ãã ããã³ããã®KVãã£ãã·ã¥ãä¿æããããšã§ã2åç®ä»¥éã®èªã¿èŸŒã¿æéãé£èºçã«çããªããŸãã
æ©èœç޹ä»
ãŸãã¯æ¬ããŒã«ã§ã§ããããšã玹ä»ããŸãã
ã³ãã³ãã©ã€ã³ã䜿ã£ããã£ãã
ãã®æ©èœã¯åæãã¹ãã®ãã廿¢ããŸããã
WebãµãŒããŒåããŠäœ¿ã
èªã¿èŸŒãã¢ãã«ã®èšå®ãã¡ã€ã«ãäœæåŸãåŒæ°ã§æå®ããããšã§è€æ°ãã¹ãã§å®è¡ããããšãã§ããŸãã
rcat@rcat-EVO-X2:/Rcat_Service/Script/AI_Server/llama_cpp_server$ ./start.sh
2025-10-13 13:55:49,683 INFO llama_cpp_server ã¢ãã«ãããŒãäž: Qwen3-30B-A3B-Instruct
llama_context: n_ctx_per_seq (8192) < n_ctx_train (262144) -- the full capacity of the model will not be utilized
2025-10-13 13:55:50,849 INFO llama_cpp_server Qwen3-30B-A3B-Instructã®ããŒããå®äºããŸããã
2025-10-13 13:55:50,849 INFO llama_cpp_server ã¢ãã«ãããŒãäž: gemma-3-4b
llama_context: n_ctx_per_seq (8192) < n_ctx_train (131072) -- the full capacity of the model will not be utilized
llama_kv_cache_unified_iswa: using full-size SWA cache (ref: https://github.com/ggml-org/llama.cpp/pull/13194#issuecomment-2868343055)
2025-10-13 13:55:51,156 INFO llama_cpp_server gemma-3-4bã®ããŒããå®äºããŸããã
2025-10-13 13:55:51,156 INFO llama_cpp_server èªèº«ã®PID (10786) ã«å¯ŸããŠCPU䜿çšçã80% (cpulimitã¿ãŒã²ãã: 2560%)ã«å¶é ããŸã...
2025-10-13 13:55:51,157 INFO llama_cpp_server cpulimitã³ãã³ããæ£åžžã«éå§ãããŸããã
Process 10786 detected
* Serving Flask app 'llama_cpp_server'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:25610
* Running on http://192.168.0.250:25610
Press CTRL+C to quit
M-SEARCHãµãŒããŒèµ·å
ãµãŒãã¹äžèЧ
urn:rcat999:service:llmnode:1 / 192.168.0.250:25610"Running on http://XXX.XXX.XXX.XXX:XX"ãšãã衚èšãåºãŠããã®ã§ãããã«ã¢ã¯ã»ã¹ããã°ãã©ãŠã¶ãã䜿ããŸãã
python3 llama_cpp_server.py -s --port 25610 --model model.json --priority 100 --cpu 80 --cpucore 32 --master åŒæ°ç޹ä»
--port
ããŒãçªå·ãæå®ããŸããçç¥å¯èœã§ãã--master
ãã¹ã¿ãŒãµãŒããŒãšããŠèµ·åããŸãããããæå®ãããµãŒããŒã ããå€éšã®ããŒãã«å¯ŸããŠç§»è²ããæ©èœã䜿ããŸãã--priority
忣åŠçæã®åªå é äœãå°ããæ¹ãåªå 床ãé«ãããã¥ãŒã®æ¡ä»¶ãåãå Žåã®éžæã«äœ¿çšãããã詳ããã¯åæ£åŠçãžã--cpu
Linuxã®ã¿ãcpulimitã³ãã³ãã䜿ã£ãŠCPU䜿çšçãå¶éããŸãã--cpucoreãªãã·ã§ã³ãšäœµçšãçç¥å¯èœ--cpucore
--cpuãšã»ãããCPUã®ã³ã¢æ°ãæå®ãå ¥åãééãããšæ£ç¢ºã«CPU䜿çšçå¶éã§ããªããã³ã¢æ°ãšãããã¹ã¬ããæ°ãããã
WEBç»é¢ã§äœ¿ã
ãµãŒããŒåããç¶æ
ã§ã¢ã¯ã»ã¹ãããšä»¥äžã®ãããªç»é¢ã«ãªããŸããããã«å
¥åããããšã§ãç°¡åã«AIãšãã£ããããããšãã§ããŸãã
ååã¯AIã«äžžæãããŸããããä»åã¯vue3ãšBootstrapã䜿ã£ãŠèªåã§äœããŸããã
v-for匷ãããŸãã?

èšå®
ã¢ãã«
è€æ°èªã¿èŸŒãã§ããå Žåã¯ããã§éžæã§ããŸã枩床
åçã®å€æ§æ§ãå¶åŸ¡ããŸãã1ã倿§ã0ãå³å¯ã§ãæå€§ããŒã¯ã³
å¿çã®é·ããå¶éããŸãã
å ¥å
ã·ã¹ãã ããã³ãã
äžçªæåã«äžããæç€ºã§ããåºæ¬çã«ã¿ã¹ã¯ã¯ããã«èšè¿°ããŸããŠãŒã¶ãŒããã³ãã
ä»»æå ¥åæ¬ã§ãã
翻蚳ãªãå¯Ÿè±¡ã®æç« ãå ¥ããå ŽæãšãªããŸã
äŒè©±å±¥æŽ
å±¥æŽãæé ããŠåçã®æ¹åæ§ãå¶åŸ¡ããŸãã
å±¥æŽã®äžã®ããŒã«ãããã«ã¯ãªãã¯ãããšæ¶ããŸãã圹å²
å±¥æŽã«è¿œå ããçºèšè ãéžæå 容
çºèš/åçå 容ãæé远å
èšå®ããå 容ã§å±¥æŽãäœæ
éä¿¡
å±¥æŽåã³åçš®ããã³ãããéä¿¡ããŸããå¿ç
åŠçæé
åŠçã«ããã£ãåèšæéã§ãåæããŒã¯ã³
æåã®1æåãåºããŸã§ã«ããã£ãæéã
æç€ºãé·ãã»ã©çè§£ããã®ã«æéããããããã®å€ãå¢å ããåºåé床
人éçã«ããããããããã«æ¯ç§äœæåã®åºåé床ã ã£ããã衚瀺ããŸããã¢ãã«
åçã«äœ¿çšãããã¢ãã«åã§ããå¿ççµæ
æçµçãªAIã®åçã§ã
APIã䜿ã
äžçªã®ç®çã¯ããã§ãããã
ããã䜿ãããšã§å®å
šã«ããŒã«ã«ã§å¥ã®ããã°ã©ã ããAIãåŒã³åºãããšãã§ããŸãã
ãã£ããAPI
ãã£ãããããããã®cgiã§ãã
å¿
èŠãªãã©ã¡ãŒã¿ãŒãJSONããã£ãšããŠPOSTããŸãã
ãšã³ããã€ã³ã /CGI_DoChat
ãã©ã¡ãŒã¿ãŒã¯å šãŠä»»æã§ããå¿ èŠãªãšããã ãæå®ããããã«ããŠãã ãããã¢ãã«ãçç¥ãããã¯ééãããšèšå®ãã¡ã€ã«ã§æåã«å®çŸ©ãããŠãããã®ã«ãªããŸãã
{
"model":ã¢ãã«å
"system_prompt": "ã·ã¹ãã ããã³ãã"
"user_prompt": "ãŠãŒã¶ãŒããã³ãã"
"max_tokens": int #æå€§ããŒã¯ã³æ° 8192
"temperature": float #枩床ãã©ã¡ãŒã¿ãŒ 1.0
"top_p": float #ãããPãã©ã¡ãŒã¿ãŒ 0.95
"top_k": float #ãããKãã©ã¡ãŒã¿ãŒ 40
"id": str #JOBID /Get_idã§æ°èŠçºè¡ã§ããã éäžçµéã®ç¢ºèªãããå Žåã«å¿
èŠ
"history" list #æé çšäŒè©±å±¥æŽ }Pythonã§ã®å®è¡äŸ
>py
Python 3.11.6 (tags/v3.11.6:8b6ee5b, Oct 2 2023, 14:57:12) [MSC v.1935 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> body = {
... "system_prompt":"ãŠãŒã¶ãŒã®å
¥åãäžåœèªã«ç¿»èš³ããŠãã ãã",
... "user_prompt":"ããã¯ããµããµã§çãããŸã",
... "model":"Qwen3-30B-A3B-Instruct"
... }
>>> resp = requests.post(url="http://192.168.0.250:25610/CGI_DoChat",json=body)
>>> print(resp.json().get("response"))
ç«æ¯èžèžçïŒè®©äººæå°æ²»æã
>>> import json
>>> json.dumps(resp.json(),indent=2,ensure_ascii=False)
'{\n "first": 0.33699536323547363,\n "model": "Qwen3-30B-A3B-Instruct",\n "response": "ç«æ¯èžèžçïŒè®©äººæå°æ²»æã",\n "status": true,\n "time": 0.5171315670013428,\n "tokens": 56\n}'
>>>å¿çãJSONã§ãã
responseããŒã®äžã«AIã®å¿çã®æååãå
¥ã£ãŠããŸãããã以å€ã¯åŠçæéãããŒã¯ã³ãªã©ãå
¥ã£ãŠããŸãããã®å Žåã¯0.5ç§ã§ããã
å±¥æŽãæé ããå Žå
å±¥æŽã®åœ¢åŒã¯ãªã¹ãã®ãªã¹ãã§ãã
>>> data = {
... "max_tokens": 1024,
... "user_prompt": "æåãªããŠäŒè©±å§ãããã ã£ã?",
... "history":[
... ["user","ããã£ãŠãããããã"],
... ["assistant","ãããã¯ããºãã®ã»ãã奜ããªã®ã§ããã¯æããŸãã"],
... ["user","ããã§ãããã§ã¯ãã®è©±ã¯çµããã§ãã"],
... ["assistant","ãããããããŸããã"]
... ]
... }
>>>
>>> resp = requests.post("http://192.168.0.4:25610/CGI_DoChat",json=data)
>>> resp.json()
{'first': 0.18724346160888672, 'model': 'Qwen3-30B-A3B-Instruct', 'response': 'ããªãããããã£ãŠããããããããšèšã£ãŠããããã¯ããããã¯ããºãã®ã»ãã奜ããªã®ã§ããã¯æããŸããããšçããŸããã', 'status': True, 'time': 0.7967422008514404, 'tokens': 180}æ å ±ååŸAPI
æ å ±ååŸAPIã¯æ··éç¶æ³ããã¹ãäžã®ã¢ãã«äžèЧãè¿ãããAPIã§ãã

ã¡ãªã¿ã«ã§ãããAIã®åŠçã¯éãã®ã§äžŠåå®è¡ã¯ã§ããŸããã
è€æ°åæã«ãªã¯ãšã¹ããåãä»ããå Žåã¯ãã¥ãŒã«æ ŒçŽããå
é ããé çªã«åŠçããŠãããããªä»çµã¿ã«ãªã£ãŠããŸãã
ä»ã®ããŒããããå Žåã¯ãäžçªç©ºããŠããšããã«å§è²ããŸãã空ããŠãªããã°èªåã§å®è¡ãšããæãã§ãããã¥ãŒã®æ°ãåãã«ãªãããã«åäœããŸãã
10å以äžè²¯ãŸã£ãŠãããšéè² è·ãšããããšã§ãšã©ãŒãè¿ãããã«ãªã£ãŠããŸãã
å°å ¥æ¹æ³
ããã±ãŒãžå 容ã®ç¢ºèª
é
åžã¯åäžéšã§è¡ã£ãŠãããŸãã
ããã±ãŒãžå
容ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã

ã¢ãã«ã®é 眮
ãŸããæåã«AIã®ã¢ãã«ãçšæããŠãã ããã
ããŠã³ããŒãã§ããããã®ãã©ã«ãããããã¯å¥œããªãšããã«çœ®ããŠãã ããã
ã¢ãã«ã®ç»é²
ã¢ãã«ãããŠã³ããŒããããèªã¿èŸŒã¿å®çŸ©ãã¡ã€ã«ãäœæããŠãã ããã
json圢åŒã§ãååãããŒã®èŸæžã§ãããšããããçŸæç¹ã§ç§ã䜿ã£ãŠãããã®ãå
¥ããŠãããŸãã

path
å®éã®æ ŒçŽå context
æå¹ã«ããã³ã³ããã¹ãé·device
cpuãgpugpulayers
gpuã®å Žåã¯-1ããããã¯èªã¿èŸŒãã¬ã€ã€ãŒæ°ãæå®ãcpuãªã0
ã¢ãã«ã¯HuggigFaceããèœãšããŸãã
äŸãã°ä»¥äžã®ãªã³ã¯ã¯Gemma3 ã®GGUFãæ€çŽ¢ããäŸã§ãã
èšå®å€æ°ã®å€æŽ
ãœãŒã¹æ¬äœã®äžã®ã»ãã«å®æ°ããããŸããäžéšã®åäœã¯ãããåç §ããŠåäœãããããé©åã«å€æŽãå¿ èŠã§ã

CACHE_THRESHOLD
ãã£ãã·ã¥åããã·ã¹ãã ããã³ããã®æå°æåæ°
ãã®æåæ°ãè¶ ããã·ã¹ãã ããã³ããã®KVãã£ãã·ã¥ã¯ä¿æããã2åç®ä»¥éã®å¿çãé«éã«ãªããŸããCACHE_LIFECYCLE_SECONDS
KVãã£ãã·ã¥ã®æå€§æå¹æé (ç§)
ãããªãã«ããŒã¿ãµã€ãºãããã®ã§ã䜿ãããŠããªããã®ã¯æ¶ããŸããCACHE_ALLOWED_MEMORY
Linuxéå®ã
ãã®ããã»ã¹ãå æ ããŠãããæå€§ã¡ã¢ãª(GB)
ãããè¶ ãããšKVãã£ãã·ã¥ã¯æéã«ãããããå€ããã®ããåé€ããã
(CPUæŒç®ã®å Žåã¯ã¢ãã«ãå«ãŸããã®ã§æ³šæ)MAX_QUEUE_COMT
䞊ãã§ããæå€§ãã¥ãŒæ°ããããè¶ ãããš503ãè¿ã
å¿çã®é«éåã«ã€ããŠã¯ãã¡ããã芧ãã ãããå§åçãªå·®ããããŸãã
Pythonã®ã€ã³ã¹ããŒã«æ¹æ³
æ¬äœã¯Pythonã§ã§ããŠããŸãã®ã§ãå¿ ãå°å ¥ãããŠãã ãã
ç°å¢ã®æ§ç¯
Linuxã®å Žåã¯start.shãå®è¡ããã°èªåã§ä»®æ³ç°å¢ãäœæãããã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ãå§ãŸããŸãã
ãã®ããŒãžã§ã³ã§ã¯Linuxã®ã¿ã§åäœç¢ºèªãããŠããŸãã
GPUã䜿ãå Žå
å
ã»ã©ã®èšäºã§ã玹ä»ããŠããŸãããGPUã䜿ãå Žåã¯èªåã§ã©ã€ãã©ãªããã«ãããå¿
èŠããããŸãããã«ãæ¹æ³ã«ã€ããŸããŠã¯ãäžã®èšäºã§ç޹ä»ããŠããŸãã
å
ã«èªåæ§ç¯ããŠããŸã£ãå Žåã¯ãå¿
ã匷å¶åã€ã³ã¹ããŒã«æç€ºã§ãã«ããšã€ã³ã¹ããŒã«ãè¡ããŸãããã
ROCm(Radeon)ã§äœ¿ãå Žå
ãã¡ãã®èšäºã§ã¯Ryzen AI MAX+ 395ã®å
èµGPUã§ããRadeon 8060Sã䜿ã£ãŠããŸãã
ãã«ãæ¹æ³ã«é¢ããŠããã¡ãã§ããäœ¿ãæ¹æ¬¡ç¬¬ã§ã¯RTX4070ãè¶
ãããããåãç©ã§ãã
ãŸãšã
ä»åã¯éååLLMã䜿ã£ãå人AIãµãŒããŒãäœæããŸããã
ãšããšãèªå®
ã§åžžæLLMã皌åããæä»£ãæ¥ãŸãããã
ããã§å©çšèŠçŽãæ°ã«ããããšãªãã©ããªå
容ã§ãå
¥åãå¯èœã§ã!
é©åºŠã«ã¢ã©ã«ãå®ãã€ã€äœ¿ããŸãããã
é åžæ å ±
é åžURL
以äžã®URLããé
åžããŠããŸãã
å©çšèŠçŽã«åæã®äžãå©çšãã ããã