使用ChromaDB执行向量嵌入时内核崩溃问题求助
问题描述
本地用Ollama构建聊天机器人时,ChromaDB向量嵌入环节处理完整246页PDF内核崩溃,仅处理单章节可正常运行。
问题代码
# Create the Chroma vector store from langchain_chroma.vectorstores import Chroma try: vector_db = Chroma.from_documents( documents=chunked_document, embedding=embedding_model, collection_name="local-rag", persist_directory="./db/db_nomic" ) print("Embedded Documents stored in ChromaDB successfully!") except Exception as e: print(f"An error occurred: {e}")
备注信息
embedding_model = OllamaEmbeddings(model="nomic-embed-text") chunked_document = [Document(metadata={'source': 'xxx', 'page': 1, 'math_expressions': 'xxx'}, page_content=''), .... ]
补充信息
- Python版本:
3.12.7
已尝试方案
- 将代码从Jupyter Notebook移至Python文件,问题依旧;
- 采用批量嵌入方式,未解决;
- 合并单章节生成的数据库,无效。
解决方案
1. 分批次增量嵌入
避免一次性传入所有文档块,分批次增量添加到ChromaDB,降低内存负载:
from langchain_chroma.vectorstores import Chroma import math # 设定每批次处理的文档数量 batch_size = 50 total_chunks = len(chunked_document) vector_db = None for i in range(0, total_chunks, batch_size): batch = chunked_document[i:i+batch_size] if not vector_db: # 初始化数据库 vector_db = Chroma.from_documents( documents=batch, embedding=embedding_model, collection_name="local-rag", persist_directory="./db/db_nomic" ) else: # 增量添加当前批次 vector_db.add_documents(documents=batch) print(f"完成批次 {i//batch_size + 1}/{math.ceil(total_chunks/batch_size)} 处理") # 持久化数据库 vector_db.persist() print("所有文档嵌入并存储成功!")
2. 清理无效文档与优化分割
- 过滤空内容的文档(如备注中
page_content=''的条目):
# 移除无实际内容的文档块 filtered_chunks = [doc for doc in chunked_document if doc.page_content.strip() != '']
- 调整PDF分割的
chunk_size和chunk_overlap参数,缩小单个文档块的体积,减少单批次内存占用。
3. 限制嵌入模型资源占用
给Ollama嵌入模型设置批量大小和超时,避免进程过度占用内存:
from langchain_community.embeddings import OllamaEmbeddings embedding_model = OllamaEmbeddings( model="nomic-embed-text", timeout=60, embed_batch_size=32 # 控制单次嵌入的文档数量 )
4. 系统资源优化
- 关闭后台闲置程序,释放足够RAM;
- Windows关闭虚拟内存压缩,Linux/macOS适当调整swap空间,缓解内存压力。
内容的提问来源于stack exchange,提问作者Abdullah Al Mahfuz
相关产品推荐
相关产品推荐

