Im Zeitalter der künstlichen Intelligenz (KI) ist das Extrahieren von aussagekräftigem Material aus riesigen Datensätzen sowohl für Unternehmen als auch für Privatpersonen von entscheidender Bedeutung geworden. Hier kommt Retrieval-Augmented Generation (RAG) ins Spiel, eine bahnbrechende Entwicklung, welche die Fähigkeiten der KI enorm verbessert hat und es Systemen ermöglicht, nicht nur menschenähnlichen Text zu erzeugen, sondern auch relevante Informationen in Echtzeit abzurufen. Durch diese Kombination werden Antworten erzeugt, die sowohl kontextorientiert als auch detailreich sind.
Bevor wir in See stechen und die aufregende Reise über den weiten Ozean der künstlichen Intelligenz (KI) antreten, müssen wir unbedingt die drei Säulen verstehen, die als unsere Leitsterne fungieren werden: generative KI, große Sprachmodelle (engl. Large Language Models; LLMs), LangChain, Hugging Face und die nützliche Anwendung dieser RAG (Retrieval-Augmented Generation).
Im Mittelpunkt unserer Reise stehen große Sprachmodelle (LLMs) und generative KI – zwei starke Motoren, die das Innovationsschiff vorantreiben.
LLMs wie u. a. Qwen und GPT sind die Text-Titanen, die in der Lage sind, menschenähnliche Sprache in riesengroßem Umfang zu verstehen und zu generieren. Diese Modelle wurden anhand von umfangreichen Textdatenkorpora trainiert, sodass sie kohärente und kontextuell relevante Textzeichenfolgen vorhersagen und erzeugen können. Sie sind das Rückgrat vieler Aufgaben, welche die Verarbeitung natürlicher Sprache umfassen, von der Übersetzung bis zur Erstellung von Inhalten.
Generative KI ist der kunstvolle Zauberer der Schöpfung im Reich der KI. Sie umfasst Technologien, die neue Dateninstanzen generieren, die den Trainingsdaten ähneln, wie Bilder, Musik und – für unsere Reise besonders wichtig – Text. In unserem Kontext bezieht sich generative KI auf die Fähigkeit der KI, neuartige und informative Antworten, Geschichten oder Ideen zu erzeugen, die es in dieser Form noch nie gegeben hat. Sie ermöglicht der KI, nicht nur die Vergangenheit nachzuahmen, sondern auch zu erfinden, zu innovieren und zu inspirieren.
LangChain fungiert als Architekt unseres KI-Workflows und entwirft sorgfältig die Struktur, die eine nahtlose Integration und Interaktion zwischen verschiedenen KI-Komponenten ermöglicht. Dieses Framework vereinfacht den komplexen Prozess der Verkettung des Datenflusses aus intelligenten Subsystemen, einschließlich LLMs und Retrieval-Systemen, und macht Aufgaben wie Informationsextraktion und Verständnis natürlicher Sprache zugänglicher als je zuvor.
Hugging Face ist eine geschäftige Metropole, in der KI-Modelle florieren. Dieser zentrale Hub bietet eine Vielzahl von vortrainierten Modellen, die als fruchtbarer Boden für die Erforschung und Anwendung maschinellen Lernens dienen. Um Zugang zu diesem Hub und seinen Ressourcen zu erhalten, müssen Sie ein Hugging Face-Konto erstellen. Sobald Sie diesen Schritt gemacht haben, öffnen sich für Sie die Tore zu einer weitläufigen Welt der KI – besuchen Sie einfach Hugging Face und melden Sie sich an, um das Abenteuer zu beginnen.
Retrieval-Augmented Generation (RAG) ist ein ausgefeiltes KI-Verfahren, das die Erfindungskraft der generativen KI mit der Präzision des Informationsabrufs verbindet und so ein System schafft, das nicht nur sprachgewandt, sondern auch bestens informiert ist. Um das Potenzial und die Effizienz von RAG voll auszuschöpfen, werden Vektordatenbanken integriert – ein leistungsstarkes Tool zum schnellen Durchsuchen großer Informationsbestände. Hier finden Sie eine ausführlichere Beschreibung, wie RAG mit Vektordatenbanken arbeitet:
Die Integration von Vektordatenbanken ist der Schlüssel zur Effizienz der RAG. Herkömmliche Metadaten-Suchmethoden sind meist langsamer und ungenauer, Vektordatenbanken hingegen ermöglichen das nahezu sofortige Abrufen kontextrelevanter Informationen, selbst aus extrem großen Datenbeständen. Dieser Ansatz spart nicht nur wertvolle Zeit, sondern stellt auch sicher, dass die Antworten der KI auf den relevantesten und aktuellsten verfügbaren Informationen beruhen.
Die Fähigkeiten von RAG sind besonders bei Anwendungen wie Chatbots, digitalen Assistenten und anspruchsvollen Recherchetools von Vorteil – überall, wo die Bereitstellung präziser, zuverlässiger und kontextbezogener Informationen von entscheidender Bedeutung ist. Es geht nicht nur darum, Antworten zu erzeugen, die überzeugend klingen. Es geht darum, Inhalte zu generieren, die auf überprüfbaren Daten und realem Wissen basieren.
Nun da wir ein besseres Verständnis von LangChain, Hugging Face, LLMs, GenAI und der durch Vektordatenbanken optimierten RAG haben, stehen wir am Beginn eines Programmierabenteuers, das diese Technologien zum Leben erwecken wird. Das Python-Skript, mit dem wir uns befassen werden, stellt die Synergie dieser Elemente dar. Es liefert ein KI-System, das nicht nur mit Kreativität und Kontext reagieren kann, sondern auch mit einem tiefen Verständnis, das einst als reine Science-Fiction galt. Machen Sie sich bereit, zu programmieren und die transformierende Kraft von RAG mit Vektordatenbanken zu erleben.
Bevor wir uns auf diese technische Odyssee begeben, sollten wir sicherstellen, dass Sie alles Nötige bereit haben:
Haben Sie das alles? Fabelhaft! Dann machen wir uns nun die Hände schmutzig (im übertragenen Sinne natürlich).
Durch die sorgfältige Verwaltung Ihrer Python-Abhängigkeiten stellen Sie sicher, dass Ihr KI-Projekt auf einer stabilen und zuverlässigen Grundlage aufbaut. Wenn die Abhängigkeiten in Ordnung sind und die Umgebung korrekt eingerichtet ist, können Sie das Skript ausführen und die Leistungsfähigkeit von RAG und LangChain in Aktion erleben.
Jetzt können Sie das Python-Skript ausführen, um RAG in Aktion zu sehen.
Bevor wir uns der Erforschung der KI mit dem LangChain-Framework und der Transformers-Bibliothek von Hugging Face widmen können, müssen wir unbedingt eine sichere und gut konfigurierte Umgebung einrichten. Bei dieser Vorbereitung werden die erforderlichen Bibliotheken importiert und vertrauliche Informationen wie API-Schlüssel über Umgebungsvariablen verwaltet.
from torch import cuda
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from transformers import AutoModelForCausalLM, AutoTokenizer
from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline
from transformers import pipeline
from dotenv import load_dotenv
load_dotenv()
Wenn Sie mit KI-Modellen von Hugging Face arbeiten, benötigen Sie häufig Zugriff auf die Hugging Face-API, für die ein API-Schlüssel erforderlich ist. Dieser Schlüssel ist Ihre eindeutige Kennung, wenn Sie Anfragen an Hugging Face-Dienste stellen, sodass Sie Modelle laden und in Ihren Anwendungen verwenden können.
Folgendes müssen Sie tun, um Ihre Umgebung sicher einzurichten:
HUGGINGFACE_API_KEY=your_api_key_here
Ersetzen Sie „your_api_key_here“ durch den tatsächlichen API-Schlüssel, den Sie von Hugging Face erhalten haben.
modelPath = "sentence-transformers/all-mpnet-base-v2"
device = 'cuda' if cuda.is_available() else 'cpu'
model_kwargs = {'device': device}
Hier legen wir den Pfad zum vortrainierten Modell fest, das für Einbettungen verwendet wird. Wir konfigurieren auch die Geräteeinstellung und verwenden eine GPU für eine schnellere Rechenleistung, wenn diese zur Verfügung steht, ansonsten greifen wir auf die CPU zurück.
embeddings = HuggingFaceEmbeddings(
model_name=modelPath,
model_kwargs=model_kwargs,
)
# Made up data, just for fun, but who knows in a future
vectorstore = FAISS.from_texts(
["Harrison worked at Alibaba Cloud"], embedding=embeddings
)
retriever = vectorstore.as_retriever()
Wir initialisieren eine Instanz von HuggingFaceEmbeddings mit unserem gewählten Modell und unserer gewählten Konfiguration. Anschließend erstellen wir mithilfe von FAISS einen Vektorspeicher, mit dem wir effiziente Ähnlichkeitssuchen in hochdimensionalen Räumen durchführen können. Wir instanziieren auch einen Retriever, der Informationen basierend auf den Einbettungen abruft.
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
Hier definieren wir eine Chat-Prompt-Vorlage, die zur Strukturierung der Interaktion mit der KI verwendet wird. Sie enthält Platzhalter für den Kontext und eine Frage, die während der Ausführung der Kette dynamisch gefüllt werden.
In der Welt der KI und der Verarbeitung natürlicher Sprache sind der Tokenizer und das Sprachmodell das dynamische Duo, das Text in sinnvolles Handeln verwandelt. Der Tokenizer zerlegt die Sprache in Teile, die das Modell verstehen kann, während das Sprachmodell basierend auf diesen Eingaben die Sprache vorhersagt und generiert. Auf unserer Reise verwenden wir die AutoTokenizer- und AutoModelForCausalLM-Klassen von Hugging Face, um diese Funktionen zu nutzen. Man darf jedoch nicht vergessen, dass es bei der Auswahl eines Sprachmodells keine Universallösung gibt.
Die Größe des Modells ist ein wichtiger, zu berücksichtigender Faktor. Größere Modelle wie Qwen-72B haben mehr Parameter, was im Allgemeinen bedeutet, dass sie komplexeren Text verstehen und erzeugen können. Sie erfordern jedoch auch mehr Rechenleistung. Wenn Sie mit High-End-GPUs und ausreichend Speicher ausgestattet sind, können Sie sich für diese größeren Modelle entscheiden, um ihre Fähigkeiten optimal zu nutzen.
Auf der anderen Seite sind kleinere Modelle wie Qwen-1.8B für Standard-Computerumgebungen viel handlicher. Selbst dieses winzige Modell sollte auf IoT und mobilen Geräten laufen können. Auch wenn sie möglicherweise die Feinheiten der Sprache nicht so gut erfassen wie ihre größeren Gegenstücke, bieten sie dennoch eine hervorragende Leistung und sind für diejenigen, die keine spezielle Hardware haben, leichter zugänglich.
Ein weiterer zu berücksichtigender Punkt ist die Art Ihrer Aufgabe. Wenn Sie eine Konversations-KI entwickeln, kann die Verwendung eines Chat-spezifischen Modells wie Qwen-7B-Chat zu besseren Ergebnissen führen, da diese Modelle für Dialoge optimiert sind und die Nuancen von Gesprächen besser verarbeiten können als die Basismodelle.
Größere Modelle stellen nicht nur höhere Anforderungen an Ihre Hardware, sondern können auch höhere Kosten verursachen, wenn Sie Cloud-basierte Dienste für die Ausführung Ihrer Modelle verwenden. Jede Inferenz beansprucht Verarbeitungszeit und Ressourcen, die sich summieren können, wenn Sie mit einem umfangreichen Modell arbeiten.
Wenn Sie entscheiden, welches Modell Sie verwenden möchten, sollten Sie die Vorteile eines größeren Modells gegen die verfügbaren Ressourcen und die spezifischen Anforderungen Ihres Projekts abwägen. Wenn Sie gerade erst anfangen oder ein Projekt mit kleinerem Maßstab entwickeln, ist möglicherweise ein kleineres Modell die beste Wahl. Wenn Ihre Anforderungen wachsen oder wenn Sie erweiterte Funktionen benötigen, sollten Sie auf ein größeres Modell zurückgreifen.
Denken Sie daran, dass die Qwen-Serie Open Source ist. Sie können also mit verschiedenen Modellen experimentieren, um zu sehen, welches am besten zu Ihrem Projekt passt. So könnte der Teil des Skripts für die Modellauswahl aussehen, wenn Sie sich für ein anderes Modell entscheiden:
# This can be changed to any of the Qwen models based on your needs and resources
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-7B", trust_remote_code=True)
model_name_or_path = "Qwen/Qwen-7B"
model = AutoModelForCausalLM.from_pretrained(model_name_or_path,
device_map="auto",
trust_remote_code=True)
Wir laden einen Tokenizer und ein kausales Sprachmodell von Hugging Face mit den AutoTokenizer- und AutoModelForCausalLM-Klassen. Diese Komponenten sind entscheidend für die Verarbeitung von Input in natürlicher Sprache und die Erzeugung von Output.
Diese Pipeline ist so konzipiert, dass sie mithilfe eines Sprachmodells und eines Tokenizers, die zuvor geladen wurden, Text generiert. Lassen Sie uns die Parameter aufschlüsseln, um ihre Rollen bei der Steuerung des Verhaltens der Textgenerierung zu verstehen:
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=8192,
do_sample=True,
temperature=0.7,
top_p=0.95,
top_k=40,
repetition_penalty=1.1
)
hf = HuggingFacePipeline(pipeline=pipe)
Nach dem Einrichten der Pipeline mit den gewünschten Parametern folgt die Codezeile:
hf = HuggingFacePipeline(pipeline=pipe)
Dadurch wird die Pipeline in eine HuggingFacePipeline verpackt. Diese Klasse ist Teil des LangChain-Frameworks und ermöglicht die nahtlose Integration der Pipeline in den Workflow von LangChain zum Entwickeln von KI-Anwendungen. Durch Verpacken der Pipeline können wir sie nun in Verbindung mit anderen Komponenten der LangChain, wie z. B. Retrievern und Parsern, verwenden, um komplexere KI-Systeme zu erstellen.
Die sorgfältige Auswahl dieser Parameter ermöglicht es Ihnen, das Verhalten der Textgenerierung an die spezifischen Bedürfnisse Ihrer Anwendung anzupassen – je nachdem, ob Sie kreativere und abwechslungsreichere Ergebnisse wollen oder einen konsequent kohärenten und zielgerichteten Text anstreben.
Der folgende Code-Abschnitt stellt ein vollständiges End-to-End-RAG-System dar, bei dem die anfängliche Frage eine Suche nach relevanten Informationen einleitet, die anschließend zur Ergänzung des generativen Prozesses verwendet werden. Dies führt zu einer fundierten und kontextbezogenen Antwort auf die eingegebene Frage.
1. Kettenaufbau:
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| hf
| StrOutputParser()
)
Folgendes läuft in diesem Teil des Codes ab:
Die Verwendung des | (pipe) Operators legt nahe, dass dieser Code einen funktionalen Programmierstil verwendet, insbesondere das Konzept der Funktionskomposition oder ein Pipeline-Muster, bei dem der Output einer Funktion zum Input der nächsten wird.
2. Kettenaufruf:
results = chain.invoke("Where did Harrison work?")
In dieser Zeile wird die Kette mit einer bestimmten Frage aufgerufen: „Where did Harrison work?“ Dieser Aufruf löst die gesamte Abfolge von Vorgängen aus, die in der Kette definiert sind. Der Retriever sucht nach relevanten Informationen, die dann zusammen mit der Frage über den Prompt an das Hugging Face-Modell weitergegeben werden. Das Modell generiert eine Antwort basierend auf den Eingaben, die es erhält.
3. Ergebnisse ausgeben:
print(results)
Die generierte Antwort wird dann vom StrOutputParser() geparst und als Endergebnis zurückgegeben, das dann auf der Konsole oder einer anderen Schnittstelle ausgegeben wird.
Schließlich erstellen wir die RAG-Kette, indem wir den Retriever, die Prompt-Vorlage, die Hugging Face-Pipeline und den Output-Parser verknüpfen. Wir rufen die Kette mit unserer Frage auf, und die Ergebnisse werden ausgegeben.
Sie haben mit RAG und LangChain soeben einen riesigen Sprung in die Welt der KI gemacht. Durch Verstehen und Ausführen dieses Codes erschließen Sie das Potenzial, intelligente Systeme zu entwickeln, die auf noch nie dagewesene Weise mit Informationen argumentieren und interagieren können.
Dieser Artikel wurde ursprünglich in englischer Sprache verfasst. Den Originalartikel finden Sie hier.
Руководство по развертыванию модели чата Qwen с помощью HuggingFace
82 posts | 3 followers
FollowRegional Content Hub - March 25, 2024
Regional Content Hub - April 28, 2024
Regional Content Hub - May 6, 2024
Farruh - February 26, 2024
Regional Content Hub - April 15, 2024
Regional Content Hub - February 26, 2024
82 posts | 3 followers
FollowA one-stop, multi-channel verification solution
Learn MoreTop-performance foundation models from Alibaba Cloud
Learn MoreMore Posts by Regional Content Hub