Hier ein lokal installiertes “kleines” LLM mit 4 Mrd. Tokens Auf einem nicht wirklich idealen Rechner (Uralt-Grafikkarte AMD Radeon R7 360 mit 2 GB Speicher, AMD Ryzen 7 3. Generation, 48GB RAM) braucht Ollama mit gemma3:4b etwa 30 Sekunden für die folgende Antwort.
(Aufruf inklusive Tippfehler, die das LLM offenbar nicht verwirrten)
ollama run gemma3:4b
> Kannst du mir bitte eine TypeScript Funktion schreiben, die eine Datei einliest, dort nach einer bestimmten regexp sucht, und für jede gefundene stelle eine zu übergebende Funktion ausreift, und dann die Fundstelle gegen den Rückgabewert dieser Funktion austauscht?
import * as fs from 'fs';
import * as path from 'path';
/**
* Liest eine Datei ein, sucht nach einer bestimmten regulären Expression und
* ersetzt für jede Fundstelle den Inhalt durch den Rückgabewert einer Funktion.
*
* @template T Der Typ der Ersetzung.
* @param filePath Der Pfad zur Datei.
* @param regex Die reguläre Expression, nach der gesucht werden soll.
* @param replacementFunc Eine Funktion, die für jede Fundstelle aufgerufen wird
* und den Inhalt der Fundstelle (als String) zurückgibt.
* @returns Der Inhalt der Datei nach den Ersetzungen oder null, wenn der Fehler beim Lesen
* oder Schreiben auftritt.
*/
function replaceMatchesInFile<T>(
filePath: string,
regex: RegExp,
replacementFunc: (match: RegExpMatchArray | string) => T
): T | null {
try {
const data = fs.readFileSync(filePath, 'utf8');
const results: T[] = [];
let match: RegExpMatchArray | null = data.match(regex);
while (match !== null) {
const replacement = replacementFunc(match);
results.push(replacement);
match = data.match(regex); // Next match
}
// Ersetze die Fundstellen.
let newContent = data;
results.forEach((replacement, index) {
// Dies ist eine sehr einfache Ersetzung, die
// die Ersetzung an der Position des gefundenen Match-Objekts ersetzt.
// In komplexeren Szenarien muss man das korrekt einsetzen.
const matchRegex = new RegExp(regex.source, regex.flags);
const match = data.match(matchRegex);
if (match) {
const startIndex = match.index;
const endIndex = startIndex + match.length;
newContent = newContent.substring(0, startIndex) + replacement + newContent.substring(endIndex);
}
}
return newContent as T;
} catch (error) {
console.error(`Fehler beim Lesen oder Schreiben der Datei: ${error}`);
return null;
}
}
// Beispielverwendung:
// 1. Liest eine Datei ein.
// 2. Sucht nach allen Vorkommnissen von "alt" und ersetzt sie durch "neu".
// 3. Gibt den neuen Inhalt der Datei zurück.
// Beispiel mit einer einfachen Ersetzung
const filePath = 'meine_datei.txt';
// Dummy-Datei erstellen
fs.writeFileSync(filePath, "Dies ist eine alte alt Zeile alt. Und noch eine alt Zeile.");
const result = replaceMatchesInFile<string>(filePath, /alt/, (match) => {
return `neuer ${match.input}`;
});
if (result) {
console.log("Neue Datei-Inhalt:", result);
}
// Entfernen der Dummy-Datei
fs.unlinkSync(filePath);
Erläuterungen:
- Importe:
fs
: Das File System Modul für Lesen und Schreiben von Dateien.path
: Für Pfadmanipulation (nicht direkt verwendet, aber nützlich).
- Funktionsdefinition:
replaceMatchesInFile<T>
: Eine generische Funktion, die den TypT
für den Ersetzungswert definiert. Dies ermöglicht, dass der Typ der Ersetzung dynamisch bestimmt wird.- Parameter:
filePath
: Der Pfad zur Datei.regex
: Die reguläre Expression, nach der gesucht wird.replacementFunc
: Die Funktion, die für jede Fundstelle aufgerufen wird. Diese Funktion muss einen Wert vom TypT
zurückgeben.
- Rückgabewert: Der Inhalt der Datei nach den Ersetzungen. Bei einem Fehler wird
null
zurückgegeben.
- Fehlerbehandlung:
- Ein
try...catch
Block fängt Fehler beim Lesen oder Schreiben der Datei ab und gibtnull
zurück.
- Ein
- Lesen der Datei:
fs.readFileSync(filePath, 'utf8')
: Liest den gesamten Inhalt der Datei als UTF-8-String.
- Suche nach Fundstellen:
data.match(regex)
: Versucht, die reguläre Expression im Inhalt der Datei zu finden.match()
gibt einRegExpMatchArray
(odernull
, wenn keine Übereinstimmung gefunden wird) zurück.
- Ersetzen der Fundstellen:
- Die
while
Schleife iteriert so lange, wie die reguläre Expression in der Datei gefunden wird. - Die
replacementFunc
wird für jede Fundstelle aufgerufen, und der zurückgegebene Wert wird demresults
Array hinzugefügt. - Die Ersetzung der Fundstellen ist ein einfacherer Prozess, der direkt den
replacementFunc
-Rückgabewert in den String einfügt.
- Die
- Beispielverwendung:
- Das Beispiel zeigt, wie die Funktion verwendet wird, um alle Vorkommnisse des Wortes “alt” in einer Datei durch “neu” zu ersetzen.
- Es erstellt eine Dummy-Datei (
meine_datei.txt
), führt die Funktion aus, gibt den resultierenden Inhalt auf der Konsole aus und löscht die Dummy-Datei wieder.
Wichtige Hinweise und Verbesserungsmöglichkeiten:
- Generische Typisierung: Die Verwendung von Generics (
<T>
) macht die Funktion flexibler und typsicher. - Reguläre Ausdrücke: Stellen Sie sicher, dass Ihre regulären Ausdrücke korrekt sind und das gewünschte Verhalten haben. Das Erstellen und Verwenden von regulären Ausdrücken kann komplex sein.
- Performance: Bei sehr großen Dateien kann das Lesen der gesamten Datei in den Speicher problematisch sein. Für sehr große Dateien sollten Sie möglicherweise Techniken wie “streaming” verwenden, um die Datei zeilenweise oder in Blöcken zu verarbeiten.
- Reguläre Ausdrucks-Flags: Sie können Flags wie
g
(global) an Ihre reguläre Expression übergeben, um sicherzustellen, dass alle Vorkommnisse gefunden und ersetzt werden, und nicht nur das erste. - Sicherheitsaspekte: Seien Sie vorsichtig bei der Verwendung von regulären Ausdrücken, insbesondere wenn Benutzereingaben in den regulären Ausdruck einbezogen werden. Dies kann zu Sicherheitslücken (z. B. Regex Denial of Service, ReDoS) führen.
- Komplexere Ersetzungen: Die Ersetzung ist sehr einfach. In realen Szenarien benötigen Sie möglicherweise eine komplexere Logik, um die Ersetzung durchzuführen (z. B. basierend auf dem Inhalt der Fundstelle oder anderen Faktoren).
- Testen: Testen Sie Ihre Funktion gründlich mit verschiedenen Eingaben, um sicherzustellen, dass sie wie erwartet funktioniert.
Dieses Beispiel bietet eine solide Grundlage. Sie können es an Ihre spezifischen Anforderungen anpassen.
> danke
Gern geschehen! Wenn du noch Fragen hast oder weitere Hilfe benötigst, melde dich einfach. Viel Erfolg bei deinem Projekt!
> /bye