chatchat-space / Langchain-Chatchat

Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM, Qwen 与 Llama 等语言模型的 RAG 与 Agent 应用 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM, Qwen and Llama) RAG and Agent app with langchain
Apache License 2.0
31.24k stars 5.45k forks source link

如何使上传的pdf文档被向量化?document_loaders文件夹下面各种loader的用法是什么? #3521

Closed xx59469xx closed 5 months ago

xx59469xx commented 5 months ago

如何使上传的pdf文档被向量化?document_loaders文件夹下面各种loader的用法是什么? 目前我上传的pdf文档无法被加入向量库中,也没有文档加载器被使用,但是我看到document_loaders下面是由pdfloader的 屏幕截图 2024-03-26 143418

dosubot[bot] commented 5 months ago

嗨,@xx59469xx!很高兴再次见到你,希望一切都好!

根据您的问题,我理解您想要知道如何使用Langchain-Chatchat中的document_loaders文件夹下的加载器,使上传的pdf文档被向量化并加入向量库中。以下是一段示例代码,展示了如何实现这个过程:

from langchain.document_loaders import VectorDatabase
from langchain.chains import SimpleRetriever
from langchain.document_loaders.unstructured import PDFLoader

# 首先,创建一个PDFLoader实例来加载PDF文档
pdf_loader = PDFLoader()

# 加载PDF文档
document_path = "path/to/your/document.pdf"  # 替换为你的PDF文档路径
document = pdf_loader.load(document_path)

# 使用OCR处理PDF文档并获取文本
ocr_text = get_ocr(document)

# 接下来,使用Langchain的向量化功能将文本向量化
# 假设你已经有一个向量化模型,这里我们使用一个简单的例子
vectorizer = SimpleRetriever()  # 这里应根据实际情况选择合适的向量化模型

# 向量化文本
vectorized_text = vectorizer.vectorize([ocr_text])

# 最后,将向量化的文档加入向量库中
vector_database = VectorDatabase()  # 初始化向量库
vector_database.add(vectorized_text)  # 添加向量化的文档到向量库

这段代码首先使用PDFLoader加载PDF文档并通过OCR获取文本内容。然后,使用一个向量化模型(这里以SimpleRetriever为例)将文本内容向量化。最后,将向量化的文档加入到向量库中。请注意,这里的SimpleRetrieverVectorDatabase是假设的类,实际使用时应替换为Langchain提供的相应功能或类。

关于PDFLoader类的具体功能,它是设计用来加载PDF文档,从中提取文本,并处理PDF中的图像以进行OCR(光学字符识别)。它扩展了UnstructuredFileLoader类,表明其用于处理非结构化文档格式。关键功能包括:

  1. 文本提取:它使用fitz库(PyMuPDF的一部分)打开并阅读PDF文档的每一页,直接从文档结构中提取文本。
  2. 图像处理以进行OCR:对于嵌入在PDF中的图像,它检查它们的大小是否超过由PDF_OCR_THRESHOLD定义的某个阈值。如果图像在可接受的大小范围内,它将处理它们以进行OCR。这涉及将图像转换为适当的格式,如果页面本身旋转,则可能旋转它们,然后将图像数据传递给OCR函数(get_ocr)。OCR函数预计会返回从图像中提取的文本,然后将其附加到从PDF中提取的整体文本中。
  3. 旋转处理:对于需要旋转的图像(基于页面的旋转属性),它计算必要的旋转并应用它,确保OCR可以在图像的正确方向上工作。
  4. 进度跟踪:它使用tqdm提供进度条,显示已处理的PDF页数。
  5. 文本分区:在从PDF的文本层和通过OCR从图像中提取和编译文本之后,它使用函数partition_text分区文本,该函数可能根据类的unstructured_kwargs将文本组织成更结构化的格式。
  6. 在图像上进行OCR:对于满足大小标准并且是PDF的一部分的图像,它执行OCR以提取文本。这对于包含扫描文档或带有文本的图像的PDF特别有用。

总的来说,PDFLoader类是从PDF文件中提取文本的全面工具,包括处理嵌入的图像以进行OCR,具有调整页面旋转和分区提取文本以进行进一步处理的功能。

关于get_ocr函数在Langchain-Chatchat存储库中的工作方式,以及它如何与PDFLoader类一起用于从PDF文档中提取文本,以下是详细的解释:

  1. 初始化OCR:在pdf2text函数开始时,调用get_ocr函数(无参数)来初始化OCR引擎。这是通过ocr = get_ocr()这行代码完成的。
  2. 打开PDF文档:使用PyMuPDF库的fitz.open(filepath)方法打开PDF文档。
  3. 遍历页面:代码遍历PDF文档的每一页。对于每一页,首先尝试使用page.get_text("")直接提取文本。
  4. 提取图像以进行OCR:如果页面包含图像,它会检查每个图像的尺寸是否超过预定义的阈值(PDF_OCR_THRESHOLD)。如果图像满足大小标准,它将被处理以进行OCR。
  5. 图像准备:在进行OCR之前,通过检查页面是否有旋转来准备图像。如果有,使用rotate_img函数将图像旋转回其原始方向。这确保OCR引擎可以准确解读文本。
  6. 执行OCR:然后通过调用result, _ = ocr(img_array)将准备好的图像传递给OCR引擎。这个函数返回OCR结果,然后处理并添加到resp字符串中,该字符串累积从直接文本提取和OCR中提取的文本。
  7. 分区文本:在处理所有页面和图像后,将累积的文本(resp)传递给partition_text函数,该函数可能根据self.unstructured_kwargs中定义的某些标准将文本划分为更易管理的部分或将其结构化。
  8. 使用:通过指定PDF文档的文件路径创建RapidOCRPDFLoader类的实例,然后调用load方法来提取文本。这个过程在if __name__ == "__main__":块中演示,其中创建了一个测试PDF文件的RapidOCRPDFLoader实例,并打印了提取的文档。

总的来说,get_ocr函数是RapidOCRPDFLoader类中OCR过程的关键部分,使得从PDF文档中的图像提取文本成为可能,这补充了从PDF的文本层直接提取文本的功能。

以上信息来源于:

希望这些信息能帮助您解决问题。如果您有任何其他问题,或者需要更多的解释,请随时提问。

Sources

#### About Dosu This response is meant to be useful and save you time. It is **not meant to be a precise solution**, but rather a starting point for your own research. Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant. If you want to continue the conversation, start your reply with @dosu-bot.
xx59469xx commented 5 months ago

嗨,@xx59469xx!很高兴再次见到你,希望一切都好!

根据您的问题,我理解您想要知道如何使用Langchain-Chatchat中的document_loaders文件夹下的加载器,使上传的pdf文档被向量化并加入向量库中。以下是一段示例代码,展示了如何实现这个过程:

from langchain.document_loaders import VectorDatabase
from langchain.chains import SimpleRetriever
from langchain.document_loaders.unstructured import PDFLoader

# 首先,创建一个PDFLoader实例来加载PDF文档
pdf_loader = PDFLoader()

# 加载PDF文档
document_path = "path/to/your/document.pdf"  # 替换为你的PDF文档路径
document = pdf_loader.load(document_path)

# 使用OCR处理PDF文档并获取文本
ocr_text = get_ocr(document)

# 接下来,使用Langchain的向量化功能将文本向量化
# 假设你已经有一个向量化模型,这里我们使用一个简单的例子
vectorizer = SimpleRetriever()  # 这里应根据实际情况选择合适的向量化模型

# 向量化文本
vectorized_text = vectorizer.vectorize([ocr_text])

# 最后,将向量化的文档加入向量库中
vector_database = VectorDatabase()  # 初始化向量库
vector_database.add(vectorized_text)  # 添加向量化的文档到向量库

这段代码首先使用PDFLoader加载PDF文档并通过OCR获取文本内容。然后,使用一个向量化模型(这里以SimpleRetriever为例)将文本内容向量化。最后,将向量化的文档加入到向量库中。请注意,这里的SimpleRetrieverVectorDatabase是假设的类,实际使用时应替换为Langchain提供的相应功能或类。

关于PDFLoader类的具体功能,它是设计用来加载PDF文档,从中提取文本,并处理PDF中的图像以进行OCR(光学字符识别)。它扩展了UnstructuredFileLoader类,表明其用于处理非结构化文档格式。关键功能包括:

  1. 文本提取:它使用fitz库(PyMuPDF的一部分)打开并阅读PDF文档的每一页,直接从文档结构中提取文本。
  2. 图像处理以进行OCR:对于嵌入在PDF中的图像,它检查它们的大小是否超过由PDF_OCR_THRESHOLD定义的某个阈值。如果图像在可接受的大小范围内,它将处理它们以进行OCR。这涉及将图像转换为适当的格式,如果页面本身旋转,则可能旋转它们,然后将图像数据传递给OCR函数(get_ocr)。OCR函数预计会返回从图像中提取的文本,然后将其附加到从PDF中提取的整体文本中。
  3. 旋转处理:对于需要旋转的图像(基于页面的旋转属性),它计算必要的旋转并应用它,确保OCR可以在图像的正确方向上工作。
  4. 进度跟踪:它使用tqdm提供进度条,显示已处理的PDF页数。
  5. 文本分区:在从PDF的文本层和通过OCR从图像中提取和编译文本之后,它使用函数partition_text分区文本,该函数可能根据类的unstructured_kwargs将文本组织成更结构化的格式。
  6. 在图像上进行OCR:对于满足大小标准并且是PDF的一部分的图像,它执行OCR以提取文本。这对于包含扫描文档或带有文本的图像的PDF特别有用。

总的来说,PDFLoader类是从PDF文件中提取文本的全面工具,包括处理嵌入的图像以进行OCR,具有调整页面旋转和分区提取文本以进行进一步处理的功能。

关于get_ocr函数在Langchain-Chatchat存储库中的工作方式,以及它如何与PDFLoader类一起用于从PDF文档中提取文本,以下是详细的解释:

  1. 初始化OCR:在pdf2text函数开始时,调用get_ocr函数(无参数)来初始化OCR引擎。这是通过ocr = get_ocr()这行代码完成的。
  2. 打开PDF文档:使用PyMuPDF库的fitz.open(filepath)方法打开PDF文档。
  3. 遍历页面:代码遍历PDF文档的每一页。对于每一页,首先尝试使用page.get_text("")直接提取文本。
  4. 提取图像以进行OCR:如果页面包含图像,它会检查每个图像的尺寸是否超过预定义的阈值(PDF_OCR_THRESHOLD)。如果图像满足大小标准,它将被处理以进行OCR。
  5. 图像准备:在进行OCR之前,通过检查页面是否有旋转来准备图像。如果有,使用rotate_img函数将图像旋转回其原始方向。这确保OCR引擎可以准确解读文本。
  6. 执行OCR:然后通过调用result, _ = ocr(img_array)将准备好的图像传递给OCR引擎。这个函数返回OCR结果,然后处理并添加到resp字符串中,该字符串累积从直接文本提取和OCR中提取的文本。
  7. 分区文本:在处理所有页面和图像后,将累积的文本(resp)传递给partition_text函数,该函数可能根据self.unstructured_kwargs中定义的某些标准将文本划分为更易管理的部分或将其结构化。
  8. 使用:通过指定PDF文档的文件路径创建RapidOCRPDFLoader类的实例,然后调用load方法来提取文本。这个过程在if __name__ == "__main__":块中演示,其中创建了一个测试PDF文件的RapidOCRPDFLoader实例,并打印了提取的文档。

总的来说,get_ocr函数是RapidOCRPDFLoader类中OCR过程的关键部分,使得从PDF文档中的图像提取文本成为可能,这补充了从PDF的文本层直接提取文本的功能。

以上信息来源于:

希望这些信息能帮助您解决问题。如果您有任何其他问题,或者需要更多的解释,请随时提问。

Sources

About Dosu

This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot. 我想知道的是如何在webui界面上传pdf的同时,使这个pdf文件被加入到向量库中

xx59469xx commented 5 months ago

我想知道的是如何在webui界面上传pdf的同时,使这个pdf文件被加入到向量库中

嗨,@xx59469xx!很高兴再次见到你,希望一切都好!

根据您的问题,我理解您想要知道如何使用Langchain-Chatchat中的document_loaders文件夹下的加载器,使上传的pdf文档被向量化并加入向量库中。以下是一段示例代码,展示了如何实现这个过程:

from langchain.document_loaders import VectorDatabase
from langchain.chains import SimpleRetriever
from langchain.document_loaders.unstructured import PDFLoader

# 首先,创建一个PDFLoader实例来加载PDF文档
pdf_loader = PDFLoader()

# 加载PDF文档
document_path = "path/to/your/document.pdf"  # 替换为你的PDF文档路径
document = pdf_loader.load(document_path)

# 使用OCR处理PDF文档并获取文本
ocr_text = get_ocr(document)

# 接下来,使用Langchain的向量化功能将文本向量化
# 假设你已经有一个向量化模型,这里我们使用一个简单的例子
vectorizer = SimpleRetriever()  # 这里应根据实际情况选择合适的向量化模型

# 向量化文本
vectorized_text = vectorizer.vectorize([ocr_text])

# 最后,将向量化的文档加入向量库中
vector_database = VectorDatabase()  # 初始化向量库
vector_database.add(vectorized_text)  # 添加向量化的文档到向量库

这段代码首先使用PDFLoader加载PDF文档并通过OCR获取文本内容。然后,使用一个向量化模型(这里以SimpleRetriever为例)将文本内容向量化。最后,将向量化的文档加入到向量库中。请注意,这里的SimpleRetrieverVectorDatabase是假设的类,实际使用时应替换为Langchain提供的相应功能或类。

关于PDFLoader类的具体功能,它是设计用来加载PDF文档,从中提取文本,并处理PDF中的图像以进行OCR(光学字符识别)。它扩展了UnstructuredFileLoader类,表明其用于处理非结构化文档格式。关键功能包括:

  1. 文本提取:它使用fitz库(PyMuPDF的一部分)打开并阅读PDF文档的每一页,直接从文档结构中提取文本。
  2. 图像处理以进行OCR:对于嵌入在PDF中的图像,它检查它们的大小是否超过由PDF_OCR_THRESHOLD定义的某个阈值。如果图像在可接受的大小范围内,它将处理它们以进行OCR。这涉及将图像转换为适当的格式,如果页面本身旋转,则可能旋转它们,然后将图像数据传递给OCR函数(get_ocr)。OCR函数预计会返回从图像中提取的文本,然后将其附加到从PDF中提取的整体文本中。
  3. 旋转处理:对于需要旋转的图像(基于页面的旋转属性),它计算必要的旋转并应用它,确保OCR可以在图像的正确方向上工作。
  4. 进度跟踪:它使用tqdm提供进度条,显示已处理的PDF页数。
  5. 文本分区:在从PDF的文本层和通过OCR从图像中提取和编译文本之后,它使用函数partition_text分区文本,该函数可能根据类的unstructured_kwargs将文本组织成更结构化的格式。
  6. 在图像上进行OCR:对于满足大小标准并且是PDF的一部分的图像,它执行OCR以提取文本。这对于包含扫描文档或带有文本的图像的PDF特别有用。

总的来说,PDFLoader类是从PDF文件中提取文本的全面工具,包括处理嵌入的图像以进行OCR,具有调整页面旋转和分区提取文本以进行进一步处理的功能。

关于get_ocr函数在Langchain-Chatchat存储库中的工作方式,以及它如何与PDFLoader类一起用于从PDF文档中提取文本,以下是详细的解释:

  1. 初始化OCR:在pdf2text函数开始时,调用get_ocr函数(无参数)来初始化OCR引擎。这是通过ocr = get_ocr()这行代码完成的。
  2. 打开PDF文档:使用PyMuPDF库的fitz.open(filepath)方法打开PDF文档。
  3. 遍历页面:代码遍历PDF文档的每一页。对于每一页,首先尝试使用page.get_text("")直接提取文本。
  4. 提取图像以进行OCR:如果页面包含图像,它会检查每个图像的尺寸是否超过预定义的阈值(PDF_OCR_THRESHOLD)。如果图像满足大小标准,它将被处理以进行OCR。
  5. 图像准备:在进行OCR之前,通过检查页面是否有旋转来准备图像。如果有,使用rotate_img函数将图像旋转回其原始方向。这确保OCR引擎可以准确解读文本。
  6. 执行OCR:然后通过调用result, _ = ocr(img_array)将准备好的图像传递给OCR引擎。这个函数返回OCR结果,然后处理并添加到resp字符串中,该字符串累积从直接文本提取和OCR中提取的文本。
  7. 分区文本:在处理所有页面和图像后,将累积的文本(resp)传递给partition_text函数,该函数可能根据self.unstructured_kwargs中定义的某些标准将文本划分为更易管理的部分或将其结构化。
  8. 使用:通过指定PDF文档的文件路径创建RapidOCRPDFLoader类的实例,然后调用load方法来提取文本。这个过程在if __name__ == "__main__":块中演示,其中创建了一个测试PDF文件的RapidOCRPDFLoader实例,并打印了提取的文档。

总的来说,get_ocr函数是RapidOCRPDFLoader类中OCR过程的关键部分,使得从PDF文档中的图像提取文本成为可能,这补充了从PDF的文本层直接提取文本的功能。

以上信息来源于:

希望这些信息能帮助您解决问题。如果您有任何其他问题,或者需要更多的解释,请随时提问。

Sources

About Dosu

This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

dosubot[bot] commented 5 months ago

Based on the context provided, the PDFLoader class in the Langchain-Chatchat repository is designed to load PDF documents, extract text from them, and process images in the PDFs for OCR (Optical Character Recognition).

The PDFLoader class extends the UnstructuredFileLoader class, which is designed to handle unstructured document formats like PDFs. The PDFLoader class uses the fitz library (part of PyMuPDF) to open and iterate through each page of the PDF document. For each page, it extracts the text using page.get_text("") and appends it to a response string.

For each page, the PDFLoader class also extracts images using page.get_image_info(xrefs=True). If the image dimensions exceed a certain threshold defined by PDF_OCR_THRESHOLD, it processes the image for OCR. If the page or image is rotated (page.rotation), the image is rotated back to its original orientation using the rotate_img function. This function uses OpenCV (cv2) to calculate the rotation matrix and applies it to the image to correct its orientation.

The get_ocr function is called with the image array as its argument. This function is expected to perform OCR on the image and return the recognized text. The text extracted from both the PDF's text content and the OCR results from images is combined into a single string, which is then partitioned using partition_text to split it into more manageable parts or documents.

Here is an example of how to use the PDFLoader class:

if __name__ == "__main__":
    loader = RapidOCRPDFLoader(file_path="/Users/tonysong/Desktop/test.pdf")
    docs = loader.load()
    print(docs)

This example creates an instance of RapidOCRPDFLoader with a specified file path to a PDF document. It then calls the load method, which internally uses the pdf2text function to extract text and process images for OCR. The final result is printed out, which would include the text extracted directly from the PDF as well as any text recognized from images within the PDF.

For more details, you can refer to the source code of the PDFLoader class in the document_loaders/mypdfloader.py file in the Langchain-Chatchat repository.

Sources

#### About Dosu This response is meant to be useful and save you time. It is **not meant to be a precise solution**, but rather a starting point for your own research. Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant. If you want to continue the conversation, start your reply with @dosu-bot.
glide-the commented 5 months ago

目前pdf解析是通过ocr完成的,具体请参考configs中的配置类