В преvious article, мы использовали Ollama с LangChain и SingleStore. LangChain предоставил эффективное и компактное решение для интеграции Ollama с SingleStore. Тем не менее, что, если бы мы удалили LangChain? В этой статье мы продемонстрируем пример использования Ollama с SingleStore без использования LangChain. Мы увидим, что хотя мы можем достичь тех же результатов, которые были описаны в предыдущей статье, количество кода увеличивается, требуя от нас управления большей частью подключения, которое обычно выполняет LangChain.
Файл NOTEBOOK, используемый в этой статье, доступен на GitHub.
Введение
Из предыдущей статьи мы продолжим те же шаги для установки нашего тестового среда, как описано в этих разделах:
- Введение
- Использовать виртуальную машину или
venv
.
- Использовать виртуальную машину или
- Создать учетную запись SingleStoreDB Cloud
- Использовать Ollama Demo Group как имя группы workspace и ollama-demo как имя workspace. Замените password и host name. Temporarily allow access from anywhere by configuring the firewall under Ollama Demo Group > Firewall.
- Create a Database
CREATE DATABASE IF NOT EXISTS ollama_demo;
- Install Jupyter
pip install notebook
- Install Ollama
curl -fsSL https://ollama.com/install.sh | sh
- Environment Variable
export SINGLESTOREDB_URL="admin:<password>@<host>:3306/ollama_demo"
Replace<password>
and<host>
with the values for your environment.
- Launch Jupyter
jupyter notebook
Fill out the Notebook
First, some packages:
!pip install ollama numpy pandas sqlalchemy-singlestoredb --quiet --no-warn-script-location
Next, we’ll import some libraries:
import ollama
import os
import numpy as np
import pandas as pd
from sqlalchemy import create_engine, text
We’ll create embeddings using all-minilm
(45 MB at the time of writing):
ollama.pull("all-minilm")
{'status': 'success'}
Для нашего LLM мы будем использовать llama2
(3,8 ГБ на момент написания):
ollama.pull("llama2")
Пример вывода:
{'status': 'success'}
Далее мы будем использовать текст примера с сайта Ollama:
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"])
Мы установим embeddings на all-minilm
и пройдем по каждому документу, чтобы собрать содержимое для DataFrame Pandas. Кроме того, мы convert embeddings в формат 32-бит, поскольку это значение по умолчанию SingleStore для типа данных VECTOR
. Наконец, мы определим размерность embeddings для первого документа в DataFrame Pandas.
Далее мы создадим соединение с экземпляром SingleStore:
connection_url = "singlestoredb://" + os.environ.get("SINGLESTOREDB_URL")
db_connection = create_engine(connection_url)
Теперь мы создадим таблицу с колонкой vector
, используя размерности, которые мы ранее определили:
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})
Теперь мы начнем записывать DataFrame Pandas в таблицу:
df.to_sql(
"pandas_docs",
con = db_connection,
if_exists = "append",
index = False,
chunksize = 1000
)
Пример вывода:
6
Теперь мы создадим индекс, который соответствует тому, что мы создавали в предыдущей статье:
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)
Теперь мы запросим вопрос следующим образом:
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)
Мы convert prompt в embeddings, уверенным, что embeddings convert в формат 32-бит, и затем выполним SQL-запрос, который использует инфиксную нотацию <->
для Евклидовой Distancia.
Пример вывода:
Llamas are members of the camelid family meaning they're pretty closely related to vicuñas and camels
Далее мы используем LLM так:
output = ollama.generate(
model = "llama2",
prompt = f"Using this data: {data}. Respond to this prompt: {prompt}"
)
print(output["response"])
Пример вывода:
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.
Резюме
В этой статье мы повторяем шаги, которые мы проделали в предыдущей и добиваемся схожих результатов. Тем не менее, нам пришлось написать ряд SQL-запросов и управлять несколькими шагами, которые LangChain бы справился с собой. Кроме того, для поддержки базы кода в долгосрочной перспективе может потребоваться больше времени и средств, чем для решения с помощью LangChain.
Использование LangChain вместо написания自定义 кода для доступа к базе данных предлагает несколько преимуществ, таких как эффективность, масштабность и надежность.
LangChain предлагает библиотеку с ready-made модулей для взаимодействия с базами данных, что сокращает время и усилия разработки. Разработчики могут использовать这些 модули, чтобы быстро внедрить различные операции с базой данных, не начиная с начала.
LangChain абстрагирует многие сложности, связанные с управлением базой данных, позволяя разработчикам сосредотачиваться на высокоуровневых задачах, а не на деталях нижнего уровня. Это улучшает производительность и скорость запуска приложений, основанных на базе данных.
LangChain имеет крупную, активную и растущую общность разработчиков, доступен на GitHub, и предоставляет обширную документацию и примеры.
В общем, LangChain позволяет разработчикам использовать мощную, эффективную и надежную платформу для создания приложений с базой данных, позволяя им сосредотачиваться на решенииビジネス проблем с использованием высокоуровневых абстракций, а не переиначивать колесо собственным кодом. Comparing the example in this article with the example we used in the previous article, we can see the benefits.
Source:
https://dzone.com/articles/ollama-plus-singlestore-minus-langchain