运行FAISS相似度搜索时Jupyter内核崩溃问题求助
FAISS相似度搜索导致Jupyter内核崩溃(Intel MacBook Pro环境)
问题概述
使用LangChain 0.2.0构建FAISS向量存储库后,执行similarity_search时Jupyter内核直接崩溃。已尝试重建向量库、重装faiss-cpu、关闭高资源程序,均未解决问题。运行环境为Intel芯片MacBook Pro、Python 3.9、Jupyter Notebook。
相关代码:
from langchain_community.document_loaders import PyPDFLoader from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings from langchain_text_splitters import RecursiveCharacterTextSplitter f = open('credentials.txt') OPENAI_API_KEY = f.read() embeddings_model = OpenAIEmbeddings(api_key=OPENAI_API_KEY) document_loader = PyPDFLoader('filename.pdf') text_splitter=RecursiveCharacterTextSplitter() documents = document_loader.load_and_split(text_splitter) vectorstore = FAISS.from_documents(documents, embeddings_model) vectorstore.similarity_search('query')
可能的原因及解决方案
1. 内存过载
PDF文档拆分后生成的文本块过多,向量存储库体积过大,执行相似度搜索时内存占用峰值超出系统可用内存,导致内核崩溃。
- 解决方案:缩小文本拆分的块大小,减少向量数量:
text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, # 调整为更小的块大小 chunk_overlap=50 ) - 额外建议:查看拆分后的
len(documents),如果数量上千,考虑进一步缩小chunk_size,或者过滤掉无意义的短文本块。
2. FAISS与LangChain版本不兼容
LangChain 0.2.0对FAISS版本有特定依赖,当前安装的faiss-cpu版本可能存在兼容性问题。
- 解决方案:安装LangChain 0.2.0兼容的FAISS版本,例如:
pip uninstall -y faiss-cpu pip install faiss-cpu==1.7.4
3. Jupyter内核资源限制
Jupyter内核默认的内存配额可能不足以支撑相似度搜索的内存需求,即使系统有剩余内存。
- 解决方案:
- 尝试在终端直接运行代码(而非Jupyter),验证是否仍会崩溃:将代码保存为
.py文件,执行python your_script.py。如果终端运行正常,说明问题出在Jupyter内核配置。 - 修改Jupyter内核配置,增加内存限制:
- 生成Jupyter配置文件:
jupyter notebook --generate-config - 打开配置文件,找到
c.NotebookApp.max_buffer_size,取消注释并设置较大值(例如c.NotebookApp.max_buffer_size = 10737418240,即10GB)。
- 生成Jupyter配置文件:
- 尝试在终端直接运行代码(而非Jupyter),验证是否仍会崩溃:将代码保存为
4. Embeddings批量生成异常
使用FAISS.from_documents批量生成embeddings时,可能存在隐藏的内存泄漏或数据异常,导致后续搜索出错。
- 解决方案:手动分批生成embeddings并构建FAISS库:
# 拆分文档为小批次 batch_size = 100 batches = [documents[i:i+batch_size] for i in range(0, len(documents), batch_size)] # 初始化FAISS库 vectorstore = None for batch in batches: contents = [doc.page_content for doc in batch] embeddings = embeddings_model.embed_documents(contents) if vectorstore is None: vectorstore = FAISS.from_embeddings( list(zip(contents, embeddings)), embeddings_model ) else: vectorstore.add_embeddings( list(zip(contents, embeddings)) )
内容的提问来源于stack exchange,提问作者JKS
相关产品推荐
相关产品推荐

