Chroma向量数据库:简单易懂的基础介绍与实战示例

Chroma是一个专门用来存储和搜索"向量"的开源数据库。向量是机器学习模型把文字、图片等信息转换成的一串数字,代表它们的"意思"或"特征"。Chroma让我们可以用自然语言快速找到和查询内容相似的文档、图片等,特别适合做语义搜索、智能问答、推荐系统等AI应用。

什么是向量数据库?

  • 向量是什么?

    向量是机器学习模型把文本或图片等信息转换成的数字列表,比如一句话"我喜欢苹果"会变成一个长度为768的数字数组。这个数组捕捉了这句话的语义信息。

  • 向量数据库的作用

    传统数据库是通过关键词匹配来找数据,而向量数据库是通过"向量距离"来找相似内容。距离越小,内容越相似。

  • Chroma的特点

    • 开源免费,支持Python和JavaScript
    • API简单,只有4个核心接口,方便快速开发
    • 支持多种向量生成模型,如Sentence Transformers、OpenAI Embeddings等
    • 支持持久化存储和内存模式,适合开发和生产环境
    • 可以和主流AI框架如LangChain、LlamaIndex无缝集成

Chroma适合用在哪些场景?

  • 语义搜索:用自然语言查询,快速找到相关文档或图片
  • 知识库问答:把文档转成向量,结合大语言模型实现智能问答
  • 推荐系统:存储用户和物品的向量,实时计算相似度,推荐个性化内容
  • 图像检索:通过图像特征向量实现内容搜索
  • 异常检测:分析向量数据找异常,应用于安全和反欺诈
  • 医疗数据分析:辅助预测和决策

Chroma解决了什么问题?

  • 高效存储和检索高维向量
    传统数据库难处理高维向量,Chroma专为此设计,支持快速的近邻搜索,性能大幅提升。
  • 简化开发流程
    自动处理文本分词、向量生成和索引,开发者专注业务逻辑。
  • 统一API,方便开发和部署
    同一套API支持内存和持久化模式,开发测试到生产无缝切换。
  • 多语言多模型支持
    Python、JavaScript SDK都支持,兼容多种embedding模型,灵活适配需求。

Chroma快速入门示例(Python)

下面是一个简单的Python示例,展示如何用Chroma创建一个向量库,添加文档,进行相似度查询。

python 复制代码
import chromadb

# 创建客户端(内存模式,方便测试)
client = chromadb.Client()

# 创建一个集合(相当于数据库中的表)
collection = client.create_collection(name="my_collection")

# 添加文档,Chroma会自动生成向量
collection.add(
    documents=["这是一个关于工程师的文档", "这是一个关于牛排的文档"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}],
    ids=["id1", "id2"]
)

# 查询与"哪种食物最好?"语义最接近的两个文档
results = collection.query(
    query_texts=["哪种食物最好?"],
    n_results=2
)

print(results)

运行结果会返回与查询语义最接近的文档及相关信息。

使用自定义中文向量模型示例

如果你想用自己喜欢的中文模型生成向量,比如text2vec-base-chinese,可以这样做:

python 复制代码
import chromadb
from text2vec import SentenceModel
from chromadb import Documents, EmbeddingFunction, Embeddings

# 自定义embedding函数
class MyEmbeddingFunction(EmbeddingFunction):
    def __call__(self, texts: Documents) -> Embeddings:
        model = SentenceModel(model_name_or_path='text2vec-base-chinese')
        embeddings = [list(model.encode(text, normalize_embeddings=True).astype(float)) for text in texts]
        return embeddings

client = chromadb.Client()

# 创建集合时传入自定义embedding函数
collection = client.create_collection(name="my_collection", embedding_function=MyEmbeddingFunction())

collection.add(
    documents=["这是第一篇文档", "这是第二篇文档"],
    metadatas=[{"source": "source1"}, {"source": "source2"}],
    ids=["id1", "id2"]
)

results = collection.query(
    query_texts=["查询文档内容"],
    n_results=2
)

print(results)

结合LangChain构建知识库问答示例

下面是一个使用LangChain和Chroma构建本地中文知识库的示例:

python 复制代码
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma

# 加载中文embedding模型
embedding_function = HuggingFaceEmbeddings(model_name="shibing624/text2vec-base-chinese")

# 加载文档
loader = TextLoader("your_document.txt")
documents = loader.load()

# 文档切分,避免太长
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)

# 创建Chroma向量数据库并保存到本地
db = Chroma.from_documents(docs, embedding_function, persist_directory="./chroma_db")
db.persist()

# 查询示例
query = "什么是人工智能?"
results = db.similarity_search(query, k=3)

for doc in results:
    print(doc.page_content)
    print("-----")

重要指标和性能

  • 向量维度通常为128、256、512、768或更高,取决于embedding模型。
  • 查询速度:Chroma支持近似最近邻搜索(ANN),查询延迟通常在毫秒级,适合实时应用。
  • 存储容量:支持百万级别向量存储,且支持持久化到磁盘。
  • API简单,核心功能仅4个接口,快速上手。

总结

Chroma是一个为AI应用设计的开源向量数据库,专注存储和检索高维向量,支持中文和多种embedding模型。它简化了语义搜索、知识问答、推荐系统等场景的开发流程,性能优异且易于集成。通过简单的Python或JavaScript代码,就能快速搭建智能的带记忆功能的AI系统。

如果你想快速开始,推荐先用Chroma内置的embedding功能,熟悉API后,再尝试接入你喜欢的中文embedding模型,实现更精准的语义理解和搜索。

相关推荐
六行神算API-天璇13 分钟前
架构思考:大模型作为医疗科研的“智能中间件”
人工智能·中间件·架构·数据挖掘·ar
济南壹软网络科技有限公司42 分钟前
企业级盲盒系统:Java高并发架构在多元化抽奖电商中的设计与实践
java·架构·开源源码·盲盒源码·盲盒h5·盲盒app
周杰伦_Jay2 小时前
【大模型数据标注】核心技术与优秀开源框架
人工智能·机器学习·eureka·开源·github
铭哥的编程日记2 小时前
后端面试通关笔记:从真题到思路(五)
面试·职场和发展
鹏说大数据2 小时前
数据治理项目实战系列6-数据治理架构设计实战,流程 + 工具双架构拆解
大数据·数据库·架构
一水鉴天2 小时前
整体设计 定稿 之26 重构和改造现有程序结构 之2 (codebuddy)
开发语言·人工智能·重构·架构
隐语SecretFlow3 小时前
【隐语Secreflow】如何配置 Kuscia 对请求进行 Path Rewrit
架构·开源
小二·3 小时前
MyBatis基础入门《十四》多租户架构实战:基于 MyBatis 实现 SaaS 系统的动态数据隔离
数据库·架构·mybatis
前端一小卒3 小时前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
老前端的功夫3 小时前
Vue 3 vs Vue 2 深度解析:从架构革新到开发体验全面升级
前端·vue.js·架构