RAG進階:Chroma開源的AI原生向量數據庫

一、Chroma 核心概念與優勢

1. 什么是 Chroma?

Chroma 是一款開源的向量數據庫,專為高效存儲和檢索高維向量數據設計。其核心能力在于語義相似性搜索,支持文本、圖像等嵌入向量的快速匹配,廣泛應用于大模型上下文增強(RAG)、推薦系統、多模態檢索等場景。與傳統數據庫不同,Chroma 基于向量距離(如余弦相似度、歐氏距離)衡量數據關聯性,而非關鍵詞匹配。

GitHub地址:

https://github.com/chroma-core/chroma

官方文檔:

https://docs.trychroma.com/

2. 核心優勢

  • 輕量易用:以 Python/JS 包形式嵌入代碼,無需獨立部署,適合快速原型開發。
  • 靈活集成:支持自定義嵌入模型(如 OpenAI、HuggingFace),兼容 LangChain 等框架。
  • 高性能檢索:采用 HNSW 算法優化索引,支持百萬級向量毫秒級響應。
  • 多模式存儲:內存模式用于開發調試,持久化模式支持生產環境數據落地。

?

二、安裝和基礎配置

?1、安裝Chroma

支持windows、ubuntu等操作系統,Python>=3.9? 。

創建虛擬環境以及安裝

#創建虛擬環境
conda create -n chromadb python==3.10#激活
conda activate chromadb#安裝chromadb
pip install chromadb

注意:Chroma 默認是本地嵌入式數據庫,并不原生支持遠程訪問像傳統數據庫那樣(比如 PostgreSQL 那種 client-server 模式)。

當然官方也提供了客戶端-服務器端模式(Client-Server Mode),服務器端的啟動方式如下:

#服務器端啟動,默認端口號8000
chroma run --path /db_path

2、初始化客戶端

?內存模式調試,實驗的場景):

import chromadb
client = chromadb.Client()

持久化模式(生產環境):

在創建的時候,可以配置本地的存儲路徑

client = chromadb.PersistentClient(path="/path/to/save") # 數據保存至本地目錄

Client-Server模式的客戶端:

前兩種,都是本地模式,chroma的服務端和客戶端需要位于同一臺機器。CS模式可以獨立部署,通過httpclient進行訪問。

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

三、增刪改查操作

1. 創建集合(Collection

集合是 Chroma 中管理數據的基本單元,類似傳統數據庫的表。 集合的name名稱有以下約束:
  • 名稱的長度必須介于 3 到 63 個字符之間。
  • 名稱必須以小寫字母或數字開頭和結尾,中間可以包含點、破折號和下劃線。
  • 名稱不得包含兩個連續的點。
  • 該名稱不能是有效的 IP 地址。

Chroma 集合是用一個名稱和一個可選的嵌入函數創建的。

如果您提供嵌入函數,則每次獲取集合時都必須提供它。

# 創建
collection = client.create_collection(name="my_collection", embedding_function=emb_fn)# 獲取
collection = client.get_collection(name="my_collection", embedding_function=emb_fn)# 若沒有則創建,若有則獲取
collection = chroma_client.get_or_create_collection(name="my_collection2")

如果不提供嵌入函數,則使用默認的嵌入函數 sentence transformer? 使用的的是一個小型的模型all-MiniLM-L6-v2,該模型主要是針對英語場景。一般我們都需要自定義一個嵌入函數:

import chromadb
from sentence_transformers import SentenceTransformerclass SentenceTransformerEmbeddingFunction:def __init__(self, model_path: str, device: str = "cuda"):self.model = SentenceTransformer(model_path, device=device)def __call__(self, input: list[str]) -> list[list[float]]:if isinstance(input, str):input = [input]return self.model.encode(input, convert_to_numpy=True).tolist()# 創建/加載集合(含自定義嵌入函數)
embed_model = SentenceTransformerEmbeddingFunction(model_path=r"D:\Test\LLMTrain\testllm\llm\BAAI\bge-m3",device="cuda"  # 無 GPU 改為 "cpu"
)# 創建客戶端和集合
client = chromadb.Client()
collection = client.create_collection("my_knowledge_base", metadata={"hnsw:space": "cosine"},embedding_function=embed_model)

創建collect時,可以配置如下參數。

  • name標識collect的名稱,是必填項;
  • embedding_function,指定嵌入函數,不填為默認的嵌入模型。
  • metadata,元數據,比如索引方式等,非必填。
from datetime import datetimecollection = client.create_collection(name="my_collection", embedding_function=emb_fn,metadata={"description": "my first Chroma collection","created": str(datetime.now())}  
)

集合有一些常用方法:

  • peek()?- 返回集合中前 10 個項目的列表。
  • count()?-返回集合中的項目數。
  • modify()?-重命名集合
collection.peek() 
collection.count() 
collection.modify(name="new_name")

2、寫入數據

寫入數據時,配置以下參數:

  • document,原始的文本塊。
  • metadatas,描述文本塊的元數據,kv鍵值對。
  • ids,文本塊的唯一標識,每個文檔必須具有唯一關聯的ID。 若添加兩次相同的 ID 將導致僅存儲初始值。
  • embeddings,對于已經向量化的文本塊,可以直接寫入結果。如果不填,則在寫入時,使用指定或者默認的嵌入函數對documents進行向量化。
collection.add(documents=["lorem ipsum...", "doc2", "doc3", ...],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],ids=["id1", "id2", "id3", ...]
)

或者

collection.add(embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],ids=["id1", "id2", "id3", ...]
)

3、修改數據

提供ids(文本唯一標識)。

collection.update(ids=["doc1"],  # 使用已存在的IDdocuments=["RAG是一種檢索增強生成技術222"]
)

4、更新插入方法

Chroma 還支持更新插入操作,更新現有項目,如果項目尚不存在則添加它們。

collection.upsert(ids=["id1", "id2", "id3", ...],embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],documents=["doc1", "doc2", "doc3", ...],
)

5、刪除數據

Chroma 支持通過以下方式從集合中刪除項目ID使用delete。與每個項目相關的嵌入、文檔和元數據將被刪除。

還支持where過濾器。如果沒有ID提供,它將刪除集合中與where篩選。

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

6、查詢數據

(1)查詢所有數據

all_docs = collection.get()
print("集合中所有文檔:", all_docs)

(2)根據ids查詢

可以通過以下方式從集合中檢索項目ID使用get

collection.get(ids=["id1", "id2", "id3", ...],where={"style": "style1"}
)

(3)查詢嵌入

可以通過多種方式查詢 Chroma 集合,使用query方法。比如 使用query_embedding。

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_result每個最接近的匹配查詢嵌入,按順序排列。?可選where過濾字典可以通過metadata與每個文檔關聯。?此外,where document可以提供過濾字典來根據文檔內容進行過濾。

(4)查詢相似文檔

還可以通過一組查詢文本query_texts. Chroma 將首先嵌入每個查詢文本與集合的嵌入函數,然后使用生成的嵌入執行查詢。

# 查詢相似文檔
results = collection.query(query_texts=["什么是RAG技術?"],n_results=3
)print("查詢的結果",results)
查詢結果
  • 當使用 get 或 query 時,您可以使用include參數來指定您想要返回的數據包括:embeddings, documents,metadatas;include為數組,可以傳多個值。
  • 對于查詢query,默認返回距離distances結果。
  • embeddings出于性能考慮,默認不返回,直接顯示None ,若想返回,則include中包含embeddings即可。
  • ID始終會返回。
  • 返回值里有included參數,表明本次返回的數據有哪些類型。
  • embeddings將以二維 NumPy 數組的形式返回。
# Only get documents and ids
collection.get(include=["documents"]
)collection.query(query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],include=["documents"]
)
#查詢的結果{'ids': [['doc1', 'doc3', 'doc2']], 
'embeddings': None, 
'documents': [['RAG是一種檢索增強生成技術', '三英戰呂布', '向量數據庫存儲文檔的嵌入表示']], 
'uris': None,
'included': ['metadatas', 'documents', 'distances'], 
'data': None, 
'metadatas': [[{'source': 'tech_doc'}, {'source': 'tutorial1'}, {'source': 'tutorial'}]], 
'distances': [[0.2373753786087036, 0.7460092902183533, 0.7651787400245667]]
}

四、實戰操作

將一批數據插入向量數據庫,再根據一個問題從向量數據庫中找出相似數據。

?1、安裝包

pip install sentence_transformerspip install modelscope

2、下載Embedding模型到本地

#模型下載
from modelscope import snapshot_download
model_dir = snapshot_download('BAAI/bge-m3',cache_dir=r"D:\Test\LLMTrain\testllm\llm")

3、寫入數據和查詢相似文本

import chromadb
from sentence_transformers import SentenceTransformerclass SentenceTransformerEmbeddingFunction:def __init__(self, model_path: str, device: str = "cuda"):self.model = SentenceTransformer(model_path, device=device)def __call__(self, input: list[str]) -> list[list[float]]:if isinstance(input, str):input = [input]return self.model.encode(input, convert_to_numpy=True).tolist()# 創建/加載集合(含自定義嵌入函數)
embed_model = SentenceTransformerEmbeddingFunction(model_path=r"D:\Test\LLMTrain\testllm\llm\BAAI\bge-m3",device="cuda"  # 無 GPU 改為 "cpu"
)# 創建客戶端和集合
client = chromadb.PersistentClient(path=r"D:\Test\LLMTrain\chromadb_test\chroma_data")
collection = client.get_or_create_collection("my_knowledge_base",metadata={"hnsw:space": "cosine"},embedding_function=embed_model)# 添加文檔
collection.add(documents=[ "向量數據庫存儲文檔的嵌入表示", "三英戰呂布","RAG是一種檢索增強生成技術"],metadatas=[{"source": "tech_doc"}, {"source": "tutorial"}, {"source": "tutorial1"}],ids=["doc1", "doc2", "doc3"]
)# 查詢相似文檔
results = collection.query(query_texts=["什么是RAG技術?"],n_results=3
)print("查詢的結果",results)

執行返回結果:

查詢的結果 
{
'ids': [['doc3', 'doc2', 'doc1']], 
'embeddings': None, 
'documents': [['RAG是一種檢索增強生成技術', '三英戰呂布', '向量數據庫存儲文檔的嵌入表示']], 
'uris': None, 
'included': ['metadatas', 'documents', 'distances'], 
'data': None, 
'metadatas': [[{'source': 'tutorial1'}, {'source': 'tutorial'}, {'source': 'tech_doc'}]], 
'distances': [[0.2373753786087036, 0.7460092902183533, 0.7651787400245667]]
}

查看結果,我們重點看 distances,值是從小到大排序的,所以3條數據與問題“什么是RAG技術?”的相似度情況:distances值越小越相似。因此,第1條數據與問題越相似。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78077.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

店匠科技摘得 36 氪“2025 AI Partner 創新大獎”

全場景 AI 方案驅動跨境電商數智化躍遷 4 月 18 日,36 氪 2025 AI Partner 大會于上海盛大開幕。大會緊扣“Super App 來了”主題,全力探尋 AI 時代的全新變量,探索 AI 領域下一個超級應用的無限可能性。在此次大會上,跨境電商獨立站 SaaS 平臺店匠科技(Shoplazza)憑借“店匠跨…

SQL技術終極指南:從內核原理到超大規模應用

一、DDL核心應用場景與最佳實踐 1.1 表結構設計場景矩陣 業務場景核心語法要素典型實現案例電商用戶畫像JSON字段虛擬列索引CREATE TABLE users (id INT, profile JSON, AS (profile->>$.age) VIRTUAL, INDEX idx_age((profile->>$.age)))物聯網時序數據分區表壓…

吳恩達深度學習作業CNN之ResNet實現(Pytorch)

課程中認識許多CNN架構。首先是經典網絡: LeNet-5AlexNetVGG 之后是近年來的一些網絡: ResNetInceptionMobileNet 經典網絡 LeNet-5 LeNet-5是用于手寫數字識別(識別0~9的阿拉伯數字)的網絡。它的結構如下: 網絡…

FPGA入門學習Day1——設計一個DDS信號發生器

目錄 一、DDS簡介 (一)基本原理 (二)主要優勢 (三)與傳統技術的對比 二、FPGA存儲器 (一)ROM波形存儲器 (二)RAM隨機存取存儲器 (三&…

SqlSugar與Entity Framework (EF)的SWOT分析

以下是基于 SWOT 分析法 對 SqlSugar 和 Entity Framework (EF) 的特性對比: SqlSugar 優勢 (Strengths) 高性能: SqlSugar 以輕量化設計著稱,執行速度更快,適合對性能要求較高的場景。在大數據量操作和復雜查詢中表現優異。 易…

學習記錄:DAY16

Maven 進階與前端實戰 前言 二輪考核的內容下來了,由整體項目構建轉為實現特定模塊的功能。對細節的要求更高了,而且有手搓線程池、手搓依賴注入等進階要求,又有得學力。嘻嘻,太簡單了,只要我手搓 Spring Boot 框架……

深度學習--卷積神經網絡調整學習率

文章目錄 前言一、學習率1、什么學習率2、什么是調整學習率3、目的 二、調整方法1、有序調整1)有序調整StepLR(等間隔調整學習率)2)有序調整MultiStepLR(多間隔調整學習率)3)有序調整ExponentialLR (指數衰減調整學習率)4)有序調整…

【消息隊列RocketMQ】四、RocketMQ 存儲機制與性能優化

一、RocketMQ 存儲機制詳解 1.1 存儲文件結構? RocketMQ 的存儲文件主要分布在store目錄下,該目錄是在broker.conf配置文件中通過storePathRootDir參數指定的,默認路徑為${user.home}/store 。主要包含以下幾種關鍵文件類型:? 1.1.1 Comm…

C++入門小館: 探尋vector類

嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的pa…

CSS-跟隨圖片變化的背景色

CSS-跟隨圖片變化的背景色 獲取圖片的主要顏色并用于背景漸變需要安裝依賴 colorthief獲取圖片的主要顏色. 并丟給背景注意 getPalette并不是個異步方法 import styles from ./styles.less; import React, { useState } from react; import Colortheif from colorthief;cons…

RAGFlow:構建高效檢索增強生成流程的技術解析

引言 在當今信息爆炸的時代,如何從海量數據中快速準確地獲取所需信息并生成高質量內容已成為人工智能領域的重要挑戰。檢索增強生成(Retrieval-Augmented Generation, RAG)技術應運而生,它將信息檢索與大型語言模型(L…

SpringBoot應用:MyBatis的select語句如何返回數組類型

在SpringBoot應用中&#xff0c;比如想返回一個表的主鍵id構成的Long型數組Long[]&#xff0c;需要在XxxMapper.xml文件中這樣定義select語句&#xff1a; <select id"selectIds" parameterType"int" resultType"Long">select id from sy…

【HFP】藍牙HFP協議來電處理機制解析

目錄 一、協議概述與技術背景 1.1 HFP協議演進 1.2 核心角色定義 1.3 關鍵技術指標 二、來電接入的核心交互流程 2.1 基礎流程概述&#xff1a;AG 的 RING 通知機制 2.2 HF 的響應&#xff1a;本地提醒與信令交互 三、帶內鈴聲&#xff08;In-Band Ring Tone&#xff0…

【每天一個知識點】如何解決大模型幻覺(hallucination)問題?

解決大模型幻覺&#xff08;hallucination&#xff09;問題&#xff0c;需要從模型架構、訓練方式、推理機制和后處理策略多方面協同優化。 &#x1f9e0; 1. 引入 RAG 框架&#xff08;Retrieval-Augmented Generation&#xff09; 思路&#xff1a; 模型生成前先檢索知識庫中…

基于STC89C52RC和8X8點陣屏、獨立按鍵的小游戲《打磚塊》

目錄 系列文章目錄前言一、效果展示二、原理分析三、各模塊代碼1、8X8點陣屏2、獨立按鍵3、定時器04、定時器1 四、主函數總結 系列文章目錄 前言 用的是普中A2開發板&#xff0c;外設有&#xff1a;8X8LED點陣屏、獨立按鍵。 【單片機】STC89C52RC 【頻率】12T11.0592MHz 效…

C++學習:六個月從基礎到就業——C++學習之旅:STL迭代器系統

C學習&#xff1a;六個月從基礎到就業——C學習之旅&#xff1a;STL迭代器系統 本文是我C學習之旅系列的第二十四篇技術文章&#xff0c;也是第二階段"C進階特性"的第二篇&#xff0c;主要介紹C STL迭代器系統。查看完整系列目錄了解更多內容。 引言 在上一篇文章中…

leetcode刷題——判斷對稱二叉樹(C語言版)

題目描述&#xff1a; 示例 1&#xff1a; 輸入&#xff1a;root [6,7,7,8,9,9,8] 輸出&#xff1a;true 解釋&#xff1a;從圖中可看出樹是軸對稱的。 示例 2&#xff1a; 輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false 解釋&#xff1a;從圖中可看出最…

無法右鍵下載文檔?網頁PDF下載方法大全

適用場景&#xff1a;繞過付費限制/無法右鍵下載/動態加載PDF 方法1&#xff1a;瀏覽器原生下載&#xff08;成功率60%&#xff09; Chrome/Edge&#xff1a; 在PDF預覽頁點擊工具欄 ??下載圖標&#xff08;右上角&#xff09; 快捷鍵&#xff1a;CtrlS → 保存類型選PDF …

基于缺失數據的2024年山東省專項債發行報告

一、數據情況 本次報告選取了山東省財政局公開的2024年專項債數據,共計2723條,發行期數是從第1期到第58期,由于網絡原因,其中25期到32期,54到57期的數據有缺失,如下圖所示。 從上圖看出,一年52周,平均每周都有一期發布,因此持續做專項債的謀劃很重要,一定要持續謀劃…

Ubuntu數據連接訪問崩潰問題

目錄 一、分析問題 1、崩潰問題本地調試gdb調試&#xff1a; 二、解決問題 1. 停止 MySQL 服務 2. 卸載 MySQL 相關包 3. 刪除 MySQL 數據目錄 4. 清理依賴和緩存 5.重新安裝mysql數據庫 6.創建程序需要的數據庫 三、驗證 1、動態庫更新了 2、頭文件更新了 3、重新…