MacでStackChan物語 #4 Gemma4の回答を速くする方法
前回、スタックちゃんが日本語で会話できるようになりました。
しかし、応答が100秒くらいかかってしまいます。
調べてみると、MacBookProのスペックやGemma4のせいではなさそうです。
スタックチャンではなくターミナルから直接Gemma4にコマンドを投げてみます。
time ollama run gemma4:12b "こんにちは。20文字以内の日本語で返事してください。"
どうやらThinkingモードになっているようです。
ターミナル経由でも47秒かかっています。
ollama run gemma4:12b 0.13s user 0.17s system 0% cpu 46.795 total次にオフにしてみます。
time ollama run gemma4:12b --think=false "こんにちは。20文字以内の日本語で返事してください。"satoshi@Satoshi-MacBook-Pro xiaozhi-server % time ollama run gemma4:12b --think=false "こんにちは。20文字以内の日本語で返事してください。"
こんにちは。何かお手伝いできますか?
ollama run gemma4:12b --think=false 0.03s user 0.03s system 1% cpu 3.069 totalThinkingあり:約46.8秒
Thinkingなし:約3.1秒
スタックチャン経由の時はThinkingなしにできれば会話が速くなりそうです。
下記を1度だけ実行します。仮の修正です。
docker exec -i xiaozhi-esp32-server python - <<'PY'
from pathlib import Path
path = Path("/opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.py")
text = path.read_text()
text = text.replace(
"model=self.model_name, messages=dialogue, stream=True\n",
'model=self.model_name, messages=dialogue, stream=True, extra_body={"think": False}\n',
1,
)
text = text.replace(
"tools=functions,\n",
'tools=functions,\n extra_body={"think": False},\n',
1,
)
path.write_text(text)
print("think:false を2か所へ追加しました")
PYdocker exec xiaozhi-esp32-server \
grep -n "extra_body" /opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.py反映確認
satoshi@Satoshi-MacBook-Pro xiaozhi-server % docker exec xiaozhi-esp32-server \
grep -n "extra_body" /opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.py
47: model=self.model_name, messages=dialogue, stream=True, extra_body={"think": False}
118: extra_body={"think": False},
satoshi@Satoshi-MacBook-Pro xiaozhi-server % これでよしですね。
260716 13:23:15[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别语言: ja
260716 13:23:15[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别情绪: 😶
260716 13:23:15[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别文本: おはよう。
260716 13:23:15[0.9.5_SiFuOlEdnocaCh][core.connection]-INFO-大模型收到用户消息: {"content": "おはよう。", "language": "ja", "emotion": "😶"}
260716 13:23:17[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送第一段语音: おはようございます
260716 13:23:17[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, おはようございます
260716 13:23:18[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: おはようございます,重试0次
260716 13:23:18[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, ドイちゃん
260716 13:23:18[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: ドイちゃん,重试0次
260716 13:23:19[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 今日も素敵な一日になるといいですね
260716 13:23:19[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 今日も素敵な一日になるといいですね,重试0次
260716 13:23:19[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.LAST, None
260716 13:23:26[0.9.5_SiFuOlEdnocaCh][core.handle.textMessageProcessor]-INFO-收到listen消息:{"session_id":"84e92165-7b8a-49a5-9d73-0ea807060ebd","type":"listen","state":"start","mode":"auto"}
おはよう
に対して、回答が2秒になりました。
今度はreasoning_effort="none" の修正を、コンテナ再作成後も消えないように恒久化する必要があります。
次の作業は、
Mac側の ollama.py に reasoning_effort="none" を追加
docker-compose.yml でそのファイルをコンテナへマウント
コンテナを再作成
設定が残ることを確認
cd ~/git/xiaozhi-esp32-server/main/xiaozhi-server
sed -n '1,220p' docker-compose.ymlsatoshi@Satoshi-MacBook-Pro xiaozhi-server % sed -n '1,220p' docker-compose.yml
# Docker安装Server
version: '3'
services:
xiaozhi-esp32-server:
image: ghcr.nju.edu.cn/xinnan-tech/xiaozhi-esp32-server:server_latest
container_name: xiaozhi-esp32-server
restart: always
security_opt:
- seccomp:unconfined
environment:
- TZ=UTC
ports:
# ws服务端
- "8000:8000"
# http服务的端口,用于简单OTA接口(单服务部署),以及视觉分析接口
- "8003:8003"
volumes:
# 配置文件目录
- ./data:/opt/xiaozhi-esp32-server/data
# 模型文件挂接,很重要
- ./models/SenseVoiceSmall/model.pt:/opt/xiaozhi-esp32-server/models/SenseVoiceSmall/model.pt% satoshi@Satoshi-MacBook-Pro xiaozhi-server % 次のコマンドを流します。
python3 - <<'PY'
from pathlib import Path
path = Path("core/providers/llm/ollama/ollama.py")
text = path.read_text()
text = text.replace(
'extra_body={"think": False}',
'reasoning_effort="none"',
)
if 'reasoning_effort="none"' not in text:
text = text.replace(
"model=self.model_name, messages=dialogue, stream=True\n",
'model=self.model_name, messages=dialogue, stream=True, reasoning_effort="none"\n',
1,
)
text = text.replace(
"tools=functions,\n",
'tools=functions,\n reasoning_effort="none",\n',
1,
)
path.write_text(text)
print("Mac側 ollama.py を修正しました")
PYsatoshi@Satoshi-MacBook-Pro xiaozhi-server % grep -n "reasoning_effort" core/providers/llm/ollama/ollama.py
47: model=self.model_name, messages=dialogue, stream=True, reasoning_effort="none"
118: reasoning_effort="none",修正ができました。
次は docker-compose.yml の volumes: に、次の1行を追加します。
- ./core/providers/llm/ollama/ollama.py:/opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.pyDockerを再作成します。
docker compose down
docker compose up -ddocker exec xiaozhi-esp32-server \
grep -n "reasoning_effort" /opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.pysatoshi@Satoshi-MacBook-Pro xiaozhi-server % docker compose down
[+] Running 2/2
✔ Container xiaozhi-esp32-server Removed 0.0s
✔ Network xiaozhi-server_default Removed 0.1s
satoshi@Satoshi-MacBook-Pro xiaozhi-server % docker compose up -d
[+] Running 2/2
✔ Network xiaozhi-server_default Created 0.0s
✔ Container xiaozhi-esp32-server Started 0.2s
satoshi@Satoshi-MacBook-Pro xiaozhi-server % docker exec xiaozhi-esp32-server \
grep -n "reasoning_effort" /opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.py
47: model=self.model_name, messages=dialogue, stream=True, reasoning_effort="none"
118: reasoning_effort="none",では再度会話してみます。
260716 13:37:26[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别语言: ja
260716 13:37:26[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别情绪: 😶
260716 13:37:26[0.9.5_00000000000000][core.providers.asr.base]-INFO-识别文本: 上を向いてみて。
260716 13:37:26[0.9.5_SiFuOlEdnocaCh][core.connection]-INFO-大模型收到用户消息: {"content": "上を向いてみて。", "language": "ja", "emotion": "😶"}
260716 13:37:28[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送第一段语音: ドイちゃん
260716 13:37:28[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, ドイちゃん
260716 13:37:28[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: ドイちゃん,重试0次
260716 13:37:29[0.9.5_SiFuOlEdnocaCh][core.handle.sendAudioHandle]-INFO-发送音频消息: SentenceType.FIRST, 今すぐ空を見上げるような気持ちで、顔を上に向けたよ
260716 13:37:29[0.9.5_00000000000000][core.providers.tts.base]-INFO-语音生成成功: 今すぐ空を見上げるような気持ちで、顔を上に向けたよ,重试0次
2秒程度で回答ができています。
しかもちゃんと上を向いてくれました。

本記事はここまで。
次回は、声や顔を他のものに変えてみようと思う。
【共感していただけましたら、よかったらフォローと、スキ❤️を、そしてX(Twitter)でシェアと感想を頂けると幸いです】
いいなと思ったら応援しよう!
お読みいただきありがとうございました。もし参考になったり面白かったと思っていただけましたらサポートよろしくお願いします。次の執筆のモチベになります。