見出し画像

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 total

Thinkingあり:約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か所へ追加しました")
PY
docker 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" の修正を、コンテナ再作成後も消えないように恒久化する必要があります。

次の作業は、

  1. Mac側の ollama.py に reasoning_effort="none" を追加

  2. docker-compose.yml でそのファイルをコンテナへマウント

  3. コンテナを再作成

  4. 設定が残ることを確認

cd ~/git/xiaozhi-esp32-server/main/xiaozhi-server
sed -n '1,220p' docker-compose.yml
satoshi@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 を修正しました")
PY
satoshi@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.py

Dockerを再作成します。

docker compose down
docker compose up -d
docker exec xiaozhi-esp32-server \
  grep -n "reasoning_effort" /opt/xiaozhi-esp32-server/core/providers/llm/ollama/ollama.py
satoshi@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)でシェアと感想を頂けると幸いです】

いいなと思ったら応援しよう!

ドイのnote お読みいただきありがとうございました。もし参考になったり面白かったと思っていただけましたらサポートよろしくお願いします。次の執筆のモチベになります。