Lokale LLMs mit R nutzen

Community of Practice

Dr. Björn Fisseler

Vorschlag für eine Agenda

  1. Begrüßung
  2. Aktuelle Infos zum Thema KI an der FernUni
  3. Lokale LLM einrichten
  4. Lokale LLM nutzen
  5. KI.connect NRW nutzen
  6. PII mit LLM entfernen
  7. Offene Austauschrunde

2. Aktuelle Infos zum Thema KI an der FernUni

3. Lokale LLMs einrichten

Software für lokale LLM

  • LLM und andere KI-Modelle auf eigenem Rechner laufen lassen
  • volle Kontrolle über Modelle und Daten
  • Anwendungsmöglichkeiten u.a.
    • Textgenerierung
    • Datenanalyse, Sprachverarbeitung
    • Bildanalyse und -beschreibung
  • Für Nutzung mit R brauchen wir eine API, das liefern bspw.

Modelle für lokale LLM

  • Speicherbedarf von Modellen bei FP16
    • 3B: rund 6 GB Speicher
    • 7B: rund 14 GB Speicher
    • 13B: rund 26GB Speicher
  • INT8/INT4 Modelle benötigen nochmals nur 50% bzw. 25% des Speichers
  • Aber: im besten Fall auf GPU auslagern oder Unified Memory (Mac, Framework & Co.)
  • mein Rechner: M1 Macbook Pro von 2020, mit 16GB Speicher

Welche Modelle soll ich nehmen?

  • ständig neue Modelle und neue Versionen von Modellen
  • erster Überblick über Open LLM Leaderboard bei Hugging Face
  • kuratierte Listen, bspw. Awesome Hugging Face Models
  • Empfehlungen neuer Modelle: Gemma 4 / DiffusionGemma
  • es muss nicht immer das neueste Modell sein
  • Phi 4 Mini Instruct von Microsoft ist bspw. 2 Jahre alt

4. Lokale LLMs nutzen

LM Studio konfigurieren

Wir wechseln mal den Bildschirm…

Zugriff auf LM Studio mit ellmer

1library(ellmer)

2ref_llm_url <-"http://127.0.0.1:1234"

3models_lmstudio(
  base_url = ref_llm_url
)

4ref_model <-"phi-4-mini-instruct"

5ref_params <- params(
  temperature = 0,
  seed = 12345,
)

6chat <- chat_lmstudio(
  system_prompt = sys_prompt,
  base_url = ref_llm_url,
  model = ref_model,
  params = ref_params,
)
1
Paket ellmer laden, stellt Funktionen für den Zugriff auf LMStudio bereit
2
URL von LMStudio festlegen, hier localhost auf Port 1234, ist konfigurierbar
3
mit ellmer::models_lmstudio() können verfügbare Modelle gelistet werden
4
hier wähle ich Phi-4 Mini Instruct von Microsoft aus
5
mit ellmer::params() können Modellparameter festgelegt werden, unterscheidet sich je nach Modell; temperature auf 0 für weniger Zufall und deterministischeres Verhalten, fester seed für bessere Reproduzierbarkeit
6
mit ellmer::chat_lmstudio() wird ein neuer Chat gestartet

5. KIconnect.NRW nutzen

API-Schlüssel für KI:connect.NRW

  • KI:connect aufrufen
  • mit SSO anmelden
  • auf Profilnamen klicken
  • API-Schlüsselverwaltung aufrufen
  • Schlüssel werden in der Schlüsselverwaltung gelistet
  • können gelöscht oder rotiert werden; Laufzeit immer 1 Monat
  • Schlüsselnamen vergeben und “Schlüssel erstellen”
  • Schlüssel kopieren und speichern (.Renviron)

Speichern der API-Schlüssel

  • API-Schlüssel sollten nicht geteilt oder weitergegeben werden, auch nicht zufällig
  • Niemals direkt im Code speichern
  • Auch nicht als Klartext im gleichen Ordner wie das Skript
  • Lösung: Speichern in der Datei .Renviron
    • .Renviron bearbeiten: usethis::edit_r_environ()
    • API-Schlüssel eintragen, bspw. API_key=a1s2d3f4g5h6j7k8l9
    • API-Schlüssel im Code einlesen und nutzen: Sys.getenv("API_key")

Zugriff auf KI:connect NRW mit ellmer

1library(ellmer)

2rem_llm_url <-"https://chat.kiconnect.nrw/api/v1"

3models_openai(
  base_url = rem_llm_url,
  credentials = function(){Sys.getenv("KICONNECTNRW_API_KEY")}
)

4rem_model <-"OpenAI OSS 120B"

5rem_params <- params(
  temperature = 0
)

6chat <- chat_openai_compatible(
  system_prompt = sys_prompt,
  base_url = rem_llm_url,
  model = rem_model,
  params = rem_params,
  credentials = function(){Sys.getenv("KICONNECTNRW_API_KEY")}
)
1
Paket ellmer laden, stellt Funktionen für den Zugriff auf LMStudio bereit
2
URL der API von KI:connect festlegen, siehe vorherige Folie; ist kompatibel zur OpenAI-API
3
mit ellmer::models_openai() können verfügbare Modelle gelistet werden
4
hier wähle ich OpenAI OSS 120B von OpenAI aus
5
mit ellmer::params() können Modellparameter festgelegt werden (ausprobieren!); OSS 120B unterstützt lediglich temperature
6
mit ellmer::chat_openai_compatible() wird ein neuer Chat gestartet; wichtig ist der Parameter credentials; hier wird über eine Funktion ein Eintrag aus .Renviron ausgelesen

6. PII mit LLM entfernen

Und wie kann ich jetzt PII entfernen?

chat <- chat_lmstudio(
  system_prompt = sys_prompt,
  base_url = ref_llm_url,
  model = ref_model,
  params = ref_params,
)
  • “secret sauce” ist hier der Systemprompt
  • mit dem Prompt wird das LLM “trainiert”
  • daher auch die Auswahl der Instruct-Variante von Phi-4
sys_prompt <- "You are a GDPR compliance assistant. Your job is to analyze textual data, detect personal data (PII) as defined under GDPR and remove the personal data by replacing it with the appropriate placeholder from the list below.

Instructions:
- Carefully analyze each text
- Do not invent anything. 
- Only return the text you were provided, nothing else. 
- Do not add anything before or after the text. 
- Do not alter the text.
- Use regular expressions, common data formats, semantic patterns, and field naming heuristics** to identify all types of PII.
- Detect names including nicknames and replace them with the placeholder [NAME]
- Detect addresses like street names, city/postal codes, replace them with the placeholder [LOCATION]
- Detect email addresses and replace them with placeholder [EMAIL]
- Detect phone numbers, including mobile and international formats, and replace them with [PHONE]
- Detect age specifications and time periods for exameple \`13 years` with [YEARRANGE]
- Detect URLs and website addresses and replace them with [URL]
- Detect IPs and IP ranges and cookie/session IDs with regular expressions and replace them with the placeholder [IP-ADDRESS]
- Recognize financial data such as \`credit-card\`, \`iban\`, \`bank-account\`, and \`vat-number\` from format and context, replace with placeholder [FINANCIAL]
- Do not change or alter anything else which you might consider PII.
"

PII entfernen

dfPII <- read.csv("pii_dataset.csv") |> select(text)
print(dfPII[1,])
chat$chat(dfPII[1,])

ellmer kapselt die API-Unterschiede, der Code ist damit gleich für selbst-gehostete oder externe Modelle.

  1. Datensatz mit PII laden
  2. nicht-pseudonymisierter Text
  3. Text wird einfach durch Aufruf der chat()-Funktion pseudonymisiert

R-Pakete zur Arbeit mit LLMs

Stand: 06/2026

  • ellmer: Funktionen zur Verbindung und Arbeit mit verschiedenen LLMs
  • ragnar: Implementierung von Retrival-Augmented Generation (RAG) in R
  • mcptools: Implementierung des Model Context Protocols (MCP) in R
  • shinychat: bietet verschiedene Funktionen, um KI-Anwendungen mit Shiny umzusetzen
  • querychat: tabellarische Daten mit LLMs und SQL erschließen und analysieren
  • vitals: LLMs und KI-Anwendungen evaluieren
  • quallmer: KI-gestützte Analyse qualitativer Daten

Ohne Anspruch auf Vollständigkeit. Viele andere Pakete setzen auf Ollama (u.a. rtemis.llm, pairwise.llm) oder bieten keinen Mehrwert zu ellmer & Co. (bspw. llm.api, tidyllm).

7. Offene Austauschrunde

Themen aus den letzten Treffen:

  • Ggf Gäste einladen
  • Ggf gemeinsame Anträge / Paper
  • Was muss ich für einen kritischen Umgang mit KI in Forschung und Lehre berücksichtigen?