In einem früheren Artikel haben wir Ollama mit LangChain und SingleStore verwendet. LangChain bot eine effiziente und kompakte Lösung für die Integration von Ollama mit SingleStore. Wie würde es jedoch ausscheinen, wenn wir LangChain entfernen würden? In diesem Artikel werden wir ein Beispiel zeigen, wie Ollama mit SingleStore verwendet werden kann, ohne auf LangChain zu verlassen. Wir werden erkennen, dass wir die gleichen Ergebnisse erzielen können, die in dem früheren Artikel beschrieben wurden, aber die Anzahl der Code steigt, was bedeutet, dass wir mehr der Pipeline verwalten müssen, die normalerweise von LangChain verwaltet wird.
Der in diesem Artikel verwendete Notebook-Datei ist auf GitHub verfügbar.
Einführung
Aus dem vorhergehenden Artikel werden wir die gleichen Schritte befolgen, um unser Testumfeld wie in diesen Abschnitten beschrieben zu setzen:
- Einführung
- Verwenden Sie eine Virtual Machine oder
venv
.
- Verwenden Sie eine Virtual Machine oder
- Erstellen Sie ein SingleStoreDB Cloud-Konto
- Verwenden Sie Ollama Demo Group als Workspace-Gruppennamen und ollama-demo als Workspace-Name. Notieren Sie sich das Passwort und den Rechnernamen. Ändern Sie die Firewall-Einstellungen unter Ollama Demo Group > Firewall, um暂时 von überall her zuzulassen.
- Erstellen Sie eine Datenbank
CREATE DATABASE IF NOT EXISTS ollama_demo;
- Installieren Sie Jupyter
pip install notebook
- Installieren Sie Ollama
curl -fsSL https://ollama.com/install.sh | sh
- Umgebungsvariable
export SINGLESTOREDB_URL="admin:<password>@<host>:3306/ollama_demo"
Ersetzen Sie<password>
und<host>
durch die Werte für Ihre Umgebung.
- Starten Sie Jupyter
jupyter notebook
Füllen Sie das Notebook aus
Zuerst einige Pakete:
!pip install ollama numpy pandas sqlalchemy-singlestoredb --quiet --no-warn-script-location
Dann importieren wir einige Bibliotheken:
import ollama
import os
import numpy as np
import pandas as pd
from sqlalchemy import create_engine, text
Wir erstellen Einbettungen mit all-minilm
(45 MB zum Zeitpunkt der Verfassung):
ollama.pull("all-minilm")
Beispieloutput:
{'status': 'success'}
Für unser LLM verwenden wir llama2
(3,8 GB zum Zeitpunkt der Verfassung):
ollama.pull("llama2")
Beispieloutput:
{'status': 'success'}
Dann verwenden wir den Beispieltext von der Ollama-Website:
documents = [
"Llamas are members of the camelid family meaning they're pretty closely related to vicuñas and camels",
"Llamas were first domesticated and used as pack animals 4,000 to 5,000 years ago in the Peruvian highlands",
"Llamas can grow as much as 6 feet tall though the average llama between 5 feet 6 inches and 5 feet 9 inches tall",
"Llamas weigh between 280 and 450 pounds and can carry 25 to 30 percent of their body weight",
"Llamas are vegetarians and have very efficient digestive systems",
"Llamas live to be about 20 years old, though some only live for 15 years and others live to be 30 years old"
]
df_data = []
for doc in documents:
response = ollama.embeddings(
model = "all-minilm",
prompt = doc
)
embedding = response["embedding"]
embedding_array = np.array(embedding).astype(np.float32)
df_data.append({"content": doc, "vector": embedding_array})
df = pd.DataFrame(df_data)
dimensions = len(df.at[0, "vector"])
Wir setzen die Embeddings auf all-minilm
und iterieren durch jedes Dokument, um den Inhalt für einen Pandas DataFrame aufzubauen. Zusätzlich konvertieren wir die Embeddings in ein 32-Bit-Format, da dies das Standardformat von SingleStore für den VECTOR
-Datentyp ist. Schließlich bestimmen wir die Anzahl der Embedding-Dimensionen für das erste Dokument im Pandas DataFrame.
Dann erstellen wir eine Verbindung zu unserer SingleStore-Instanz:
connection_url = "singlestoredb://" + os.environ.get("SINGLESTOREDB_URL")
db_connection = create_engine(connection_url)
Nun erstellen wir eine Tabelle mit der vector
-Spalte unter Verwendung der zuvor bestimmten Dimensionen:
query = text("""
CREATE TABLE IF NOT EXISTS pandas_docs (
id BIGINT AUTO_INCREMENT NOT NULL,
content LONGTEXT,
vector VECTOR(:dimensions) NOT NULL,
PRIMARY KEY(id)
);
""")
with db_connection.connect() as conn:
conn.execute(query, {"dimensions": dimensions})
Nun schreiben wir den Pandas DataFrame in die Tabelle:
df.to_sql(
"pandas_docs",
con = db_connection,
if_exists = "append",
index = False,
chunksize = 1000
)
Beispieloutput:
6
Nun erstellen wir einen Index, der dem in dem vorherigen Artikel entspricht:
query = text("""
ALTER TABLE pandas_docs ADD VECTOR INDEX (vector)
INDEX_OPTIONS '{
"metric_type": "EUCLIDEAN_DISTANCE"
}';
""")
with db_connection.connect() as conn:
conn.execute(query)
Nun stellen wir eine Frage, wie folgt:
prompt = "What animals are llamas related to?"
response = ollama.embeddings(
prompt = prompt,
model = "all-minilm"
)
embedding = response["embedding"]
embedding_array = np.array(embedding).astype(np.float32)
query = text("""
SELECT content
FROM pandas_docs
ORDER BY vector <-> :embedding_array ASC
LIMIT 1;
""")
with db_connection.connect() as conn:
results = conn.execute(query, {"embedding_array": embedding_array})
row = results.fetchone()
data = row[0]
print(data)
Wir konvertieren die Eingabe in Embeddings, stellen sicher, dass die Embeddings in ein 32-Bit-Format konvertiert werden, und führen dann die SQL-Abfrage aus, die die Infixnotation <->
für den Euklidischen Abstand verwendet.
Beispieloutput:
Llamas are members of the camelid family meaning they're pretty closely related to vicuñas and camels
Dann verwenden wir das LLM, wie folgt:
output = ollama.generate(
model = "llama2",
prompt = f"Using this data: {data}. Respond to this prompt: {prompt}"
)
print(output["response"])
Beispieloutput:
Llamas are members of the camelid family, which means they are closely related to other animals such as:
1. Vicuñas: Vicuñas are small, wild camelids that are native to South America. They are known for their soft, woolly coats and are considered an endangered species due to habitat loss and poaching.
2. Camels: Camels are large, even-toed ungulates that are native to Africa and the Middle East. They are known for their distinctive humps on their backs, which store water and food for long periods of time.
Both llamas and vicuñas are classified as members of the family Camelidae, while camels are classified as belonging to the family Dromedaryae. Despite their differences in size and habitat, all three species share many similarities in terms of their physical characteristics and behavior.
Zusammenfassung
In diesem Artikel haben wir die Schritte, die wir im vorherigen Artikel befolgt haben, repliziert und ähnliche Ergebnisse erzielt. Allerdings mussten wir eine Reihe von SQL-Anweisungen schreiben und mehrere Schritte verwalten, die LangChain für uns gehandhabt hätte. Zusätzlich können sich langfristig höhere Zeitaufwand und Kosten bei der Wartung der Codebasis im Vergleich zur LangChain-Lösung ergeben.
Die Verwendung von LangChain anstelle des Schreibens von benutzerdefiniertem Code für Datenbankzugriffe bietet mehrere Vorteile, wie Effizienz, Skalierbarkeit und Zuverlässigkeit.
LangChain bietet eine Bibliothek vorgefertigter Module für die Datenbankinteraktion, was die Entwicklungzeit und -arbeit verringert. Entwickler können diese Module verwenden, um verschiedene Datenbankoperationen schnell zu implementieren, ohne von Grund auf zu beginnen.
LangChain abstrahiert viele der Komplexitäten, die mit der Datenbankverwaltung verbunden sind, sodass Entwickler sich auf höhere Aufgaben konzentrieren können, anstatt sich mit Implementierungsdetails auf niedriger Ebene zu beschäftigen. Dies verbessert die Produktivität und reduziert die Zeit bis zur Markteinführung für datenbankgetriebene Anwendungen.
LangChain hat eine große, aktive und wachsende Entwicklergemeinschaft, ist auf GitHub verfügbar und bietet umfangreiche Dokumentation und Beispiele.
Zusammenfassend bietet LangChain Entwicklern eine leistungsstarke, effiziente und zuverlässige Plattform für die Entwicklung datenbankgetriebener Anwendungen, ermöglicht es ihnen, sich auf Geschäftsprobleme zu konzentrieren und höherwertige Abstraktionen zu verwenden, anstatt mit benutzerdefiniertem Code das Rad neu zu erfinden. Ein Vergleich des Beispiels in diesem Artikel mit dem Beispiel aus dem vorherigen Artikel zeigt die Vorteile.
Source:
https://dzone.com/articles/ollama-plus-singlestore-minus-langchain