From a39a08ae1cbd5016904f1942cd78a13c1a8297fe Mon Sep 17 00:00:00 2001 From: liwenhao2 Date: Wed, 16 Sep 2026 13:58:34 +0800 Subject: [PATCH] =?UTF-8?q?MiniCPM5=20=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=95=B4=E4=BD=93=E6=91=98=E9=99=A4(=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=8B=8D=E6=9D=BF):useMinicpm5=20=E5=BC=80=E5=85=B3+=E4=B8=89?= =?UTF-8?q?=E6=B4=BE=E7=94=9F=E5=B8=B8=E9=87=8F=E5=88=A0=E9=99=A4(gemma4-e?= =?UTF-8?q?2b=20=E5=9B=BA=E5=AE=9A);renderMinicpmPrompt=20=E4=B8=8E=20mini?= =?UTF-8?q?cpm=20=E6=A8=A1=E6=9D=BF=E5=88=86=E6=94=AF=E5=88=A0=E9=99=A4;th?= =?UTF-8?q?ink=20=E5=9D=97=E5=89=A5=E9=99=A4=EF=BC=88MiniCPM=E4=B8=93?= =?UTF-8?q?=E5=B1=9E=E9=98=B2=E5=BE=A1)=E5=88=A0=E9=99=A4(<|channel>though?= =?UTF-8?q?t=20=E9=80=9A=E7=94=A8=E9=98=B2=E5=BE=A1=E4=BF=9D=E7=95=99);pro?= =?UTF-8?q?mpts.md=20=E9=80=82=E7=94=A8=E6=A8=A1=E5=9E=8B/=E5=AE=B6?= =?UTF-8?q?=E6=97=8F=E5=88=97=E8=A1=A8/PC=E5=A4=8D=E7=8E=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E5=85=A8=E9=83=A8=E6=94=B9E2B;=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=BF=9D=E7=95=99=E4=BA=8E=E9=80=80=E5=BD=B9?= =?UTF-8?q?=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/summarize/prompts.md | 10 +++++----- .../java/com/k2fsa/sherpa/onnx/LlmEngine.kt | 14 ++------------ .../com/k2fsa/sherpa/onnx/MainActivity.kt | 19 +++++++------------ .../k2fsa/sherpa/onnx/SummarizePipeline.kt | 2 -- 4 files changed, 14 insertions(+), 31 deletions(-) diff --git a/app/src/main/assets/summarize/prompts.md b/app/src/main/assets/summarize/prompts.md index 7a06eda..46beebb 100644 --- a/app/src/main/assets/summarize/prompts.md +++ b/app/src/main/assets/summarize/prompts.md @@ -2,7 +2,7 @@ > 适用模型:`google/gemma-4-E2B-it-qat-q4_0-gguf` 的 `gemma-4-E2B_q4_0-it.gguf` > (架构 gemma4。2026-09-16 由 MiniCPM5-2B 切回:E2B 为真机验证过的稳定引擎, -> MiniCPM5 多次"空模板回显";模板分支全部保留在 LlmEngine 可回切) +> MiniCPM5 多次"空模板回显") > 本文件是唯一事实源:App 内 `SummarizePipeline.kt` 逐字引用这里的文本。改提示词先改本文件。 > PC 调试方法见文末「用 PC llama.cpp 复现」。 @@ -17,7 +17,7 @@ ## 1. 聊天模板(以代码为准) -模板由 `LlmEngine.renderChatPrompt` 按模型家族渲染:gemma4(旧)/ gemma3 / minicpm(ChatML im_start/im_end + 空 think 前缀禁用思考)。MiniCPM5 的确切 token 序列与特殊 id 以 `renderMinicpmPrompt` 与 GGUF 内嵌模板为准;PC 调试直接加 --jinja 用内置模板即可。 +模板由 `LlmEngine.renderChatPrompt` 按模型家族渲染:gemma4 / gemma3(2026-09-16 起 MiniCPM 分支已摘除)。PC 调试直接加 --jinja 用内置模板即可。 --- @@ -107,12 +107,12 @@ schema(键名禁止改动): ## 用 PC llama.cpp 复现(提示词调优用) 1. 取 llama.cpp master(gemma3 及更早架构均支持,App 的 `libsummarize-llm-jni.so` 无需重编)。 -2. 模型:`MiniCPM5-2B-Q4_K_M.gguf`(openbmb/MiniCPM5-2B-GGUF,架构 llama)。 +2. 模型:`gemma-4-E2B_q4_0-it.gguf`(google/gemma-4-E2B-it-qat-q4_0-gguf,架构 gemma4)。 3. 跑 P1 示例(替换 sys/user 两段;`--jinja` 走 GGUF 内置模板,与 App 的 - `renderMinicpmPrompt`——ChatML + 预填空 `` 块禁用思考——等价): + `renderGemma4Prompt`(<|turn> 系标记)等价): ```bash -llama-cli -m MiniCPM5-2B-Q4_K_M.gguf -c 8192 -ctk q8_0 -ctv f16 --jinja \ +llama-cli -m gemma-4-E2B_q4_0-it.gguf -c 8192 -ctk q8_0 -ctv f16 --jinja \ --temp 0 -n 900 \ --sys "$(sed -n '/^### SYSTEM/,/^```$/p' prompts.md | sed '1,2d;$d')" \ -p "$USER_PROMPT" diff --git a/app/src/main/java/com/k2fsa/sherpa/onnx/LlmEngine.kt b/app/src/main/java/com/k2fsa/sherpa/onnx/LlmEngine.kt index f5f61fe..04d7103 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/LlmEngine.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/LlmEngine.kt @@ -75,23 +75,13 @@ class LlmEngine( append("model\n") } - // ---- MiniCPM5(ChatML,生成 prompt 默认带 think 块)---- - // GGUF 模板 enable_thinking=false 时的 generation prompt 为: - // <|im_start|>assistant\n\n\n\n\n - // 显式预填空 think → 模型直接输出正文,不浪费解码在思考上。 - // EOG 为 <|im_end|>(llama.cpp 官方 GGUF,元数据已配)。 - fun renderMinicpmPrompt(system: String, user: String): String = - buildString { - append("<|im_start|>system\n").append(system.trim()).append("<|im_end|>\n") - append("<|im_start|>user\n").append(user.trim()).append("<|im_end|>\n") - append("<|im_start|>assistant\n\n\n\n\n") - } + // MiniCPM5 模板分支 2026-09-16 随引擎退役摘除(三连空模板回显, + // 用户拍板弃用;历史实现见 git history) fun renderChatPrompt(system: String, user: String, template: String = "gemma4"): String = when (template) { "gemma3" -> renderGemma3Prompt(system, user) - "minicpm" -> renderMinicpmPrompt(system, user) else -> renderGemma4Prompt(system, user) } } diff --git a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt index 8ccaa5f..266b094 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -305,17 +305,12 @@ class MainActivity : AppCompatActivity() { // 完全一致。摘要是独立世界:专用后台线程 + 独立 .so(llama.cpp), // 不 import 任何 sherpa-onnx ASR native 对象。 private val summarizeEnabled = true - // 摘要模型一键开关:true=MiniCPM5-2B(新);false=回退已验证的 Gemma-4-E2B - // 2026-09-16 用户拍板切回 false:MiniCPM5 三连空模板回显(9/14 起), - // E2B 为 9/11 真机验证过的稳定引擎;摘要与翻译兜底同步受益 - private val useMinicpm5 = false - private val summarizeModelDirName: String - get() = if (useMinicpm5) "minicpm5-2b" else "gemma4-e2b" - private val summarizeGgufName: String - get() = if (useMinicpm5) "MiniCPM5-2B-Q4_K_M.gguf" - else "gemma-4-E2B_q4_0-it.gguf" - private val summarizeChatTemplate: String - get() = if (useMinicpm5) "minicpm" else "gemma4" + // 摘要/翻译兜底引擎:固定 Gemma-4-E2B(2026-09-16 用户拍板,休眠开关 + // 一并摘除)。历史:MiniCPM5-2B 三连空模板回显(9/14 起)被弃用, + // 切换实现见 git history;E2B 为 9/11 真机验证过的稳定引擎 + private val summarizeModelDirName = "gemma4-e2b" + private val summarizeGgufName = "gemma-4-E2B_q4_0-it.gguf" + private val summarizeChatTemplate = "gemma4" private lateinit var summarizeButton: Button private lateinit var copyMinutesButton: Button private lateinit var minutesStatus: TextView @@ -2357,7 +2352,7 @@ class MainActivity : AppCompatActivity() { } } - // 升档兜底:1B 全链失败后,用摘要引擎(E2B/MiniCPM5,已随纪要常驻外部 + // 升档兜底:1B 全链失败后,用 E2B 引擎(已随纪要常驻外部 // 目录)低温再译一次。临时引擎用完即 release(KV 污染协议);预算将尽 // (剩不到 8s)不启用。产物过同样的 echo/drift 质检,宁缺毋滥。 private fun translateFallback( diff --git a/app/src/main/java/com/k2fsa/sherpa/onnx/SummarizePipeline.kt b/app/src/main/java/com/k2fsa/sherpa/onnx/SummarizePipeline.kt index 238c1cb..9667ee8 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/SummarizePipeline.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/SummarizePipeline.kt @@ -306,8 +306,6 @@ class SummarizePipeline( s = s.replace( Regex("<\\|channel>thought.*?", RegexOption.DOT_MATCHES_ALL), "" ) - // MiniCPM5 兜底:万一 think 块未被预填空掉仍然冒出来,一并剥除 - s = s.replace(Regex(".*?", RegexOption.DOT_MATCHES_ALL), "") s = s.replace(Regex("\n{3,}"), "\n\n") return s.trim() }