LangChain使用指南:ChromaDB集成

12/31/2025 大模型LLM应用开发LangChain

目录


参考


# LangChain使用指南:ChromaDB集成


#

# 1. 定义与术语

# 核心定义

ChromaDB是一个开源的AI原生向量数据库(Apache 2.0许可),专注于开发者的生产力和用户体验。

在LangChain生态中,langchain_chroma.Chroma是与ChromaDB交互的官方向量存储类,用于:

  • 存储文档的嵌入向量和元数据
  • 执行高效的相似性搜索(如余弦相似度)
  • 支持检索增强生成(RAG)系统

# 名词术语表

术语 解释
向量存储 存储嵌入向量并支持相似性搜索的数据库
嵌入向量 通过模型(如text-embedding-3-small)将文本转换为数值向量
RAG 检索增强生成,结合检索和LLM生成的技术
持久化 将向量数据保存到磁盘长期存储
MMR 最大边际相关性,优化搜索结果多样性的算法
分块 将文档分割为固定大小的片段

# 2. 使用指南

# 集成安装与环境配置

# 基础安装
pip install langchain-chroma chromadb

# 可选依赖(按需安装)
pip install langchain-openai pypdf sentence-transformers

# 环境变量配置(使用OpenAI时)
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
1
2
3
4
5
6
7
8
9

# 使用方法与解释说明

# 1. 初始化方法
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

# 方法1:从文档初始化
vectorstore = Chroma.from_documents(
    documents=split_docs,          # 分割后的文档列表
    embedding=OpenAIEmbeddings(),  # 嵌入模型
    collection_name="knowledge",   # 集合名称(默认langchain)
    persist_directory="./chroma_db" # 持久化目录
)

# 方法2:直接初始化
vectorstore = Chroma(
    embedding_function=OpenAIEmbeddings(),
    collection_name="my_collection",
    persist_directory="./db"
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2. 数据操作方法
# 添加文档
new_ids = vectorstore.add_documents(
    documents=[Document(...)],  # 文档对象列表
    ids=["doc001"]              # 自定义ID(可选)
)

# 添加文本
text_ids = vectorstore.add_texts(
    texts=["文本内容1", "文本内容2"],
    metadatas=[{"source": "file1"}, {"source": "file2"}]
)

# 更新文档
vectorstore.update_document(
    document_id="doc001",        # 目标文档ID
    document=Document(...)       # 更新后的文档对象
)

# 删除文档
vectorstore.delete(ids=["doc001"])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 3. 检索方法
# 相似性搜索
results = vectorstore.similarity_search(
    query="查询内容", 
    k=5,                        # 返回结果数
    filter={"source": "file.pdf"} # 元数据过滤
)

# 带分数搜索
scored_results = vectorstore.similarity_search_with_score(
    query="查询内容",
    k=3
)  # 返回格式: [(Document, score)]

# MMR多样性搜索
diverse_results = vectorstore.max_marginal_relevance_search(
    query="查询内容",
    k=3,
    fetch_k=20  # 预取数量
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 4. 持久化管理
# 手动持久化(新版本通常自动执行)
vectorstore.persist()

# 删除集合
vectorstore.delete_collection()

# 加载已有数据库
existing_store = Chroma(
    persist_directory="./chroma_db",
    embedding_function=OpenAIEmbeddings()
)
1
2
3
4
5
6
7
8
9
10
11
# 5. 检索器转换
# 转换为LangChain检索器
retriever = vectorstore.as_retriever(
    search_type="mmr",           # 搜索类型(similarity/mmr)
    search_kwargs={
        "k": 3,
        "filter": {"category": "tech"}
    }
)

# 在RAG中使用
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()} 
    | prompt 
    | llm
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 注意事项与常见问题

# 关键注意事项
  1. 分块优化:建议chunk_size=500-1000字符,chunk_overlap=50-100字符

  2. 元数据设计:为文档添加source/category等字段便于过滤

  3. 版本兼容

    • 使用langchain_chroma而非弃用的langchain_community.vectorstores.Chroma
  • ChromaDB版本需≥0.4.0
# 常见问题解决方案
问题 解决方案
LangChainDeprecationWarning 迁移到from langchain_chroma import Chroma
持久化文件损坏 删除persist_directory重建数据库
搜索结果不相关 调整分块大小/重叠量,检查嵌入模型
内存不足 使用持久化模式或Docker容器部署
元数据过滤失效 确保添加文档时包含对应metadata字段

# 3. 综合使用案例

# RAG系统实现(PDF问答)

import os
from langchain_chroma import Chroma
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 配置环境
os.environ["OPENAI_API_KEY"] = "sk-xxx"
pdf_path = "knowledge.pdf"

# 1. 加载与分割文档
loader = PyPDFLoader(pdf_path)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
split_docs = text_splitter.split_documents(docs)

# 2. 创建向量库
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
    split_docs,
    embeddings,
    collection_name="pdf_qa",
    persist_directory="./chroma_db"
)

# 3. 构建RAG链
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
llm = ChatOpenAI(model="gpt-4-turbo")

rag_chain = (
    {
        "context": retriever | (lambda docs: "\n\n".join(d.page_content for d in docs)),
        "question": RunnablePassthrough()
    }
    | ChatPromptTemplate.from_template("基于以下上下文:\n{context}\n\n问题:{question}")
    | llm
    | StrOutputParser()
)

# 4. 执行查询
response = rag_chain.invoke("如何治疗骨质疏松症?")
print(response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# 技术栈说明

  1. 文档处理
    • PyPDFLoader加载PDF
    • RecursiveCharacterTextSplitter分块(1000字符+200重叠)
  2. 向量管理
    • text-embedding-3-small生成嵌入
    • ChromaDB持久化存储
  3. 检索配置
    • 返回top3相关文档
    • 元数据过滤支持
  4. 生成模型
    • GPT-4-turbo生成最终回答
    • 上下文拼接提示工程

# 优化建议

  1. 元数据过滤:添加filter={"page": 10}定位特定页码内容
  2. 混合搜索:使用MMR提升结果多样性
  3. 分数阈值:设置score_threshold=0.7过滤低质量结果
  4. 异步处理:对大型文档库采用add_documents的异步版本

通过本指南,开发者可快速构建基于ChromaDB的高效RAG系统。建议从简单查询开始,逐步添加元数据过滤、分数阈值等高级功能优化效果。

上次更新时间: 6/19/2025, 4:12:57 PM