A/B-Ergebnis: Qwen3.5-4B verliert, Qwen3-4B bleibt produktiv
Qwen3.5-4B ist auf der RK3588-NPU 21-45% langsamer und haelt die JSON-Vorgabe nicht durch: von 61 extrahierten Todos ueber drei Gespraeche blieben 2 uebrig, dazu 13 Parse-Fehler mit Wiederholungen. Die Prosa war nicht schlechter, teils genauer -- ausschlaggebend ist die Formatdisziplin. Modell-Drop-in zurueckgesetzt, Originalanalysen per restore wiederhergestellt. rkllm_server.cpp: neuer Schalter RKLLM_SUPPRESS_THINK=1 haengt einen leeren Denkblock an das Chat-Template. Ohne ihn antwortet Qwen3.5 mit Gedankengang statt JSON; RKLLMInput.enable_thinking reicht dafuer nicht. Ohne die Variable bleibt das Template unveraendert. Doku: Changelog 2026-09-29 (3) mit Messwerten, Bewertung und der Einschaetzung zu rknn-llm v1.3.1 (fuer uns wirkungslos, weil wir keep_history=0 fahren), plus Kapitel 05. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017A91sWU5aWrqZ2DWNTLVph
This commit is contained in:
+12
-1
@@ -8,6 +8,7 @@
|
||||
// keep_history=0 → every request is independent (Node sends full context each time).
|
||||
#include <cstddef> // rkllm.h uses size_t without including it itself
|
||||
#include "rkllm.h"
|
||||
#include <cstdlib> // getenv
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
@@ -74,7 +75,17 @@ int main(int argc, char** argv) {
|
||||
// without this the model gets the raw prompt with no turn markers and just
|
||||
// rambles generic filler. prefix/postfix wrap each user prompt; <bos> is
|
||||
// added by the runtime (add_bos_token=True at conversion).
|
||||
rkllm_set_chat_template(h, "", "<|im_start|>user\n", "<|im_end|>\n<|im_start|>assistant\n");
|
||||
// Qwen3.5 denkt per Default und ignoriert dabei die JSON-Vorgabe -- es
|
||||
// antwortet mit Gedankengang ("Wait, looking at line ..."), und der
|
||||
// JSON-Parser in llm.js sieht nichts Brauchbares. RKLLMInput.enable_thinking
|
||||
// allein schaltet das NICHT ab; das Modell-Template tut es, indem es den
|
||||
// Assistenten-Zug mit einem LEEREN Denkblock vorbefuellt. Genau den haengen
|
||||
// wir hier an, wenn RKLLM_SUPPRESS_THINK=1 gesetzt ist (Qwen3, Gemma3 und
|
||||
// Qwen2.5 brauchen es nicht und bekommen unveraendert das alte Template).
|
||||
std::string assist = "<|im_end|>\n<|im_start|>assistant\n";
|
||||
const char* sup = getenv("RKLLM_SUPPRESS_THINK");
|
||||
if (sup && *sup == '1') assist += "<think>\n\n</think>\n\n";
|
||||
rkllm_set_chat_template(h, "", "<|im_start|>user\n", assist.c_str());
|
||||
printf("READY\n"); fflush(stdout);
|
||||
fprintf(stderr, "rkllm model loaded\n"); fflush(stderr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user