如何从Google Cloud Storage加载FAISS索引至Cloud Function并解决加载报错
从Google Cloud Storage加载FAISS索引到Cloud Function的正确方法
问题根源分析
你的代码存在三个关键问题导致加载失败:
- 路径传递错误:
FAISS.load_local中folder_path传了字符串"EMBEDDINGS_PATH",而非变量EMBEDDINGS_PATH,导致函数找不到正确的文件目录 - 文件下载不完整:
filename = "index.faiss" or "index.pkl"的逻辑只会返回第一个值,没有下载FAISS索引必需的两个文件(.faiss和.pkl) - 文件写入冗余:使用
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
相关产品推荐
相关产品推荐

