开启左侧

向量数据库Chroma极简教程

[复制链接]
PillsSkiny 发表于 昨天 13:54 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
作者:CSDN博客
引子

向量数据库其实最早在传统的人工智能和机器学习场景中就有所应用。在大模型兴起后,由于目前大模型的token数限制,很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入(embedding)算法转变为向量数据,然后存储在Chroma等向量数据库中。当用户在大模型输入问题后,将问题本身也embedding,转化为向量,在向量数据库中查找与之最匹配的相关知识,组成大模型的上下文,将其输入给大模型,最终返回大模型处理后的文本给用户,这种方式不仅降低大模型的计算量,提高响应速度,也降低成本,并避免了大模型的tokens限制,是一种简单高效的处理手段。此外,向量数据库还在大模型记忆存储等领域发挥其不可替代的作用。
由于大模型的火热,现在市面上的向量数据库众多,主流的向量数据库对比如下所示:
向量数据库URLGitHub StarLanguage
chromahttps://github.com/chroma-core/chroma7.4KPython
milvushttps://github.com/milvus-io/milvus21.5KGo/Python/C++
pineconehttps://www.pinecone.io/
qdranthttps://github.com/qdrant/qdrant11.8KRust
typesensehttps://github.com/typesense/typesense12.9KC++
weaviatehttps://github.com/weaviate/weaviate6.9KGo
表格引用自:一文全面了解向量数据库的基本概念、原理、算法、选型
本文重点围绕向量数据库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
向量数据库Chroma极简教程-1.jpg


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

首先需要Python环境(Chroma官方原生支持Python和JavaScript,本文用Python做示例)
  1. 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:
  1. client = chromadb.PersistentClient(path="/Users/yourname/xxxx")
复制代码
这样在运行代码后,在

原文地址:https://blog.csdn.net/weixin_46763762/article/details/144834572
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )