如何向已有的Chroma向量库中批量添加嵌入向量
批量将PDF拆分片段存入Chroma向量库的正确方案
错误原因分析
你之前尝试的方法存在几个核心问题:
vectordb.add_document(split, embedding):Chroma没有add_document(单数)方法,正确调用应为add_documents(复数)vectordb.add_documents([split], embedding=embedding):初始化Chroma时已绑定嵌入函数,无需重复传入embedding参数;若报错,大概率是splits不是LangChain标准Document对象列表vectordb.add(embeddings):add方法需同时传入文档内容与对应向量,使用门槛高,不如add_documents自动生成向量简便
正确实现代码
假设你已完成批次拆分与文本分片,直接循环处理每个批次的splits即可:
import time # 假设all_splits_batches是存储所有批次分片的列表 for splits in all_splits_batches: # 将当前批次的分片添加到向量库 vectordb.add_documents(documents=splits) # 手动持久化,确保数据写入磁盘(可选但推荐) vectordb.persist() # 休眠规避OpenAI的TPM限制,时长可根据API配额调整 time.sleep(8)
关键注意事项
- 确保
splits是LangChain Document对象的列表:每个对象需包含page_content(文本内容)与metadata(可选,如PDF来源、页码等)。若拆分后是纯文本,需转换格式:from langchain_core.documents import Document # 示例:将纯文本列表转为Document对象列表 splits = [Document(page_content=text, metadata={"source": "目标PDF路径"}) for text in split_texts] - 初始化Chroma时已指定
embedding_function,add_documents会自动调用该函数生成嵌入向量,无需额外传入参数 - 分批次休眠是为了避免触发OpenAI的每分钟Token限制,时长可根据你的API配额灵活调整
内容的提问来源于stack exchange,提问作者Atul
相关产品推荐
相关产品推荐

