You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于LangChain复用Chroma DB实例动态添加新文档嵌入?

动态向ChromaDB添加文档嵌入并复用已有实例

要实现复用已存储abc.txt嵌入的ChromaDB实例,动态添加def.txt的嵌入,核心是将ChromaDB持久化到本地目录,后续从该目录加载实例并添加新文档,具体步骤如下:

1. 初始创建并持久化ChromaDB实例

修改原代码,指定persist_directory参数,让Chroma将嵌入数据保存到本地目录(示例用./chroma_db),确保实例数据可复用:

from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# 加载处理abc.txt
loader = UnstructuredFileLoader('abc.txt', mode='elements')
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
texts = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()
# 指定持久化目录创建Chroma实例
vectordb = Chroma.from_documents(
    texts,
    embeddings,
    persist_directory="./chroma_db"
)
vectordb.persist()  # 手动触发持久化,确保数据写入本地

# 创建Retrieval QA Chain
chain = RetrievalQA.from_chain_type(
    llm=OpenAI(temperature=0.0),
    chain_type="stuff",
    retriever=vectordb.as_retriever(search_type="mmr"),
    return_source_documents=True
)

2. 加载已有实例并添加def.txt

后续添加新文档时,直接从持久化目录加载ChromaDB实例,处理def.txt后将其嵌入添加到实例中,无需重新加载abc.txt:

from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

embeddings = OpenAIEmbeddings()
# 从本地目录加载已有的ChromaDB实例
vectordb = Chroma(
    persist_directory="./chroma_db",
    embedding_function=embeddings
)

# 加载处理def.txt
loader_def = UnstructuredFileLoader('def.txt', mode='elements')
documents_def = loader_def.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
texts_def = text_splitter.split_documents(documents_def)

# 将def.txt的文本块嵌入添加到已有实例
vectordb.add_documents(texts_def)
vectordb.persist()  # 添加后再次持久化,保存新数据

# 更新Retrieval QA Chain,使用更新后的实例
chain = RetrievalQA.from_chain_type(
    llm=OpenAI(temperature=0.0),
    chain_type="stuff",
    retriever=vectordb.as_retriever(search_type="mmr"),
    return_source_documents=True
)

# 测试检索,结果会包含abc.txt和def.txt的内容
result = chain({"query": "你的查询问题"})
print(result["result"])
print(result["source_documents"])

关键注意点

  • 必须指定persist_directory:不指定的话Chroma默认用内存存储,程序退出后数据丢失,无法复用。
  • 嵌入模型需一致:加载实例时使用的embedding_function要和初始创建时完全相同,否则无法兼容已有嵌入数据。
  • 添加后需持久化:每次新增文档后调用persist(),确保新嵌入数据写入本地目录。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:37:35