Web Grounding für Large Language Models mit Python umsetzen

Wenn Sie einem Large Language Model Fragen zu aktuellen oder bevorstehenden Ereignissen stellen, kann die Antwort ungenau sein. Der Grund dafür ist, dass das Modell nur auf Informationen zugreifen kann, die während seines Trainings verfügbar waren. Fragen Sie beispielsweise ein LLM, das vor der letzten Präsidentschaftswahl trainiert wurde, nach dem aktuellen Präsidenten, und stellen Sie keinen Webzugriff bereit, kann das Modell entweder den vorherigen Präsidenten nennen oder eine falsche Antwort erzeugen. Das folgende Beispiel zeigt eine Anfrage an Llama 3.3 70B, dessen Wissensstand im Training bis Dezember 2023 reicht.

example_llm.py

response = call_llm("Who is the current president?")
print(f"Response: {response}")

Ausgabe

Response: As of my knowledge cutoff in 2023, Joe Biden is the President of the United States. However, please note that my information may not be up-to-date, and I recommend checking with a reliable news source for the most current information.

Viele LLM-APIs lösen diese Einschränkung, indem sie eine Anfrage mit Informationen aus einer Websuche anreichern. Dieser Vorgang wird als Web Grounding bezeichnet und ähnelt dem Prinzip der Retrieval Augmented Generation. Dabei prüft der Workflow, ob die Eingabe des Nutzers aktuelle Informationen aus dem Web benötigt. Falls ja, wird eine Suche durchgeführt, die Suchergebnisse werden dem finalen Prompt als zusätzlicher Kontext hinzugefügt, und anschließend wird die Antwort an den Nutzer zurückgegeben.

Web-Grounding-Workflow

Wenn Sie ein Open-Source-Modell verwenden möchten, statt auf eine LLM-API mit bereits integriertem Web Grounding zurückzugreifen, müssen Sie diesen Ablauf möglicherweise selbst erstellen. In diesem Tutorial entwickeln Sie einen Python-basierten Workflow, der Web Grounding nutzt, um die Genauigkeit von Modellantworten zu verbessern.

Wichtige Erkenntnisse

  • LLMs verfügen nur über Informationen bis zu dem Zeitpunkt, an dem sie trainiert wurden. Web Grounding nutzt aktuelle Websuchen, damit LLM-Prompts Zugriff auf zeitnahe Informationen erhalten.
  • Web Grounding ist eine Form der Retrieval Augmented Generation. Der Workflow erkennt, welcher zusätzliche Kontext für die Beantwortung eines Prompts erforderlich ist, sucht diesen Kontext im Web und übergibt die Suchinformationen zusammen mit dem Prompt an das LLM.
  • Viele proprietäre Modelle von Anbietern wie OpenAI und Google bieten integrierte Funktionen für Web Grounding. Bei anderen Modellen müssen Anwender einen eigenen Web-Grounding-Prozess mit Python-Logik und Zugriff auf eine Websuch-API entwickeln.

Schritt 1 — API-Schlüssel vorbereiten

Sie benötigen ein Tool, das das Web durchsuchen und Suchergebnisse zurückgeben kann. Einige Suchanbieter, darunter Google und Bing, haben klassische Such-APIs zugunsten eigener proprietärer Web-Grounding- oder Agenten-Dienste zurückgestellt. In diesem Tutorial verwenden Sie DuckDuckGo-Suchen über einen begrenzten kostenlosen Tarif von Serp API. Grundsätzlich kann jede Such-API genutzt werden, solange sie Zugriff auf Titel, Snippet und Datum der Suchergebnisse bereitstellt.

Um ein kostenloses Konto bei Serp API zu erstellen und einen API-Schlüssel zu erhalten, besuchen Sie die Website des Anbieters und registrieren Sie sich für den kostenlosen Tarif.

Zusätzlich benötigen Sie Zugriff auf ein LLM. Dieses Tutorial verwendet Llama 3.3 70B über einen allgemeinen serverlosen Inferenz-Endpunkt. Sie benötigen dafür einen Modellzugriffsschlüssel Ihres gewählten Inferenzanbieters, um das Modell aufrufen zu können.

Schritt 2 — Entwicklungsumgebung einrichten

Falls Python auf Ihrem System noch nicht installiert ist, laden Sie es von der offiziellen Python-Website herunter und installieren Sie es.

Erstellen Sie eine Python-Datei mit dem Namen web_grounding_tutorial.py. Importieren Sie in diesem Skript die Bibliothek requests. Fügen Sie Ihren Serp-API-Schlüssel ein und ersetzen Sie den Platzhalter your_api_key durch den API-Schlüssel aus Ihrem Serp-API-Konto. In der Regel finden Sie diesen Schlüssel nach der Anmeldung im API-Key-Bereich Ihres Serp-API-Dashboards.

Ergänzen Sie anschließend die Inferenz-URL sowie die Anfrage-Header für Ihren LLM-Anbieter. Ersetzen Sie den Platzhalter your_model_access_key durch den Modellzugriffsschlüssel aus der Konsole Ihres Inferenzanbieters.

web_grounding_tutorial.py

import requests

SERP_API_KEY = "your_api_key"

llm_url = "https://your-inference-provider.example.com/v1/chat/completions"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer your_model_access_key"
}

Die Anfrage-Header legen den JSON-Inhaltstyp fest und übergeben den Modellzugriffsschlüssel zur Autorisierung. Als Nächstes erstellen Sie eine Funktion, die das LLM aufruft. Diese Funktion sendet eine HTTP-Anfrage an Ihren serverlosen Inferenz-Endpunkt.

web_grounding_tutorial.py

def call_llm(prompt):
    data = {
        "model": "llama3.3-70b-instruct",
        "messages": [
            {
                "role": "user",
                "content": prompt
            }
        ],
        "max_tokens": 500
    }

    response = requests.post(llm_url, headers=headers, json=data)
    message = response.json()['choices'][0]['message']['content']
    return message

Die Funktion call_llm nimmt einen Prompt entgegen, sendet ihn über eine HTTP-Anfrage an das Modell und gibt den Antworttext zurück.

Schritt 3 — Erkennen, ob ein Prompt Web Grounding benötigt

Nicht jede Anfrage muss mit einer Websuche angereichert werden. Wenn Sie beispielsweise nach einem Suppenrezept fragen, soll das LLM möglicherweise direkt antworten, ohne vorher das Web zu durchsuchen. Außerdem können Such-APIs Nutzungslimits oder Kosten verursachen, weshalb unnötige Suchanfragen vermieden werden sollten. Websuchen können auch zusätzliche Latenz erzeugen. Deshalb ist es sinnvoll, nur dann zu suchen, wenn der Prompt tatsächlich aktuelle Informationen benötigt.

Um zu entscheiden, ob eine Websuche erforderlich ist, erstellen Sie eine Funktion, die das LLM fragt, ob die Nutzereingabe mit Suchergebnissen ergänzt werden sollte.

web_grounding_tutorial.py

def needs_web_grounding(query):

    prompt = f"Does the following prompt need information more recent than December 2023 to answer correctly?. Answer only YES or NO.\nQuestion: {query}\nAnswer:"

    judgement = call_llm(prompt)

    return judgement.strip().upper().startswith("YES")

Die Funktion needs_web_grounding fragt das Modell, ob der Prompt des Nutzers Informationen benötigt, die neuer sind als der Wissensstand von Dezember 2023 des in diesem Tutorial verwendeten Modells Llama 3.3 70B. Antwortet das Modell mit YES, gibt die Funktion den booleschen Wert True zurück. Andernfalls wird False zurückgegeben. Dieses Ergebnis entscheidet darüber, ob der Workflow eine Websuche ausführen soll.

Wenn Sie needs_web_grounding mit der Anfrage Who is the current president? aufrufen, sollte die Funktion YES beziehungsweise True zurückgeben. Bei der Anfrage Why is the sky blue? sollte sie NO beziehungsweise False zurückgeben.

Der Prompt innerhalb der Funktion needs_web_grounding wird nicht in jedem Fall perfekt erkennen, ob eine Websuche erforderlich ist. Wenn beispielsweise ein Land seine Hauptstadt ändert, könnte das Modell annehmen, dass Hauptstädte sich selten ändern, und deshalb NO zurückgeben. Viele ähnliche Fälle machen diese Erkennungslogik komplexer, als sie zunächst wirkt. Für dieses Tutorial reicht der einfache Prompt aus. In einer produktiven Umgebung sollten Sie den Prompt anpassen, je nachdem, welches Fehlerrisiko Ihre Anwendung tolerieren kann.

Schritt 4 — Websuche implementieren

Erstellen Sie nun die Funktion für die Websuche. Sie soll eine Suchanfrage entgegennehmen und die ersten drei Suchergebnisse zurückgeben.

web_grounding_tutorial.py

def search_web(search_query): 
    params = {
        'engine': 'duckduckgo_light',
        'q': search_query,
        'api_key': SERP_API_KEY,
    }

    response = requests.get('https://serpapi.com/search', params=params)
    data = response.json()

    return data["organic_results"][:3]

Die Funktion search_web nimmt die Nutzereingabe entgegen und verwendet den zuvor definierten SERP_API_KEY, um über Serp API eine DuckDuckGo-Suche auszuführen. Anschließend gibt sie die Details der ersten drei Suchergebnisse zurück. Diese Ergebnisse werden dem Prompt des Nutzers hinzugefügt, bevor das LLM die finale Antwort erzeugt.

Schritt 5 — Workflow-Logik schreiben

Erstellen Sie nun eine Funktion, die alle bisher geschriebenen Funktionen miteinander verbindet. Sie nimmt die Eingabe des Nutzers entgegen, ruft needs_web_grounding auf, um zu prüfen, ob eine Suche notwendig ist, und führt anschließend entweder eine Websuche durch und ergänzt den Prompt mit den Ergebnissen oder ruft das LLM ohne zusätzlichen Kontext direkt auf.

web_grounding_tutorial.py

def answer_with_web_grounding(user_input):

    if needs_web_grounding(user_input):
        print("Web search needed; fetching info...")
        search_results = search_web(user_input)
        prompt = f"Please respond to the user's query: {user_input}\n\nYou may use the following web search results as context in your answer: {search_results}"
    
    else:
        print("Web search NOT needed; answering from LLM knowledge.")
        prompt = user_input
      
    answer = call_llm(prompt)
    return answer

Wenn needs_web_grounding den Wert True zurückgibt, erstellt der Workflow einen Prompt, der das LLM anweist, die Websuchergebnisse als Kontext zu nutzen. Gibt die Funktion False zurück, wird nur die ursprüngliche Nutzereingabe an das Modell gesendet.

Führen Sie nun den folgenden Code aus:

web_grounding_tutorial.py

answer_with_web_grounding("Who is the current president?")

Sie sollten eine Antwort erhalten, die ungefähr wie die folgende aussieht.

Ausgabe

The current president of the United States is Donald J. Trump. He was sworn in as the 47th president on January 20, 2025, and his current term is set to end on January 20, 2029.

Diese Ergebnisse sind nicht nur aktuell, sondern enthalten auch Details wie das Datum der Amtseinführung und das voraussichtliche Ende der Amtszeit. Solche Informationen wären möglicherweise nicht korrekt zurückgegeben worden, wenn das Modell ohne Web Grounding geantwortet hätte.

Web-Grounding-Workflow verbessern

Um diesen LLM-Workflow für Ihre eigene Anwendung zu optimieren, sollten Sie als Nächstes die Methode anpassen, mit der entschieden wird, ob ein Prompt eine Websuche benötigt. Diese Entscheidung hängt stark von den Anforderungen Ihrer Anwendung ab. Wenn Ihre Anwendung ausschließlich Informationen zu bevorstehenden Konzerten liefern soll, kann eine Websuche bei jeder Anfrage sinnvoll sein. Wenn das Ziel dagegen nur darin besteht, einen Teil veralteter Antworten zu vermeiden, können Sie den in diesem Tutorial erstellten Ablauf weiterverwenden. Der Prompt in der Funktion needs_web_grounding lässt sich entsprechend anpassen.

Außerdem können Sie die Ausgabe der Suchergebnisse bereinigen, um Token zu sparen und die Antwortgenauigkeit zu erhöhen. Aktuell gibt die Funktion search_web ein JSON-Objekt zurück, das ungefähr wie folgt aussieht:

[
  {
    "position": 1,
    "title": "President Donald J. Trump - The White House",
    "link": "https://www.whitehouse.gov/administration/donald-j-trump/",
    "displayed_link": "www.whitehouse.gov/administration/donald-j-trump/",
    "snippet": "President Trump built on his success in private life when he entered into politics and public service. He remarkably won the Presidency in his first ever run for any political office.",
    "favicon": "https://external-content.duckduckgo.com/ip3/www.whitehouse.gov.ico"
  },
  {
    "position": 2,
    "title": "Donald Trump Sworn In as 47th President in Capitol Ceremony ... - Yahoo",
    ...
  }
]

Mehrere dieser Felder, etwa position, link und displayed_link, sind für die Antwort des Modells möglicherweise nicht erforderlich. Prüfen Sie das Format, das Ihre Such-API zurückgibt, und erstellen Sie eine Funktion, die unnötige Felder entfernt. Dadurch reduzieren Sie die Menge an Informationen, die dem Prompt-Kontext hinzugefügt wird. Zusätzlich kann es hilfreich sein, das JSON in ein TOON-Format umzuwandeln, um den Tokenverbrauch weiter zu verringern.

Möglicherweise stellen Sie auch fest, dass viele Antworten nicht vollständig in den Snippets der Suchergebnisse enthalten sind. Wenn Sie beispielsweise nach der Uhrzeit des nächsten Seahawks-Spiels fragen, kann das Such-Snippet zwar den Tag enthalten, aber nicht zwingend die genaue Uhrzeit, sofern Ihr Workflow nicht auf den Inhalt der verlinkten Seite zugreifen kann.

web_grounding_tutorial.py

answer_with_web_grounding("What time is the next Seahawks game?")

Ausgabe

The next Seahawks game is today, Sunday, December 28, 2025, against the Panthers. However, the exact time of the game is not specified in the provided search results. I recommend checking the official Seattle Seahawks website...

Eine Möglichkeit zur Verbesserung besteht darin, einen weiteren Schritt einzubauen, bei dem der Workflow mit einer Python-Bibliothek wie Beautiful Soup den Inhalt der Webseite abruft und diesen Inhalt in den Prompt-Kontext einfügt. Nachdem diese Funktionalität ergänzt wurde, wird der Kontext von der offiziellen Seahawks-Spielplanseite einbezogen. Das Modell kann dadurch erkennen, dass das heutige Spiel bereits vorbei ist und dass das genaue Datum sowie die Uhrzeit des nächsten Spiels noch nicht feststehen.

Ausgabe

The next Seahawks game is scheduled for Week 18, but the date, time, and location are still "TBD" (to be determined) as it is against the 49ers at Levi's Stadium.

Aus Sicherheitsgründen sollten Sie hartcodierte API-Schlüssel und URLs aus Ihrem Quellcode entfernen. Eine Möglichkeit besteht darin, diese Werte als Umgebungsvariablen zu speichern und sie in Ihren Skripten zu laden.

Abschließend sollte jeder LLM-Workflow ausreichend Fehlerbehandlung enthalten, um mit dem nicht-deterministischen und teilweise schwer vorhersehbaren Verhalten von KI-Anwendungen umgehen zu können.

FAQ

Kann Web Grounding über eine gesamte Unterhaltung hinweg funktionieren und nicht nur für einen einzelnen Prompt?

Ja. Wenn Sie ein dialogbasiertes Format unterstützen möchten, in dem Nutzer Folgefragen stellen können, können Sie den Grounding-Kontext direkt in die Unterhaltung aufnehmen. Falls dadurch zu viele Tokens im Gesprächskontext entstehen, können ältere Konversationseinträge entfernt werden, um den Tokenverbrauch zu reduzieren, sofern Ihre Anwendung dies zulässt.

Web Grounding erhöht die Latenz, weil die Websuche Zeit benötigt. Wie lässt sich der Ablauf beschleunigen?

Sie können LLM-Aufrufe asynchron ausführen. Senden Sie den Prompt des Nutzers ohne Suchergebnisse an das LLM und stellen Sie gleichzeitig eine separate Anfrage, die prüft, ob der Prompt Web Grounding benötigt. Sobald beide Antworten vorliegen, führen Sie die Websuche nur dann aus, wenn sie erforderlich ist, und rufen das LLM anschließend erneut mit dem Websuch-Kontext auf. Dadurch lässt sich die Latenz bei Prompts reduzieren, die keine Websuche benötigen. Gleichzeitig steigen jedoch die Tokenkosten, da die erste LLM-Antwort verworfen wird, sobald eine Websuche notwendig ist.

Die Websuche verbraucht zu viele Tokens. Wie kann der Tokenverbrauch gesenkt werden?

Eine Möglichkeit besteht darin, innerhalb der Funktion needs_web_grounding ein kleineres Modell zu verwenden. Für die Entscheidung, ob ein Prompt Websuch-Kontext benötigt, ist möglicherweise kein Modell mit 70 Milliarden Parametern erforderlich. Ein kleineres Modell kann für diesen Klassifizierungsschritt günstiger und schneller sein.

Fazit

Web Grounding ist ein wirkungsvoller Ansatz, um die Genauigkeit von KI-Anwendungen zu verbessern. Es kann in bestehende Workflows für Retrieval Augmented Generation integriert werden. Mithilfe von Web Grounding können auch ältere oder kleinere Modelle, die mit weniger aktuellen Daten trainiert wurden, präzise und aktuelle Antworten liefern.

In diesem Tutorial haben Sie einen Serp-API-Endpunkt verwendet, um DuckDuckGo-Suchen auszuführen, und den Prompt des Nutzers mit Kontext aus den zurückgegebenen Suchergebnissen erweitert. Der nächste Schritt besteht darin, die Implementierung an die Anforderungen Ihrer eigenen Anwendung anzupassen.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

n8n Workflow-Automatisierung: Open-Source-Guide

AI/ML, Tutorial
Vijonavor 10 Minuten n8n Workflow-Automatisierung: Open-Source-Automation für Apps, APIs und Services Automatisierung ist heute ein fester Bestandteil moderner Softwareentwicklung und IT-Betriebsprozesse. Ob Teams Daten zwischen verschiedenen Systemen synchronisieren oder komplexe Geschäftsabläufe…
Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

QwenLong-L1.5: Long-Context Reasoning mit KI

AI/ML, Tutorial
Vijonavor 1 Stunde QwenLong-L1.5: Long-Context Reasoning mit speichergestützter KI Large Language Models (LLMs) entwickeln sich im Bereich logisches Schlussfolgern rasant weiter. Long-Context Reasoning bleibt jedoch weiterhin eine der anspruchsvollsten Herausforderungen. Zwar…
Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

Olmo 3: Open-Source-KI-Modell im Überblick

AI/ML, Tutorial
Vijonavor 2 Stunden Olmo 3: Praxisnaher Überblick über Open-Source-KI-Modelle, Trainingsdaten und Tools Die Arbeit von Allen AI trägt dazu bei, fortgeschrittene KI-Forschung zugänglicher zu machen. Indem Einstiegshürden gesenkt werden, können Universitätslabore,…