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

[智能体-301]:Chroma向量数据库详解,包括主要接口,代码示例

一、Chroma 概述

Chroma是开源、轻量级、嵌入式向量数据库专为 LLM/RAG 设计,主打:

  • 零依赖:内置 SQLite+DuckDB,无需单独部署
  • 本地优先:支持内存 / 持久化两种模式
  • 自动嵌入:内置OpenAI / 句子嵌入模型,开箱即用
  • 简单 API:Python/JS 多语言,5 分钟上手
  • LangChain 原生集成

核心用途:文档语义检索、知识库问答、Agent 记忆、相似内容推荐。


二、安装

bash

运行

# 基础版(核心功能) pip install chromadb # 完整版(含内置嵌入、可视化) pip install "chromadb[all]"

三、核心概念

  • Client:数据库连接入口(内存 / 持久化 / 云)
  • Collection:向量集合(类比 “表”),含:
    • ids:唯一标识(必填)
    • embeddings:向量(可选,可自动生成)
    • documents:原始文本(可选)
    • metadatas:元数据(过滤用)

四、主要接口(Python)

1. 客户端(Client)

python

运行

import chromadb # 1)内存模式(临时,程序退出丢失) client = chromadb.Client() # 2)持久化模式(数据存文件夹,常用) client = chromadb.PersistentClient(path="./chroma_db") # 3)云服务模式(Chroma Cloud) client = chromadb.CloudClient(tenant="xxx", database="yyy", api_key="zzz")
2. 集合(Collection)管理

python

运行

# 创建/获取集合(不存在则创建,存在则获取) collection = client.get_or_create_collection( name="my_knowledge", metadata={"hnsw:space": "cosine"} # 距离度量:cosine/l2/ip ) # 列出所有集合 client.list_collections() # 删除集合 client.delete_collection(name="my_knowledge")
3. 增(add/upsert)

python

运行

# 方式1:自动生成向量(推荐,传文本即可) collection.add( documents=[ "RAG 检索增强生成", "Chroma 轻量级向量库", "向量数据库用于语义搜索" ], metadatas=[{"topic": "AI"}, {"topic": "DB"}, {"topic": "Search"}], ids=["doc1", "doc2", "doc3"] # 必须唯一 ) # 方式2:手动传向量(自定义模型) collection.add( embeddings=[[0.1,0.2,...], [0.3,0.4,...]], # 与文本一一对应 documents=["文本1", "文本2"], ids=["id1", "id2"] ) # upsert:存在则更新,不存在则插入 collection.upsert(...)
4. 查(query/get)

语义检索(核心)

python

运行

results = collection.query( query_texts=["什么是向量数据库?"], # 查询文本(自动转向量) n_results=2, # 返回 top2 where={"topic": "DB"}, # 元数据过滤 where_document={"$contains": "向量"} # 文本内容过滤 ) # 结果结构 # results = { # "ids": [["doc2", "doc3"]], # "distances": [[0.12, 0.34]], # 距离越小越相似 # "documents": [["Chroma 轻量级向量库", "向量数据库用于语义搜索"]], # "metadatas": [[{"topic":"DB"}, {"topic":"Search"}]] # }

精确获取(按 ID / 过滤)

python

运行

# 按 ID 获取 items = collection.get(ids=["doc1", "doc2"]) # 过滤+分页 items = collection.get( where={"topic": "AI"}, limit=10, offset=0, include=["documents", "metadatas"] # 只返回指定字段 )
5. 改(update)

python

运行

collection.update( ids=["doc1"], documents=["更新:RAG 检索增强生成技术"], metadatas=[{"topic": "AI", "updated": True}] )
6. 删(delete)

python

运行

# 按 ID 删除 collection.delete(ids=["doc3"]) # 按条件删除 collection.delete(where={"topic": "old"}) # 清空集合 collection.delete(where={})
7. 其他常用

python

运行

# 集合总数 collection.count() # 预览前 5 条 collection.peek(limit=5)

五、完整代码示例(RAG 最小 Demo)

python

运行

import chromadb # 1. 初始化客户端(持久化) client = chromadb.PersistentClient(path="./chroma_rag") # 2. 创建集合 collection = client.get_or_create_collection( name="rag_demo", metadata={"hnsw:space": "cosine"} ) # 3. 准备知识库文本 docs = [ "Chroma 是轻量级开源向量数据库,专为 LLM 应用设计。", "RAG 通过检索外部知识库,让大模型回答更准确、时效性更强。", "向量数据库将文本转为高维向量,支持语义相似度搜索。" ] ids = ["rag1", "rag2", "rag3"] metas = [{"source": "intro"}, {"source": "tech"}, {"source": "concept"}] # 4. 存入数据库(自动嵌入) collection.add(documents=docs, ids=ids, metadatas=metas) # 5. 语义查询 query = "RAG 如何提升大模型回答准确性?" results = collection.query(query_texts=[query], n_results=2) # 6. 打印结果 print("=== 最相似文档 ===") for i, (doc, dist) in enumerate(zip(results["documents"][0], results["distances"][0])): print(f"{i+1}. 距离:{dist:.4f} | 内容:{doc}")

输出示例

plaintext

=== 最相似文档 === 1. 距离:0.1823 | 内容:RAG 通过检索外部知识库,让大模型回答更准确、时效性更强。 2. 距离:0.4567 | 内容:向量数据库将文本转为高维向量,支持语义相似度搜索。

六、LangChain 集成(常用)

python

运行

from langchain_community.vectorstores import Chroma from langchain_core.documents import Document # 1. 从 Document 列表创建向量库 documents = [Document(page_content="文本1", metadata={"source": "test"})] vectorstore = Chroma.from_documents( documents=documents, persist_directory="./chroma_langchain" # 持久化 ) # 2. 加载已有向量库 vectorstore = Chroma(persist_directory="./chroma_langchain") # 3. 转为检索器 retriever = vectorstore.as_retriever(k=3) docs = retriever.invoke("你的问题")

七、最佳实践

  1. 生产用持久化模式:避免内存模式数据丢失
  2. 元数据规范化:统一source/page/topic字段,便于过滤
  3. 距离度量选 cosine:文本语义检索最常用
  4. 批量添加:减少 IO,提升性能
  5. 敏感数据加密:元数据可加is_secret标记过滤
http://www.jsqmd.com/news/968273/

相关文章:

  • 从网页IM状态集成到现代客服组件:原理、演进与实战
  • Intel TBB 2019 Update 8(2019年6月5日发布)Windows全功能开发包
  • Java电商项目沙箱支付全流程演示包(含下单、签名、回调模拟)
  • 2026年宁波市PMP培训机构哪家好?官方授权R.E.P.报考指南 - 众智商学院课程中心
  • 掌握Windows与Office智能激活解决方案:KMS_VL_ALL_AIO专业指南
  • JavaWeb 全套教程 乱码问题 85-88
  • 串口通信:查询与中断模式详解及实战应用
  • VCC、VDD、VEE、VSS电源符号的起源、区别与PCB设计实战
  • STM32L431 STOP模式实测:LPUART收数据或RTC定时都能唤醒,功耗稳、响应快
  • Windows体检套餐配置工具:C#写的桌面程序,增删项目+自动算总价
  • 如何快速单独编译LibreDWG的dwg2dxf工具:轻量级CAD文件转换方案
  • 保姆级教程:用端口转发搞定跨网段打印机共享(潘多拉/Padavan固件实测)
  • 2026年佛山市PMP培训机构哪家好?官方授权R.E.P.报考指南 - 众智商学院课程中心
  • 工程师职场生存指南:从技术实力到沟通表达与职业网络构建
  • 星露谷物语模组开发终极指南:用SMAPI打造你的专属农场
  • PVZ Toolkit:3个步骤让植物大战僵尸变得无限有趣
  • 单JTAG链多FPGA系统JIC文件生成与烧写全流程详解
  • HarmonyOS开发板烧录全攻略:从环境配置到故障排查
  • STM32调试效率提升:RAM与Flash调试模式详解与实战配置
  • Quartus编译错误:Top partition does not contain any logic的根源与解决
  • 中国电子制造业投资北移:技术升级与区域格局重构深度解析
  • AI时代的轻创业:一个人也能打造自己的互联网事业
  • eDP 1.2接口核心技术解析:从高速串行链路到双向智能控制
  • 2026年广西壮族自治区CPPM考试最新全攻略:科目题型、通过率、备考重点及官方双认证报考机构推荐 - 众智商学院课程中心
  • LabWindows/CVI程序打包部署全攻略:从依赖分析到专业安装包制作
  • STM32 HAL工程:AD9910单频正弦波发生器(SPI直驱,开箱即用)
  • TegraRcmGUI深度解析:如何用图形化界面轻松完成Switch RCM注入
  • AI辅助可观测性:异常检测与根因分析
  • 番茄小说下载器终极指南:5分钟搞定离线阅读与有声书生成
  • 从握手到碰拳:工程师视角下的日常问候卫生风险量化分析