调用OpenAIEmbeddings的get_embeddings方法触发AttributeError错误求助
解决OpenAIEmbeddings的AttributeError问题:'get_embeddings'方法不存在
错误原因
OpenAIEmbeddings类并未提供get_embeddings方法,获取文本嵌入向量的正确方法为:
- 处理单条查询文本:使用
embed_query()方法 - 处理多条文档文本:使用
embed_documents()方法
修正后的完整代码
同时修复原代码中分割文本与原始Item索引不匹配的问题(原代码直接用split_texts的索引去取原始texts的元素会导致结果错误),推荐使用更清晰的索引映射方式:
import os import pandas as pd from langchain.embeddings.openai import OpenAIEmbeddings from langchain.text_splitter import CharacterTextSplitter from langchain.vectorstores import FAISS # 设置OpenAI API密钥 os.environ["OPENAI_API_KEY"] = "你的API密钥" # 初始化嵌入模型 embedding = OpenAIEmbeddings() # 加载Excel数据 df = pd.read_excel('sampledata.xlsx') # 提取Item列文本 texts = df['Item'].tolist() # 文本分割(若Item文本较短可省略此步骤) text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=10, chunk_overlap=0) split_texts = [] # 记录每个分割文本对应的原始Item,避免索引混乱 original_items = [] for item in texts: chunks = text_splitter.split_text(item) for chunk in chunks: split_texts.append(chunk) original_items.append(item) # 创建FAISS向量库 vectordb = FAISS.from_texts(texts=split_texts, embedding=embedding) # 查询处理 query = "Pen" # 获取查询向量(单条文本用embed_query) query_vector = embedding.embed_query(query) # 搜索相似结果 top_k = 10 distances, indices = vectordb.search(query_vector, top_k) # 打印结果(使用original_items匹配分割文本对应的原始Item) for i in range(len(distances[0])): idx = indices[0][i] print(f"原始Item: {original_items[idx]}, 匹配文本块: {split_texts[idx]}, 距离: {distances[0][i]}")
额外优化建议
- 若
Item列文本较短,可直接跳过文本分割步骤,避免索引匹配的麻烦。 - 创建向量库时可添加元数据,方便后续直接获取原始数据:
# 示例:添加原始Item作为元数据 from langchain.schema import Document docs = [Document(page_content=item, metadata={"original_item": item}) for item in texts] vectordb = FAISS.from_documents(documents=docs, embedding=embedding) # 搜索时直接读取元数据 results = vectordb.similarity_search_with_score(query, k=top_k) for doc, score in results: print(f"原始Item: {doc.metadata['original_item']}, 相似度分数: {score}")
内容的提问来源于stack exchange,提问作者RoRo
相关产品推荐
相关产品推荐

