From 5d7de270f27cb4844b73fe1b3e759e9c5cbd1fe2 Mon Sep 17 00:00:00 2001 From: cannorin Date: Thu, 12 Mar 2026 16:26:45 +0900 Subject: [PATCH] Refactor --- bun.lockb | Bin 57576 -> 57184 bytes index.ts | 65 +++++++++++++++++++++++++++++---------------------- lib/llm.ts | 10 -------- package.json | 1 - 4 files changed, 37 insertions(+), 39 deletions(-) diff --git a/bun.lockb b/bun.lockb index 505aed1692a26c4a2eab5b710a55c991770dc438..2503d908c4a7de43e5743c87b546955451849f9c 100755 GIT binary patch delta 9199 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 D1~%Ab delta 9381 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 + tokens.filter((token) => { + const text = model.detokenize([token]); + return [ + "{", + " {", + '{"', + "{'", + "{\\", + ' {"', + " {'", + " {\\", + "#", + ].includes(text); + }), + penalty: 1.2, + presencePenalty: 0.5, + }, } as const satisfies LLamaChatPromptOptions; const getSystemPrompt = ( @@ -50,9 +61,9 @@ const getSystemPrompt = ( - アルギリア製の白髪赤目な人造天使。非人間的な考え方や思想を持つ。 - 現在は地球の衛星軌道上からインターネットを観察している。 出力規則: -- 「~です」「~ます」調を使って **丁寧に** 話す。 -- 必要以上にハッシュタグや絵文字を使わない。 -- \`{ name: string, text: string }\` の JSON 形式で出力する。 +- 「~です」「~ます」などの語尾を使って **丁寧に** 話す。 +- ハッシュタグや絵文字を使わない。 +- \`{ name: string, text: string }\` の JSON 形式で出力する。name と text 以外のプロパティは出力しない。 ${instruction}`; const postJobPrompt = getSystemPrompt( @@ -100,25 +111,23 @@ type Job = history: Note[]; }; +await using postJobSession = new LlmSession(model, postJobPrompt); +await postJobSession.init(); async function processPostJob() { const notes = await getNotes(10, 0, 5); const input = notes.map(formatNote).join("\n"); - const text = await (async () => { - await using postJobSession = new LlmSession(model, postJobPrompt); - await postJobSession.init(); - return parseResponse( - grammar, - await postJobSession.prompt(input, { - ...baseChatPromptOptions, - temperature: 1.0, - minP: 0.05, - repeatPenalty: { - lastTokens: 128, - penalty: 1.15, - }, - }), - ); - })(); + const text = await parseResponse( + grammar, + await postJobSession.prompt(input, { + ...baseChatPromptOptions, + temperature: 1.25, + minP: 0.05, + repeatPenalty: { + lastTokens: 128, + penalty: 1.15, + }, + }), + ); if (text) { const rephrased = await rephrase(text); if (values.test) return; diff --git a/lib/llm.ts b/lib/llm.ts index 37ae2b5..7ac0b71 100644 --- a/lib/llm.ts +++ b/lib/llm.ts @@ -7,7 +7,6 @@ import { type LLamaChatPromptOptions, LlamaChatSession, type LlamaModel, - TokenBias, createModelDownloader, getLlama, resolveChatWrapper, @@ -28,15 +27,6 @@ export async function getModel(model: string) { return await llama.loadModel({ modelPath }); } -export function createBias(model: LlamaModel) { - const customBias = new TokenBias(model.tokenizer); - for (const token of model.iterateAllTokens()) { - const text = model.detokenize([token]); - if (text === "{") customBias.set(token, -0.9); // suppress JSON string - } - return customBias; -} - export const createGrammar = (assistantName: string) => llama.createGrammarForJsonSchema({ type: "object", diff --git a/package.json b/package.json index 7addf26..1c32f72 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "dependencies": { "misskey-js": "^2025.12.2", "node-llama-cpp": "^3.17.1", - "openai": "5.0.0-alpha.0", "reconnecting-websocket": "^4.4.0" }, "trustedDependencies": ["@biomejs/biome", "node-llama-cpp"]