使用 OpenAI 嵌入和 Chroma 向量存储限制 LangChain 中每分钟的代币数量

Hek*_*eka 5 langchain chromadb openaiembeddings

我正在寻找一种方法来限制在 Chroma 矢量存储中保存嵌入时每分钟的令牌数。这是我的代码:

[...]
# split the documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1500, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# select which embeddings we want to use
embeddings = OpenAIEmbeddings()
# create the vectorestore to use as the index
db = Chroma.from_documents(texts, embeddings)
[...]
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Retrying langchain.embeddings.openai.embed_with_retry.<locals>._embed_with_retry in 4.0 seconds as it raised RateLimitError: Rate limit reached for default-text-embedding-ada-002 in organization org-xxx on tokens per min. Limit: 1000000 / min. Current: 1 / min. Contact us through our help center at help.openai.com if you continue to have issues..
Run Code Online (Sandbox Code Playgroud)

由于该函数.from_documents由langchain/chroma库提供,因此无法编辑。我想知道你们中是否有人知道在向量存储中存储许多文本块和嵌入时如何限制每分钟的令牌数?我考虑过创建多组文本块并将它们安全地设置为db,例如使用该.persist函数。然而,db据我了解,这会覆盖每次。我在 langchain 或 chroma 文档中找不到解决方案。

非常感谢您的帮助。

问候

小智 3

发生这种情况是因为您可以向 OpenAI 发送有限数量的代币。

我找到的解决方案是慢慢地将其喂给OpenAI。我期望 Chroma 有速率限制器,但我找不到这样的东西。下面的代码为我做了

创建数据库后

for splitted_document in all_splits:
  vectorstore.from_documents(documents=[splitted_document], embedding=OpenAIEmbeddings(), persist_directory=base_path)
  time.sleep(60)
Run Code Online (Sandbox Code Playgroud)