From cea98924260d10c648cccf4716ea8005ee49a446 Mon Sep 17 00:00:00 2001 From: liwenhao2 Date: Wed, 16 Sep 2026 14:20:43 +0800 Subject: [PATCH] =?UTF-8?q?KV=E6=B1=A1=E6=9F=93=E6=A0=B9=E6=B2=BB(?= =?UTF-8?q?=E8=BF=989/14=E7=9A=84=E5=80=BA):JNI=20=E6=AF=8F=E6=AC=A1=20gen?= =?UTF-8?q?erate=20=E5=89=8D=20llama=5Fmemory=5Fclear=E2=80=94=E2=80=94?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E6=85=A2=E7=9A=84=E4=B8=BB=E5=9B=A0(?= =?UTF-8?q?=E6=AF=8F=E6=89=B9=E9=87=8D=E5=BB=BA=E5=BC=95=E6=93=8E=3D?= =?UTF-8?q?=E6=AF=8F=E6=AC=A1=E5=B0=9D=E8=AF=95=E9=87=8D=E8=BD=BDE2B=204~6?= =?UTF-8?q?s)=E5=B0=B1=E6=AD=A4=E5=85=8D=E9=99=A4;Kotlin=20=E4=BE=A7=20tra?= =?UTF-8?q?nslateNumbered=20=E6=94=B9=E5=BC=95=E6=93=8E=E5=A4=8D=E7=94=A8(?= =?UTF-8?q?translateEngine=20=3F:=20ensure),=E9=97=B2=E7=BD=AE60s=E5=8D=B8?= =?UTF-8?q?=E8=BD=BD=E4=B8=8D=E5=8F=98;=E7=BA=AA=E8=A6=81=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E7=BA=BF=E5=A4=9A=E5=9D=97=E5=85=B1=E4=BA=AB=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E7=9A=84=E6=BD=9C=E5=9C=A8=E6=B1=A1=E6=9F=93=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=B6=88=E9=99=A4;.so=20=E5=B7=B2=E9=87=8D=E7=BC=96?= =?UTF-8?q?=E9=83=A8=E7=BD=B2(strip=204.32MB,6=E5=AF=BC=E5=87=BA=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/k2fsa/sherpa/onnx/MainActivity.kt | 10 +++++----- tools/llama-jni/src/summarize_llm_jni.cpp | 6 ++++++ 2 files changed, 11 insertions(+), 5 deletions(-) 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 c354998..f692f1e 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -2382,6 +2382,7 @@ class MainActivity : AppCompatActivity() { } private fun ensureTranslateEngine(): LlmEngine? { + translateEngine?.let { return it } val f = File(File(externalModelDir, summarizeModelDirName), summarizeGgufName) if (!f.isFile) { Log.i(TAG, "translate model missing at ${f.absolutePath}; tap-translate off") @@ -2400,18 +2401,17 @@ class MainActivity : AppCompatActivity() { } } - // 一批 = 一个全新引擎(nativeGenerate 不清 KV 的 workaround)。 // items: key(通常是 sid 字符串) × 原文;返回 key × 译文,失败 null。 - // 直译模式(2026-09-16):不再携带同轮上下文 + // 直译模式(2026-09-16):不携带同轮上下文;引擎复用(JNI 每次生成前清 KV) private fun translateNumbered( items: List>, temp: Float = 0f, ): Map? { if (items.isEmpty()) return emptyMap() val targetName = transTargetName() val langHint = transLangHint() - translateEngine?.let { runCatching { it.release() } } - translateEngine = null - val engine = ensureTranslateEngine() ?: return null + // 引擎复用(2026-09-16,JNI 已加 KV 清除):不再按批重建—— + // "每批重建"曾让每次尝试都重载 E2B ~4-6s,是翻译单句 30~40s 的主因 + val engine = translateEngine ?: ensureTranslateEngine() ?: return null // 长句拆段:小模型对短输入才稳定;长句译到中途会"掉语言" // (简体→繁体→别的语言)。拆 ≤140 字段一次 generate,段序拼回。 val segKeys = ArrayList>() diff --git a/tools/llama-jni/src/summarize_llm_jni.cpp b/tools/llama-jni/src/summarize_llm_jni.cpp index e32a130..2742c33 100644 --- a/tools/llama-jni/src/summarize_llm_jni.cpp +++ b/tools/llama-jni/src/summarize_llm_jni.cpp @@ -165,6 +165,12 @@ Java_com_k2fsa_sherpa_onnx_LlmEngine_nativeGenerate( std::lock_guard lock(e->mu); e->abort.store(false); + // KV 清除(2026-09-16 根治):原实现不清 KV,同引擎连续 generate 会复读 + // 上一条输出 -> Kotlin 侧被迫"每次尝试重建引擎"(E2B 每次重载 4~6s, + // 是翻译单句 30~40s 的主因)。每次生成前清空内存,引擎即可安全复用; + // 顺带修复纪要流水线多块共享引擎的潜在污染。 + llama_memory_clear(llama_get_memory(e->ctx), true); + const std::string prompt = jstringToUtf8(env, jPrompt); if (prompt.empty()) { throwJava(env, "nativeGenerate: empty prompt");