Retrieval-Augmented Generation mit Quellenangaben
Wenn du Antworten von deinen Large-Language-Model-(LLM-)Apps erhältst, möchtest du dann wissen, woher diese Antwort stammt? Das ist die Stärke von Zitaten oder Quellenangaben. In diesem Tutorial sehen wir uns an, warum es wichtig ist, Zitate einzubeziehen, wie du auf hoher Ebene Zitate erhalten kannst, und tauchen dann in ein Codebeispiel ein!
Warum solltest du deine Retrieval-Augmented-Generation-(RAG-)Quellen zitieren?
Retrieval Augmented Generation ist eine Technik, die mit LLM-Apps verwendet wird, um deren Wissen zu ergänzen. Eine der Hauptschwächen von LLMs im Allgemeinen ist ihr Mangel an entweder aktuellem oder domänenspezifischem Wissen. Dafür gibt es zwei Hauptlösungen: Fine-Tuning und Retrieval Augmented Generation.
Hier bei Zilliz und bei anderen Unternehmen wie OpenAI schlagen wir RAG als die bessere Option gegenüber Fine-Tuning für faktenbasierte Abfragen vor. Fine-Tuning ist teurer und erfordert viel mehr Daten; es ist jedoch eine gute Option für Style-Transfer. RAG verwendet eine vector database wie Milvus, um dein Wissen in deine App einzuspeisen.
Anstatt das LLM zu deinem Produkt oder deinen Dokumentationen zu befragen, kannst du eine Vektordatenbank als deine Wahrheitsquelle verwenden. Dadurch wird sichergestellt, dass deine App das korrekte Wissen zurückgibt und nicht halluziniert, um den Datenmangel auszugleichen. Wenn du beginnst, mehr Dokumente und Anwendungsfälle hinzuzufügen, wird es immer wichtiger zu wissen, wo diese Informationen liegen.
Hier kommen Zitate und Quellenangaben ins Spiel. Wenn du eine Antwort von deiner LLM-App erhältst, möchtest du wissen, wie sie an diese Information gelangt ist. Antworten mit Zitaten oder Quellenangaben zeigen dir, aus welchem Textstück/wo im Text deine Antwort stammt. Da wir immer mehr Daten haben, wird dies entscheidend, um vertrauenswürdige Antworten zu bestimmen.
Wie kannst du deine RAG-Quellen zitieren?
LLMs haben die Popularität angrenzender Tools gesteigert, etwa von Vektordatenbanken wie Milvus. Sie haben auch Frameworks wie LangChain und LlamaIndex Auftrieb gegeben. Im Zuge dieses Popularitätsanstiegs ist Retrieval Augmented Generation zu einer wichtigen App geworden, insbesondere wenn es um Informationsabruf aus deinen internen Daten geht.
Zusätzlich zum Abrufen von Daten haben viele Menschen erkannt, dass das Hinzufügen von Zitaten zu deinen abgerufenen Daten deine App robuster und besser erklärbar macht und mehr Kontext bietet. Wie machst du das also? Es gibt viele Möglichkeiten, dies zu tun. Du kannst die Textabschnitte in deiner Vektordatenbank speichern, wenn sie Metadaten wie Milvus unterstützt, oder du kannst ein Framework wie LlamaIndex verwenden. Dieses Tutorial behandelt, wie man RAG mit Zitaten mithilfe von LlamaIndex und Milvus umsetzt.
Retrieval Augmented Generation mit Quellenbeispiel
Tauchen wir in den Code ein. Um dieses Tutorial durchzuführen, musst du pip install milvus llama-index python-dotenv ausführen. Die Bibliotheken milvus und llama-index sind für die Kernfunktionalität zuständig, während python-dotenv zum Laden deiner Umgebungsvariablen wie deines OpenAI-API-Schlüssels dient. In diesem Beispiel scrapen wir einige Daten über verschiedene Städte aus Wikipedia und führen darauf eine Abfrage mit Zitaten durch.
Wir importieren einige notwendige Bibliotheken und laden unseren OpenAI-API-Schlüssel. Wir benötigen sieben Submodule aus LlamaIndex. In keiner bestimmten Reihenfolge: OpenAI, um auf ein LLM zuzugreifen, CitationQueryEngine zum Erstellen der Citation Query Engine und MilvusVectorStore, um Milvus als Vektorspeicher zu verwenden. Darüber hinaus importieren wir auch VectorStoreIndex, um Milvus zu verwenden, SimpleDirectoryReader zum Einlesen lokaler Daten sowie StorageContext und ServiceContext, um dem Vektorindex Zugriff auf Milvus zu geben. Schließlich verwenden wir load_dotenv, um unseren OpenAI-API-Schlüssel zu laden.
from llama_index.llms import OpenAI
from llama_index.query_engine import CitationQueryEngine
from llama_index import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
ServiceContext,
)
from llama_index.vector_stores import MilvusVectorStore
from milvus import default_server
from dotenv import load_dotenv
import os
load_dotenv()
open_api_key = os.getenv("OPENAI_API_KEY")
Einige Testdaten scrapen
Beginnen wir unser Projekt damit, zunächst einige Daten zu haben, mit denen wir arbeiten können. Für dieses Beispiel scrapen wir einige Daten von Wikipedia. Tatsächlich scrapen wir dieselben Daten, wie wir es beim Erstellen einer Multi-Dokument-Query-Engine getan haben. Der folgende Code pingt die API von Wikipedia für die in der Liste wiki_titles genannten Seiten an. Er speichert das Ergebnis lokal in einer Textdatei.
wiki_titles = ["Toronto", "Seattle", "San Francisco", "Chicago", "Boston", "Washington, D.C.", "Cambridge, Massachusetts", "Houston"]
from pathlib import Path
import requests
for title in wiki_titles:
response = requests.get(
'https://en.wikipedia.org/w/api.php',
params={
'action': 'query',
'format': 'json',
'titles': title,
'prop': 'extracts',
'explaintext': True,
}
).json()
page = next(iter(response['query']['pages'].values()))
wiki_text = page['extract']
data_path = Path('data')
if not data_path.exists():
Path.mkdir(data_path)
with open(data_path / f"{title}.txt", 'w') as fp:
fp.write(wiki_text)
Einrichten Ihres Vector Stores in LlamaIndex
Da wir nun all unsere Daten haben, können wir die App-Logik für unsere RAG-mit-Zitaten-App einrichten. Zunächst müssen wir als Erstes eine Vektordatenbank starten. In diesem Beispiel verwenden wir Milvus Lite, um sie direkt in unserem Notebook auszuführen. Anschließend verwenden wir das Modul MilvusVectorStore von LlamaIndex, um Milvus als unseren Vector Store zu verbinden.
default_server.start()
vector_store = MilvusVectorStore(
collection_name="citations",
host="127.0.0.1",
port=default_server.listen_port
)
Als Nächstes erstellen wir die Kontexte für unseren Index. Der Service-Kontext teilt dem Index und Retriever mit, welche Dienste verwendet werden sollen. In diesem Fall wird GPT 3.5 Turbo als gewünschtes LLM übergeben. Außerdem erstellen wir einen Storage-Kontext, damit der Index weiß, wo Daten gespeichert und abgefragt werden sollen. In diesem Fall übergeben wir das oben erstellte Milvus-Vector-Store-Objekt.
service_context = ServiceContext.from_defaults(
llm=OpenAI(model="gpt-3.5-turbo", temperature=0)
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
Nachdem all dies eingerichtet ist, können wir die Daten laden, die wir zuvor gescrapt haben, und aus diesen Dokumenten einen Vector-Store-Index erstellen.
documents = SimpleDirectoryReader("./data/").load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context, storage_context=storage_context)
Abfragen mit Zitaten
Nun können wir eine Citation Query Engine erstellen. Wir übergeben ihr den zuvor erstellten Vektorindex sowie Parameter dazu, wie viele Ergebnisse zurückgegeben werden sollen, und zur Chunk-Größe des Zitats. Das ist alles, was zum Einrichten der Zitation erforderlich ist, und der nächste Schritt besteht darin, die Engine abzufragen.
query_engine = CitationQueryEngine.from_args(
index,
similarity_top_k=3,
# here we can control how granular citation sources are, the default is 512
citation_chunk_size=512,
)
response = query_engine.query("Does Seattle or Houston have a bigger airport?")
print(response)
for source in response.source_nodes:
print(source.node.get_text())
Wenn wir abfragen, sieht die Antwort ungefähr so aus.
Abfragen mit Zitaten
Zusammenfassung
In diesem Tutorial haben wir gelernt, wie man Retrieval Augmented Generation mit Zitaten (Attributionen) durchführt. Retrieval Augmented Generation ist eine Art von LLM-Anwendung, die viele Unternehmen entwickeln möchten. Zusätzlich dazu, Ihre Informationen in einem verständlichen Format abzurufen und zu formatieren, möchten wir auch wissen, woher die Informationen stammen.
Wir können diese Art von RAG-Anwendung mit LlamaIndex als unserem Datenrouter und Milvus als unserem Vektorspeicher erstellen. Wir haben damit begonnen, einige Daten von Wikipedia zu scrapen, um zu zeigen, wie dies funktioniert. Dann starten wir eine Instanz von Milvus und erstellen eine Vektorspeicher-Instanz in LlamaIndex. Von dort aus legen wir unsere Daten in Milvus ab und verwenden LlamaIndex, um die Attributionen und Zitate mithilfe einer Citation Query Engine nachzuverfolgen. Anschließend können wir diese Query Engine abfragen und Antworten erhalten, einschließlich der Stelle im Text und des Textes, aus dem wir unsere Antwort ableiten.
Weiterlesen

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.

OpenAI o1: What Developers Need to Know
In this article, we will talk about the o1 series from a developer's perspective, exploring how these models can be implemented for sophisticated use cases.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



