A simple Chroma Vector Database client written in Go
Works with Chroma Version: v0.4.3 - v0.5.x
We invite users to visit the docs site for the library for more in-depth information: Chroma Go Docs
0.2.0
+, we also support the default all-MiniLM-L6-v2
model running on Onnx Runtime (ORT). From release 0.2.0
the Chroma Go client also supports Reranking functions. The following are supported:
[!IMPORTANT]
There are many new changes leading up tov0.2.0
, as documented below. If you'd like to use them please install the latest version of the client.go get github.com/amikos-tech/chroma-go@main
go get github.com/amikos-tech/chroma-go
Import:
import (
chroma "github.com/amikos-tech/chroma-go"
)
Ensure you have a running instance of Chroma running. We recommend one of the two following options:
Docker
, minikube
and kubectl
installed)The Setup (Cloud-native):
minikube start --profile chromago
minikube profile chromago
helm repo add chroma https://amikos-tech.github.io/chromadb-chart/
helm repo update
helm install chroma chroma/chromadb --set chromadb.allowReset=true,chromadb.apiVersion=0.4.5
|Note: To delete the minikube cluster: minikube delete --profile chromago
Consider the following example where:
package main
import (
"context"
"fmt"
"log"
"os"
chroma "github.com/amikos-tech/chroma-go"
"github.com/amikos-tech/chroma-go/collection"
openai "github.com/amikos-tech/chroma-go/pkg/embeddings/openai"
"github.com/amikos-tech/chroma-go/types"
)
func main() {
// Create a new Chroma client
client,err := chroma.NewClient(chroma.WithBasePath("http://localhost:8000"))
if err != nil {
log.Fatalf("Error creating client: %s \n", err)
return
}
// Close the client to release any resources such as local embedding functions
defer func() {
err = client.Close()
if err != nil {
log.Fatalf("Error closing client: %s \n", err)
}
}()
// Create a new collection with options. We don't provide an embedding function here, so the default embedding function will be used
newCollection, err := client.NewCollection(
context.TODO(),
"test-collection",
collection.WithMetadata("key1", "value1"),
collection.WithHNSWDistanceFunction(types.L2),
)
if err != nil {
log.Fatalf("Error creating collection: %s \n", err)
}
// Create a new record set with to hold the records to insert
rs, err := types.NewRecordSet(
types.WithEmbeddingFunction(newCollection.EmbeddingFunction), // we pass the embedding function from the collection
types.WithIDGenerator(types.NewULIDGenerator()),
)
if err != nil {
log.Fatalf("Error creating record set: %s \n", err)
}
// Add a few records to the record set
rs.WithRecord(types.WithDocument("My name is John. And I have two dogs."), types.WithMetadata("key1", "value1"))
rs.WithRecord(types.WithDocument("My name is Jane. I am a data scientist."), types.WithMetadata("key2", "value2"))
// Build and validate the record set (this will create embeddings if not already present)
_, err = rs.BuildAndValidate(context.TODO())
if err != nil {
log.Fatalf("Error validating record set: %s \n", err)
}
// Add the records to the collection
_, err = newCollection.AddRecords(context.Background(), rs)
if err != nil {
log.Fatalf("Error adding documents: %s \n", err)
}
// Count the number of documents in the collection
countDocs, qrerr := newCollection.Count(context.TODO())
if qrerr != nil {
log.Fatalf("Error counting documents: %s \n", qrerr)
}
// Query the collection
fmt.Printf("countDocs: %v\n", countDocs) //this should result in 2
qr, qrerr := newCollection.Query(context.TODO(), []string{"I love dogs"}, 5, nil, nil, nil)
if qrerr != nil {
log.Fatalf("Error querying documents: %s \n", qrerr)
}
fmt.Printf("qr: %v\n", qr.Documents[0][0]) //this should result in the document about dogs
}
make build
make test
make generate
make lint-fix
Note: Docker must be installed
make server