适用于 Go 的可嵌入向量数据库,具有类 Chroma 接口,零第三方依赖。内存存储,可选持久化。
由于 chromem-go
是可嵌入的,它使您能够将检索增强生成(RAG)和类似的基于嵌入的功能添加到您的 Go 应用程序中,而无需运行单独的数据库。就像使用 SQLite 而不是 PostgreSQL/MySQL 等。
它不是连接 Chroma 的库,也不是用 Go 重新实现 Chroma。它是一个独立的数据库。
重点不是规模(数百万文档)或功能数量,而是最常见用例的简单性和性能。在 2020 年中端英特尔笔记本 CPU 上,您可以在 0.3 毫秒内查询 1,000 个文档,在 40 毫秒内查询 100,000 个文档,内存分配很少且很小。详情请参见基准测试。
⚠️ 该项目处于测试阶段,正在大规模构建中,在
v1.0.0
发布之前的版本中可能会引入重大更改。所有更改都记录在CHANGELOG
中。
使用向量数据库,您可以做各种事情:
让我们详细看看 RAG 使用场景:
大型语言模型(LLM)的知识是有限的 - 即使是那些拥有 300 亿、700 亿甚至更多参数的模型。它们不知道训练结束后发生的事情,不知道未经训练的数据(如您公司的内网、Jira / 错误跟踪器、维基或其他类型的知识库),即使是它们确实知道的数据,它们通常也无法准确重现,反而会开始产生"幻觉"。
微调 LLM 可以稍微有所帮助,但它更多是为了改善 LLM 对特定主题的推理,或重现文本或代码的风格。微调并不能将知识一对一地添加到模型中。细节会丢失或混淆。而且知识截止(关于微调后发生的任何事情)的问题也没有解决。
=> 向量数据库可以作为 LLM 的最新、精确知识来源:
text-embedding-3-small
)创建。
chromem-go
可以为您完成这项工作,并支持多个嵌入提供商和模型。查看 示例代码 以了解其运行情况!
我们最初的灵感来自 Chroma 接口,其核心 API 如下(摘自他们的 README):
<details><summary>Chroma 核心接口</summary></details>import chromadb # 在内存中设置 Chroma,便于原型设计。可以轻松添加持久性! client = chromadb.Client() # 创建集合。还可使用 get_collection、get_or_create_collection、delete_collection! collection = client.create_collection("all-my-documents") # 向集合添加文档。也可以更新和删除。基于行的 API 即将推出! collection.add( documents=["这是文档1", "这是文档2"], # 我们自动处理分词、嵌入和索引。你也可以跳过这些步骤,添加自己的嵌入 metadatas=[{"来源": "notion"}, {"来源": "google-docs"}], # 可以基于这些进行过滤! ids=["doc1", "doc2"], # 每个文档唯一 ) # 查询/搜索2个最相似的结果。你也可以通过 id 使用 .get 方法获取 results = collection.query( query_texts=["这是一个查询文档"], n_results=2, # where={"元数据字段": "等于这个值"}, # 可选过滤器 # where_document={"$contains":"搜索字符串"} # 可选过滤器 )
我们的 Go 库提供了相同的接口:
<details><summary>chromem-go 等效代码</summary></details>package main import "github.com/philippgille/chromem-go" func main() { // 设置 chromem-go 内存模式,方便原型开发。可以轻松添加持久化! // 我们称之为 DB 而不是 client,因为没有客户端-服务器分离。DB 是嵌入式的。 db := chromem.NewDB() // 创建集合。也可以使用 GetCollection、GetOrCreateCollection、DeleteCollection! collection, _ := db.CreateCollection("我的所有文档", nil, nil) // 向集合添加文档。未来将添加更新和删除功能。 // 可以使用 AddConcurrently() 进行多线程处理! // 这里我们展示了类似 Chroma 的方法,但也提供了更符合 Go 习惯的方法! _ = collection.Add(ctx, []string{"doc1", "doc2"}, // 每个文档的唯一 ID nil, // 我们自动处理嵌入。你也可以跳过这步,添加自己的嵌入。 []map[string]string{{"来源": "notion"}, {"来源": "google-docs"}}, // 可以基于这些进行过滤! []string{"这是文档1", "这是文档2"}, ) // 查询/搜索2个最相似的结果。未来将添加通过 ID 获取的功能。 results, _ := collection.Query(ctx, "这是一个查询文档", 2, map[string]string{"元数据字段": "等于这个值"}, // 可选过滤器 map[string]string{"$contains": "搜索字符串"}, // 可选过滤器 ) }
最初,chromem-go
只有四个核心方法,但随着时间推移 我们添加了更多功能。不过我们有意不覆盖 Chroma 100% 的 API 表面。
我们提供了一些更符合 Go 习惯的替代方法。
完整接口请参见 Godoc:https://pkg.go.dev/github.com/philippgille/chromem-go
chromem.EmbeddingFunc
)chromem-go
创建它们$contains
、$not_contains
io.Writer
/io.Reader
的方法,因此你可以插入 S3 存储桶和其他 blob 存储,示例代码见 examples/s3-export-importEmbeddingFunc
,用于下载并调用llamafile$and
、$or
等)go get github.com/philippgille/chromem-go@latest
参考Godoc文档:https://pkg.go.dev/github.com/philippgille/chromem-go
完整的工作示例,使用向量数据库进行检索增强生成(RAG)和语义搜索,并使用OpenAI或本地运行嵌入模型和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: "天空呈蓝色是因为瑞利散射。", }, { ID: "2", Content: "树叶是绿色的因为叶绿素吸收红光和蓝光。", }, }, runtime.NumCPU()) if err != nil { panic(err) } res, err := c.Query(ctx, "为什么天空是蓝色的?", 1, nil, nil) if err != nil { panic(err) } fmt.Printf("ID: %v\n相似度: %v\n内容: %v\n", res[0].ID, res[0].Similarity, res[0].Content) }
输出:
ID: 1 相似度: 0.6833369 内容: 天空呈蓝色是因为瑞利散射。
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@latest
benchstat before.out after.out
2023年12月,当我想在Go程序中尝试检索增强生成(RAG)时,我寻找一个可以嵌入Go程序的向量数据库,就像嵌入SQLite那样,不需要单独的数据库设置和维护。令我惊讶的是,考虑到Go生态系统中嵌入式键值存储的丰富性,我竟然找不到这样的数据库。
当时,大多数流行的向量数据库,如Pinecone、Qdrant、Milvus、Chroma、Weaviate等,要么完全不可嵌入,要么只能在Python或JavaScript/TypeScript中嵌入。
后来我发现了@eliben的博客文章和示例代码,展示了如何用很少的Go代码创建一个非常基础的向量数据库概念验证。
那时我 决定构建自己的向量数据库,可嵌入Go,灵感来自ChromaDB的接口。ChromaDB因可嵌入(在Python中)而脱颖而出,并在其README和网站首页上展示了其核心API的4个命令。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种 方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信 扫一扫关注公众号