Retrieval-augmented Generation ist eine schnell wachsende Gruppe von Techniken, die ursprünglich als Erweiterung für Large Language Models (LLMs) konzipiert wurden, aber zunehmend als alternatives Paradigma gesehen werden, das die Rolle von KI-Modellen völlig neu denkt.
Wir zeigen Ihnen, wie Sie eine grundlegende RAG-Engine mit dem LlamaIndex Framework, einem Open-Source Mistral LLM, Jina Embeddings v2 und der KI-bereiten Vektordatenbank von Qdrant erstellen können.
tagRAG im Kontext
In einem RAG-System ist die Rolle des KI-Modells zwar weiterhin zentral, aber deutlich eingeschränkter. Anstatt Prompts aus seinem internen Wissen zu beantworten, das aus seinen Trainingsdaten stammt, werden ihm die relevanten Informationen in seinem Prompt präsentiert. Die Aufgabe des Modells besteht dann darin, Informationen zu verstehen und in eine Ausgabe zu synthetisieren.
Dies nutzt die Stärken von KI-Modellen und minimiert ihre Schwächen.
Zum Beispiel könnten wir dem Mistral-Instruct Model folgenden Prompt geben:
Answer the query. Please be brief, concise, and complete.
Query: Why is Taylor Swift planning to attend the Superbowl?
Answer:
Als ich das tat, antwortete das Modell:
I don't have real-time information. However, as of my last update,
Taylor Swift is not officially confirmed to attend or perform at
the Superbowl. If there are any updates, I recommend checking the
latest news sources.
Large Language Models sind teuer in der Aktualisierung und im Neutraining, sodass ihre internen Informationen nie vollständig aktuell sein können.
Darüber hinaus sind Large Language Models dafür bekannt zu "halluzinieren", d.h. plausible Antworten zu erfinden, die teilweise oder vollständig falsch sein können und überprüft werden müssen.
Answer the query. Please be brief, concise, and complete.
Query: What was Weird Al Yankovic's first Taylor Swift parody?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," a spoof
of Swift's song "Blank Space." The parody was released in 2014
as part of Yankovic's album "Mandatory Fun." The song humorously
addresses the obsession with celebrity gossip and scandals, as
reported by the tabloid news website TMZ.
Weird Al Yankovics TMZ wurde 2011 auf dem Album Alpocalypse veröffentlicht und ist eine Parodie von Swifts You Belong with Me.
Die Natur der neuronalen Netze macht Halluzinationen schwierig, wenn nicht unmöglich, vollständig zu verhindern und untergräbt stark jeden Plan, KI-Modelle als Informationsquellen zu nutzen.
In den Worten von Sam Altman, CEO von OpenAI:
"Ich denke, die Leute machen einen großen Fehler, wenn sie diese Modelle [LLMs] als Datenbank betrachten. [...] Es wird irgendwie funktionieren. Aber es ist die teuerste, langsamste und ungenaueste Datenbank der Welt."
RAG minimiert die Abhängigkeit vom internen Faktenwissen eines KI-Modells und nutzt seine größten Stärken: Verständnis natürlicher Sprache und flüssige Sprachgenerierung.
Nehmen wir ein weiteres Beispiel für eine Frage, die Mistral-Instruct nicht beantworten kann:
Answer the query. Please be brief, concise, and complete.
Query: What is the title of Taylor Swift's next album?
Answer:
As of the time I am providing this answer, Taylor Swift has
not yet announced the title of her next album. She has released
several re-recorded albums, but the title of her next original
album remains unknown. I recommend checking her official social
media channels or website for the latest updates.
Ein RAG-System könnte eine Datenbank mit aktuellen Nachrichten haben oder im Internet nach Texten zum Titel von Taylor Swifts nächstem Album suchen. Dann würde es die gefundenen Texte in den Prompt einfügen.
Nehmen wir an, es identifiziert diesen AP-Artikel als relevant für die Anfrage und erstellt den folgenden Prompt:
Context information is below.
---------------------
February 6, 2024
LOS ANGELES (AP) — Forget her "Reputation." Taylor Swift has a
whole new album coming out.
Accepting the Grammy for best pop vocal album on Sunday night,
Taylor said she'd been keeping a secret for two years.
"My brand-new album comes out April 19. It's called 'The Tortured
Poets Department.' I'm going to go and post the cover right now
backstage," she announced.
And so she did.
---------------------
Given the context information and not prior knowledge, answer the query.
Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What is the title of Taylor Swift's next album?
Answer:
Mistral-Instruct antwortete:
The title of Taylor Swift's next album is 'The Tortured Poets Department'.
Diese Art des Prompting reduziert auch die Wahrscheinlichkeit von Halluzinationen dramatisch. Zum Beispiel:
Context information is below.
---------------------
Alpocalypse is the thirteenth studio album by American parody
musician "Weird Al" Yankovic, released on June 21, 2011.
Track List
1. Perform This Way (Parody of "Born This Way" by Lady Gaga)
2. CNR
3. TMZ (Parody of "You Belong with Me" by Taylor Swift)
4. Skipper Dan
5. Polka Face (Polka medley including songs by artists such as
Lady Gaga, Justin Bieber, Britney Spears, Ke$ha, and others)
6. Craigslist
7. Party in the CIA (Parody of "Party in the U.S.A." by Miley
Cyrus)
8. Ringtone
9. Another Tattoo (Parody of "Nothin' on You" by B.o.B featuring
Bruno Mars)
10. If That Isn't Love
11. Whatever You Like (Parody of "Whatever You Like" by T.I.)
12. Stop Forwarding That Crap to Me
---------------------
Given the context information and not prior knowledge, answer the
query. Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What was Weird Al Yankovic's first Taylor Swift parody, what
year was it released, and what song was he parodying?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," and it was
released in 2011. He was parodying "You Belong with Me" by Taylor
Swift.
tagAnatomie eines RAG-Systems
Ein RAG-System hat mindestens zwei Komponenten:
- Ein generatives KI-Modell
- Ein Informationsabrufsystem
In diesem Artikel verwenden wir Mistral-Instruct als generatives KI-Modell und greifen darauf über die Hugging Face Inference API zu. Wir werden die Qdrant Vektordatenbank und Jina Embeddings gemeinsam für das Informationsabrufsystem verwenden.
Als Datenquelle verwenden wir den National Artificial Intelligence Research and Development Strategic Plan 2023 Update, der im Mai 2023 vom National Science and Technology Council veröffentlicht wurde, einem Gremium, das den US-Präsidenten in wissenschaftlichen und technischen Fragen berät. Dieses etwa 25.000 Wörter umfassende Dokument ist ein Politik- und Strategieplanungsdokument für die amerikanische KI-Politik und -Entwicklung.
Es ist auch ein klassisches "tl;dr" Regierungsdokument. Der Großteil ist sehr langweilig, und wenn Sie nicht direkt betroffen sind oder ein enges Interesse an diesem Bereich haben, werden Sie es wahrscheinlich nicht lesen. Aber Sie möchten vielleicht trotzdem wissen, was darin steht.
Dieser Artikel führt Sie durch die Schritte zur Erstellung eines RAG-Systems, das Fragen zum Text und seinen Inhalten beantworten kann.
tagInstallation der Voraussetzungen
Stellen Sie zunächst sicher, dass Sie alle relevanten Python-Bibliotheken installiert haben. Führen Sie in Ihrer Python-Umgebung Folgendes aus:
pip install llama-index qdrant-client
pip install pdfminer.six llama-index-vector-stores-qdrant
pip install llama-index-llms-openai llama-index-embeddings-jinaai
pip install llama-index-llms-huggingface "huggingface_hub[inference]"
Wir verwenden LlamaIndex, um ein RAG-System um das Mistral-Instruct Large Language Model herum aufzubauen und pdfminer.six zur Verarbeitung der PDF-Datei in einen Qdrant Vector Store.
tagVerbindung zu Mistral-Instruct über die Hugging Face Inference API
Zuerst richten wir das LLM ein. Sie benötigen Zugang zur Hugging Face Inference API, einschließlich eines Zugriffstokens. Wenn Sie ein Hugging Face-Konto haben, können Sie einen Token von Ihrer Kontoeinstellungsseite erhalten.
Wenn Sie kein Konto haben, erstellen Sie zunächst eines und dann einen Zugriffstoken.
Speichern Sie Ihren Token in einer Variable zur späteren Verwendung:
hf_inference_api_key = '<your HuggingFace Inference API token>'
Als Nächstes erstellen wir eine Prompt-Vorlage:
from llama_index.core import PromptTemplate
qa_prompt_tmpl = (
"Context information is below.\n"
"---------------------\n"
"{context_str}\\n"
"---------------------\n"
"Given the context information and not prior knowledge, "
"answer the query. Please be brief, concise, and complete.\n"
"If the context information does not contain an answer to the query, "
"respond with \"No information\".\n"
"Query: {query_str}\n"
"Answer: "
)
qa_prompt = PromptTemplate(qa_prompt_tmpl)
Diese Vorlage weist das LLM an, nur die im Prompt bereitgestellten Kontextinformationen zu verwenden, um Fragen zu beantworten. Dieser Prompt hat sich bei der Arbeit mit Mistral-Instruct für uns bewährt, aber Sie können mit anderen Formulierungen experimentieren, um zu sehen, was für Ihren Anwendungsfall funktioniert.
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
mixtral_llm = HuggingFaceInferenceAPI(
model_name="mistralai/Mixtral-8x7B-Instruct-v0.1",
token=hf_inference_api_key
)
Zum Schluss erstellen und initialisieren wir ein Objekt für das LlamaIndex-Framework, das die Verbindung zu Mistral-Instruct enthält. Der folgende Code stammt aus dem vorherigen Beitrag über die Erstellung von RAG-Systemen mit LlamaIndex.
Dies speichert die Verbindung zum Mistral LLM in der Variable mistral_llm
.
tagInformationsabruf mit Qdrant und Jina Embeddings
Um das Abrufsystem einzurichten, benötigen Sie einen Jina Embeddings API-Schlüssel. Sie können einen kostenlosen Schlüssel mit einem vorausbezahlten Budget von 1 Million Tokens auf der Jina Embeddings Website erhalten.

Speichern Sie Ihren Jina Embeddings-Schlüssel in einer Variable zur späteren Verwendung:
jina_emb_api_key = "<your Jina Embeddings API key>"
Erstellen Sie dann ein Connector-Objekt mit LlamaIndex für den Jina Embeddings-Server und wählen Sie speziell das englische monolinguale Modell:
from llama_index.embeddings.jinaai import JinaEmbedding
jina_embedding_model = JinaEmbedding(
api_key=jina_emb_api_key,
model="jina-embeddings-v2-base-en",
)
tagTextdaten laden
Als Nächstes laden wir das Dokument und teilen es in Absätze auf. Zuerst laden wir die PDF von der White House Website in die Variable pdf_data
:
import urllib.request
uri = "https://www.whitehouse.gov/wp-content/uploads/2023/05/National-Artificial-Intelligence-Research-and-Development-Strategic-Plan-2023-Update.pdf"
pdf_data = urllib.request.urlopen(uri).read()
Als Nächstes verarbeiten wir die PDF Seite für Seite, extrahieren den Text und teilen ihn dann in Absätze auf, indem wir an doppelten Zeilenumbrüchen trennen. Diese werden in der Liste text_paras
gespeichert:
import regex as re
from io import BytesIO, StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
text_paras = []
parser = PDFParser(BytesIO(pdf_data))
doc = PDFDocument(parser)
rsrcmgr = PDFResourceManager()
for page in PDFPage.create_pages(doc):
output_string = StringIO()
device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
interpreter = PDFPageInterpreter(rsrcmgr, device)
interpreter.process_page(page)
page_text = output_string.getvalue()
text_paras.extend(re.split(r'\n\s*\n', page_text))
Überprüfen Sie, ob alles geladen wurde:
assert len(text_paras) == 615
Als Nächstes wandeln wir diese Liste von kurzen Texten in LlamaIndex Document-Objekte um:
from llama_index.core.readers import StringIterableReader
rag_docs = StringIterableReader().load_data(text_paras)
Und Sie können den Text inspizieren:
print(rag_docs[0].text)
Ergebnis:
NATIONAL ARTIFICIAL INTELLIGENCE
RESEARCH AND DEVELOPMENT
STRATEGIC PLAN
2023 UPDATE
tagEinrichten einer Qdrant Vector-Datenbank
In diesem Artikel verwenden wir die Qdrant Vector Search Cloud zur Implementierung der RAG-System-Datenbank. Die kostenlose Stufe von Qdrant enthält 1 GB Speicherplatz, was für dieses Tutorial mehr als ausreichend ist.
Sie müssen zunächst ein Konto auf der Qdrant Cloud-Website erstellen, bevor Sie fortfahren.

Sobald Sie ein Konto haben und eingeloggt sind, müssen Sie einen Cluster erstellen. Folgen Sie den "Quick Start"-Anweisungen auf der Qdrant Website, um einen kostenlosen Cluster einzurichten und eine API sowie den Namen des Qdrant-Hostservers zu erhalten.

Speichern Sie den Schlüssel und Hostnamen in Variablen:
qdrant_api_key = "<your API key>"
qdrant_server = "https://<your server>"
Als Nächstes müssen wir die relevanten Komponenten aus den Paketen qdrant_client
und llama_index
importieren:
import qdrant_client
from llama_index.vector_stores.qdrant import QdrantVectorStore
client = qdrant_client.QdrantClient(qdrant_server, api_key=qdrant_api_key)
vector_store = QdrantVectorStore(client=client, collection_name="NTSC")
Dies erstellt eine Sammlung namens NTSC
in Ihrem kostenlosen Cluster.
In der Qdrant-Dokumentation finden Sie Informationen zum Aufbau eines lokalen Datenspeichers im Speicher oder auf der Festplatte sowie zum Hosten Ihrer eigenen Qdrant-Server-Instanz in einem Docker-Container über eine Web-API.
tagDas RAG-System vervollständigen
Nun werden wir diese Komponenten mit Boilerplate-Code für LlamaIndex zu einem vollständigen RAG-System zusammenfügen:
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.storage.storage_context import StorageContext
from llama_index.core import (
VectorStoreIndex,
ServiceContext,
get_response_synthesizer,
)
# set up the service and storage contexts
service_context = ServiceContext.from_defaults(
llm=mixtral_llm, embed_model=jina_embedding_model
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# create an index
index = VectorStoreIndex.from_documents(
rag_docs, storage_context=storage_context, service_context=service_context
)
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=2,
)
# configure response synthesizer
response_synthesizer = get_response_synthesizer(
service_context=service_context,
text_qa_template=qa_prompt,
response_mode="compact",
)
# assemble query engine
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
)
Dieses System verwendet Jina Embeddings, um die Absätze aus unserer Textquelle zu indexieren und wird die zwei besten Übereinstimmungen in den Kontext jedes Prompts einfügen. Um beispielsweise auf die drei besten zu ändern, modifizieren Sie einfach die VectorIndexRetriever
-Initialisierung oben mit einem anderen similarity_top_k
-Parameter:
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=3,
)
Jetzt ist das System einsatzbereit.
tagEin Dokument abfragen
Versuchen wir eine einfache Abfrage:
response = query_engine.query("""
What is the Biden Administration's policy with regard to AI?
""")
print(response.response)
Das Ergebnis (Ihres könnte anders aussehen):
The Biden Administration prioritizes responsible AI systems that
are ethical, trustworthy, and safe, and serve the public good.
The Administration has committed to substantial funding for AI
R&D, and has established the National AI Initiative Office to
coordinate AI activities across the federal government.
The Administration's AI policy focuses on developing evaluative
techniques for AI, workforce development, public-private
partnerships, and international collaboration in AI research.
Oder etwas Spezifischeres:
response = query_engine.query("""
What protections does the AI Bill of Rights propose to offer?
""")
print(response.response)
The AI Bill of Rights proposes five core protections: Safe and
Effective Systems; Algorithmic Discrimination Protections; Data
Privacy; Notice and Explanation; and Human Alternatives,
Consideration, and Fallback.
Oder sogar sehr spezifisch:
response = query_engine.query("Who is Kei Koizumi?")
print(response.response)
Kei Koizumi is the Principal Deputy Director for Policy at the Office
of Science and Technology Policy (OSTP).
Sie können auch fantasievollere Fragen stellen:
response = query_engine.query("""
What rights will AI's receive under President Biden's proposed
AI Bill of Rights?
""")
print(response.response)
The proposed AI Bill of Rights does not grant rights to AI systems, but
rather outlines principles to ensure that AI technologies are
developed and used in a manner that respects human rights and values.
The principles include safety, transparency, fairness, disclosure,
data privacy, non-discrimination, and the ability for individuals to
opt out of certain AI systems.
response = query_engine.query("""
Why is President Biden's proposing an AI Bill of Rights?
Does AI really need rights?
""")
print(response.response)
President Biden's proposed AI Bill of Rights aims to ensure that AI
technologies are developed and used ethically, legally, and with
societal considerations in mind. The Bill of Rights is not granting
"rights" to AI, but rather setting guidelines for the responsible
development and deployment of AI systems to protect individuals and
communities from potential negative impacts.
response = query_engine.query("""
Has Donald Trump weighed in on AI?
Will he Make Humans Great Again?
""")
print(response.response)
No information. The context information does not mention Donald
Trump's views on AI.
tagJina AI und Qdrant
Das 8k-Token-Kontextfenster von Jina Embeddings macht es besonders gut geeignet für Retrieval-Augmented Generation, da es mit viel größeren Textblöcken arbeiten kann. Während andere RAG-Anwendungen oft einzelne Sätze oder Satzpaare speichern müssen, konnten wir in diesem Tutorial ganze Absätze verwenden, ohne uns um deren Größe sorgen zu müssen.
Dies reduziert die Anzahl der Textelemente, die gespeichert werden müssen, um die gleiche Information zu übermitteln, senkt die Rechenkosten, spart Speicher und macht das Abrufen schneller.
Qdrants Vektordatenbank ist einfach zu konfigurieren, schnell und kosteneffektiv, und wie Sie gesehen haben, benötigt man nur wenige Zeilen Python-Code, um sie in ein RAG-System zu integrieren.
Mehr über Qdrants KI-bereite Datenbank und Cloud-Angebote erfahren Sie auf der Website.

tagKontaktieren Sie uns
Jina AI ist bestrebt, zuverlässige, erschwingliche KI-Technologien für Unternehmen jeder Größe und Art bereitzustellen. Wir würden gerne von Ihren Anwendungsfällen hören und Ihnen helfen, KI in Ihre Geschäftsprozesse zu integrieren. Weitere Informationen über die Angebote von Jina AI und Kontaktmöglichkeiten finden Sie auf der Jina AI Website oder treten Sie unserer Community auf Discord bei.

