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

文章目录

  • [AI(学习笔记第四课) 使用langchain进行AI开发 load documents(pdf)](#AI(学习笔记第四课) 使用langchain进行AI开发 load documents(pdf))
  • 学习内容:
    • [1.load documents(pdf)](#1.load documents(pdf))
      • [1.1 学习`url`](#1.1 学习url)
      • [1.2 `pdf`文件准备](#1.2 pdf文件准备)
      • [1.3 准备`ollama`的模型](#1.3 准备ollama的模型)
        • [1.3.1 安装`ollama`](#1.3.1 安装ollama)
        • [1.3.3 下载需要的`embedding`大模型](#1.3.3 下载需要的embedding大模型)
      • [1.4 在`pycharm`中准备代码](#1.4 在pycharm中准备代码)
      • [1.5 在`pycharm`中下载必要的`python library`](#1.5 在pycharm中下载必要的python library)
      • [1.6 执行代码](#1.6 执行代码)
      • [1.7 代码解析](#1.7 代码解析)
        • [1.7.1 准备`embed`模型](#1.7.1 准备embed模型)
        • [1.7.2 将`pdf`进行`load`](#1.7.2 将pdf进行load)
        • [1.7.3 使用`pdf`内容创建`vector store`](#1.7.3 使用pdf内容创建vector store)
        • [1.7.4 使用`vector store`进行`ai`检索](#1.7.4 使用vector store进行ai检索)
    • [2.段落分析`Layout analysis`](#2.段落分析Layout analysis)
      • [2.1 导入必要的包](#2.1 导入必要的包)
      • [2.2 需要安装的软件](#2.2 需要安装的软件)
        • [2.2.1 Poppler (PDF analysis)](#2.2.1 Poppler (PDF analysis))
        • [2.2.2 `Tesseract (OCR)`](#2.2.2 Tesseract (OCR))
      • [2.2 准备代码](#2.2 准备代码)
      • [2.3 代码执行,对`pdf`进行分解](#2.3 代码执行,对pdf进行分解)

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模型。

shell 复制代码
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

代码如下所示:

python 复制代码
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模型
python 复制代码
# 替换 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
python 复制代码
    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
python 复制代码
    # 后续使用方式与 OpenAIEmbeddings 完全一致
    vector_store = InMemoryVectorStore.from_documents(
        pages,
        embeddings)

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

1.7.4 使用vector store进行ai检索
python 复制代码
    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 准备代码

python 复制代码
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对象里面。