LangChain使用指南:ChromaDB集成
accttodo 12/31/2025 大模型LLM应用开发LangChain
目录
参考
- 【LangChain】langchain_chroma 中的 Chroma 常用方法 列举 和 解释说明 (opens new window)
- Langchain 和 Chroma 的集成 (opens new window)
- 大模型工程师学习日记(八):基于 LangChain 构建向量存储和查询:Chroma (opens new window)
- langchain Chroma 构建本地向量数据库 (opens new window)
- langchain chroma 与 chromadb笔记 (opens new window)
- 【LangChain】langchaincommunity.vectorstores.Chroma 迁移至 langchainchroma.Chroma (opens new window)
# 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
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
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
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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 注意事项与常见问题
# 关键注意事项
分块优化:建议chunk_size=500-1000字符,chunk_overlap=50-100字符
元数据设计:为文档添加source/category等字段便于过滤
版本兼容:
- 使用
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
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
# 技术栈说明
- 文档处理:
- PyPDFLoader加载PDF
- RecursiveCharacterTextSplitter分块(1000字符+200重叠)
- 向量管理:
- text-embedding-3-small生成嵌入
- ChromaDB持久化存储
- 检索配置:
- 返回top3相关文档
- 元数据过滤支持
- 生成模型:
- GPT-4-turbo生成最终回答
- 上下文拼接提示工程
# 优化建议
- 元数据过滤:添加
filter={"page": 10}
定位特定页码内容 - 混合搜索:使用MMR提升结果多样性
- 分数阈值:设置
score_threshold=0.7
过滤低质量结果 - 异步处理:对大型文档库采用
add_documents
的异步版本
通过本指南,开发者可快速构建基于ChromaDB的高效RAG系统。建议从简单查询开始,逐步添加元数据过滤、分数阈值等高级功能优化效果。