在Django服务器中运行Langchain无法创建FAISS索引求助
解决方案
1. 延迟单例初始化到首次使用时
不要在Django启动阶段(如类定义、apps.py的ready()方法)初始化模型和FAISS索引,改为首次调用聊天功能时再执行初始化逻辑,避免启动阶段阻塞:
class ChatBotSingleton: _instance = None vectordb = None embeddings = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def get_vectordb(self): if self.vectordb is None: import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) gpt4all_path = os.path.join(BASE_DIR, 'models/gpt4all_converted.bin') llama_path = os.path.join(BASE_DIR, 'models/ggml_model_q4_0.bin') self.embeddings = LlamaCppEmbeddings(model_path=llama_path) print("Initializing Index...") self.vectordb = FAISS.from_documents(docs, self.embeddings) print("Initialized Index!!!") return self.vectordb
2. 限制模型使用的CPU线程数
LlamaCpp默认会占用全部CPU核心,在Django服务器环境下易导致资源耗尽。初始化时指定线程数,避免抢占过多资源:
self.embeddings = LlamaCppEmbeddings( model_path=llama_path, n_threads=4 # 根据服务器CPU核心数调整,建议使用核心数的一半 )
3. 预构建FAISS索引并直接加载
跳过实时创建索引的耗时步骤,先在manage.py shell中构建并保存索引,之后在单例类里直接加载:
# 先在shell中执行一次保存索引 vectordb.save_local("faiss_index") # 单例类中修改加载逻辑 def get_vectordb(self): if self.vectordb is None: import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) llama_path = os.path.join(BASE_DIR, 'models/ggml_model_q4_0.bin') self.embeddings = LlamaCppEmbeddings(model_path=llama_path, n_threads=4) self.vectordb = FAISS.load_local("faiss_index", self.embeddings) return self.vectordb
4. 适配多进程WSGI服务器
如果使用Gunicorn等多进程服务器,添加--preload参数让模型在进程fork前完成加载,避免重复初始化:
gunicorn your_project.wsgi:application --preload --workers 2
5. 检查模型文件路径与权限
确保Django进程有模型文件的读取权限,改用绝对路径避免相对路径在服务器环境下的解析错误:
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) llama_path = os.path.join(BASE_DIR, 'models/ggml_model_q4_0.bin')
内容的提问来源于stack exchange,提问作者Rocky C.
相关产品推荐
相关产品推荐

