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

如何在Chroma数据库中添加集合/对象?解决合并实例报错问题

解决方案:处理OpenAI嵌入速率限制并分批存入Chroma

一、核心问题拆解

  1. OpenAI速率限制:个人账号使用text-embedding-ada-002时存在调用频次上限,一次性处理大量文档会触发RateLimitError。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:17:25