如何基于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
相关产品推荐
相关产品推荐

