feat(desktop): LLM 기본 모델 qwen3:4b → gemma4:e4b 전면 전환 + think:false 안전장치

qwen3:4b가 reasoning 모델이라 <think>...</think> 블록을 길게 생성 →
stripReasoningBlocks 후 빈 문자열 → 원본 transcript fallback으로 끝나면서
LLM refine이 42초 걸리는 병목 발견. Google Gemma 4 e4b(4.5B effective
params, 2026-04-02 릴리스)로 교체. non-reasoning 기본 + Ollama v0.20+
think: false 파라미터로 2중 방어.

실측 결과: 받아쓰기 한 사이클 51.4s → 5.5s (9.3배 빠름).
  STT 500ms + LLM 3,925ms + insert 1,092ms.
refine 품질 정상 동작 확인: "테스트하는 중입니다" → "테스트하고 있습니다".

- LocalLLMService: 3개 fallback 기본값 변경(generate / streamGenerate /
  chatStream) + Ollama 요청 body에 think: false 명시 추가. non-reasoning
  모델은 무시, reasoning 모델은 thinking 토큰 차단. NO_THINK 주석을
  legacy 설명으로 업데이트 — qwen3/deepseek-r1 수동 선택자를 위한 3중
  방어(/no_think + think:false + stripReasoningBlocks) 명시.
- OnboardingModal / OllamaGuideModal: pull 명령어 갱신
- 테스트 fixture 갱신
- 12개 i18n locale JSON: settings.ollamaHint / ollama.step2.alt 키 업데이트
  (qwen3:4b → gemma4:e4b, qwen3:8b → gemma4:26b)
- 10개 site i18n locale TS + HowItWorks.tsx 파이프라인 시각화 — detail
  문자열 'qwen3 / llama3 / gemma3' → 'gemma4 / llama3.2 / phi4',
  파이프라인 라벨 'qwen3:4b @ localhost' → 'gemma4:e4b @ localhost'
- 설계서 00 LLMConfig 기본값 + CONFIG_DEFAULTS
- 설계서 05: 6개 API 스키마 예시, 2개 OllamaClient 코드 예시, LLM 모델
  추천 표 재정렬(gemma4:e4b 최상위, qwen3는 reasoning 경고와 함께 후순위),
  권장 JSON 설정에 think:false 추가
- phase-14 meeting mode 컨텍스트 윈도우 표 갱신
- V2-5 Mac 부트스트랩 가이드 pull 커맨드 갱신
- project_status.md Part 7 전체 섹션 추가
This commit is contained in:
윤찬 2026-04-12 09:47:08 +09:00
parent a744551442
commit d397bcbf57
32 changed files with 153 additions and 65 deletions

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "Automatische Erkennung",
"settings.ollamaServer": "Ollama-Server",
"settings.ollamaUrl": "Ollama-Server-URL",
"settings.ollamaHint": "D3RO Voice verbindet sich automatisch, wenn Ollama läuft. Lade Modelle direkt über Ollama herunter (z. B.: ollama pull qwen3:4b).",
"settings.ollamaHint": "D3RO Voice verbindet sich automatisch, wenn Ollama läuft. Lade Modelle direkt über Ollama herunter (z. B.: ollama pull gemma4:e4b).",
"settings.postProcess": "Sprachnachbearbeitung",
"settings.defaultAction": "Standard-Nachbearbeitungsaktion",
"settings.action.none": "Keine (Originaltext unverändert)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama ist ein kostenloses Tool zum lokalen Ausführen von LLMs.",
"ollama.step2.title": "SCHRITT 2 — Modell herunterladen",
"ollama.step2.desc": "Führe den folgenden Befehl im Terminal aus, um das empfohlene Modell herunterzuladen:",
"ollama.step2.alt": "Oder ein größeres Modell: ollama pull qwen3:8b (genauer, langsamer)",
"ollama.step2.alt": "Oder ein größeres Modell: ollama pull gemma4:26b (genauer, langsamer)",
"ollama.step3.title": "SCHRITT 3 — Automatische Verbindung",
"ollama.step3.desc": "D3RO-VOICE erkennt automatisch, wenn Ollama läuft. Wenn die LED in der Statusleiste von Rot auf Grün wechselt, ist alles bereit!",
"service.sttEngine": "STT-ENGINE",

View file

@ -122,7 +122,7 @@
"settings.sttLang.auto": "Auto-detect",
"settings.ollamaServer": "Ollama Server",
"settings.ollamaUrl": "Ollama Server URL",
"settings.ollamaHint": "Connects automatically when Ollama is running. Pull models directly in Ollama (e.g. ollama pull qwen3:4b).",
"settings.ollamaHint": "Connects automatically when Ollama is running. Pull models directly in Ollama (e.g. ollama pull gemma4:e4b).",
"settings.llmModel": "LLM Model",
"settings.postProcess": "Voice Post-Processing",
"settings.defaultAction": "Default Post-Processing Command",
@ -187,7 +187,7 @@
"ollama.step1.desc": "Ollama is a free tool for running LLMs locally.",
"ollama.step2.title": "STEP 2 — Download a Model",
"ollama.step2.desc": "Pull a model from your terminal. Recommended:",
"ollama.step2.alt": "Or a larger model: ollama pull qwen3:8b (more accurate, slower)",
"ollama.step2.alt": "Or a larger model: ollama pull gemma4:26b (more accurate, slower)",
"ollama.step3.title": "STEP 3 — Auto-Connect",
"ollama.step3.desc": "Once Ollama is running, D3RO-VOICE will detect it automatically. When the status bar LED turns from red to green, you're ready!",
"service.sttEngine": "STT ENGINE",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "Detección automática",
"settings.ollamaServer": "Servidor Ollama",
"settings.ollamaUrl": "URL del servidor Ollama",
"settings.ollamaHint": "D3RO Voice se conecta automáticamente cuando Ollama está en ejecución. Descarga modelos directamente desde Ollama (ej: ollama pull qwen3:4b).",
"settings.ollamaHint": "D3RO Voice se conecta automáticamente cuando Ollama está en ejecución. Descarga modelos directamente desde Ollama (ej: ollama pull gemma4:e4b).",
"settings.postProcess": "Postprocesado de voz",
"settings.defaultAction": "Acción de postprocesado predeterminada",
"settings.action.none": "Ninguna (texto original sin cambios)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama es una herramienta gratuita para ejecutar LLMs de forma local.",
"ollama.step2.title": "PASO 2 — Descargar un modelo",
"ollama.step2.desc": "Ejecuta el siguiente comando en la terminal para descargar el modelo recomendado:",
"ollama.step2.alt": "O un modelo más grande: ollama pull qwen3:8b (más preciso, más lento)",
"ollama.step2.alt": "O un modelo más grande: ollama pull gemma4:26b (más preciso, más lento)",
"ollama.step3.title": "PASO 3 — Conexión automática",
"ollama.step3.desc": "D3RO-VOICE detecta automáticamente cuando Ollama está en ejecución. Cuando el LED de la barra de estado pase de rojo a verde, ¡estará listo!",
"service.sttEngine": "MOTOR STT",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "Détection automatique",
"settings.ollamaServer": "Serveur Ollama",
"settings.ollamaUrl": "URL du serveur Ollama",
"settings.ollamaHint": "D3RO Voice se connecte automatiquement quand Ollama est en cours d'exécution. Téléchargez les modèles directement depuis Ollama (ex : ollama pull qwen3:4b).",
"settings.ollamaHint": "D3RO Voice se connecte automatiquement quand Ollama est en cours d'exécution. Téléchargez les modèles directement depuis Ollama (ex : ollama pull gemma4:e4b).",
"settings.postProcess": "Post-traitement vocal",
"settings.defaultAction": "Action de post-traitement par défaut",
"settings.action.none": "Aucune (texte original inchangé)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama est un outil gratuit pour exécuter des LLM en local.",
"ollama.step2.title": "ÉTAPE 2 — Télécharger un modèle",
"ollama.step2.desc": "Exécutez la commande suivante dans le terminal pour télécharger le modèle recommandé :",
"ollama.step2.alt": "Ou un modèle plus grand : ollama pull qwen3:8b (plus précis, plus lent)",
"ollama.step2.alt": "Ou un modèle plus grand : ollama pull gemma4:26b (plus précis, plus lent)",
"ollama.step3.title": "ÉTAPE 3 — Connexion automatique",
"ollama.step3.desc": "D3RO-VOICE détecte automatiquement quand Ollama est en cours d'exécution. Quand la LED de la barre d'état passe du rouge au vert, c'est prêt !",
"service.sttEngine": "MOTEUR STT",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "自動検出",
"settings.ollamaServer": "Ollamaサーバー",
"settings.ollamaUrl": "OllamaサーバーURL",
"settings.ollamaHint": "Ollamaが起動していれば自動的に接続されます。モデルはOllamaから直接pullしてください例: ollama pull qwen3:4b。",
"settings.ollamaHint": "Ollamaが起動していれば自動的に接続されます。モデルはOllamaから直接pullしてください例: ollama pull gemma4:e4b。",
"settings.postProcess": "音声後処理",
"settings.defaultAction": "デフォルト後処理コマンド",
"settings.action.none": "なし (元のテキストをそのまま)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "OllamaはローカルでLLMを実行するための無料ツールです。",
"ollama.step2.title": "STEP 2 — モデルのダウンロード",
"ollama.step2.desc": "ターミナルで希望のモデルをpullしてください。日本語におすすめ:",
"ollama.step2.alt": "または大きいモデル: ollama pull qwen3:8b (より正確、より遅い)",
"ollama.step2.alt": "または大きいモデル: ollama pull gemma4:26b (より正確、より遅い)",
"ollama.step3.title": "STEP 3 — 自動接続",
"ollama.step3.desc": "Ollamaが起動するとD3RO-VOICEが自動的に検出します。下部ステータスバーのLEDが赤から緑に変われば準備完了",
"service.sttEngine": "STT ENGINE",

View file

@ -123,7 +123,7 @@
"settings.sttLang.auto": "자동 감지",
"settings.ollamaServer": "Ollama 서버",
"settings.ollamaUrl": "Ollama 서버 URL",
"settings.ollamaHint": "Ollama가 실행 중이면 자동으로 연결됩니다. 모델은 Ollama에서 직접 pull하세요 (예: ollama pull qwen3:4b).",
"settings.ollamaHint": "Ollama가 실행 중이면 자동으로 연결됩니다. 모델은 Ollama에서 직접 pull하세요 (예: ollama pull gemma4:e4b).",
"settings.llmModel": "LLM 모델",
"settings.postProcess": "음성 후처리",
"settings.defaultAction": "기본 후처리 명령어",
@ -188,7 +188,7 @@
"ollama.step1.desc": "Ollama는 로컬에서 LLM을 실행하는 무료 도구입니다.",
"ollama.step2.title": "STEP 2 — 모델 다운로드",
"ollama.step2.desc": "터미널에서 원하는 모델을 pull하세요. 한국어에 추천:",
"ollama.step2.alt": "또는 더 큰 모델: ollama pull qwen3:8b (더 정확, 더 느림)",
"ollama.step2.alt": "또는 더 큰 모델: ollama pull gemma4:26b (더 정확, 더 느림)",
"ollama.step3.title": "STEP 3 — 자동 연결",
"ollama.step3.desc": "Ollama가 실행되면 D3RO-VOICE가 자동으로 감지합니다. 하단 상태 바의 LED가 빨간색에서 초록색으로 바뀌면 준비 완료!",
"service.sttEngine": "STT ENGINE",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "Detecção automática",
"settings.ollamaServer": "Servidor Ollama",
"settings.ollamaUrl": "URL do servidor Ollama",
"settings.ollamaHint": "D3RO Voice conecta-se automaticamente quando o Ollama está em execução. Baixe modelos diretamente pelo Ollama (ex: ollama pull qwen3:4b).",
"settings.ollamaHint": "D3RO Voice conecta-se automaticamente quando o Ollama está em execução. Baixe modelos diretamente pelo Ollama (ex: ollama pull gemma4:e4b).",
"settings.postProcess": "Pós-processamento de voz",
"settings.defaultAction": "Ação de pós-processamento padrão",
"settings.action.none": "Nenhuma (texto original sem alterações)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "O Ollama é uma ferramenta gratuita para executar LLMs localmente.",
"ollama.step2.title": "PASSO 2 — Baixar um modelo",
"ollama.step2.desc": "Execute o seguinte comando no terminal para baixar o modelo recomendado:",
"ollama.step2.alt": "Ou um modelo maior: ollama pull qwen3:8b (mais preciso, mais lento)",
"ollama.step2.alt": "Ou um modelo maior: ollama pull gemma4:26b (mais preciso, mais lento)",
"ollama.step3.title": "PASSO 3 — Conexão automática",
"ollama.step3.desc": "D3RO-VOICE detecta automaticamente quando o Ollama está em execução. Quando o LED da barra de status mudar de vermelho para verde, está pronto!",
"service.sttEngine": "MOTOR STT",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "Автоопределение",
"settings.ollamaServer": "Сервер Ollama",
"settings.ollamaUrl": "URL сервера Ollama",
"settings.ollamaHint": "Если Ollama запущена, подключение произойдёт автоматически. Загружайте модели напрямую через Ollama (например: ollama pull qwen3:4b).",
"settings.ollamaHint": "Если Ollama запущена, подключение произойдёт автоматически. Загружайте модели напрямую через Ollama (например: ollama pull gemma4:e4b).",
"settings.postProcess": "Постобработка речи",
"settings.defaultAction": "Команда постобработки по умолчанию",
"settings.action.none": "Нет (оригинальный текст)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama — бесплатный инструмент для локального запуска LLM.",
"ollama.step2.title": "ШАГ 2 — Загрузка модели",
"ollama.step2.desc": "Загрузите нужную модель через терминал. Рекомендуется:",
"ollama.step2.alt": "Или более крупная модель: ollama pull qwen3:8b (точнее, медленнее)",
"ollama.step2.alt": "Или более крупная модель: ollama pull gemma4:26b (точнее, медленнее)",
"ollama.step3.title": "ШАГ 3 — Автоподключение",
"ollama.step3.desc": "При запуске Ollama D3RO-VOICE обнаружит её автоматически. Когда индикатор LED на нижней панели сменится с красного на зелёный — готово!",
"service.sttEngine": "STT ENGINE",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "ตรวจจับอัตโนมัติ",
"settings.ollamaServer": "เซิร์ฟเวอร์ Ollama",
"settings.ollamaUrl": "URL เซิร์ฟเวอร์ Ollama",
"settings.ollamaHint": "หาก Ollama กำลังทำงาน จะเชื่อมต่ออัตโนมัติ ดาวน์โหลดโมเดลโดยตรงจาก Ollama (เช่น: ollama pull qwen3:4b)",
"settings.ollamaHint": "หาก Ollama กำลังทำงาน จะเชื่อมต่ออัตโนมัติ ดาวน์โหลดโมเดลโดยตรงจาก Ollama (เช่น: ollama pull gemma4:e4b)",
"settings.postProcess": "การประมวลผลเสียงหลังการบันทึก",
"settings.defaultAction": "คำสั่งประมวลผลเริ่มต้น",
"settings.action.none": "ไม่มี (ข้อความต้นฉบับ)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama เป็นเครื่องมือฟรีสำหรับรัน LLM ในเครื่อง",
"ollama.step2.title": "ขั้นตอนที่ 2 — ดาวน์โหลดโมเดล",
"ollama.step2.desc": "ดาวน์โหลดโมเดลที่ต้องการผ่านเทอร์มินัล แนะนำ:",
"ollama.step2.alt": "หรือโมเดลที่ใหญ่กว่า: ollama pull qwen3:8b (แม่นยำกว่า ช้ากว่า)",
"ollama.step2.alt": "หรือโมเดลที่ใหญ่กว่า: ollama pull gemma4:26b (แม่นยำกว่า ช้ากว่า)",
"ollama.step3.title": "ขั้นตอนที่ 3 — เชื่อมต่ออัตโนมัติ",
"ollama.step3.desc": "เมื่อ Ollama ทำงาน D3RO-VOICE จะตรวจพบโดยอัตโนมัติ เมื่อไฟ LED บนแถบสถานะเปลี่ยนจากสีแดงเป็นสีเขียว — พร้อมใช้งาน!",
"service.sttEngine": "STT ENGINE",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "Tự động phát hiện",
"settings.ollamaServer": "Máy chủ Ollama",
"settings.ollamaUrl": "URL máy chủ Ollama",
"settings.ollamaHint": "Nếu Ollama đang chạy, kết nối sẽ tự động. Tải mô hình trực tiếp từ Ollama (ví dụ: ollama pull qwen3:4b).",
"settings.ollamaHint": "Nếu Ollama đang chạy, kết nối sẽ tự động. Tải mô hình trực tiếp từ Ollama (ví dụ: ollama pull gemma4:e4b).",
"settings.postProcess": "Hậu xử lý giọng nói",
"settings.defaultAction": "Lệnh hậu xử lý mặc định",
"settings.action.none": "Không có (văn bản gốc)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama là công cụ miễn phí để chạy LLM cục bộ.",
"ollama.step2.title": "BƯỚC 2 — Tải mô hình",
"ollama.step2.desc": "Tải mô hình bạn muốn qua terminal. Khuyến nghị:",
"ollama.step2.alt": "Hoặc mô hình lớn hơn: ollama pull qwen3:8b (chính xác hơn, chậm hơn)",
"ollama.step2.alt": "Hoặc mô hình lớn hơn: ollama pull gemma4:26b (chính xác hơn, chậm hơn)",
"ollama.step3.title": "BƯỚC 3 — Tự động kết nối",
"ollama.step3.desc": "Khi Ollama chạy, D3RO-VOICE sẽ tự động phát hiện. Khi đèn LED trên thanh trạng thái chuyển từ đỏ sang xanh — đã sẵn sàng!",
"service.sttEngine": "STT ENGINE",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "自動偵測",
"settings.ollamaServer": "Ollama伺服器",
"settings.ollamaUrl": "Ollama伺服器URL",
"settings.ollamaHint": "Ollama執行時將自動連線。請直接在Ollama中pull模型例如ollama pull qwen3:4b。",
"settings.ollamaHint": "Ollama執行時將自動連線。請直接在Ollama中pull模型例如ollama pull gemma4:e4b。",
"settings.postProcess": "語音後處理",
"settings.defaultAction": "預設後處理指令",
"settings.action.none": "無(保留原始文字)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama是一款在本地端執行LLM的免費工具。",
"ollama.step2.title": "STEP 2 — 下載模型",
"ollama.step2.desc": "在終端機中pull所需模型。推薦繁體中文模型",
"ollama.step2.alt": "或更大的模型ollama pull qwen3:8b更精準速度較慢",
"ollama.step2.alt": "或更大的模型ollama pull gemma4:26b更精準速度較慢",
"ollama.step3.title": "STEP 3 — 自動連線",
"ollama.step3.desc": "Ollama啟動後D3RO-VOICE將自動偵測。底部狀態列的LED從紅色變為綠色即表示準備就緒",
"service.sttEngine": "STT ENGINE",

View file

@ -116,7 +116,7 @@
"settings.sttLang.auto": "自动检测",
"settings.ollamaServer": "Ollama服务器",
"settings.ollamaUrl": "Ollama服务器URL",
"settings.ollamaHint": "Ollama运行时将自动连接。请直接在Ollama中pull模型例如ollama pull qwen3:4b。",
"settings.ollamaHint": "Ollama运行时将自动连接。请直接在Ollama中pull模型例如ollama pull gemma4:e4b。",
"settings.postProcess": "语音后处理",
"settings.defaultAction": "默认后处理命令",
"settings.action.none": "无(保留原始文本)",
@ -173,7 +173,7 @@
"ollama.step1.desc": "Ollama是一款在本地运行LLM的免费工具。",
"ollama.step2.title": "STEP 2 — 下载模型",
"ollama.step2.desc": "在终端中pull所需模型。推荐中文模型",
"ollama.step2.alt": "或更大的模型ollama pull qwen3:8b更精准更慢",
"ollama.step2.alt": "或更大的模型ollama pull gemma4:26b更精准更慢",
"ollama.step3.title": "STEP 3 — 自动连接",
"ollama.step3.desc": "Ollama启动后D3RO-VOICE将自动检测。底部状态栏的LED从红色变为绿色即表示准备就绪",
"service.sttEngine": "STT ENGINE",