Database vektor yang dapat disematkan untuk GO dengan antarmuka seperti chroma dan nol dependensi pihak ketiga. Dalam memori dengan kegigihan opsional.
Karena chromem-go dapat disematkan, ini memungkinkan Anda untuk menambahkan pengambilan augmented generasi (RAG) dan fitur berbasis embeddings serupa ke dalam aplikasi GO Anda tanpa harus menjalankan database terpisah . Seperti saat menggunakan sqlite alih -alih postgresql/mysql/dll.
Ini bukan perpustakaan untuk terhubung ke Chroma dan juga bukan penerimaan ulang di Go. Ini adalah database sendiri.
Fokusnya bukan skala (jutaan dokumen) atau jumlah fitur, tetapi kesederhanaan dan kinerja untuk kasus penggunaan yang paling umum. Pada CPU laptop Intel 2020 mid-range Anda dapat meminta 1.000 dokumen dalam 0,3 ms dan 100.000 dokumen dalam 40 ms, dengan sangat sedikit dan alokasi memori kecil. Lihat tolok ukur untuk detailnya.
️ Proyek ini dalam beta, di bawah konstruksi berat, dan dapat memperkenalkan perubahan rilis sebelumv1.0.0. Semua perubahan didokumentasikan dalamCHANGELOG.
Dengan database vektor Anda dapat melakukan berbagai hal:
Mari kita lihat case penggunaan kain secara lebih rinci:
Pengetahuan tentang model bahasa besar (LLM) - bahkan yang dengan 30 miliar, 70 miliar parameter dan banyak lagi - terbatas. Mereka tidak tahu apa -apa tentang apa yang terjadi setelah pelatihan mereka berakhir, mereka tidak tahu apa -apa tentang data yang tidak mereka latih (seperti intranet perusahaan Anda, pelacak jira / bug, wiki atau jenis basis pengetahuan lainnya), dan bahkan data yang mereka tahu mereka sering tidak dapat mereproduksi dengan tepat , tetapi mulai berhalusinasi sebagai gantinya.
Menyempurnakan LLM dapat membantu sedikit, tetapi lebih dimaksudkan untuk meningkatkan penalaran LLM tentang topik tertentu, atau mereproduksi gaya teks atau kode tertulis. Fine-tuning tidak menambah pengetahuan 1: 1 ke dalam model. Detail hilang atau campur aduk. Dan cutoff pengetahuan (tentang apa pun yang terjadi setelah penyetelan fine) juga tidak diselesaikan.
=> Basis data vektor dapat bertindak sebagai pengetahuan yang terbaru dan tepat untuk LLMS:
text-embedding-3-small openai.chromem-go dapat melakukan ini untuk Anda dan mendukung beberapa penyedia dan model embedding out-of-the-box.Lihat kode contoh untuk melihatnya beraksi!
Inspirasi asli kami adalah Antarmuka Chroma, yang API intinya adalah sebagai berikut (diambil dari Readme mereka):
import chromadb
# setup Chroma in-memory, for easy prototyping. Can add persistence easily!
client = chromadb . Client ()
# Create collection. get_collection, get_or_create_collection, delete_collection also available!
collection = client . create_collection ( "all-my-documents" )
# Add docs to the collection. Can also update and delete. Row-based API coming soon!
collection . add (
documents = [ "This is document1" , "This is document2" ], # we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well
metadatas = [{ "source" : "notion" }, { "source" : "google-docs" }], # filter on these!
ids = [ "doc1" , "doc2" ], # unique for each doc
)
# Query/search 2 most similar results. You can also .get by id
results = collection . query (
query_texts = [ "This is a query document" ],
n_results = 2 ,
# where={"metadata_field": "is_equal_to_this"}, # optional filter
# where_document={"$contains":"search_string"} # optional filter
)Perpustakaan GO kami memperlihatkan antarmuka yang sama:
package main
import "github.com/philippgille/chromem-go"
func main () {
// Set up chromem-go in-memory, for easy prototyping. Can add persistence easily!
// We call it DB instead of client because there's no client-server separation. The DB is embedded.
db := chromem . NewDB ()
// Create collection. GetCollection, GetOrCreateCollection, DeleteCollection also available!
collection , _ := db . CreateCollection ( "all-my-documents" , nil , nil )
// Add docs to the collection. Update and delete will be added in the future.
// Can be multi-threaded with AddConcurrently()!
// We're showing the Chroma-like method here, but more Go-idiomatic methods are also available!
_ = collection . Add ( ctx ,
[] string { "doc1" , "doc2" }, // unique ID for each doc
nil , // We handle embedding automatically. You can skip that and add your own embeddings as well.
[] map [ string ] string {{ "source" : "notion" }, { "source" : "google-docs" }}, // Filter on these!
[] string { "This is document1" , "This is document2" },
)
// Query/search 2 most similar results. You can also get by ID.
results , _ := collection . Query ( ctx ,
"This is a query document" ,
2 ,
map [ string ] string { "metadata_field" : "is_equal_to_this" }, // optional filter
map [ string ] string { "$contains" : "search_string" }, // optional filter
)
} Awalnya chromem-go dimulai dengan hanya empat metode inti, tetapi kami menambahkan lebih banyak dari waktu ke waktu. Kami sengaja tidak ingin menutupi 100% permukaan API Chroma.
Kami menyediakan beberapa metode alternatif yang lebih go-idiomatik.
Untuk antarmuka lengkap, lihat Godoc: https://pkg.go.dev/github.com/philippgille/chromem-go
chromem.EmbeddingFunc )chromem-go membuatnya$contains , $not_contains io.Writer / io.Reader generik sehingga Anda dapat mencolokkan ember S3 dan penyimpanan gumpalan lainnya, lihat contoh / S3-Export-Import untuk kode contohEmbeddingFunc yang mengunduh dan cangkang ke llamafile$and , $or dll.) go get github.com/philippgille/chromem-go@latest
Lihat Godoc untuk referensi: https://pkg.go.dev/github.com/philippgille/chromem-go
Untuk contoh penuh, yang berfungsi, menggunakan database vektor untuk pengambilan augmented generasi (RAG) dan pencarian semantik dan menggunakan openai atau secara lokal menjalankan model embeddings dan LLM (di ollama), lihat kode contoh.
Ini diambil dari contoh "minimal":
package main
import (
"context"
"fmt"
"runtime"
"github.com/philippgille/chromem-go"
)
func main () {
ctx := context . Background ()
db := chromem . NewDB ()
c , err := db . CreateCollection ( "knowledge-base" , nil , nil )
if err != nil {
panic ( err )
}
err = c . AddDocuments ( ctx , []chromem. Document {
{
ID : "1" ,
Content : "The sky is blue because of Rayleigh scattering." ,
},
{
ID : "2" ,
Content : "Leaves are green because chlorophyll absorbs red and blue light." ,
},
}, runtime . NumCPU ())
if err != nil {
panic ( err )
}
res , err := c . Query ( ctx , "Why is the sky blue?" , 1 , nil , nil )
if err != nil {
panic ( err )
}
fmt . Printf ( "ID: %v n Similarity: %v n Content: %v n " , res [ 0 ]. ID , res [ 0 ]. Similarity , res [ 0 ]. Content )
}Keluaran:
ID: 1
Similarity: 0.6833369
Content: The sky is blue because of Rayleigh scattering.
Benchmarked pada 2024-03-17 dengan:
$ go test -benchmem -run=^$ -bench .
goos: linux
goarch: amd64
pkg: github.com/philippgille/chromem-go
cpu: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
BenchmarkCollection_Query_NoContent_100-8 13164 90276 ns/op 5176 B/op 95 allocs/op
BenchmarkCollection_Query_NoContent_1000-8 2142 520261 ns/op 13558 B/op 141 allocs/op
BenchmarkCollection_Query_NoContent_5000-8 561 2150354 ns/op 47096 B/op 173 allocs/op
BenchmarkCollection_Query_NoContent_25000-8 120 9890177 ns/op 211783 B/op 208 allocs/op
BenchmarkCollection_Query_NoContent_100000-8 30 39574238 ns/op 810370 B/op 232 allocs/op
BenchmarkCollection_Query_100-8 13225 91058 ns/op 5177 B/op 95 allocs/op
BenchmarkCollection_Query_1000-8 2226 519693 ns/op 13552 B/op 140 allocs/op
BenchmarkCollection_Query_5000-8 550 2128121 ns/op 47108 B/op 173 allocs/op
BenchmarkCollection_Query_25000-8 100 10063260 ns/op 211705 B/op 205 allocs/op
BenchmarkCollection_Query_100000-8 30 39404005 ns/op 810295 B/op 229 allocs/op
PASS
ok github.com/philippgille/chromem-go 28.402s go build ./...go test -v -race -count 1 ./...go test -benchmem -run=^$ -bench . (Tambah > bench.out atau Mirip dengan Menulis ke File)go test -benchmem -run ^$ -cpuprofile cpu.out -bench .-cpuprofile , -memprofile , -blockprofile , -mutexprofile )benchstat : go install golang.org/x/perf/cmd/benchstat@latestbenchstat before.out after.out Pada bulan Desember 2023, ketika saya ingin bermain -main dengan Retrieval Augmented Generation (RAG) dalam program GO, saya mencari database vektor yang dapat tertanam dalam program GO, sama seperti Anda akan menyematkan SQLite agar tidak memerlukan pengaturan dan pemeliharaan DB yang terpisah. Saya terkejut ketika saya tidak menemukannya, mengingat banyaknya toko-toko nilai kunci tertanam di ekosistem Go.
Pada saat sebagian besar database vektor populer seperti Pinecone, Qdrant, Milvus, Chroma, Weaviate dan lainnya tidak dapat disematkan sama sekali atau hanya dalam Python atau JavaScript/TypeScript.
Kemudian saya menemukan posting blog @Eliben dan kode contoh yang menunjukkan bahwa dengan kode GO yang sangat sedikit Anda dapat membuat POC yang sangat mendasar dari database vektor.
Saat itulah saya memutuskan untuk membangun database vektor saya sendiri, disematkan di Go, terinspirasi oleh antarmuka Chromadb. Chromadb menonjol karena disematkan (dalam Python), dan dengan menunjukkan API intinya dalam 4 perintah pada readme mereka dan di halaman arahan situs web mereka.