Quickstart
This quickstart shows you how to combine Weaviate Cloud and Weaviate Embeddings to:
- Set up a Weaviate instance. (10 minutes)
- Add and vectorize your data. (10 minutes)
- Perform a semantic search and retrieval augmented generation (RAG). (10 minutes)
Notes:
- The code examples here are self-contained. You can copy and paste them into your own environment to try them out.
Requirements
In order to perform Retrieval Augmented Generation (RAG) in the last step, you will need a Cohere account. You can use a free Cohere trial API key. If you have another preferred model provider, you can use that instead of Cohere.
Step 1: Set up Weaviate Cloud
1.1 Create a Weaviate Cloud account
- Open the Weaviate Cloud console.
- Click on
Sign up
. - Provide an email address and password.
- After you confirm your email address, open the login page.
- Log in to Weaviate Cloud.

1.2 Create a cluster
When you log into the Weaviate Cloud web console, the Clusters
panel lists your clusters (1). There are no clusters when you log in to a new account.
- To create a cluster, click the
Create cluster
button on the Weaviate Cloud homepage (2).

Weaviate offers the following cluster options:
- Sandbox clusters: free short-term cluster for development purposes.
- Serverless clusters: permanent production-ready environment.
- Sandbox
- Serverless
- Select the
Sandbox
tab. - Choose a name for your cluster.
- Select a cloud region from the dropdown.
- Click the
Create
button.

- Select the
Serverless
tab. - Choose a name for your cluster.
- Select a cloud region from the dropdown.
- Click the
Create
button.

It takes a minute or two to create the new cluster. When the cluster is ready, there will be a checkmark (✔️
) next to the cluster name.
When possible, try to use the latest Weaviate version. New releases include cutting-edge features, performance enhancements, and critical security updates to keep your application safe and up-to-date.
Step 2: Connect to your cluster
2.1 Install a client library
The Weaviate Cloud console includes a query interface, but most interactions rely on a Weaviate client. Clients are available in several programming languages. Choose one that makes sense for your project.
To install a client, follow these steps for your language:
- Python
- JS/TS
- Go
- Java
Install the latest, Python client v4
, by adding weaviate-client
to your Python environment with pip
:
pip install -U weaviate-client
Install the latest, JS/TS client v3
, by adding weaviate-client
to your project with npm
:
npm install weaviate-client
Add weaviate-go-client
to your project with go get
:
go get github.com/weaviate/weaviate-go-client/v4
Add this dependency to your project:
<dependency>
<groupId>io.weaviate</groupId>
<artifactId>client</artifactId>
<version>4.8.3</version> <!-- Check latest version: https://github.com/weaviate/java-client -->
</dependency>
2.2 Connect to your Weaviate Cloud instance
Now, you can connect to your Weaviate instance. Get the instance REST Endpoint URL and the Administrator API Key from the Weaviate Cloud console as shown below.

REST Endpoint
URL.
Admin
API key.Weaviate supports both REST and gRPC protocols. For Weaviate Cloud deployments, you only need to provide the REST endpoint URL - the client will automatically configure gRPC.
Once you have the REST Endpoint URL and the Admin API key, you can connect to the Sandbox instance and work with Weaviate.
The example below shows how to connect to Weaviate and perform a basic operation, like checking the cluster status.
- Python
- JS/TS
- Go
- Java
- Curl
import weaviate
from weaviate.classes.init import Auth
import os
# Best practice: store your credentials in environment variables
wcd_url = os.environ["WCD_URL"]
wcd_api_key = os.environ["WCD_API_KEY"]
client = weaviate.connect_to_weaviate_cloud(
cluster_url=wcd_url, # Replace with your Weaviate Cloud URL
auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key
)
print(client.is_ready()) # Should print: `True`
client.close() # Free up resources
import weaviate, { WeaviateClient } from 'weaviate-client';
// Best practice: store your credentials in environment variables
const wcdUrl = process.env.WCD_URL as string;
const wcdApiKey = process.env.WCD_API_KEY as string;
const client: WeaviateClient = await weaviate.connectToWeaviateCloud(
wcdUrl, // Replace with your Weaviate Cloud URL
{
authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key
}
);
var clientReadiness = await client.isReady();
console.log(clientReadiness); // Should return `true`
client.close(); // Close the client connection
// Set these environment variables
// WCD_HOSTNAME your Weaviate instance hostname
// WCD_API_KEY your Weaviate instance API key
package main
import (
"context"
"fmt"
"os"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/auth"
)
func main() {
cfg := weaviate.Config{
Host: os.Getenv("WCD_HOSTNAME"),
Scheme: "https",
AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")},
}
client, err := weaviate.NewClient(cfg)
if err != nil {
fmt.Println(err)
}
// Check the connection
ready, err := client.Misc().ReadyChecker().Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", ready)
}
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.WeaviateAuthClient;
import io.weaviate.client.base.Result;
// Set these environment variables
// WCD_HOSTNAME Your Weaviate instance hostname
// WCD_API_KEY Your Weaviate instance API key
public class IsReady {
public static void main(String[] args) throws Exception {
String host = System.getenv("WCD_HOSTNAME");
String apiKey = System.getenv("WCD_API_KEY");
Config config = new Config("https", host);
WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey);
// check the result
Result<Boolean> result = client.misc().readyChecker().run();
System.out.println(result.getResult());
}
}
# Best practice: store your credentials in environment variables
# export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL
# export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key
curl -w "\nResponse code: %{http_code}\n" \
-H "Authorization: Bearer $WCD_API_KEY" \
$WCD_URL/v1/.well-known/ready
# You should see "Response code: 200" if the instance is ready
If you did not see any errors, you are ready to proceed. We will replace the simple cluster status check with more meaningful operations in the next steps.
Step 3: Populate your database
3.1 Define a collection
The following example creates a collection called Question
with:
- The Weaviate Embeddings model integration to create vectors during ingestion & queries.
- Cohere generative AI integrations for retrieval augmented generation (RAG).
- Python
- JS/TS
- Go
- Java
- Curl
import weaviate
from weaviate.classes.init import Auth
from weaviate.classes.config import Configure
import os
# Best practice: store your credentials in environment variables
wcd_url = os.environ["WCD_URL"]
wcd_api_key = os.environ["WCD_API_KEY"]
client = weaviate.connect_to_weaviate_cloud(
cluster_url=wcd_url, # Replace with your Weaviate Cloud URL
auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key
)
questions = client.collections.create(
name="Question",
vectorizer_config=Configure.Vectorizer.text2vec_weaviate(), # Configure the Weaviate Embeddings integration
generative_config=Configure.Generative.cohere() # Configure the Cohere generative AI integration
)
client.close() # Free up resources
import weaviate, { WeaviateClient, vectorizer, generative } from 'weaviate-client';
// Best practice: store your credentials in environment variables
const wcdUrl = process.env.WCD_URL as string;
const wcdApiKey = process.env.WCD_API_KEY as string;
const client: WeaviateClient = await weaviate.connectToWeaviateCloud(
wcdUrl, // Replace with your Weaviate Cloud URL
{
authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key
}
);
await client.collections.create({
name: 'Question',
vectorizers: vectorizer.text2VecWeaviate(),
generative: generative.cohere(),
});
client.close(); // Close the client connection
// Set these environment variables
// WCD_HOSTNAME your Weaviate instance hostname
// WCD_API_KEY your Weaviate instance API key
// COHERE_APIKEY your Cohere API key
package main
import (
"context"
"fmt"
"os"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/auth"
"github.com/weaviate/weaviate/entities/models"
)
func main() {
cfg := weaviate.Config{
Host: os.Getenv("WCD_HOSTNAME"),
Scheme: "https",
AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")},
}
client, err := weaviate.NewClient(cfg)
if err != nil {
fmt.Println(err)
}
// Define the collection
classObj := &models.Class{
Class: "Question",
Vectorizer: "text2vec-weaviate",
ModuleConfig: map[string]interface{}{
"text2vec-weaviate": map[string]interface{}{},
"generative-cohere": map[string]interface{}{},
},
}
// add the collection
err = client.Schema().ClassCreator().WithClass(classObj).Do(context.Background())
if err != nil {
panic(err)
}
}
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateAuthClient;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.schema.model.WeaviateClass;
import java.util.HashMap;
import java.util.Map;
// Set these environment variables
// WCD_HOSTNAME Your Weaviate instance hostname
// WCD_API_KEY Your Weaviate instance API key
public class CreateCollection {
public static void main(String[] args) throws Exception {
String host = System.getenv("WCD_HOSTNAME");
String apiKey = System.getenv("WCD_API_KEY");
Config config = new Config("https", host);
WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey);
Map<String, Object> text2vecWeaviateSettings = new HashMap<>();
Map<String, Object> generativeCohereSettings = new HashMap<>();
Map<String, Object> moduleConfig = new HashMap<>();
moduleConfig.put("text2vec-weaviate", text2vecWeaviateSettings);
moduleConfig.put("generative-cohere", generativeCohereSettings);
// Create the collection "Question"
WeaviateClass clazz = WeaviateClass.builder()
.className("Question")
.vectorizer("text2vec-weaviate")
.moduleConfig(moduleConfig)
.build();
// Review the response
Result<Boolean> result = client.schema().classCreator().withClass(clazz).run();
System.out.println(result);
Result<WeaviateClass> collectionDefinition = client.schema().classGetter().withClassName("Question").run();
System.out.println(collectionDefinition.getResult());
}
}
# Best practice: store your credentials in environment variables
# export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL
# export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WCD_API_KEY" \
-d '{
"class": "Question",
"vectorizer": "text2vec-weaviate",
"moduleConfig": {
"text2vec-weaviate": {},
"generative-cohere": {}
}
}' \
"$WCD_URL/v1/schema"
Run this code to create the collection to which you can add data.
You can optionally specify the model in the collection definition. As we did not specify models in the collection definition above, these integrations will use the Weaviate-defined default models.
See the model providers integration section for more information.
3.2 Load the data
We can now add data to our collection.
The following example:
- Loads objects, and
- Adds objects to the target collection (
Question
) using a batch process.
(Batch imports) are the most efficient way to add large amounts of data, as it sends multiple objects in a single request. See the How-to: Batch import guide for more information.
- Python
- JS/TS
- Go
- Java
- Curl
import weaviate
from weaviate.classes.init import Auth
import requests, json, os
# Best practice: store your credentials in environment variables
wcd_url = os.environ["WCD_URL"]
wcd_api_key = os.environ["WCD_API_KEY"]
client = weaviate.connect_to_weaviate_cloud(
cluster_url=wcd_url, # Replace with your Weaviate Cloud URL
auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key
)
resp = requests.get(
"https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json"
)
data = json.loads(resp.text)
questions = client.collections.get("Question")
with questions.batch.dynamic() as batch:
for d in data:
batch.add_object({
"answer": d["Answer"],
"question": d["Question"],
"category": d["Category"],
})
if batch.number_errors > 10:
print("Batch import stopped due to excessive errors.")
break
failed_objects = questions.batch.failed_objects
if failed_objects:
print(f"Number of failed imports: {len(failed_objects)}")
print(f"First failed object: {failed_objects[0]}")
client.close() # Free up resources
During a batch import, any failed objects can be obtained through batch.failed_objects
. Additionally, a running count of failed objects is maintained and can be accessed through batch.number_errors
within the context manager. This counter can be used to stop the import process in order to investigate the failed objects or references. Find out more about error handling on the Python client reference page.
import weaviate, { WeaviateClient } from 'weaviate-client';
// Best practice: store your credentials in environment variables
const wcdUrl = process.env.WCD_URL as string;
const wcdApiKey = process.env.WCD_API_KEY as string;
const client: WeaviateClient = await weaviate.connectToWeaviateCloud(
wcdUrl, // Replace with your Weaviate Cloud URL
{
authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key
}
);
// Load data
async function getJsonData() {
const file = await fetch(
'https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json'
);
return file.json();
}
// Note: The TS client does not have a `batch` method yet
// We use `insertMany` instead, which sends all of the data in one request
async function importQuestions() {
const questions = client.collections.get('Question');
const data = await getJsonData();
const result = await questions.data.insertMany(data);
console.log('Insertion response: ', result);
}
await importQuestions();
client.close(); // Close the client connection
// Set these environment variables
// WCD_HOSTNAME your Weaviate instance hostname
// WCD_API_KEY your Weaviate instance API key
package main
import (
"context"
"encoding/json"
"fmt"
"net/http"
"os"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/auth"
"github.com/weaviate/weaviate/entities/models"
)
func main() {
cfg := weaviate.Config{
Host: os.Getenv("WCD_HOSTNAME"),
Scheme: "https",
AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")},
}
client, err := weaviate.NewClient(cfg)
if err != nil {
fmt.Println(err)
}
// Retrieve the data
data, err := http.DefaultClient.Get("https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json")
if err != nil {
panic(err)
}
defer data.Body.Close()
// Decode the data
var items []map[string]string
if err := json.NewDecoder(data.Body).Decode(&items); err != nil {
panic(err)
}
// convert items into a slice of models.Object
objects := make([]*models.Object, len(items))
for i := range items {
objects[i] = &models.Object{
Class: "Question",
Properties: map[string]any{
"category": items[i]["Category"],
"question": items[i]["Question"],
"answer": items[i]["Answer"],
},
}
}
// batch write items
batchRes, err := client.Batch().ObjectsBatcher().WithObjects(objects...).Do(context.Background())
if err != nil {
panic(err)
}
for _, res := range batchRes {
if res.Result.Errors != nil {
panic(res.Result.Errors.Error)
}
}
}
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateAuthClient;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.v1.batch.api.ObjectsBatcher;
import io.weaviate.client.v1.data.model.WeaviateObject;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
// Set these environment variables
// WCD_HOSTNAME Your Weaviate instance hostname
// WCD_API_KEY Your Weaviate instance API key
public class Import {
public static void main(String[] args) throws Exception {
String host = System.getenv("WCD_HOSTNAME");
String apiKey = System.getenv("WCD_API_KEY");
Config config = new Config("https", host);
WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey);
// Get JSON data
URL url = new URL("https://raw.githubusercontent.com/weaviate-tutorials/quickstart/main/data/jeopardy_tiny.json");
String jsonData = new BufferedReader(new InputStreamReader(((HttpURLConnection) url.openConnection()).getInputStream()))
.lines().reduce("", String::concat);
// Create and execute batch
ObjectsBatcher batcher = client.batch().objectsBatcher();
new JSONArray(jsonData).forEach(item -> {
JSONObject json = (JSONObject) item;
HashMap<String, Object> properties = new HashMap<>();
properties.put("category", json.getString("Category"));
properties.put("question", json.getString("Question"));
properties.put("answer", json.getString("Answer"));
batcher.withObject(WeaviateObject.builder()
.className("Question")
.properties(properties)
.build());
});
// Flush
batcher.run();
}
}
- Download the
jeopardy_tiny.json
file from here before running the following script. - This assumes you have
jq
installed.
# Best practice: store your credentials in environment variables
# export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL
# export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key
# Set batch size
BATCH_ENDPOINT="$WCD_URL/v1/batch/objects"
BATCH_SIZE=100
# Read the JSON file and loop through its entries
lines_processed=0
batch_data="{\"objects\": ["
cat jeopardy_tiny.json | jq -c '.[]' | while read line; do
# Concatenate lines
line=$(echo "$line" | jq "{class: \"Question\", properties: {answer: .Answer, question: .Question, category: .Category}}")
if [ $lines_processed -eq 0 ]; then
batch_data+=$line
else
batch_data+=",$line"
fi
lines_processed=$((lines_processed + 1))
# If the batch is full, send it to the API using curl
if [ $lines_processed -eq $BATCH_SIZE ]; then
batch_data+="]}"
curl -X POST "$BATCH_ENDPOINT" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WCD_API_KEY" \
-d "$batch_data"
echo "" # Print a newline for better output formatting
# Reset the batch data and counter
lines_processed=0
batch_data="{\"objects\": ["
fi
done
# Send the remaining data (if any) to the API using curl
if [ $lines_processed -ne 0 ]; then
batch_data+="]}"
curl -X POST "$BATCH_ENDPOINT" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WCD_API_KEY" \
-d "$batch_data"
echo "" # Print a newline for better output formatting
fi
Run this code to add the demo data.
Step 4: Query your data
Weaviate provides a wide range of query tools to help you find the right data. We will try a few searches here.
4.1 Semantic search
Semantic search finds results based on meaning. This is called nearText
in Weaviate.
The following example searches for 2 objects whose meaning is most similar to that of biology
.
- Python
- JS/TS
- Go
- Java
- Curl
import weaviate
from weaviate.classes.init import Auth
import os, json
# Best practice: store your credentials in environment variables
wcd_url = os.environ["WCD_URL"]
wcd_api_key = os.environ["WCD_API_KEY"]
client = weaviate.connect_to_weaviate_cloud(
cluster_url=wcd_url, # Replace with your Weaviate Cloud URL
auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key
)
questions = client.collections.get("Question")
response = questions.query.near_text(
query="biology",
limit=2
)
for obj in response.objects:
print(json.dumps(obj.properties, indent=2))
client.close() # Free up resources
import weaviate, { WeaviateClient } from 'weaviate-client';
// Best practice: store your credentials in environment variables
const wcdUrl = process.env.WCD_URL as string;
const wcdApiKey = process.env.WCD_API_KEY as string;
const client: WeaviateClient = await weaviate.connectToWeaviateCloud(
wcdUrl, // Replace with your Weaviate Cloud URL
{
authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key
}
);
const questions = client.collections.get('Question');
const result = await questions.query.nearText('biology', {
limit: 2,
});
result.objects.forEach((item) => {
console.log(JSON.stringify(item.properties, null, 2));
});
client.close(); // Close the client connection
// Set these environment variables
// WCD_HOSTNAME your Weaviate instance hostname
// WCD_API_KEY your Weaviate instance API key
package main
import (
"context"
"fmt"
"os"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/auth"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: os.Getenv("WCD_HOSTNAME"),
Scheme: "https",
AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")},
}
client, err := weaviate.NewClient(cfg)
if err != nil {
fmt.Println(err)
}
ctx := context.Background()
response, err := client.GraphQL().Get().
WithClassName("Question").
WithFields(
graphql.Field{Name: "question"},
graphql.Field{Name: "answer"},
graphql.Field{Name: "category"},
).
WithNearText(client.GraphQL().NearTextArgBuilder().
WithConcepts([]string{"biology"})).
WithLimit(2).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Printf("%v", response)
}
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateAuthClient;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.argument.NearTextArgument;
import io.weaviate.client.v1.graphql.query.builder.GetBuilder;
import io.weaviate.client.v1.graphql.query.fields.Field;
import io.weaviate.client.v1.graphql.query.fields.Fields;
import java.util.HashMap;
import java.util.Map;
// Set these environment variables
// WCD_HOSTNAME Your Weaviate instance hostname
// WCD_API_KEY Your Weaviate instance API key
public class NearText {
public static void main(String[] args) throws Exception {
String host = System.getenv("WCD_HOSTNAME");
String apiKey = System.getenv("WCD_API_KEY");
Config config = new Config("https", host);
WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey);
NearTextArgument nearText = NearTextArgument.builder()
.concepts(new String[]{"biology"})
.build();
Fields fields = Fields.builder()
.fields(new Field[]{
Field.builder().name("question").build(),
Field.builder().name("answer").build(),
})
.build();
String query = GetBuilder.builder()
.className("Question")
.fields(fields)
.withNearTextFilter(nearText)
.limit(2)
.build()
.buildQuery();
Result<GraphQLResponse> result = client.graphQL().raw().withQuery(query).run();
System.out.println(result.getResult());
}
}
# Best practice: store your credentials in environment variables
# export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL
# export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key
echo '{
"query": "{
Get {
Question (
limit: 2
nearText: {
concepts: [\"biology\"],
}
) {
question
answer
category
}
}
}"
}' | tr -d "\n" | curl \
-X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $WCD_API_KEY" \
-d @- \
$WCD_URL/v1/graphql
Run this code to perform the query. Our query found entries for DNA
and species
.
Example full response in JSON format
{
{
"answer": "DNA",
"question": "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance",
"category": "SCIENCE"
},
{
"answer": "species",
"question": "2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new one of this classification",
"category": "SCIENCE"
}
}
If you inspect the full response, you will see that the word biology
does not appear anywhere.
Even so, Weaviate was able to return biology-related entries. This is made possible by vector embeddings that capture meaning. Under the hood, semantic search is powered by vectors, or vector embeddings.
Here is a diagram showing the workflow in Weaviate.
Weaviate used the Weaviate Embeddings service to generate a vector embedding for each object during import. During the query, Weaviate similarly converted the query (biology
) into a vector.
As we mentioned above, this is optional. See Starter Guide: Bring Your Own Vectors if you would prefer to provide your own vectors.
Weaviate is capable of many types of searches. See, for example, our how-to guides on similarity searches, keyword searches, hybrid searches, and filtered searches.
4.2 Retrieval augmented generation
Retrieval augmented generation (RAG), also called generative search, combines the power of generative AI models such as large language models (LLMs) with the up-to-date truthfulness of a database.
RAG works by prompting a large language model (LLM) with a combination of a user query and data retrieved from a database.
This diagram shows the RAG workflow in Weaviate.
The following example combines the same search (for biology
) with a prompt to generate a tweet.
- Python
- JS/TS
- Go
- Java
- Curl
import weaviate
from weaviate.classes.init import Auth
import os
# Best practice: store your credentials in environment variables
wcd_url = os.environ["WCD_URL"]
wcd_api_key = os.environ["WCD_API_KEY"]
cohere_api_key = os.environ["COHERE_APIKEY"]
client = weaviate.connect_to_weaviate_cloud(
cluster_url=wcd_url, # Replace with your Weaviate Cloud URL
auth_credentials=Auth.api_key(wcd_api_key), # Replace with your Weaviate Cloud key
headers={"X-Cohere-Api-Key": cohere_api_key}, # Replace with your Cohere API key
)
questions = client.collections.get("Question")
response = questions.generate.near_text(
query="biology",
limit=2,
grouped_task="Write a tweet with emojis about these facts."
)
print(response.generated) # Inspect the generated text
client.close() # Free up resources
import weaviate, { WeaviateClient } from 'weaviate-client';
// Best practice: store your credentials in environment variables
const wcdUrl = process.env.WCD_URL as string;
const wcdApiKey = process.env.WCD_API_KEY as string;
const cohereKey = process.env.COHERE_APIKEY as string;
const client: WeaviateClient = await weaviate.connectToWeaviateCloud(
wcdUrl, // Replace with your Weaviate Cloud URL
{
authCredentials: new weaviate.ApiKey(wcdApiKey), // Replace with your Weaviate Cloud API key
headers: {
'X-Cohere-Api-Key': cohereKey, // Replace with your Cohere API key
},
}
);
const questions = client.collections.get('Question');
const result = await questions.generate.nearText(
'biology',
{
groupedTask: 'Write a tweet with emojis about these facts.',
},
{
limit: 2,
}
);
console.log(result.generated);
client.close(); // Close the client connection
// Set these environment variables
// WCD_HOSTNAME your Weaviate instance hostname
// WCD_API_KEY your Weaviate instance API key
// COHERE_APIKEY your Cohere API key
package main
import (
"context"
"fmt"
"os"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/auth"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: os.Getenv("WCD_HOSTNAME"),
Scheme: "https",
AuthConfig: auth.ApiKey{Value: os.Getenv("WCD_API_KEY")},
Headers: map[string]string{
"X-Cohere-Api-Key": os.Getenv("COHERE_APIKEY"),
},
}
client, err := weaviate.NewClient(cfg)
if err != nil {
fmt.Println(err)
}
ctx := context.Background()
generatePrompt := "Write a tweet with emojis about these facts."
gs := graphql.NewGenerativeSearch().GroupedResult(generatePrompt)
response, err := client.GraphQL().Get().
WithClassName("Question").
WithFields(
graphql.Field{Name: "question"},
graphql.Field{Name: "answer"},
graphql.Field{Name: "category"},
).
WithGenerativeSearch(gs).
WithNearText(client.GraphQL().NearTextArgBuilder().
WithConcepts([]string{"biology"})).
WithLimit(2).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Printf("%v", response)
}
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateAuthClient;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.argument.NearTextArgument;
import io.weaviate.client.v1.graphql.query.builder.GetBuilder;
import io.weaviate.client.v1.graphql.query.fields.Field;
import io.weaviate.client.v1.graphql.query.fields.Fields;
import io.weaviate.client.v1.graphql.query.fields.GenerativeSearchBuilder;
import java.util.HashMap;
import java.util.Map;
// Set these environment variables
// WCD_HOSTNAME Your Weaviate instance hostname
// WCD_API_KEY Your Weaviate instance API key
// COHERE_APIKEY Your Cohere API key
public class RAG {
public static void main(String[] args) throws Exception {
String host = System.getenv("WCD_HOSTNAME");
String apiKey = System.getenv("WCD_API_KEY");
String cohereKey = System.getenv("COHERE_APIKEY");
Map<String, String> headers = new HashMap<String, String>() { {
put("X-Cohere-Api-Key", cohereKey);
} };
Config config = new Config("https", host, headers);
WeaviateClient client = WeaviateAuthClient.apiKey(config, apiKey);
NearTextArgument nearText = NearTextArgument.builder()
.concepts(new String[]{"biology"})
.build();
GenerativeSearchBuilder ragQuery = GenerativeSearchBuilder.builder()
.groupedResultTask("Write a tweet with emojis about these facts.")
.build();
Fields fields = Fields.builder()
.fields(new Field[]{
Field.builder().name("question").build(),
Field.builder().name("answer").build(),
})
.build();
String query = GetBuilder.builder()
.className("Question")
.fields(fields)
.withNearTextFilter(nearText)
.withGenerativeSearch(ragQuery)
.limit(2)
.build()
.buildQuery();
Result<GraphQLResponse> result = client.graphQL().raw().withQuery(query).run();
System.out.println(result.getResult());
}
}
# Best practice: store your credentials in environment variables
# export WCD_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL
# export WCD_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key
# export COHERE_APIKEY="YOUR_API_KEY" # Your Cohere API key
echo '{
"query": "{
Get {
Question (
limit: 2
nearText: {
concepts: [\"biology\"],
}
) {
question
answer
category
_additional {
generate(
groupedResult: {
task: \"\"\"
Write a tweet with emojis about these facts.
\"\"\"
}
) {
groupedResult
error
}
}
}
}
}"
}' | tr -d "\n" | curl \
-X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $WCD_API_KEY" \
-H "X-Cohere-Api-Key: $COHERE_APIKEY" \
-d @- \
$WCD_URL/v1/graphql
Note that this code includes an additional header for the Cohere API key. Weaviate uses this key to access the Cohere generative AI model and perform retrieval augmented generation (RAG).
Run this code to perform the query. Here is one possible response (your response will likely be different).
🧬 In 1953 Watson & Crick built a model of the molecular structure of DNA, the gene-carrying substance! 🧬🔬
🦢 2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new species! 🦢🌿 #ScienceFacts #DNA #SpeciesClassification
The response should be new, yet familiar. This is because you have seen the entries above for DNA
and species
in the semantic search section.
The power of RAG comes from the ability to transform your own data. Weaviate helps you in this journey by making it easy to perform a combined search & generation in just a few lines of code.
Next steps
Try these additional resources to learn more about Weaviate:
Support
For help with Serverless Cloud, Enterprise Cloud, and Bring Your Own Cloud accounts, contact Weaviate support directly to open a support ticket.
For questions and support from the Weaviate community, try these resources:
To add a support plan, contact Weaviate sales.