当前位置:   article > 正文

向量数据库Chroma教程_chroma 数据库

chroma 数据库

引言

随着大模型的崛起,数据的海洋愈发浩渺无垠。受限于token的数量,无数的开发者们如同勇敢的航海家,开始在茫茫数据之海中探寻新的路径。他们选择了将浩如烟海的知识、新闻、文献、语料等,通过嵌入算法(embedding)的神秘力量,转化为向量数据,存储在神秘的Chroma向量数据库中。每当用户在大模型的界面上输入一个问题,这个问题也会如同被施了魔法一般,被转化为向量,然后在向量数据库中寻找与之最匹配的相关知识。这些知识如同宝藏一般,被精心组合成大模型的上下文,为其提供了丰富的思考背景。这种方式不仅削减了大模型的计算负担,提高了响应的速度,还大大降低了成本。更令人惊叹的是,它巧妙地绕过了大模型的token限制,成为了一种既简单又高效的处理手段。而向量数据库,在大模型的记忆存储等领域中,发挥着无可替代的作用。它的存在,如同一位守护者,默默地守护着大模型的智慧与记忆,让其在知识的海洋中畅游无阻。

由于大模型的火热,现在市面上的向量数据库众多,主流的向量数据库对比如下所示:

向量数据库 URL GitHub Star Language
chroma https://github.com/chroma-core/chroma 7.4K Python
milvus https://github.com/milvus-io/milvus 21.5K Go/Python/C++
pinecone https://www.pinecone.io/
qdrant https://github.com/qdrant/qdrant 11.8K Rust
typesense https://github.com/typesense/typesense 12.9K C++
weaviate https://github.com/weaviate/weaviate 6.9K Go

表格引用自:向量数据库|一文全面了解向量数据库的基本概念、原理、算法、选型-腾讯云开发者社区-腾讯云

本文重点围绕向量数据库Chroma的使用和实战,主要包括以下内容:

  • Chroma设计理念
  • Chroma常见概念(数据集,文档,存储,查询,条件过滤)
  • Chroma快速上手
  • Chroma支持的Embeddings算法
  • 实战:在Langchain中使用Chroma对中国古典四大名著进行相似性查询

Chroma快速上手

设计理念

Chroma的目标是帮助用户更加便捷地构建大模型应用,更加轻松的将知识(knowledge)、事实(facts)和技能(skills)等我们现实世界中的文档整合进大模型中。

Chroma提供的工具:

  • 存储文档数据和它们的元数据:store embeddings and their metadata
  • 嵌入:embed documents and queries
  • 搜索: search embeddings

Chroma的设计优先考虑:

  • 足够简单并且提升开发者效率:simplicity and developer productivity
  • 搜索之上再分析:analysis on top of search
  • 追求快(性能): it also happens to be very quick

目前官方提供了Python和JavaScript版本,也有其他语言的社区版本支持。

实现Demo

首先需要Python环境(Chroma官方原生支持Python和JavaScript,本文用Python做示例)

pip install chromadb

直接运行如下代码,便是一个完整的Demo:

  1. import chromadb
  2. chroma_client = chromadb.Client()
  3. collection = chroma_client.create_collection(name="my_collection")
  4. collection.add(
  5. documents=["This is a document about engineer", "This is a document about steak"],
  6. metadatas=[{"source": "doc1"}, {"source": "doc2"}],
  7. ids=["id1", "id2"]
  8. )
  9. results = collection.query(
  10. query_texts=["Which food is the best?"],
  11. n_results=2
  12. )
  13. print(results)

上面的代码中,我们向Chroma提交了两个文档(简单起见,是两个字符串),一个是This is a document about engineer,一个是This is a document about steak。若在add方法没有传入embedding参数,则会使用Chroma默认的all-MiniLM-L6-v2 方式进行embedding。随后,我们对数据集进行query,要求返回两个最相关的结果。提问内容为:Which food is the best?

返回结果:

  1. {
  2. 'ids': [
  3. ['id2', 'id1']
  4. ],
  5. 'distances': [
  6. [1.5835548639297485, 2.1740970611572266]
  7. ],
  8. 'metadatas': [
  9. [{
  10. 'source': 'doc2'
  11. }, {
  12. 'source': 'doc1'
  13. }]
  14. ],
  15. 'embeddings': None,
  16. 'documents': [
  17. ['This is a document about steak', 'This is a document about engineer']
  18. ]
  19. }

结果显示,两个文档都被正确返回,且id2由于是steak(牛排),相关性与我们的提问更大,排在了首位。还打印了distances。

数据持久化

Chroma一般是直接作为内存数据库使用,但是也可以进行持久化存储。

在初始化Chroma Client时,使用PersistentClient:

client = chromadb.PersistentClient(path="/Users/yourname/xxxx")

这样在运行代码后,在你指定的位置会新建一个chroma.sql

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/624882
推荐阅读
相关标签
  

闽ICP备14008679号