向量数据库Chroma教程

引言

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

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

向量数据库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

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

实现Demo

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

pip install chromadb

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

import chromadb
chroma_client = chromadb.Client()collection = chroma_client.create_collection(name="my_collection")collection.add(documents=["This is a document about engineer", "This is a document about steak"],metadatas=[{"source": "doc1"}, {"source": "doc2"}],ids=["id1", "id2"]
)results = collection.query(query_texts=["Which food is the best?"],n_results=2
)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?

返回结果:

{'ids': [['id2', 'id1']],'distances': [[1.5835548639297485, 2.1740970611572266]],'metadatas': [[{'source': 'doc2'}, {'source': 'doc1'}]],'embeddings': None,'documents': [['This is a document about steak', 'This is a document about engineer']]
}

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

数据持久化

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512927.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1999-2022年30省平均受教育年限(含原始数据和具体计算过程+计算结果)

1999-2022年30省平均受教育年限(含原始数据和具体计算过程) 1、时间:1999-2022年 2、范围:30省(剔除西藏) 3、计算方式:平均受教育年限(未上学人数*0小学人数*6初中人数*9高中人数…

P5076 【深基16.例7】普通二叉树(简化版)题解

题目 您需要写一种数据结构,来维护一些数(都是绝对值以内的数)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数q不超过: 定义数x的排名为集合中小于x的数的个数1。查询数x的排名。注意x不一定…

GPT本地化研究(JAVA版本)

1.我觉得gpt3 600多G个人是不可能部署得成功的,回想我自己个人不可能每一方面知识都知道,我只是知道最多的是我自己擅长的,百事通需要靠大公司才能解决,我们只是要关注这个gpt是哪个领域的, 我想做的是工业—>自动化gpt(貌似这个方向日本很专业了*_*) 它山之石可以攻玉 2.gp…

FreeRTOS操作系统学习——FreeRTOS工程介绍

FreeRTOS工程介绍 核心文件 FreeRTOS的最核心文件只有2个: FreeRTOS/Source/tasks.cFreeRTOS/Source/list.c 文件功能如下图: 头文件相关 内存管理文件 文件在 Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang 下,它也是放…

118页Vue面试题总结,资深web前端开发

大厂面试真题整理 CSS: 1,盒模型 2,如何让一个盒子水平垂直居中? 3,css 优先级确定 4,解释下浮动和它的工作原理,清除浮动的方法? 5,CSS隐藏元素的几种方法 6&#xff0…

刷题笔记day27-回溯算法3

39. 组合总和 var path []int var tmp []int var result [][]int// 还是需要去重复,题目中要求的是至少一个数字备选的数量不同。 // 所以需要剪枝操作,右边的要比左边的> func combinationSum(candidates []int, target int) [][]int {// 组合问题pa…

49、WEB攻防——通用漏洞业务逻辑水平垂直越权访问控制脆弱验证

文章目录 前置知识点水平越权——YXCMS 前置知识点 逻辑越权原理: 水平越权:同级用户权限共享。用户信息获取时未对用户与ID比较判断直接查询等;垂直越权:低高级用户权限共享。数据库中用户类型编号接受篡改或高权限未作验证等。 …

langchain学习笔记(十一)

关于langchain中的memory,即对话历史(message history) 1、 Add message history (memory) | 🦜️🔗 Langchain RunnableWithMessageHistory,可用于任何的chain中添加对话历史,将以下之一作为…

微软最新Sora综述!!

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora,成为了很多科技公司当下阶段的新目标。研究者们好奇的是:Sora 是如何被 OpenAI 发掘出来的?未来又有哪些演进和应用方向? Sora 的技术报告披露了一些技术细节&…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

Linux网络编程——socket 通信基础

Linux网络编程——socket 通信基础 1. socket 介绍2. 字节序2.1 简介2.2 字节序举例2.3 字节序转换函数 3. socket 地址3.1 通用 socket 地址3.2 专用 socket 地址 4. IP地址转换&#xff08;字符串ip -> 整数&#xff0c;主机、网络字节序的转换 &#xff09;5. TCP 通信流…

文件操作与IO(3) 文件内容的读写——数据流

目录 一、流的概念 二、字节流代码演示 1、InputStream read方法 第一个没有参数的版本&#xff1a; 第二个带有byte数组的版本&#xff1a; 第三个版本 搭配Scanner的使用 2、OutputStream write方法 第一个版本&#xff1a; 第二个写入整个数组版本&#xff1a; …