In een vorige artikel gebruikten we Ollama samen met LangChain en SingleStore. LangChain bood een efficiënte en compacte oplossing voor de integratie van Ollama met SingleStore. Echter, wat als we LangChain zouden verwijderen? In dit artikel zullen we een voorbeeld geven van het gebruik van Ollama met SingleStore zonder afhankelijkheid van LangChain. We zullen zien dat we dezelfde resultaten kunnen behalen als beschreven in het vorige artikel, maar dat het aantal code toeneemt, waardoor we meer van de installaties moeten beheren die normaal door LangChain worden afgehandeld.
Het notitiebestand dat in dit artikel wordt gebruikt, is beschikbaar op GitHub.
Inleiding
Vanuit het vorige artikel zullen we dezelfde stappen volgen om ons testmilieu in te stellen, zoals beschreven in deze secties:
- Inleiding
- Gebruik een Virtual Machine of
venv
.
- Gebruik een Virtual Machine of
- Maak een account aan bij SingleStoreDB Cloud
- Gebruik Ollama Demo Groep als Workspace Groepsnaam en ollama-demo als Workspace Naam. Maak een notitie van het wachtwoord en de hostnaam. Stel tijdelijk toegang toe vanaf elke plek door de brandmuur te configureren onder Ollama Demo Groep > Brandmuur.
- Maak een Database
CREATE DATABASE IF NOT EXISTS ollama_demo;
- Installeer Jupyter
pip install notebook
- Installeer Ollama
curl -fsSL https://ollama.com/install.sh | sh
- Omgevingsvariabele
export SINGLESTOREDB_URL="admin:<password>@<host>:3306/ollama_demo"
Vervang<password>
en<host>
met de waarden voor uw omgeving.
- Start Jupyter
jupyter notebook
Vul het Notebook in
Eerst enkele pakketten:
!pip install ollama numpy pandas sqlalchemy-singlestoredb --quiet --no-warn-script-location
Vervolgens importeren we enkele bibliotheken:
import ollama
import os
import numpy as np
import pandas as pd
from sqlalchemy import create_engine, text
We maken embeddings met behulp van all-minilm
(45 MB op het moment van schrijven):
ollama.pull("all-minilm")
{'status': 'success'}
Voor onze LLM gebruiken we llama2
(3.8 GB bij het schrijven van dit stuk):
ollama.pull("llama2")
Voorbeelduitvoer:
{'status': 'success'}
Volgend zal gebruik worden gemaakt van het voorbeeldtekst van de 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"])
We zullen de vectorstijlen instellen op all-minilm
en door elk document iteratief lopen om de inhoud op te bouwen voor een Pandas DataFrame. Daarnaast zullen we de vectorstijlen converteren naar een 32-bit formaat, aangezien dit SingleStore’s standaard is voor de VECTOR
datatype. We zullen ook de dimensies van de vectorstijlen voor het eerste document in het Pandas DataFrame bepalen.
Volgend zal een verbinding worden gemaakt met onze SingleStore-instantie:
connection_url = "singlestoredb://" + os.environ.get("SINGLESTOREDB_URL")
db_connection = create_engine(connection_url)
Nu zullen we een tabel aanmaken met de kolom vector
gebruikmakende van de vooraf bepaalde dimensies:
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})
We zullen nu het Pandas DataFrame naar de tabel schrijven:
df.to_sql(
"pandas_docs",
con = db_connection,
if_exists = "append",
index = False,
chunksize = 1000
)
Voorbeelduitvoer:
6
We zullen nu een index aanmaken die overeenkomt met de die we in het vorige artikel aangemaakt hebben:
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)
We zullen nu een vraag stellen, zoals volgt:
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)
We zullen de aanroepende opdracht omzetten in vectorstijlen, ervoor zorgen dat de vectorstijlen zijn geconverteerd naar een 32-bit formaat, en vervolgens uitvoeren van de SQL-query die de infix notatie <->
gebruikt voor de Euclidische afstand.
Voorbeelduitvoer:
Llamas are members of the camelid family meaning they're pretty closely related to vicuñas and camels
Volgend zal de LLM worden gebruikt, zoals volgt:
output = ollama.generate(
model = "llama2",
prompt = f"Using this data: {data}. Respond to this prompt: {prompt}"
)
print(output["response"])
Voorbeelduitvoer:
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.
Samenvatting
In dit artikel hebben we de stappen uit het vorige artikel nageleefd en vergelijkbare resultaten behaald. Echter, we moesten een reeks SQL-statementen schrijven en enkele stappen beheren die LangChain zou hebben opgelost voor ons. Bovendien zou er misschien meer tijd en kosten zijn betrokken bij het langetermijneigen van de codebasis in vergelijking met de oplossing van LangChain.
Het gebruik van LangChain in plaats van custom code voor database toegang biedt verschillende voordelen, zoals effectiviteit, scalabiliteit en betrouwbaarheid.
LangChain biedt een bibliotheek van voorgebouwde modules voor databaseinteractie, die ontwikkelingstijd en inspanningen verminderen. Ontwikkelaars kunnen deze modules gebruiken om verschillende databaseoperaties snel uit te voeren zonder vanaf nul te beginnen.
LangChain abstracte veel van de complexiteit die aanwezig is in databasebeheer, waardoor ontwikkelaars zich kunnen richten op hogere niveaus taken in plaats van op details van de lagere niveaus implementatie. Dit verbeterd de productiviteit en de tijd tot marktintroductie voor databasegebaseerde toepassingen.
LangChain heeft een grote, actieve en groeiende gemeenschap van ontwikkelaars, is beschikbaar op GitHub en biedt uitgebreide documentatie en voorbeelden.
In totaal biedt LangChain ontwikkelaars een krachtige, efficiente en betrouwbare platform voor het bouwen van databasegebaseerde toepassingen, die hen in staat stellen hun zwaartepunten op de zakelijke problemen te leggen in plaats van de wielen opnieuw te vervaardigen met custom code. Bij het vergelijken van het voorbeeld in dit artikel met het voorbeeld dat we in het vorige artikel gebruikten, kunnen we de voordelen zien.
Source:
https://dzone.com/articles/ollama-plus-singlestore-minus-langchain