Können wir diesen KI Use Case zunächst validieren, ohne ein eigenes Modell aufwändig trainieren zu müssen? Eine Frage, die bei der Diskussion über die Umsetzung von Anwendungsfällen im Bereich der Künstlichen Intelligenz immer wieder aufkommt.
Um Ideen und deren Potentiale zu evaluieren, bietet es sich an, mit einem Proof-of-Concept (PoC) zu starten. In diesem Blog-Artikel geben wir eine kurze theoretische Einführung in das Thema Generative AI (GenAI). Zudem gehen wir auf Retrieval Augmented Generation (RAG) Modelle ein, welche es erlauben, externe Wissensquellen einzubinden, ohne dass das Modell weiter trainiert werden muss. Anschließend zeigen wir, wie man mit nur ein paar Stunden Aufwand einen PoC für einen GenAI Use Case mit wenigen Zeilen Code erstellen kann.
Bei Cologne Intelligence beschäftigen wir uns viel mit dem Thema KI und haben mit diesem Ansatz bereits unterschiedliche Anwendungsfälle getestet:
Generative Artificial Intelligence ist eine Form der künstlichen Intelligenz (KI), welche Inhalte wie Text, Bilder, Videos, Audio oder Software-Code generieren kann. GenAI basiert auf komplexen neuronalen Netzen, die als Deep Learning-Modelle bezeichnet werden und die Lern- und Entscheidungsprozesse des menschlichen Gehirns simulieren. Die Modelle sind durch Training an großen Datenmengen in der Lage, Muster und Beziehungen von komplexen Daten zu erkennen. Im Falle der Textverarbeitung können sie Text voraussagen und passend zu einer Nutzereingabe eine Antwort generieren (vgl. Stryker/Scapicchio 2024).
GenAI kann die Produktivität von Einzelpersonen und Organisationen erheblich steigern. Viele Unternehmen sind daran interessiert, die Technologie einzusetzen, um interne Abläufe zu verbessern und ihre Produkte und Dienstleistungen zu bereichern (vgl. Stryker/Scapicchio 2024).
Große Sprachmodelle (Large Language Models, LLMs) sind ein Teilbereich von GenAI. LLMs sind in der Lage natürliche Sprache in Form von Text zu verarbeiten (Natural Language Processing, NLP). Durch Training an umfangreichen Textdaten können die Modelle Texte generieren und kohärente Antworten auf Nutzereingaben liefern. Dies bietet sowohl für Privatpersonen als auch für Unternehmen erhebliche Vorteile: Durch die Nutzung der Chat-Schnittstelle von OpenAI oder durch die Anwendung von LLMs zur automatisierten Analyse von Kundenfeedback beispielsweise können Informationen leicht gewonnen und die Effizienz gesteigert werden. (vgl. Kelbert et al. 2024) Aufgrund der besonderen Transformer-Architektur der neuronalen Netze, welche erstmals in dem Paper „Attention Is All You Need“ (vgl. Vaswani et al. 2017) vorgestellt wurde, ist es möglich, Prozesse innerhalb des Trainings der Modelle zu parallelisieren. Damit lässt sich die Länge des Modelltrainings deutlich verkürzen und die Modelle können an größeren Massen von Daten trainiert werden. Die Transformer-Architektur sorgt dafür, dass vorher gängige Modellarchitekturen im NLP-Bereich, wie Recurrent bzw. Convolutional Neural Networks (RNNs bzw. CNNs), an Relevanz verlieren.
Ein entscheidender Pluspunkt von LLMs ist, dass sie durch ihr umfangreiches Training in vielen Fällen keine individuelle Anpassung (Finetuning) benötigen. Das heißt, kein spezifisches Training an einem bestimmten Datensatz ist nötig, um Aufgaben zu bewältigen.
Typische Anwendungsgebiete von LLMs umfassen:
LLMs haben allerdings auch ihre Grenzen:
Um die Schwächen von LLMs zu adressieren, kamen Forscher auf die Idee, die in den Parametern der trainierten Modelle abgespeicherten Informationen durch Informationen innerhalb der Nutzereingabe (Prompt) zu erweitern. Bei der sogenannten Retrieval Augmented Generation (RAG), kann somit Wissen ohne erneutes Training oder Finetuning herangezogen werden, da es dem Modell als Information mitgegeben wird (vgl. Lewis 2020). Der Einsatz von extern trainierten Modellen, wie GPT-4 oder Lama 2, ist somit für unternehmensspezifische Anwendung möglich.
RAG kombiniert Informationsabruf und sequenzielles Generieren in einem Modell. Geben die Nutzer*innen eine Eingabe, z.B. eine Frage, ein, werden relevante Dokumente und Textausschnitte, die zur Beantwortung der Nutzereingabe verwendet werden können, gesammelt. Anstatt die Eingabe also direkt an das LLM weiterzuleiten, werden zuerst Informationen mit ähnlichem Inhalt über semantische Suche aus einer Wissensdatenbank extrahiert. Diese gesammelten Informationen werden anschließend zusammen mit der ursprünglichen Eingabe an das Sprachmodell weitergegeben, das letztendlich die Antwort generiert (vgl. Riedel 2020).
Abbildung 1 zeigt den grundsätzlichen RAG Ablauf:
Embeddings sind Darstellungen von Objekten in numerischer Form. Im Falle von Text werden Wörter innerhalb des Textes mit Hilfe von vortrainierten neuronalen Netzen (Embedding Modellen) in einen mehrdimensionalen Vektorraum eingebettet („embedded“). Jede Dimension steht dabei für bestimmte Eigenschaften der Wörter. Embeddings fangen semantische oder syntaktische Ähnlichkeiten zwischen den Wörtern ein. Das heißt, Wörter mit ähnlicher Bedeutung sollten im Vektorraum nahe beieinander liegen (vgl. Turian 2010). Ein großer Vorteil von Embeddings ist, dass sich die daraus resultierenden, verschiedenen Vektoren mit Hilfe von mathematischen Operationen vergleichen lassen. Im Falle von RAG lässt sich die Nutzereingabe mit den Vektoren der Texte der Wissensdatenbank vergleichen und eine Ähnlichkeitsmetrik errechnen.
Anhand des Beispiels in Abbildung 2 kann man sehen, wie Embeddings funktionieren. Wenn Wörter wie „Mann“ und „Frau“ jeweils als Vektoren dargestellt werden, dann ist der Unterschied („Frau“ – „Mann“) ähnlich zu dem Unterschied („Königin“ – „König“). Dadurch können Rückschlüsse gezogen werden, wie zum Beispiel: „Mann“ ist zu „König“ wie „Frau“ zu „Königin“.
Vektordatenbanken sind spezialisierte Datenbanksysteme, die für effizientes Indexieren, Abfragen und Abrufen von Embeddings ausgelegt sind. Sie ermöglichen erweiterte Datenanalyse und Operationen für die semantische Suche, die weit über den traditionellen, strukturierten Abfrageansatz herkömmlicher Datenbanken hinausgehen. Vektordatenbanken sind besonders nützlich, um die Eigenschaften und Ähnlichkeiten von Vektoren zu analysieren und zu verstehen. Sie werden beispielsweise zur Personalisierung von Empfehlungssystemen oder zur Verbesserung der Benutzererfahrung in Suchmaschinen und Forschungsdatenbanken eingesetzt (vgl. Aquino 2024).
Vektordatenbanken spielen für RAG eine entscheidende Rolle, da sie eine effiziente Speicherung des domänenspezifischen Wissens in Form von Embeddings ermöglichen.
Im Folgenden stellen wir anhand einiger Code Snippets dar, wie man in wenigen Schritten einen PoC für einen GenAI Use Case implementieren kann. Ziel unseres Beispiels ist es, einen Chatbot zu erstellen, der den Nutzer*innen Fragen über die Confluence Seiten von Cologne Intelligence beantwortet. Hierzu beschreiben wir, wie sich ein Chatbot mit Confluence als Wissensdatenbank umsetzen lässt. Das Programm läuft lokal auf dem eigenen Rechner. Eine in der Cloud gehostete Variante ist mit entsprechenden Umgebungen möglich.
Folgende Technologien kommen zum Einsatz:
OpenAI Model Konfiguration
Im Zuge der Ausarbeitung des Use-Cases haben wir uns für das aktuelle Modell von OpenAI, GPT-4, entschieden und eine entsprechende Konfiguration vorgenommen.
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint ="AZURE_OPENAI_ENDPOINT",
api_key="AZURE_OPENAI_API_KEY",
api_version="2023-07-01-preview"
)
completion = client.completions.create(
model="gpt-4-turbo",
prompt="..."
)
Embedding Model Konfiguration
Es kann jedes beliebige Embedding Modell gewählt werden. Wir haben uns für das „text-embedding-ada-002“ von OpenAI entschieden. Dieses wird genutzt, um im nächsten Schritt den jeweiligen geladenen Inhalt zu vektorisieren.
from openai import AzureOpenAI
document_embedder = AzureOpenAI(
azure_endpoint="AZURE_OPENAI_ENDPOINT",
api_key= "AZURE_OPENAI_KEY",
azure_deployment="text-embedding-ada-002")
Zum Herunterladen der Confluence Daten haben wir die „requests“ Bibliothek verwendet:
import requests
from requests.auth import HTTPBasicAuth
import json
url = "https://{CONFLUENCE_DOMAIN}/wiki/api/v2/spaces/{CONFLUENCE_SPACE_ID}/pages"
auth = HTTPBasicAuth(CONFLUENCE_ACCOUNT, CONFLUENCE_API_KEY)
headers = {
"Accept": "application/json"
}
response = requests.request(
"GET",
url,
headers=headers,
auth=auth
)
print(json.dumps(json.loads(response.text), sort_keys=True, indent=4, sepa-rators=(",", ": ")))
Die geladenen Daten können dann zum Beispiel als JSON zwischengespeichert oder direkt in die Vektordatenbank geladen werden. Alternativen, wie beispielsweise die „atlassian-python-api“ Bibliothek, können ebenfalls verwendet werden.
Zuerst werden die Dokumente mit dem ConfluencePageParser geladen. Anschließend mit Hilfe eines DocumentCleaners bereinigt und aufbereitet, um anschließend mit einem DocumentSplitter in kleinere Chunks aufgeteilt zu werden.
Für die Initialisierung der Vektordatenbank haben wir ChromaDB benutzt, es kann auch jegliche andere Vektordatenbank benutzt werden. Vektordatenbanken speichern auf eine effiziente Art und Weise Dokumente in Form von Vektoren. Die Größe der Vektoren wird anhand der Dimension angegeben, in diesem Fall 1536.
Die anschließende Pipeline verbindet verschiedene Komponenten, um den Indexierungsprozess zu orchestrieren.
import os
from dotenv import load_dotenv
from pathlib import Path
from haystack import Pipeline
from haystack.components.embedders import AzureOpenAIDocumentEmbedder
from haystack.components.writers import DocumentWriter
from haystack.utils import Secret
from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter
from haystack_integrations.document_stores.chroma import ChromaDocumentStore
data = Path("data") / "raw"
loader = ConfluencePageParser()
cleaner = DocumentCleaner()
splitter = DocumentSplitter(split_by="word", split_length=512, split_overlap=32)
document_store = ChromaDocumentStore(
path=str(Path("data") / "db"),
recreate_index=True,
return_embedding=True,
wait_result_from_api=True,
embedding_dim=1536
)
writer = DocumentWriter(document_store=document_store)
indexing_pipeline = Pipeline()
indexing_pipeline.add_component("loader", loader)
indexing_pipeline.add_component("cleaner", cleaner)
indexing_pipeline.add_component("splitter", splitter)
indexing_pipeline.add_component("embedder", document_embedder)
indexing_pipeline.add_component("writer", writer)
indexing_pipeline.connect("loader", "cleaner")
indexing_pipeline.connect("cleaner", "splitter")
indexing_pipeline.connect("splitter", "embedder")
indexing_pipeline.connect("embedder", "writer")
Streamlit bietet die leichtgewichtige Möglichkeit einen Proof-of-Concept schnellstmöglich zu testen und zu deployen. Mit Hilfe einer .streamlit Datei können weitere Design-Einstellungen getroffen werden, welche eine gute Möglichkeit bieten, eine einzigartige App für den jeweiligen Use Case zu erstellen.
import streamlit as st
st.set_page_config("Confluence",layout="wide",page_icon="logo/CI_Logo.png")
st.title("Confluence Chatbot")
sidebar=st.sidebar
with st.sidebar:
st.image("logo/Cologne-Intelligence.svg", width=250)
st.markdown(
"""
<style>
#footnotes {
display: none
}
</style>
""",
unsafe_allow_html=True,
)
user_input = st.text_input("Deine Frage")
if st.button("Senden"):
question = user_input
st.write(f'Chatbot: {answer}')
Aquino, Sabrina (2024): What is a Vector Database?, Qdrant, [online] https://qdrant.tech/articles/what-is-a-vector-database/. (abgerufen 07.05.24)
Kelbert, Patricia/Julien Siebert/Lisa Jöckel (2024): Was sind Large Language Models? Und was ist bei der Nutzung von KI-Sprachmodellen zu beachten?, Fraunhofer IESE, [online] https://www.iese.fraunhofer.de/blog/large-language-models-ki-sprachmodelle/. (abgerufen 02.05.24)
Lewis, Patrick/Ethan Perez/Aleksandra Piktus/Fabio Piktus/Vladimir Karpukhin/Naman Goyal/Heinrich Küttler/Mike Lewis/Wen-tau Yih/Tim Rocktäschel/Sebastian Riedel/Douwe Kiela (2020): Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, 34th Conference On Neural Information Processing Systems (NeurIPS 2020), [online] https://bit.ly/Lewis-RAG. (abgerufen 06.05.24)
Marcus, Gary (2020): The Next Decade in AI: Four Steps towards Robust Artificial Intelligence, arXiv.org, [online] https://arxiv.org/abs/2002.06177. (abgerufen 06.05.24)
Riedel, Sebastian/Douwe Kiela/Patrick Lewis/Aleksandra Piktus (2020): Retrieval Augmented Generation: Streamlining the creation of intelligent natural language processing models, ai.meta.com, [online] https://ai.meta.com/blog/retrieval-augmented-generation-streamlining-the-creation-of-intelligent-natural-language-processing-models/. (abgerufen 06.05.24)
Stryker, Cole/Mark Scapicchio (2024): What is Generative AI?, IBM, [online] https://www.ibm.com/topics/generative-ai.(abgerufen 02.05.24)
Turian, Joseph, Jr./Lev Ratinov/Yoshua Bengio (2010): Word representations: A simple and general method for semi-supervised learning, Proceedings Of The 48th Annual Meeting Of The Association For Computational Linguistics, [online] https://aclanthology.org/P10-1040.pdf. (abgerufen 07.05.24)
Vaswani, Ashish/Noam Shazeer/Niki Parmar/Jakob Uszkoreit/Llion Jones/Aidan N. Gomez/Lukasz Kaiser/Illia Polosukhin (2017): Attention is all you need, arXiv.org, [online] https://arxiv.org/abs/1706.03762. (abgerufen 06.05.24)
Dieser Blogbeitrag ist eine Co-Produktion von Arne Maercker, Carlo Zimmer, Florian Kretzschmar und Lars Becker.
Leichtgewichtiger Einstieg in die Welt der KI gesucht? Dann ist der AI Design Sprint™ genau das Richtige! In diesem Workshop können KI-Lösungen ganz ohne Vorwissen und im Team erarbeitet werden.