KV污染根治(还9/14的债):JNI 每次 generate 前 llama_memory_clear——翻译慢的主因(每批重建引擎=每次尝试重载E2B 4~6s)就此免除;Kotlin 侧 translateNumbered 改引擎复用(translateEngine ?: ensure),闲置60s卸载不变;纪要流水线多块共享引擎的潜在污染同步消除;.so 已重编部署(strip 4.32MB,6导出符号)

This commit is contained in:
liwenhao2 2026-09-16 14:20:43 +08:00
parent fe7c696589
commit cea9892426
2 changed files with 11 additions and 5 deletions

View File

@ -2382,6 +2382,7 @@ class MainActivity : AppCompatActivity() {
} }
private fun ensureTranslateEngine(): LlmEngine? { private fun ensureTranslateEngine(): LlmEngine? {
translateEngine?.let { return it }
val f = File(File(externalModelDir, summarizeModelDirName), summarizeGgufName) val f = File(File(externalModelDir, summarizeModelDirName), summarizeGgufName)
if (!f.isFile) { if (!f.isFile) {
Log.i(TAG, "translate model missing at ${f.absolutePath}; tap-translate off") 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。 // items: key(通常是 sid 字符串) × 原文;返回 key × 译文,失败 null。
// 直译模式(2026-09-16):不再携带同轮上下文 // 直译模式(2026-09-16):不携带同轮上下文;引擎复用(JNI 每次生成前清 KV)
private fun translateNumbered( private fun translateNumbered(
items: List<Pair<String, String>>, temp: Float = 0f, items: List<Pair<String, String>>, temp: Float = 0f,
): Map<String, String>? { ): Map<String, String>? {
if (items.isEmpty()) return emptyMap() if (items.isEmpty()) return emptyMap()
val targetName = transTargetName() val targetName = transTargetName()
val langHint = transLangHint() val langHint = transLangHint()
translateEngine?.let { runCatching { it.release() } } // 引擎复用(2026-09-16,JNI 已加 KV 清除):不再按批重建——
translateEngine = null // "每批重建"曾让每次尝试都重载 E2B ~4-6s,是翻译单句 30~40s 的主因
val engine = ensureTranslateEngine() ?: return null val engine = translateEngine ?: ensureTranslateEngine() ?: return null
// 长句拆段:小模型对短输入才稳定;长句译到中途会"掉语言" // 长句拆段:小模型对短输入才稳定;长句译到中途会"掉语言"
// (简体→繁体→别的语言)。拆 ≤140 字段一次 generate,段序拼回。 // (简体→繁体→别的语言)。拆 ≤140 字段一次 generate,段序拼回。
val segKeys = ArrayList<Pair<String, String>>() val segKeys = ArrayList<Pair<String, String>>()

View File

@ -165,6 +165,12 @@ Java_com_k2fsa_sherpa_onnx_LlmEngine_nativeGenerate(
std::lock_guard<std::mutex> lock(e->mu); std::lock_guard<std::mutex> lock(e->mu);
e->abort.store(false); 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); const std::string prompt = jstringToUtf8(env, jPrompt);
if (prompt.empty()) { if (prompt.empty()) {
throwJava(env, "nativeGenerate: empty prompt"); throwJava(env, "nativeGenerate: empty prompt");