LangChain中创建FAISS对象时遭遇AttributeError问题求助
问题解决:FAISS.from_documents 触发 AttributeError 错误
执行代码db = FAISS.from_documents(documents=documents, embedding=embedding)时出现以下错误:
AttributeError: 'google.protobuf.pyext._message.RepeatedCompositeCo' object has no attribute 'WhichOneof'
问题代码
自定义Embedding类:
class MyVertexAIEmbeddings(VertexAIEmbeddings, Embeddings): model_name = 'textembedding-gecko' max_batch_size = 5 def embed_segments(self, segments: List) -> List: embeddings = [] for i in tqdm(range(0, len(segments), self.max_batch_size)): batch = segments[i: i+self.max_batch_size] embeddings.extend(self.client.get_embeddings(batch)) return [embedding.values for embedding in embeddings] def embed_query(self, query: str) -> List: embeddings = self.client.get_embeddings([query]) return embeddings[0].values
加载数据与初始化:
documents = JSONLoader(file_path='./data/rag-schema/tables.jsonl', jq_schema='.', text_content=False, json_lines=True).load() embedding = MyVertexAIEmbeddings()
触发错误的代码:
db = FAISS.from_documents(documents=documents, embedding=embedding)
解决方法
1. 转换Embedding结果为原生Python列表
错误根源是Vertex AI返回的embedding.values是protobuf的RepeatedComposite对象,FAISS无法直接处理该类型,需转换为普通列表:
修改自定义Embedding类的两个方法:
class MyVertexAIEmbeddings(VertexAIEmbeddings, Embeddings): model_name = 'textembedding-gecko' max_batch_size = 5 def embed_segments(self, segments: List) -> List: embeddings = [] for i in tqdm(range(0, len(segments), self.max_batch_size)): batch = segments[i: i+self.max_batch_size] embeddings.extend(self.client.get_embeddings(batch)) # 转换为原生列表 return [list(embedding.values) for embedding in embeddings] def embed_query(self, query: str) -> List: embeddings = self.client.get_embeddings([query]) # 转换为原生列表 return list(embeddings[0].values)
2. 确保Protobuf版本兼容
若修改后仍报错,检查protobuf版本,高版本可能与Vertex AI SDK存在兼容性问题,可安装指定版本:
pip install protobuf==3.20.3
内容的提问来源于stack exchange,提问作者shaquille.oatmeal
相关产品推荐
相关产品推荐

