Es ist inzwischen klar, dass Agenten die Gegenwart und Zukunft der generativen KI sind. Dies zeigt sich nicht nur in den Aussagen bemerkenswerter Personen wie Andrew Ng, sondern auch in der Arbeit zahlreicher Forschungsteams. Das jüngste Paper „Mixture of Agents“ zeigt eine erstaunliche Verbesserung bei der Problemlösung, wenn LLM-Agenten gemeinsam an einem Thema arbeiten!
Nicht zu vergessen, dass jemand mutig genug war, einen Preis von 1,1 Millionen Dollar für einen Kaggle-Wettbewerb zur Entwicklung einer AGI auszusetzen (die Absicht ist eindeutig auf Agenten ausgerichtet…).
Erstellen Sie eine KI, die in der Lage ist, Denkaufgaben zu lösen, die sie noch nie zuvor gesehen hat – aus der Quelle
In diesem Artikel zeige ich Ihnen, wie Sie den Preis gewinnen können!
Scherz beiseite
Das weiß ich zwar nicht, aber ich gebe Ihnen hier den Ausgangspunkt!
Wir verwenden eine einfache und leistungsstarke Python-Bibliothek, die entwickelt wurde, um allen das Leben zu erleichtern!
In diesem Artikel zeige ich Ihnen, wie Sie eine Gruppe von Agenten aufbauen, um eine Produkteinführungskampagne von Grund auf zu erstellen: Produktbeschreibung, USP, Zielgruppe, Marketing-Kanäle, Werbetexte, Landingpage, E-Mail-Kampagne, Social-Media-Beiträge, Pressemitteilung und Leistungskennzahlen.
Fangen wir an!
Langchain Agenten mit llamacpp Beispiel – von TwitterX
Die llama-cpp-agent Bibliothek
Das llama-cpp-agent Framework ist ein Werkzeug zur Vereinfachung der Interaktion mit großen Sprachmodellen (LLMs). Es bietet eine Schnittstelle zum Chatten mit LLMs, Ausführen von Funktionsaufrufen, Generieren strukturierter Ausgaben, Durchführen von Retrieval Augmented Generation und Verarbeiten von Text mithilfe von Agentenketten mit Tools.
Wie der Name schon sagt, liegt der Fokus auf der llama-cpp-python Bibliothek.
Warum? Weil die berühmten Frameworks wie Llamaindex und LangChain bis vor wenigen Wochen keine Out-of-the-Box-Lösung hatten, um ein quantisiertes Chat-Modell in ihren leistungsstarken integrierten Workflow einzubinden.
Infolgedessen konnten Sie nicht einmal den Demo-Code testen und scheiterten bei jedem Tutorial, wenn Sie nicht die OpenAI ChatGPT API verwendeten (und dafür bezahlten).
Jetzt können wir lokal quantisierte Modelle mit llama-cpp ausführen und Ihre Agenten mit wenigen Codezeilen aufbauen!
Verwendung von LlamaCppServerProvider
Das GitHub-Repository enthält auch eine angemessene ReadTheDocs-Webseite: nicht für Anfänger, aber sicherlich gut!
Der einfachste Weg, die Funktionen des Agenten zu nutzen, besteht darin, das quantisierte Modell Ihrer Wahl als API auszuführen.
Llama-cpp-python
hat eine eingebaute Option, dies von der Kommandozeile aus zu tun. Alternativ können Sie auch Llamafile
verwenden, wie ich bereits in meinem vorherigen Artikel erklärt habe:
Zwei-Terminal-Strategie
Die Idee ist also, ein Terminalfenster zu haben, das den llamafile
-Dienst ausführt, und ein anderes, das den Python-Code ausführt und Ihnen die Ausgaben liefert.
HINWEIS: ⚠️ Ich empfehle Ihnen, die llamafile-Option zu verwenden: Die Standardinstallation der llama-cpp-agent Bibliothek enthält llama-cpp-python ohne Server-Unterstützung.
Abhängigkeiten
Als Best Practice erstellen Sie eine virtuelle Umgebung, bevor Sie neue Pakete installieren.
Beachten Sie, dass dieses Projekt nur mit Python 3.11+ funktioniert.
Erstellen Sie ein neues Verzeichnis, z.B. llamacpp-agents
mkdir llamacpp-agents
cd llamacpp-agents
python -m venv venv
#aktivieren Sie die virtuelle Umgebung
venv\Scripts\activate
Installieren Sie nun mit aktivierter virtueller Umgebung die einzigen 2 erforderlichen Pakete:
pip install llama-cpp-agent rich
Und da wir möglicherweise llamafile
verwenden möchten:
wget https://github.com/Mozilla-Ocho/llamafile/releases/download/0.8.6/llamafile-0.8.6 -OutFile llamafile-0.8.6.exe
Wenn Sie sich für llama-cpp-server
entscheiden möchten, installieren Sie zusätzlich:
pip install llama-cpp-python[server]==0.2.78
oder
pip install fastapi
pip install uvicorn
pip install anyio
pip install sse_starlette starlette_context pydantic pydantic-settings
Jetzt sind wir bereit loszulegen!
Offizielle Webseite für llamafile – jetzt in Version 0.8.6
Wie man die OpenAI-kompatible API ausführt
Wie bereits erwähnt, hier sind die 2 Methoden:
Methode 1 – empfohlen
Um den Modell-API-Endpunkt mit llamafile
auszuführen, ist es einfach und Sie benötigen keine Python-Abhängigkeiten. Führen Sie vom Terminal aus Folgendes aus:
.\llamafile-0.8.6.exe --server --host 0.0.0.0 -m .\models\qwen2-0_5b-instruct-q8_0.gguf -c 8192
Methode 2 – weniger zuverlässig
Um es direkt in llama-cpp-python
umzuwandeln, wenn Sie es mit der [server]-Option installiert haben. Aktivieren Sie vom Terminal aus die virtuelle Umgebung und führen Sie aus:
python -m llama_cpp.server --host 0.0.0.0 --port 8080 --model models\tinyllama-moe4-q8_0.gguf --n_ctx 2048 --n_gpu_layers 0
Wählen Sie Ihren Champion
Sie benötigen offensichtlich ein lokales, quantisiertes Modell. Je größer die Anzahl der Parameter, desto genauer wird das Ergebnis sein… und desto länger wird auch die Generierungszeit sein.
Hier sind die besten kleinen Sprachmodelle, die Sie meiner Meinung nach großartig finden werden:
- qwen2-0_5b-instruct-q8_0.gguf nctx=32k
- h2o-danube2-1.8b-chat-Q5_K_M.gguf nctx=8k
- stablelm-2-zephyr-1_6b-Q5_K_M.gguf nctx= 2k
- qwen2-1.5b-instruct.Q6_K.gguf nctx=32k
- gemma-1.1-2b-it.Q6_K.gguf nctx= 2k
Sie können die folgenden Links verwenden, um sie herunterzuladen. Ich schlage vor, dass Sie sie in den Unterordner models
legen. Vom Terminal aus:
mkdir models
cd models
Führen Sie dann einen der folgenden Befehle aus, je nach Ihren Präferenzen:
wget https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GGUF/resolve/main/qwen1_5-1_8b-chat-q4_k_m.gguf -OutFile qwen1_5-1_8b-chat-q4_k_m.gguf
wget https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF/resolve/main/qwen2-0_5b-instruct-q8_0.gguf -OutFile qwen2-0_5b-instruct-q8_0.gguf
wget https://huggingface.co/Clausss/Qwen2-1.5B-Instruct-Q8_0-GGUF/resolve/main/qwen2-1.5b-instruct-q8_0.gguf -OutFile qwen2-1.5b-instruct-q8_0.gguf
wget https://huggingface.co/ggml-org/gemma-1.1-2b-it-Q6_K-GGUF/resolve/main/gemma-1.1-2b-it.Q6_K.gguf -OutFile gemma-1.1-2b-it.Q6_K.gguf
wget https://huggingface.co/h2oai/h2o-danube2-1.8b-chat-GGUF/resolve/main/h2o-danube2-1.8b-chat-Q5_K_M.gguf -OutFile h2o-danube2-1.8b-chat-Q5_K_M.gguf
wget https://huggingface.co/second-state/stablelm-2-zephyr-1.6b-GGUF/resolve/main/stablelm-2-zephyr-1_6b-Q5_K_M.gguf -OutFile stablelm-2-zephyr-1_6b-Q5_K_M.gguf
Hinweis: Der gesamte Code befindet sich im GitHub-Repository, das für diesen Artikel erstellt wurde. Sie können mitverfolgen 😉
Ich habe qwen2-0_5b-instruct-q8_0.gguf
verwendet, das kleinste Modell… und auch das schnellste.
Produkteinführungskampagne – was wir erstellen werden
Ich wollte eine einfache Vorstellung von der Verwendung von KI-Agenten geben, daher ist dieses Projekt eine einfache Kette. Jeder Agent wird seine Antwort auf den Teil der anderen Agenten stützen:
Agenten-Workflow – vom Autor
Wir werden die folgenden Agenten einrichten:
- Produktbeschreibungsschreiber: Er wird „Eine detaillierte Produktbeschreibung für
Ihr Produkt
schreiben, einschließlich seiner Funktionen und Vorteile.“ - Ersteller des einzigartigen Verkaufsarguments (USP): Seine Aufgabe ist es, „Ein überzeugendes USP für
Ihr Produkt
basierend auf der Arbeit desProduktbeschreibungsschreibers
zu erstellen“ - Zielgruppenidentifizierer. Wir weisen ihm die Aufgabe zu, „Die Zielgruppe für
Ihr Produkt
basierend auf der Arbeit desProduktbeschreibungsschreibers
und desErstellers des einzigartigen Verkaufsarguments (USP)
zu identifizieren“ - Marketing-Kanal-Stratege: Sie wird „Die effektivsten Marketing-Kanäle zur Promotion von
Ihr Produkt
basierend auf den Richtlinien desZielgruppenidentifizierers
vorschlagen“ - Werbetexter. Er muss „Ansprechende Werbetexte für
Ihr Produkt
basierend auf demProduktbeschreibungsschreiber
, demErsteller des einzigartigen Verkaufsarguments (USP)
und den Richtlinien desZielgruppenidentifizierers
schreiben“ - Der Landingpage-Designer ist verantwortlich für „Erstellen Sie eine hochkonvertierende Landingpage-Struktur für
Ihr Produkt
basierend auf der zuvor erstelltenProduktbeschreibung
,USP
,Zielgruppe
undWerbetexten
.“ - E-Mail-Marketing-Spezialist: Dieser Agent „Entwickelt eine E-Mail-Kampagne für
Ihr Produkt
basierend auf derProduktbeschreibung
,USP
,Zielgruppe
undLandingpage-Struktur
.“ - Social-Media-Content-Ersteller „Erstellen Sie eine Reihe von ansprechenden Social-Media-Beiträgen für
Ihr Produkt
basierend auf derProduktbeschreibung
,USP
,Zielgruppe
undWerbetexten
.“ - Pressemitteilungsschreiber. Er „Schreibt eine überzeugende Pressemitteilung zur Ankündigung des Starts von
Ihr Produkt
basierend auf derProduktbeschreibung
,USP
undZielgruppe
.“ - Ein Marketing-Performance-Analyst identifiziert schließlich „die wichtigsten Leistungskennzahlen zur Verfolgung des Erfolgs der
Ihr Produkt
-Einführungskampagne basierend auf den Marketing-Kanälen, Werbetexten, Landingpage, E-Mail-Kampagne, Social-Media-Beiträgen und der Pressemitteilung.“
HINWEIS: Der Code wird einfacher sein als das Lesen der Beschreibung 💻😉
Website-Mockup erstellt mit Canva – basierend auf llama-cpp-agent JOB
Erstellung und Verkettung von Agenten
Lassen Sie uns hier ein wenig programmieren. Llama-cpp-agent erfordert nur eine minimale Anzahl von Codezeilen, um die Agenten zu erstellen und zu aktivieren.
Zunächst importieren wir die Bibliotheken und verbinden die KI-Anwendung mit dem laufenden Server (den Sie zwischen llamafile
und llama-cpp-python-server
gewählt haben).
from llama_cpp_agent import AgentChainElement, AgentChain
from llama_cpp_agent import LlamaCppAgent
from llama_cpp_agent import MessagesFormatterType
from llama_cpp_agent.providers import LlamaCppServerProvider
from rich.console import Console
console = Console(width=90)
import datetime
from time import sleep
Ich mag es, alles in Textdateien zu protokollieren. Lassen Sie uns also auch eine Funktion erstellen, um die Ergebnisse der Arbeit des KI-Agenten in eine Datei zu schreiben.
def writehistory(filename,text):
with open(filename, 'a', encoding='utf-8') as f:
f.write(text)
f.write('\n')
f.close()
# Dateinamen festlegen
tstamp = datetime.datetime.now()
tstamp = str(tstamp).replace(' ','_')
tstamp = str(tstamp).replace(':','_')
logfile = f'{tstamp[:-7]}_log.txt'
sleep(2)
# In die Historie die ersten 2 Sitzungen schreiben
writehistory(logfile,f'Erstellt mit 🌀 Qwen2-0.5b-instruct\n---\n\n\n')
Die Funktion schreibt einfach einen String in eine txt-Datei. Dann verwenden wir eine einfache Methode, um automatisch einen Dateinamen (basierend auf dem Zeitstempel) zu erstellen und beginnen mit der Protokollierung des verwendeten Modells (Qwen2-0.5b-instruct).
Die Verbindung zum Modell könnte nicht einfacher sein, da wir uns mit dem API-Endpunkt verbinden müssen:
model = LlamaCppServerProvider("http://127.0.0.0:8080")
# Standardport für llamafile-Server ist 8080
agent = LlamaCppAgent(
model,
system_prompt="",
)
Wie Sie sehen, ist es sehr unkompliziert. Wir richten einen Provider ein und weisen ihn einer Agent-Klasse zu.
In den nächsten Schritten werden wir die Rollen deklarieren und festlegen, wie die Ausgaben miteinander verknüpft werden sollen.
Das AgentChainElement
Jede einzelne Agentenaufgabe wird durch das AgentChainElement identifiziert: Diese Klasse hat ihren eigenen Ausgabeidentifikator (erforderlich, um die Ergebnisse in der Agentenkette zu verknüpfen) sowie einen System-Prompt und einen Anweisungs-Prompt.
Schauen wir uns den ersten an:
product_description = AgentChainElement(
output_identifier="out_0",
system_prompt="Sie sind ein Produktbeschreibungsschreiber",
prompt="""Schreiben Sie eine detaillierte Produktbeschreibung für {product_name},
einschließlich seiner Funktionen und Vorteile."""
)
Die Variable {product_name}
wird der einzige Input in unserer Kette sein, der über alle Agenten hinweg verwendet wird. Es ist im Grunde der Name des Produkts, das wir einführen möchten. Für diesen Artikel habe ich mich für intelligente Laufschuhe entschieden… etwas, das in der realen Welt noch nicht existiert… NOCH NICHT.
Die nächsten 3 Agenten sind offensichtlich miteinander verbunden. Der Übersichtlichkeit halber habe ich im Prompt neue Zeilen verwendet:
product_usp = AgentChainElement(
output_identifier="out_1",
system_prompt="Sie sind ein Ersteller des einzigartigen Verkaufsarguments (USP)",
prompt="Erstellen Sie ein überzeugendes USP für {product_name} basierend auf
der folgenden Produktbeschreibung:\n--\n{out_0}"
)
target_audience = AgentChainElement(
output_identifier="out_2",
system_prompt="Sie sind ein Zielgruppenidentifizierer",
prompt="Identifizieren Sie die Zielgruppe für {product_name} basierend
auf der folgenden Produktbeschreibung und USP:\n--\n
Produktbeschreibung:\n{out_0}\nUSP:\n{out_1}"
)
marketing_channels = AgentChainElement(
output_identifier="out_3",
system_prompt="Sie sind ein Marketing-Kanal-Stratege",
prompt="Schlagen Sie die effektivsten Marketing-Kanäle zur Promotion von
{product_name} basierend auf der folgenden Zielgruppe vor:
\n--\n{out_2}"
)
Diese Art der Vorbereitung der Agentenkette ist wirklich interessant: Sie zwingt die Programmierer dazu, ein klares Bild davon zu haben, was sie wollen!
Es ist ein Arbeitsablauf mit allen Aktionen, die wir selbst in einer bestimmten Reihenfolge und Sequenz durchgeführt hätten, um das Ziel zu erreichen.
Dies ist ein Einzeldurchlauf mit einem 0,5-Milliarden-Modell – ERSTAUNLICH!!!
Die nächsten Schritte beziehen sich alle auf Social Media und Werbung: Nach dem Code werde ich die Art und Weise darlegen, wie ich es verwendet hätte… von Ideen zur Realität, richtig?
ad_copy = AgentChainElement(
output_identifier="out_4",
system_prompt="Sie sind ein Werbetexter",
prompt="Schreiben Sie ansprechende Werbetexte für {product_name} basierend auf der
folgenden Produktbeschreibung, USP und Zielgruppe:
\n--\nProduktbeschreibung:\n{out_0}\nUSP:\n{out_1}\n
Zielgruppe:\n{out_2}"
)
landing_page = AgentChainElement(
output_identifier="out_5",
system_prompt="Sie sind ein Landingpage-Designer",
prompt="Erstellen Sie eine hochkonvertierende Landingpage-Struktur für {product_name}
basierend auf der folgenden Produktbeschreibung, USP, Zielgruppe
und Werbetexten:\n--\nProduktbeschreibung:\n{out_0}\nUSP:\n{out_1}\n
Zielgruppe:\n{out_2}\nWerbetexte:\n{out_4}"
)
email_campaign = AgentChainElement(
output_identifier="out_6",
system_prompt="Sie sind ein E-Mail-Marketing-Spezialist",
prompt="Entwickeln Sie eine E-Mail-Kampagne für {product_name} basierend auf der
folgenden Produktbeschreibung, USP, Zielgruppe und
Landingpage-Struktur:\n--\nProduktbeschreibung:\n{out_0}\n
USP:\n{out_1}\nZielgruppe:\n{out_2}\n
Landingpage-Struktur:\n{out_5}"
)
social_media_posts = AgentChainElement(
output_identifier="out_7",
system_prompt="Sie sind ein Social-Media-Content-Ersteller",
prompt="Erstellen Sie eine Reihe von ansprechenden Social-Media-Beiträgen für {product_name}
basierend auf der folgenden Produktbeschreibung, USP, Zielgruppe
und Werbetexten:\n--\nProduktbeschreibung:\n{out_0}\nUSP:\n{out_1}
\nZielgruppe:\n{out_2}\nWerbetexte:\n{out_4}"
)
press_release = AgentChainElement(
output_identifier="out_8",
system_prompt="Sie sind ein Pressemitteilungsschreiber",
prompt="Schreiben Sie eine überzeugende Pressemitteilung zur Ankündigung
des Starts von {product_name} basierend auf der folgenden Produktbeschreibung,
USP und Zielgruppe:\n--\nProduktbeschreibung:\n{out_0}
\nUSP:\n{out_1}\nZielgruppe:\n{out_2}"
)
Es besteht eine sehr hohe Korrelation zwischen einem guten Manager und der Fähigkeit, großartige Multi-Agenten-Systeme zu erstellen, da Manager darauf konditioniert sind, über das Ziel und den Prozess nachzudenken.
Aufbau der Kette
Der letzte Schritt nach der Erstellung aller Agenten besteht darin, sie zu verketten und die Arbeit zu initiieren.
chain = [product_description, product_usp, target_audience,
marketing_channels, ad_copy, landing_page, email_campaign,
social_media_posts, press_release, performance_metrics]
agent_chain = AgentChain(agent, chain)
# Nach der Eingabe fragen
productname = console.input(f'[bold green1]Was möchten Sie einführen> ') # Beispiel "Intelligenter Fitness-Tracker"
start = datetime.datetime.now()
# Die Kette ausführen
with console.status("🌟 KI-Assistent arbeitet daran...", spinner='pong'):
res = agent_chain.run_chain(additional_fields={"product_name": productname})
delta = datetime.datetime.now() - start
Der Prozess ist unkompliziert. Wir erstellen eine Liste aller AgentChainElement
und instanziieren die AgentChain
.
Das Einzige, was noch zu tun bleibt, ist, den Start der Agentenkette mit der Benutzereingabe auszulösen – in unserem Beispiel der Name des Produkts intelligente Laufschuhe.
Besondere Überlegungen
Llama-cpp-agent ist eine erstaunliche Bibliothek, aber es gibt nicht viel Literatur oder Tutorials dazu!
Die Read-the-Docs enthält viele Beispiele, und die API-Referenz ist gut organisiert.
Es gibt jedoch ein Problem, eigentlich sogar zwei:
- Sie können nur am Ende der Kette überwachen, was passiert
- Kleine Modelle neigen dazu, sehr empfindlich auf das Prompt-Format zu reagieren
Mein Vorschlag ist daher, Ihre Kette Schritt für Schritt zu testen, damit Sie das Verhalten des KI-Modells überwachen und den Prompt anpassen können. Manchmal ist es sogar besser, einige Experimente mit dem Prompt außerhalb der Kette durchzuführen und die Argumente direkt zu übergeben 😅
Fazit
Jetzt, da wir den Kern der Sache verstanden haben, sind wir bereit, tiefer einzutauchen, oder?
Das Agentenframework ist auch ein guter intellektueller Motivator: Sie müssen genau wissen, was Sie wollen und welche Zwischenschritte nötig sind, um es richtig zu machen. Während llama-cpp-agent uns einen einfachen Weg in die futuristische Welt der KI-Agenten ermöglicht, ist der Mangel an umfangreicher Literatur ein Problem.
Aber nur in Bezug auf die Lernkurve für weitere Optimierungen und Anpassungen. Schnelles Prototyping und Testen sind super einfach!
Was werden Sie also damit machen?