AI(学习笔记第四课) 使用langchain进行AI开发 load documents(pdf)

发布于:2025-07-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

AI(学习笔记第四课) 使用langchain进行AI开发 load documents(pdf)

  • 使用langchain如何构建vector store
  • 使用Layout analysis

学习内容:

  • 使用构建vector store
  • 使用利用vector store进行检索
  • 使用Layout analysis进行段落分析

1.load documents(pdf)

1.1 学习url

langchain的load documents文档

1.2 pdf文件准备

这里,想定公司需要做成知识向量库vector store文档有pdf文档,因此这里处理pdf文件,langchain的官方链接给提供了一个pdf文件请在这里提前下载文件

1.3 准备ollama的模型

langchainollama支持的非常好,而且国外的AI商用模型,一般国内都使用不了,因此这里准备本地的ollama

1.3.1 安装ollama

ollama的官方网站
可以deepseek一下,如何安装ollama,这里在mac系统上安装。

1. 下载安装包
访问 Ollama 官方下载页面:https://ollama.com/download,选择 macOS 版本(支持 Intel 和 Apple Silicon 芯片)。

2. 运行安装程序
下载完成后,双击 .dmg 文件,将 Ollama 拖到 Applications 文件夹中。

3. 启动 Ollama
打开 Launchpad 或 Applications 文件夹,点击 Ollama 图标运行。首次启动时,可能需要授予权限(在系统设置中允许)。下载安装包
访问 Ollama 官方下载页面:https://ollama.com/download,选择 macOS 版本(支持 Intel 和 Apple Silicon 芯片)。

4. 运行安装程序
下载完成后,双击 .dmg 文件,将 Ollama 拖到 Applications 文件夹中。

5. 启动 Ollama
打开 Launchpad 或 Applications 文件夹,点击 Ollama 图标运行。首次启动时,可能需要授予权限(在系统设置中允许)。
1.3.3 下载需要的embedding大模型

这里需要embedding的文本处理模型,所以下载nomic-embed-text模型。
在这里插入图片描述

ollama pull nomic-embed-text

1.4 在pycharm中准备代码

这里代码和pdf文件分别如下:
代码: src\document_loaders\001_load_pdf.py
pdf测试文件:src\document_loaders\examples\layout-parse-paper.pdf

在这里插入图片描述
代码如下所示:

from langchain_community.document_loaders import PyPDFLoader
import asyncio
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_ollama.embeddings import OllamaEmbeddings

# 替换 OpenAIEmbeddings 配置为 Ollama 本地模型
embeddings = OllamaEmbeddings(
    model="nomic-embed-text",  # 或其他支持的本地模型如 "mistral", "nomic-embed-text"
    base_url="http://192.168.43.158:11434"  # Ollama 默认地址
)

async def load_pdf():
    file_path = './examples/layout-parser-paper.pdf'
    loader = PyPDFLoader(file_path)
    pages = []
    async for page in loader.alazy_load():
        pages.append(page)

    # 后续使用方式与 OpenAIEmbeddings 完全一致
    vector_store = InMemoryVectorStore.from_documents(
        pages,
        embeddings)
    docs = vector_store.similarity_search("What is LayoutParser?", k=2)
    for doc in docs:
        print(f'Page {doc.metadata["page"]}: {doc.page_content[:300]}\n')

asyncio.run(load_pdf())

1.5 在pycharm中下载必要的python library

在这里插入图片描述

1.6 执行代码

在这里插入图片描述

1.7 代码解析

1.7.1 准备embed模型
# 替换 OpenAIEmbeddings 配置为 Ollama 本地模型
embeddings = OllamaEmbeddings(
    model="nomic-embed-text",  # 或其他支持的本地模型如 "mistral", "nomic-embed-text"
    base_url="http://192.168.43.158:11434"  # Ollama 默认地址
)

这里,已经构建了ollama,直接指向本地的ollama

1.7.2 将pdf进行load
    file_path = './examples/layout-parser-paper.pdf'
    loader = PyPDFLoader(file_path)
    pages = []
    async for page in loader.alazy_load():
        pages.append(page)

pdf文件进行load,每个pdf文件的pageappendpages变量。

1.7.3 使用pdf内容创建vector store
    # 后续使用方式与 OpenAIEmbeddings 完全一致
    vector_store = InMemoryVectorStore.from_documents(
        pages,
        embeddings)

这里,需要执行参数pagesembeddings,即文档以及embedding模型。

1.7.4 使用vector store进行ai检索
    docs = vector_store.similarity_search("What is LayoutParser?", k=2)
    for doc in docs:
        print(f'Page {doc.metadata["page"]}: {doc.page_content[:300]}\n')

在这里插入图片描述

2.段落分析Layout analysis

有时候,pdf文件不能只按照page进行load,而是按照段落,通常包括:

  • paragraphs 段落
  • titles 题目
  • tables 表格
  • other structures 其他结构
    接下来进行段落的解析,如下这样,将一个文件进行分解。
    在这里插入图片描述

2.1 导入必要的包

  • unstructured系列
    • langchain-unstructured
    • unstructured
    • unstructured-api-tools
    • unstructured-client
    • unstructured-inference
    • unstructured-paddleocr
    • unstructured.pytesseract
  • pdf系列
    • pdf2image
    • pdfminer.six
    • PyMyPDF
    • PyPDF2
    • pyPdfium2

2.2 需要安装的软件

2.2.1 Poppler (PDF analysis)

这个pdf analysis的软件,这里需要安装。这里给出了三种系统的安装方法。

Linux: apt-get install poppler-utils
Mac: brew install poppler
Windows: https://github.com/oschwartz10612/poppler-windows/releases/tag/v24.08.0-0

这里是windows安装,所以下载windows的软件包,之后直接解压,放在如下路径
D:\01_software\27_pdf_unstructured\poppler-24.08.0
在这里插入图片描述
继续设定环境变量PATH。将如下命令设定到PATH中。当然这里需要和自己的路径一致即可。
D:\01_software\27_pdf_unstructured\poppler-24.08.0\Library\bin
在这里插入图片描述

2.2.2 Tesseract (OCR)

这里还需要安装Tesseract (OCR),这是一个windows的安装包。
https://github.com/UB-Mannheim/tesseract/wiki#tesseract-installer-for-windows
在这里插入图片描述

  • 这里安装到如下目录
    D:\01_software\27_pdf_unstructured\tesseract
    -同样设定PATH目录
    D:\01_software\27_pdf_unstructured\tesseract设定到PATH,过程和上面的poppler类似。
    在这里插入图片描述

2.2 准备代码

os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["TESSDATA_PREFIX"] = r"D:\01_software\27_pdf_unstructured\tesseract\tessdata"
os.environ["PATH"] += r";D:\01_software\27_pdf_unstructured\tesseract\\"
os.environ["OCR_AGENT"] = r"D:\01_software\27_pdf_unstructured\tesseract\\"
file_path = r'D:\00_study\07_python\PythonProject\src\document_loaders\examples\layout-parser-paper.pdf'
loader_local = UnstructuredLoader(
    file_path=file_path,
    strategy="hi_res",
    ocr_languages="eng+chi_sim"  # 添加OCR语言支持
)
docs_local = []
for doc in loader_local.lazy_load():
    docs_local.append(doc)
print(len(docs_local))
first_page_docs = [doc for doc in docs_local if doc.metadata.get("page_number") == 1]
for doc in first_page_docs:
    print(doc.page_content)

这里,按照如下过程处理pdf文件。注意,在执行过程中,还可能报错,可能出现错误,这时候引入提示的python包即可

  • 使用UnstructuredLoader类进行pdf文件的解析
  • 之后打印出整个pdf文件分解出来的doc的数量
  • 最后根据每个doc对象的metadata中的page_number,来打印出page_number=1的所有doc的内容

2.3 代码执行,对pdf进行分解

在这里插入图片描述
可以看出,这里将第一个page_number进行了完美的划分,之后都保存在doc对象里面。