ฐานข้อมูลเวกเตอร์แบบฝังตัวสำหรับไปกับอินเตอร์เฟสที่มีลักษณะคล้ายโครมาและการพึ่งพาของบุคคลที่สามเป็นศูนย์ ในหน่วยความจำด้วยการคงอยู่เสริม
เนื่องจาก chromem-go ถูกฝังได้จึงช่วยให้คุณสามารถเพิ่มการเพิ่มการดึง (RAG) และคุณสมบัติที่ใช้ฝังตัวที่คล้ายกันลงในแอพ GO ของคุณ โดยไม่ต้องเรียกใช้ฐานข้อมูลแยกต่างหาก เช่นเมื่อใช้ sqlite แทน postgreSQL/mysql/etc
มัน ไม่ใช่ ห้องสมุดที่จะเชื่อมต่อกับ Chroma และไม่ได้ทำการปรับแต่งใหม่ใน GO มันเป็นฐานข้อมูลด้วยตัวเอง
โฟกัสไม่ใช่ขนาด (เอกสารหลายล้านรายการ) หรือจำนวนคุณสมบัติ แต่ความเรียบง่ายและประสิทธิภาพสำหรับกรณีการใช้งานที่พบบ่อยที่สุด ใน CPU แล็ปท็อปในช่วงกลางปี 2020 คุณสามารถสอบถามเอกสารได้ 1,000 ฉบับใน 0.3 ms และ 100,000 เอกสารใน 40 ms โดยมีการจัดสรรหน่วยความจำน้อยและเล็กมาก ดูเกณฑ์มาตรฐานสำหรับรายละเอียด
โครงการอยู่ในช่วงเบต้าภายใต้การก่อสร้างที่หนักและอาจแนะนำการเปลี่ยนแปลงที่เกิดขึ้นก่อนการเผยแพร่ก่อน v1.0.0การเปลี่ยนแปลงทั้งหมดมีการบันทึกไว้ในCHANGELOG
ด้วยฐานข้อมูลเวกเตอร์คุณสามารถทำสิ่งต่าง ๆ ได้:
มาดูเคสใช้ผ้าขี้ริ้วโดยละเอียดเพิ่มเติม:
ความรู้เกี่ยวกับแบบจำลองภาษาขนาดใหญ่ (LLMS) - แม้แต่คนที่มีพารามิเตอร์ 30 พันล้าน, 70 พันล้านพารามิเตอร์และอื่น ๆ - มี จำกัด พวกเขาไม่รู้อะไรเลยเกี่ยวกับสิ่งที่เกิดขึ้นหลังจากการฝึกซ้อมสิ้นสุดลงพวกเขาไม่รู้อะไรเกี่ยวกับข้อมูลที่พวกเขาไม่ได้รับการฝึกฝน (เช่นอินทราเน็ตของ บริษัท ของคุณตัวติดตามจิรา / บั๊กวิกิหรือฐานความรู้อื่น ๆ ) และแม้แต่ข้อมูลที่พวกเขา รู้ ว่าพวกเขามักจะไม่สามารถทำ ซ้ำได้
การปรับแต่ง LLM สามารถช่วยได้เล็กน้อย แต่มันมีความหมายมากกว่าที่จะปรับปรุงการให้เหตุผล LLMS เกี่ยวกับหัวข้อเฉพาะหรือทำซ้ำรูปแบบของข้อความหรือรหัสที่เขียน การปรับแต่ง ไม่ได้ เพิ่มความรู้ 1: 1 ลงในโมเดล รายละเอียดจะหายไปหรือปะปนกัน และการตัดความรู้ (เกี่ยวกับสิ่งที่เกิดขึ้นหลังจากการปรับแต่ง) ไม่ได้รับการแก้ไขเช่นกัน
=> ฐานข้อมูลเวกเตอร์สามารถทำหน้าที่เป็นความรู้ที่ทันสมัยและแม่นยำสำหรับ LLMS:
text-embedding-3-smallchromem-go สามารถทำสิ่งนี้ให้คุณและรองรับผู้ให้บริการฝังตัวหลายรายและโมเดลนอกกรอบตรวจสอบรหัสตัวอย่างเพื่อดูการดำเนินการ!
แรงบันดาลใจดั้งเดิมของเราคืออินเทอร์เฟซ Chroma ซึ่ง Core API มีต่อไปนี้ (นำมาจาก readme ของพวกเขา):
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
)ห้องสมุด GO ของเราเปิดเผยอินเทอร์เฟซเดียวกัน:
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
)
} เริ่มแรก chromem-go เริ่มต้นด้วยวิธีการหลักสี่วิธี แต่เราเพิ่มมากขึ้นเมื่อเวลาผ่านไป เราตั้งใจไม่ต้องการครอบคลุม 100% ของพื้นผิว API ของ Chroma
เรากำลังให้วิธีการทางเลือกบางอย่างที่เป็นไปได้มากกว่า
สำหรับอินเทอร์เฟซแบบเต็มรูป
chromem.EmbeddingFunc )chromem-go สร้างขึ้น$contains , $not_contains io.Writer / io.Reader ทั่วไปเพื่อให้คุณสามารถเสียบถัง S3 และที่เก็บข้อมูลอื่น ๆ ดูตัวอย่าง / S3-Export-Import เป็นตัวอย่างรหัสตัวอย่างEmbeddingFunc ที่ดาวน์โหลดและเชลล์ออกไปยัง llamafile$and , $or ฯลฯ ) go get github.com/philippgille/chromem-go@latest
ดู Godoc สำหรับการอ้างอิง: https://pkg.go.dev/github.com/philippgille/chromem-go
สำหรับตัวอย่างที่ใช้งานได้เต็มรูปแบบโดยใช้ฐานข้อมูลเวกเตอร์สำหรับการสร้าง Augmented Generation (RAG) และการค้นหาเชิงความหมายและการใช้ OpenAI หรือใช้งานรุ่น Embeddings และ LLM (ใน Ollama) ดูรหัสตัวอย่าง
สิ่งนี้นำมาจากตัวอย่าง "น้อยที่สุด":
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 )
}เอาท์พุท:
ID: 1
Similarity: 0.6833369
Content: The sky is blue because of Rayleigh scattering.
เปรียบเทียบกับ 2024-03-17 ด้วย:
$ 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 . (เพิ่ม > bench.out หรือคล้ายกับการเขียนไปยังไฟล์)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 ในเดือนธันวาคม 2566 เมื่อฉันต้องการเล่นกับการเพิ่มการดึง (RAG) ในโปรแกรม GO ฉันมองหาฐานข้อมูลเวกเตอร์ที่สามารถฝังตัวในโปรแกรม GO ได้เช่นเดียวกับที่คุณจะฝัง SQLite เพื่อไม่ต้องติดตั้ง DB และการบำรุงรักษาแยกต่างหาก ฉันประหลาดใจเมื่อฉันไม่พบอะไรเลยเนื่องจากความอุดมสมบูรณ์ของร้านค้าคีย์-ค่าฝังในระบบนิเวศ
ในขณะที่ฐานข้อมูลเวกเตอร์ยอดนิยมส่วนใหญ่เช่น Pinecone, Qdrant, Milvus, Chroma, Weaviate และอื่น ๆ ไม่สามารถฝังได้ทั้งหมดหรือเฉพาะใน Python หรือ JavaScript/typescript
จากนั้นฉันพบโพสต์บล็อกของ @Eliben และรหัสตัวอย่างซึ่งแสดงให้เห็นว่าด้วยรหัส GO น้อยมากคุณสามารถสร้าง POC พื้นฐานของฐานข้อมูลเวกเตอร์
นั่นคือเมื่อฉันตัดสินใจที่จะสร้างฐานข้อมูลเวกเตอร์ของตัวเองฝังอยู่ใน GO ซึ่งได้รับแรงบันดาลใจจากอินเทอร์เฟซ Chromadb Chromadb โดดเด่นสำหรับการฝัง (ใน Python) และโดยการแสดง API หลักใน 4 คำสั่งบน readme ของพวกเขาและบนหน้า Landing Page ของเว็บไซต์ของพวกเขา