Python中使用FAISS构建PDF内容向量存储时from_embeddings方法参数传递报错的问题求助
Python中使用FAISS构建PDF内容向量存储时from_embeddings方法参数传递报错的问题求助
看起来你在LangChain里用FAISS构建向量存储的时候,对from_embeddings方法的参数要求理解有点偏差,我来帮你梳理下正确的用法,顺便给你优化下整个流程~
首先先解释你遇到的报错原因:
你碰到的TypeError: FAISS.from_embeddings() missing 1 required positional argument: 'embedding',本质是因为LangChain的FAISS.from_embeddings方法必须接收一个LangChain规范的Embeddings类实例作为embedding参数,而不是直接传SentenceTransformer生成的numpy数组;另外,这个方法需要的是text_embeddings参数(是文本和对应嵌入向量的元组列表),而不是你自己命名的sentences_list。
下面给你两种可行的解决思路,其中第二种更符合LangChain的常规开发流程,推荐使用:
思路1:调整参数适配from_embeddings方法
如果你坚持要用这个方法,需要做两个关键调整:
- 用LangChain的
SentenceTransformerEmbeddings包装你的模型,符合框架的接口要求 - 把句子和对应的embedding配对成
(文本内容, 嵌入向量)的元组列表,传给text_embeddings参数
示例代码片段:
# 假设你已经有sentences列表和model.encode生成的embeddings数组 from langchain_community.embeddings import SentenceTransformerEmbeddings # 1. 初始化LangChain规范的Embeddings实例 lc_embeddings = SentenceTransformerEmbeddings(model_name='all-MiniLM-L6-v2') # 2. 配对文本和向量 text_embeddings = list(zip(sentences, embeddings)) # 3. 正确调用from_embeddings vectorstore = FAISS.from_embeddings(text_embeddings=text_embeddings, embedding=lc_embeddings)
思路2:用from_documents方法(更推荐)
LangChain更常规的用法是把文本转成框架标准的Document对象,然后用FAISS.from_documents方法,它会自动帮你处理嵌入生成,代码更简洁,后续和其他组件(比如检索链、大模型)配合也更顺畅。
下面是优化后的完整代码,我还修正了你代码里搜索方法的错误(LangChain的FAISS用similarity_search而不是search):
import re import PyPDF2 from langchain_community.vectorstores import FAISS from langchain_community.embeddings import SentenceTransformerEmbeddings from langchain_text_splitters import SentenceSplitter from langchain_core.documents import Document def extract_text_from_pdf(pdf_path): """Extracts text from a PDF file. Args: pdf_path (str): Path to the PDF file. Returns: str: Extracted text from the PDF. """ with open(pdf_path, 'rb') as pdf_file: reader = PyPDF2.PdfReader(pdf_file) text = "" for page_num in range(len(reader.pages)): page = reader.pages[page_num] text += page.extract_text() return text if __name__ == "__main__": pdf_path = "your_pdf_path.pdf" # 替换成你的实际PDF路径 # 1. 提取PDF文本 text = extract_text_from_pdf(pdf_path) print("Text extracted from PDF file successfully.") # 2. 预处理文本 text = re.sub(r'[^\x00-\x7F]+', '', text) # 移除非ASCII字符 # 3. 分割文本为句子,生成LangChain标准Document对象 splitter = SentenceSplitter(chunk_size=1, chunk_overlap=0) # 按句子分割 docs = splitter.create_documents([text]) # 4. 初始化符合LangChain规范的嵌入模型 embeddings = SentenceTransformerEmbeddings(model_name='all-MiniLM-L6-v2') # 5. 一键构建FAISS向量存储 vectorstore = FAISS.from_documents(docs, embeddings) print("Vector store created successfully.") # 6. 执行相似性搜索 query = "Was sind die wichtigsten Worte?" search_results = vectorstore.similarity_search(query) print("Search results:") for result in search_results: print(result.page_content)
备注:内容来源于stack exchange,提问作者Pantastix




