You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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方法

如果你坚持要用这个方法,需要做两个关键调整:

  1. 用LangChain的SentenceTransformerEmbeddings包装你的模型,符合框架的接口要求
  2. 把句子和对应的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

火山引擎 最新活动