毫无疑问,对于新手来说,Chroma 比 Milvus 友好得多。它的设计哲学就是“极简”、“零配置”、“开箱即用”。你只需要pip install chromadb就可以直接使用,不需要安装 Docker、启动容器、配置端口等任何基础设施操作。
下面我就为你提供一个基于 Chroma + LangChain 的 RAG 案例,重点放在 Chroma 的安装和使用上,代码简单明了,可直接复制运行。
一、Chroma 快速上手
1.1 安装 Chroma
在虚拟环境中执行:
pipinstallchromadb langchain langchain-community sentence-transformers pypdf1.2 Chroma 核心特点
| 特点 | 说明 |
|---|---|
| 零配置 | 无需 Docker、无需启动服务、无需端口配置 |
| 两种运行模式 | 内存模式(数据临时)、持久化模式(数据保存到本地磁盘) |
| Python 原生 | 完全在 Python 进程中运行,API 直观 |
| 自动持久化 | 可指定目录,退出程序后数据不丢失 |
二、完整 RAG 代码(使用 Chroma)
以下代码实现了一个完整的 RAG 流程:
- 加载 PDF 文档
- 切分为文本块
- 使用本地 HuggingFace 嵌入模型(无需 API Key)
- 向量存入 Chroma(持久化到本地磁盘)
- 检索 + 大模型问答
# rag_chroma_demo.pyimportosfromlangchain.document_loadersimportPyPDFLoaderfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain.embeddingsimportHuggingFaceEmbeddingsfromlangchain.vectorstoresimportChromafromlangchain.chainsimportRetrievalQAfromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenv load_dotenv()# 加载 .env,里面放你的阿里云 API Key# ========== 1. 加载 PDF 文档 ==========pdf_path="./docs/example.pdf"# 请替换为你的 PDF 文件路径loader=PyPDFLoader(pdf_path)documents=loader.load()print(f"✅ 加载了{len(documents)}页")# ========== 2. 切分文档 ==========text_splitter=RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50,separators=["\n\n","\n","。","!","?",";",","," ",""])chunks=text_splitter.split_documents(documents)print(f"✅ 切分为{len(chunks)}个文本块")# ========== 3. 初始化嵌入模型(本地,无需 API)==========embeddings=HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")# ========== 4. 创建 Chroma 向量库(持久化到本地目录)==========persist_directory="./chroma_db"# 数据将保存在此文件夹vector_store=Chroma.from_documents(documents=chunks,embedding=embeddings,persist_directory=persist_directory,# 指定持久化目录collection_name="my_knowledge")# 持久化保存(Chromadb 新版本会自动持久化,但显式调用更安全)vector_store.persist()print(f"✅ 向量库已保存到{persist_directory}")# ========== 5. 创建检索器 ==========retriever=vector_store.as_retriever(search_kwargs={"k":3})# ========== 6. 初始化大模型(使用阿里云百炼 Qwen)==========llm=ChatOpenAI(model="qwen-plus",temperature=0,api_key=os.getenv("DASHSCOPE_API_KEY"),base_url=os.getenv("DASHSCOPE_BASE_URL"),)# ========== 7. 创建检索问答链 ==========qa_chain=RetrievalQA.from_chain_type(llm=llm,retriever=retriever,return_source_documents=True)# ========== 8. 交互问答 ==========print("\n🤖 RAG 问答系统已启动(输入 exit 退出)")whileTrue:query=input("\n问题: ")ifquery.lower()=="exit":breakresult=qa_chain.invoke(query)print(f"\n答案:{result['result']}")print("\n参考来源:")fori,docinenumerate(result["source_documents"],1):print(f"{i}.{doc.metadata.get('source','未知')}第{doc.metadata.get('page','?')}页")print(f" 片段:{doc.page_content[:150]}...")三、Chroma 使用详解
3.1 持久化目录说明
persist_directory="./chroma_db"表示向量数据库会保存到当前目录下的chroma_db文件夹中。- 程序第二次运行时,可以直接加载已有的数据库,无需重新计算向量(节省时间):
vector_store=Chroma(persist_directory="./chroma_db",embedding_function=embeddings,collection_name="my_knowledge")3.2 Chroma 的两种模式对比
| 模式 | 代码示例 | 特点 |
|---|---|---|
| 内存模式(临时) | Chroma.from_documents(..., persist_directory=None) | 数据仅在内存中,程序退出后消失,适合测试 |
| 持久化模式(推荐) | Chroma.from_documents(..., persist_directory="./db") | 数据保存到磁盘,下次启动可复用,避免重复计算嵌入 |
3.3 Chroma 常用 API
| 操作 | 代码 |
|---|---|
| 创建集合并添加文档 | Chroma.from_documents(docs, embedding, persist_directory=...) |
| 加载已有集合 | Chroma(persist_directory=..., embedding_function=...) |
| 添加新文档 | vector_store.add_documents([doc1, doc2]) |
| 相似度检索 | vector_store.similarity_search("query", k=3) |
| 删除集合 | vector_store.delete_collection() |
四、为什么 Chroma 对新手更友好?
| 对比维度 | Chroma | Milvus |
|---|---|---|
| 安装难度 | pip install chromadb一行搞定 | 需要安装 Docker、下载镜像、启动容器 |
| 启动成本 | 无需任何后台服务 | 需要保持 Docker 容器运行 |
| 学习曲线 | 极低,API 直观 | 较高,需理解 Collection、Partition、Index 等概念 |
| 资源占用 | 轻量(几十 MB) | 较重(至少 2-3 GB 内存) |
| 生产准备 | 适合原型、小规模 | 适合大规模、分布式场景 |
简单结论:学习阶段、个人项目、原型验证 →Chroma。企业级、百万级以上数据、分布式部署 →Milvus。
五、运行前的准备
- 准备一个 PDF 文件:将任意 PDF 放到
./docs/example.pdf路径下。 - 配置
.env文件(用于大模型 API):DASHSCOPE_API_KEY=你的阿里云百炼API Key DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 - 安装依赖:
pipinstallchromadb langchain langchain-community sentence-transformers pypdf python-dotenv langchain-openai - 运行代码:
python rag_chroma_demo.py
六、常见问题
Q:首次运行下载嵌入模型很慢?
A:首次会从 Hugging Face 下载约 470MB 的模型文件。可以设置镜像:
os.environ["HF_ENDPOINT"]="https://hf-mirror.com"Q:Chroma 支持中文检索吗?
A:支持的。我们使用的paraphrase-multilingual-MiniLM-L12-v2是多语言模型,对中文效果很好。
Q:Chroma 数据存在哪里?
A:默认保存在./chroma_db文件夹下,使用 SQLite + Parquet 格式存储,可以直接查看文件。
Q:能不能不用本地嵌入模型,用阿里云的 embedding API?
A:可以。替换embeddings部分:
fromlangchain.embeddingsimportDashScopeEmbeddings embeddings=DashScopeEmbeddings(model="text-embedding-v2",dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"))这个案例已经涵盖了 Chroma 的核心用法,你只需准备好 PDF 和 API Key,就能立刻体验到完整的 RAG 流程。如果遇到任何问题,欢迎随时提问。