Description
I am facing issues setting up a weaviate client with vectorizer and generative configurations. I am running Ollama Llama3 for my tasks. I am using Weaviate 1.25.
docker_compose.yml (The local weaviate server I am running):
version: '3.4'
services:
weaviate:
command:
- --host
- 0.0.0.0
- --port
- '8080'
- --scheme
- http
image: cr.weaviate.io/semitechnologies/weaviate:1.25.1
ports:
- 8080:8080
- 50051:50051
- 11434:11434
volumes:
- weaviate_data:/var/lib/weaviate
restart: on-failure:0
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
ENABLE_MODULES: 'text2vec-ollama,generative-ollama,ref2vec-centroid,reranker-cohere,qna-openai'
CLUSTER_HOSTNAME: 'node1'
volumes:
weaviate_data:
Code (As mentioned in Quickstart, modified to use Ollama instead of OpenAI):
import weaviate
import weaviate.classes as wvc
from weaviate.classes.config import Property, DataType
from weaviate.connect import ConnectionParams
import ollama
import os
import requests
import json
client = weaviate.connect_to_local()
if client.collections.exists('Jeopardy'):
print('Dropping pre-exisiting collection')
client.collections.delete('Jeopardy')
jeopardy_collection = client.collections.create(name='Jeopardy',
vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_ollama(),
generative_config=wvc.config.Configure.Generative.ollama())
resp = requests.get('https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json')
jeopardy_data = json.loads(resp.text)
question_objs = []
for i, data in enumerate(jeopardy_data):
question_objs.append({
"answer": data["Answer"],
"question": data["Question"],
"category": data["Category"],
})
It runs well till here, then fails on insertion / update attempts:
jeopardy_collection.data.insert(jeopardy_data[0])
with an error
Cell In[27], line 1
----> 1 jeopardy_collection.data.insert(jeopardy_data[0])
File ~/miniforge3/envs/weaviate/lib/python3.11/site-packages/weaviate/collections/data.py:388, in _DataCollection.insert(self, properties, references, uuid, vector)
385 if vector is not None:
386 weaviate_obj = self.__parse_vector(weaviate_obj, vector)
--> 388 return self._insert(weaviate_obj)
File ~/miniforge3/envs/weaviate/lib/python3.11/site-packages/weaviate/collections/data.py:82, in _Data._insert(self, weaviate_obj)
79 path = "/objects"
81 params, weaviate_obj = self.__apply_context_to_params_and_object({}, weaviate_obj)
---> 82 self._connection.post(
83 path=path,
84 weaviate_object=weaviate_obj,
85 params=params,
86 error_msg="Object was not added",
87 status_codes=_ExpectedStatusCodes(ok_in=200, error="insert object"),
88 )
89 return uuid_package.UUID(weaviate_obj["id"])
File ~/miniforge3/envs/weaviate/lib/python3.11/site-packages/weaviate/connect/v4.py:500, in _Connection.post(self, path, weaviate_object, params, error_msg, status_codes)
492 def post(
493 self,
494 path: str,
(...)
498 status_codes: Optional[_ExpectedStatusCodes] = None,
499 ) -> Response:
--> 500 return self.__send(
501 "POST",
502 url=self.url + self._api_version_path + path,
503 weaviate_object=weaviate_object,
504 params=params,
505 error_msg=error_msg,
506 status_codes=status_codes,
507 )
File ~/miniforge3/envs/weaviate/lib/python3.11/site-packages/weaviate/connect/v4.py:451, in _Connection.__send(self, method, url, error_msg, status_codes, weaviate_object, params)
449 res = self._client.send(req)
450 if status_codes is not None and res.status_code not in status_codes.ok:
--> 451 raise UnexpectedStatusCodeError(error_msg, response=res)
452 return cast(Response, res)
453 except RuntimeError as e:
UnexpectedStatusCodeError: Object was not added! Unexpected status code: 500, with response body: {'error': [{'message': 'update vector: send POST request: Post "http://localhost:11434/api/embeddings": dial tcp 127.0.0.1:11434: connect: connection refused'}]}.
The server shows an error:
weaviate-1 | {"action":"requests_total","api":"rest","class_name":"Jeopardy","error":"update vector: send POST request: Post \"http://localhost:11434/api/embeddings\": dial tcp 127.0.0.1:11434: connect: connection refused","level":"error","msg":"unexpected error","query_type":"objects","time":"2024-05-28T14:42:25Z"}
To give some context, this code runs well (which does not use Ollama connectors from Weaviate itself):
client = weaviate.connect_to_local()
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",
]
# Create a new data collection
if client.collections.exists('docs'):
client.collections.delete('docs')
collection = client.collections.create(
name = "docs", # Name of the data collection
properties=[
Property(name="text", data_type=DataType.TEXT), # Name and data type of the property
])
# Store each document in a vector embedding database
with collection.batch.dynamic() as batch:
for i, document in enumerate(documents):
# Generate embeddings
response = ollama.embeddings(model = "llama3",
prompt = document)
# Add data object with text and embedding
batch.add_object(
properties = {"text" : document},
vector = response["embedding"],
)
# An example prompt
prompt = "What animals are llamas related to?"
# Generate an embedding for the prompt and retrieve the most relevant doc
response = ollama.embeddings(
model = "llama3",
prompt = prompt,
)
results = collection.query.near_vector(near_vector = response["embedding"],
limit = 1)
data = results.objects[0].properties['text']
prompt_template = f"Using this data: {data}. Respond to this prompt: {prompt}"
# Generate a response combining the prompt and data we retrieved in step 2
output = ollama.generate(
model = "llama3",
prompt = prompt_template,
)
print(output['response'])
I need help fixing the connection issue with the weaviate server.