当前位置: 首页 > news >正文

Chroma 向量数据入门

Chroma 是 AI 原生的开源矢量数据库。Chroma 使知识、事实和技能可插入 LLM,从而可以轻松构建 LLM 应用程序。Chroma 是 AI 原生的开源矢量数据库。Chroma 使知识、事实和技能可插入 LLM,从而可以轻松构建 LLM 应用程序。

🌟Chroma是一个文档检索系统,它存储了一组文档以及它们相应的嵌入向量。当接收到嵌入向量后,Chroma会根据其内部的索引结构快速查找最相关的文档。 

尝试 

import chromadb
chroma_client = chromadb.Client()
collection = chroma_client.create_collection(name="my_collection")collection.add(documents=["This is a document about pineapple","This is a document about oranges"],ids=["id1", "id2"]
)
results = collection.query(query_texts=["This is a query document about hawaii"], n_results=2 
)
print(results)

💥 输出:

{'ids': [['id1', 'id2']], 'distances': [[1.0404009819030762, 1.2430802583694458]], 'metadatas': [[None, None]], 'embeddings': None, 'documents': [['This is a document about pineapple', 'This is a document about oranges']], 'uris': None, 'data': None, 'included': ['metadatas', 'documents', 'distances']}

import chromadb
# 创建 ChromaDB 客户端实例
chroma_client = chromadb.Client()
# 获取一个集合
collection = chroma_client.get_or_create_collection(name="my_collection")
# 插入或更新文档
collection.upsert(documents=["This is a document about pineapple","This is a document about oranges"],ids=["id1", "id2"]
)
# 查询:
results = collection.query(query_texts=["This is a query document about florida"],n_results=2 
)
print(results)

💥输出:

  • 'ids': 返回的文档 ID 列表。['id2', 'id1'] 表示查询结果中最相关的两个文档是 id2id1

  • 'distances': 每个查询文本与其对应结果之间的距离(相似度)。数值越小表示相似度越高。[1.1462138891220093, 1.3015375137329102] 表示 id2 的相似度高于 id1

  • Chroma 将存储文本并自动处理嵌入和索引,我们也可以自定义嵌入模型。

  • 默认情况下,Chroma 使用Sentence Transformers all-MiniLM-L6-v2模型来创建嵌入。

也可以通过docker下载chroma: 

docker pull chroma/chroma
# 拉取 ChromaDB 镜像
docker run -p 8000:8000 chroma/chroma
# 运行 ChromaDB 容器

验证 ChromaDB 服务是否正在运行 

curl http://localhost:8000

 启动持久 Chroma 客户端

import chromadb
client = chromadb.PersistentClient(path="/home/ma-user/work/chroma_ku")

💯使用 PersistentClient 创建的客户端会将所有的数据(包括集合、文档、嵌入等)持久化到磁盘上。这意味着即使你关闭了应用程序并重新启动,之前添加的数据仍然会被保留。

# client是持久的客户端
collection = client.create_collection(name="my_collection")
  • path是 Chroma 将其数据库文件存储在磁盘上并在启动时加载它们的地方
  • client.reset() 重置数据库

在客户端-服务器模式下运行Chroma 

🧊Chroma 客户端连接到在单独进程中运行的 Chroma 服务器。

🧊上面我们创建了客户端,现在可以启动 Chroma 服务器:

🧊我们在浏览器输入http://localhost:8000 :

  • 会看到一个错误页面(404 Not Found),因为 ChromaDB 服务器默认不提供静态页面,而是提供 API 端点 

🌟 然后使用 Chroma HTTP 客户端连接到服务器:

import chromadb
chroma_client = chromadb.HttpClient(host='localhost', port=8000)

然后就可以操作了~~

操作集合

import chromadb
path = "E:\\AI-1\\Chroma_ku"
client = chromadb.PersistentClient(path=path)
# PersistentClient 会从指定的路径加载现有的数据库文件from sentence_transformers import SentenceTransformer# 加载预训练的句子嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')# 定义嵌入函数
def emb_fn(texts):return model.encode(texts, convert_to_tensor=True).cpu().numpy()collection = client.get_collection(name="my_collection", embedding_function=emb_fn)
collection.upsert(documents=["This is a document about pineapple","This is a document about oranges"],ids=["id1", "id2"]
)

我们可以使用 按照名称检索现有集合.get_collection,并使用 删除集合.delete_collection。还可以使用.get_or_create_collection获取集合(如果存在)或创建集合(如果不存在)。 

collection = client.get_collection(name="test") 
collection = client.get_or_create_collection(name="test") 
client.delete_collection(name="my_collection")

集合有一些实用的便捷方法:

collection.peek() # 返回集合中前十的列表
collection.count() # 返回集合中的项目数
collection.modify(name="new_name")  # 重命名

距离函数 

collection = client.create_collection(name="collection_name",metadata={"hnsw:space": "cosine"} )

实例创建一个使用余弦相似度的集合,并插入一些文档:(保证chroma已经运行起来)

import chromadb
from sentence_transformers import SentenceTransformer# 创建 HttpClient 实例
client = chromadb.HttpClient(host="localhost", port=8000)# 加载预训练的句子嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')# 定义嵌入函数
def emb_fn(texts):return model.encode(texts, convert_to_tensor=True).cpu().numpy()# 创建一个使用余弦相似度的集合
collection = client.create_collection(name="my_collection",metadata={"hnsw:space": "cosine"}
)# 插入文档
collection.upsert(documents=["This is a document about pineapple","This is a document about oranges"],metadatas=[{"source": "internet"}, {"source": "local"}],ids=["id1", "id2"]
)# 查询文档
results = collection.query(query_texts=["This is a query document about fruit"],n_results=2 
)

向集合添加数据:

collection.add(documents=["lorem ipsum...", "doc2", "doc3", ...],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],ids=["id1", "id2", "id3", ...]
)
# 每个元数据项是一个字典,其中键值对表示文档的附加信息

🌟使用 query 方法来查找与给定查询向量最相似的文档,并且可以附加一些过滤条件:

collection.query(query_embeddings=[[11.1, 12.1, 13.1], [1.1, 2.3, 3.2], ...],n_results=10,where={"metadata_field": "is_equal_to_this"},where_document={"$contains": "search_string"}
)
  • 查询将按顺序返回n_results与每个 最接近的匹配项。可以提供可选的过滤词典,以便根据与每个文档关联的 进行过滤。此外,还可以提供可选的过滤词典,以便根据文档的内容进行过滤

从集合中删除数据 

删除特定 ID 且元数据中 chapter 为 "20" 的文档

collection.delete(ids=["id1", "id2", "id3",...],where={"chapter": "20"}
)

相关文章:

  • 强化学习在自动驾驶技术中的应用与挑战
  • 速通LLaMA3:《The Llama 3 Herd of Models》全文解读
  • 寿司检测系统源码分享
  • UNI-SOP使用说明
  • windows下tp5创建定时任务
  • 网络原理3-应用层(HTTP/HTTPS)
  • 安卓LiveData与MutableLiveData的使用
  • Excel DAYS函数怎么用,DAYS函数的使用方法来了
  • (含答案)C++笔试题你可以答对多少?
  • 探索 Python 中的 AI 魔法:markdownify 库的奥秘
  • 从安防视频监控行业发展趋势看EasyCVR平台如何驱动行业智能升级
  • makefile和CMakeLists/C++包管理器
  • vue3中echarts柱状图横轴文字太多放不下怎么解决
  • OpenCV_距离变换的图像分割和Watershed算法详解
  • 【Redis】Centos 安装 Redis
  • [case10]使用RSQL实现端到端的动态查询
  • 【前端学习】-粗谈选择器
  • conda常用的命令
  • CSS中外联样式表代表的含义
  • HTML5新特性总结
  • JS+CSS实现数字滚动
  • Js基础知识(四) - js运行原理与机制
  • PHP的Ev教程三(Periodic watcher)
  • React Transition Group -- Transition 组件
  • Sublime text 3 3103 注册码
  • Vue UI框架库开发介绍
  • vue:响应原理
  • vue-router 实现分析
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 飞驰在Mesos的涡轮引擎上
  • 记一次和乔布斯合作最难忘的经历
  • 今年的LC3大会没了?
  • 马上搞懂 GeoJSON
  • 如何编写一个可升级的智能合约
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 数据结构java版之冒泡排序及优化
  • 携程小程序初体验
  • hi-nginx-1.3.4编译安装
  • 从如何停掉 Promise 链说起
  • ​520就是要宠粉,你的心头书我买单
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # Redis 入门到精通(七)-- redis 删除策略
  • #HarmonyOS:Web组件的使用
  • #pragam once 和 #ifndef 预编译头
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2)Java 简介
  • (2)MFC+openGL单文档框架glFrame
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C++17) std算法之执行策略 execution
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (k8s)Kubernetes本地存储接入
  • (安卓)跳转应用市场APP详情页的方式
  • (二)WCF的Binding模型
  • (附源码)python旅游推荐系统 毕业设计 250623