如何在Chroma数据库中添加集合/对象?解决合并实例报错问题
解决方案:处理OpenAI嵌入速率限制并分批存入Chroma
一、核心问题拆解
- OpenAI速率限制:个人账号使用
text-embedding-ada-002时存在调用频次上限,一次性处理大量文档会触发RateLimitError。 - Chroma实例合并错误:Chroma对象没有
add方法,无法直接合并两个独立实例,正确逻辑是复用同一实例或指向同一本地存储路径来分批添加数据。
二、具体实现方案
1. 复用Chroma实例分批添加文档
先初始化一个Chroma实例,之后循环将文档拆分为小批次,每次添加后等待固定时间规避速率限制,所有数据会自动存入同一集合。
示例代码:
from langchain.vectorstores import Chroma from langchain.embeddings.openai import OpenAIEmbeddings import time # 初始化嵌入模型与Chroma实例(指定本地存储路径,避免重启后数据丢失) embeddings = OpenAIEmbeddings() sales_store = Chroma( collection_name="sales", embedding_function=embeddings, persist_directory="./local_chroma_sales" ) # 定义分批添加函数 def batch_insert(store, docs, batch_size=20, delay=60): total_docs = len(docs) for idx in range(0, total_docs, batch_size): batch_docs = docs[idx:idx+batch_size] # 向已有Chroma实例添加文档 store.add_documents(batch_docs) # 持久化数据到本地 store.persist() # 未处理完所有批次时,等待指定时间 if idx + batch_size < total_docs: print(f"已完成{min(idx+batch_size, total_docs)}/{total_docs}条数据,等待{delay}秒...") time.sleep(delay) # 先处理yt_data_split batch_insert(sales_store, yt_data_split) # 再分批处理medium_data_split batch_insert(sales_store, medium_data_split)
2. 速率限制进阶优化:异常捕获与重试
如果仍触发速率限制,可增加重试机制,采用指数退避策略延长等待时间,避免流程中断:
import openai def batch_insert_with_retry(store, docs, batch_size=20, max_retries=3): total_docs = len(docs) for idx in range(0, total_docs, batch_size): batch_docs = docs[idx:idx+batch_size] retry_count = 0 while retry_count < max_retries: try: store.add_documents(batch_docs) store.persist() break except openai.error.RateLimitError: retry_count += 1 wait_time = 60 * (2 ** retry_count) print(f"触发速率限制,{wait_time}秒后重试第{retry_count}次...") time.sleep(wait_time) if retry_count == max_retries: print(f"批次{idx//batch_size}重试{max_retries}次失败,跳过该批次") else: print(f"批次{idx//batch_size}处理完成") time.sleep(60)
3. 关键注意事项
- 持久化存储:创建Chroma时必须指定
persist_directory,否则数据仅存于内存,重启程序后会丢失。后续可通过Chroma(persist_directory="./local_chroma_sales", embedding_function=embeddings)加载已有集合。 - 批次大小调整:根据个人账号的OpenAI速率限制调整
batch_size,建议设置为10-20条/批次,避免单次请求量过大。
内容的提问来源于stack exchange,提问作者Praveen Surendra
相关产品推荐
相关产品推荐

