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

在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:55:12