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

如何从Google Cloud Storage加载FAISS索引至Cloud Function并解决加载报错

从Google Cloud Storage加载FAISS索引到Cloud Function的正确方法

问题根源分析

你的代码存在三个关键问题导致加载失败:

  1. 路径传递错误:FAISS.load_local中folder_path传了字符串"EMBEDDINGS_PATH",而非变量EMBEDDINGS_PATH,导致函数找不到正确的文件目录
  2. 文件下载不完整:filename = "index.faiss" or "index.pkl"的逻辑只会返回第一个值,没有下载FAISS索引必需的两个文件(.faiss和.pkl)
  3. 文件写入冗余:使用download_as_string再手动写入文件容易出现二进制数据处理问题,直接用download_to_filename更可靠

修正后的完整代码

import os
from google.cloud import storage
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings

def load_faiss_from_gcs():
    # 初始化GCS客户端
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(os.environ["BUCKET_NAME"])
    
    # 定义本地临时目录和GCS上的文件路径前缀
    LOCAL_TMP_PATH = "/tmp"
    GCS_EMBEDDINGS_PREFIX = "embeddings"
    
    # FAISS索引必需的两个文件
    required_files = ["index.faiss", "index.pkl"]
    
    # 遍历下载所有必需文件到/tmp目录
    for filename in required_files:
        blob = bucket.blob(f"{GCS_EMBEDDINGS_PREFIX}/{filename}")
        local_file_path = f"{LOCAL_TMP_PATH}/{filename}"
        # 直接下载到本地文件,避免手动处理二进制数据
        blob.download_to_filename(local_file_path)
    
    # 初始化OpenAI嵌入模型
    embeddings = OpenAIEmbeddings(openai_api_key=os.environ["OPENAI_API_KEY"])
    
    # 加载FAISS索引:注意这里用变量LOCAL_TMP_PATH而非字符串
    vectorstore = FAISS.load_local(
        folder_path=LOCAL_TMP_PATH,
        embeddings=embeddings,
        allow_dangerous_deserialization=True
    )
    
    return vectorstore

额外注意事项

  • 权限配置:确保Cloud Function使用的服务账号拥有目标GCS存储桶的storage.objects.get权限(可通过IAM角色roles/storage.objectViewer配置)
  • 临时目录限制:Cloud Function的/tmp目录最大可用空间为512MB,确保你的FAISS索引文件总大小不超过这个限制
  • 反序列化风险:allow_dangerous_deserialization=True会启用pickle反序列化,仅在你完全信任索引文件来源时使用

内容的提问来源于stack exchange,提问作者Eva Agustine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:57:57