| export function applyRepPenalty( | |
| logits: Float32Array, | |
| generatedTokens: number[], | |
| penalty: number, | |
| ): Float32Array { | |
| const next = new Float32Array(logits) | |
| for (const token of new Set(generatedTokens)) { | |
| next[token] = next[token] > 0 ? next[token] / penalty : next[token] * penalty | |
| } | |
| return next | |
| } | |
| export function applyMinP(logits: Float32Array, minP: number): Float32Array { | |
| const next = new Float32Array(logits) | |
| let maxLogit = -Infinity | |
| for (const value of next) { | |
| if (value > maxLogit) { | |
| maxLogit = value | |
| } | |
| } | |
| const probs = new Float64Array(next.length) | |
| let total = 0 | |
| let maxProb = 0 | |
| for (let index = 0; index < next.length; index += 1) { | |
| const prob = Math.exp(next[index] - maxLogit) | |
| probs[index] = prob | |
| total += prob | |
| if (prob > maxProb) { | |
| maxProb = prob | |
| } | |
| } | |
| const threshold = (maxProb / total) * minP | |
| for (let index = 0; index < next.length; index += 1) { | |
| if (probs[index] / total < threshold) { | |
| next[index] = -1e9 | |
| } | |
| } | |
| return next | |
| } | |
| export function sampleWithTemperature( | |
| logits: Float32Array, | |
| temperature: number, | |
| ): number { | |
| let maxLogit = -Infinity | |
| for (const value of logits) { | |
| if (value > maxLogit) { | |
| maxLogit = value | |
| } | |
| } | |
| const probs = new Float64Array(logits.length) | |
| let total = 0 | |
| for (let index = 0; index < logits.length; index += 1) { | |
| const prob = Math.exp(logits[index] / temperature - maxLogit / temperature) | |
| probs[index] = prob | |
| total += prob | |
| } | |
| let threshold = Math.random() * total | |
| for (let index = 0; index < probs.length; index += 1) { | |
| threshold -= probs[index] | |
| if (threshold <= 0) { | |
| return index | |
| } | |
| } | |
| return probs.length - 1 | |
| } | |