LLM Universe 文档处理全攻略:多格式文件解析与向量转换实战

LLM Universe 文档处理全攻略:多格式文件解析与向量转换实战

【免费下载链接】llm-universe 本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/ 【免费下载链接】llm-universe 项目地址: https://gitcode.com/datawhalechina/llm-universe

在大模型应用开发中,文档处理是构建知识库的基础环节。无论是PDF、Markdown还是其他格式的文件,都需要经过解析、清洗、向量化等步骤才能转化为机器可理解的知识。本文将带你从零开始掌握文档处理的全流程,结合LLM Universe项目中的实战案例,解决多格式文件解析难题,实现高效向量转换。

文档解析:从多格式文件中提取内容

文档解析是知识库构建的第一步,不同格式的文件需要采用不同的处理策略。LLM Universe项目提供了丰富的工具和示例代码,帮助开发者轻松应对各类文档。

PDF文档解析

PDF是最常见的文档格式之一,但解析难度较大。项目中推荐使用PyMuPDFLoader,它不仅解析速度快,还能保留文档的元数据信息。以下是使用方法:

from langchain_community.document_loaders import PyMuPDFLoader

# 创建PDF加载器实例
loader = PyMuPDFLoader("../../data_base/knowledge_db/pumkin_book/pumpkin_book.pdf")
# 加载PDF文档
pdf_pages = loader.load()

加载后的文档会以列表形式存储,每个元素代表PDF中的一页。通过page_content属性可以获取页面内容,metadata属性则包含了文档的源路径、页码等信息。

PDF解析示例

相关代码实现可参考:notebook/C3 搭建知识库/C3.ipynb

Markdown文档解析

Markdown文档结构清晰,解析相对简单。项目中使用UnstructuredMarkdownLoader来处理Markdown文件:

from langchain_community.document_loaders.markdown import UnstructuredMarkdownLoader

loader = UnstructuredMarkdownLoader("../../data_base/knowledge_db/prompt_engineering/1. 简介 Introduction.md")
md_pages = loader.load()

与PDF解析类似,解析后的Markdown文档也会转换为Document对象,方便后续处理。

数据清洗:提升文档质量的关键步骤

原始文档往往包含大量冗余信息,如换行符、特殊符号等,需要进行清洗才能提高后续处理的效果。LLM Universe项目提供了多种数据清洗方法。

去除多余换行符和特殊符号

PDF文档在解析时常常会出现多余的换行符,影响文本的连贯性。可以使用正则表达式来去除这些换行符:

import re
pattern = re.compile(r'^\u4e00-\u9fff[^\u4e00-\u9fff]', re.DOTALL)
pdf_page.page_content = re.sub(pattern, lambda match: match.group(0).replace('\n', ''), pdf_page.page_content)

此外,还可以使用replace方法去除特殊符号和空格:

pdf_page.page_content = pdf_page.page_content.replace('•', '')
pdf_page.page_content = pdf_page.page_content.replace(' ', '')

Markdown文档清洗

Markdown文档通常会在段落之间存在空行,可以通过以下方法去除:

md_page.page_content = md_page.page_content.replace('\n\n', '\n')

数据清洗的详细示例可参考:notebook/C3 搭建知识库/C3.ipynb

向量转换:将文本转化为机器可理解的向量

向量转换是将文本信息转化为数值向量的过程,是实现语义检索的基础。LLM Universe项目支持多种Embedding模型,包括OpenAI、文心千帆、讯飞星火和智谱AI等。

使用OpenAI Embedding

OpenAI提供了高效的Embedding服务,项目中封装了简洁的调用接口:

import os
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

def openai_embedding(text: str, model: str=None):
    api_key=os.environ['OPENAI_API_KEY']
    client = OpenAI(api_key=api_key)
    if model is None:
        model="text-embedding-3-small"
    response = client.embeddings.create(
        input=text,
        model=model
    )
    return response

OpenAI提供了多种Embedding模型,各模型性能对比如下:

模型每美元页数MTEB得分MIRACL得分
text-embedding-3-large9,61564.654.9
text-embedding-3-small62,50062.344.0
text-embedding-ada-00212,50061.031.4

自定义Embedding封装

除了使用第三方API,LLM Universe项目还支持自定义Embedding模型。以智谱AI为例,我们可以继承LangChain的Embeddings基类,实现自定义的Embedding类:

from typing import List
from langchain_core.embeddings import Embeddings
from zhipuai import ZhipuAI

class ZhipuAIEmbeddings(Embeddings):
    def __init__(self):
        self.client = ZhipuAI(api_key=os.environ['ZHIPUAI_API_KEY'])
    
    def embed_documents(self, texts: List[str]) -> List[List[float]]:
        embeddings = self.client.embeddings.create(
            model="embedding-3",
            input=texts
        )
        return [embeddings.embedding for embeddings in embeddings.data]
    
    def embed_query(self, text: str) -> List[float]:
        return self.embed_documents([text])[0]

自定义Embedding的详细实现可参考:notebook/C3 搭建知识库/附LangChain自定义Embedding封装讲解.ipynb

实战案例:构建完整的文档处理流程

下面我们将结合前面介绍的内容,构建一个完整的文档处理流程,包括文档加载、清洗和向量化。

完整代码示例

# 导入所需库
from langchain_community.document_loaders import PyMuPDFLoader, UnstructuredMarkdownLoader
import re
from zhipuai_embedding import ZhipuAIEmbeddings  # 自定义的Embedding类

# 加载PDF文档
pdf_loader = PyMuPDFLoader("../../data_base/knowledge_db/pumkin_book/pumpkin_book.pdf")
pdf_docs = pdf_loader.load()

# 加载Markdown文档
md_loader = UnstructuredMarkdownLoader("../../data_base/knowledge_db/prompt_engineering/1. 简介 Introduction.md")
md_docs = md_loader.load()

# 数据清洗
def clean_text(text):
    # 去除多余换行符
    pattern = re.compile(r'^\u4e00-\u9fff[^\u4e00-\u9fff]', re.DOTALL)
    text = re.sub(pattern, lambda match: match.group(0).replace('\n', ''), text)
    # 去除特殊符号和空格
    text = text.replace('•', '').replace(' ', '')
    return text

# 清洗所有文档
all_docs = pdf_docs + md_docs
for doc in all_docs:
    doc.page_content = clean_text(doc.page_content)

# 初始化Embedding模型
embeddings = ZhipuAIEmbeddings()

# 将文档向量化
doc_embeddings = embeddings.embed_documents([doc.page_content for doc in all_docs])

print(f"成功处理 {len(all_docs)} 个文档,生成 {len(doc_embeddings)} 个向量")

结果分析

通过上述流程,我们成功将PDF和Markdown文档转换为向量表示。这些向量可以存储在向量数据库中,用于后续的语义检索等任务。项目中使用的向量数据库主要是Chroma,相关实现可参考:data_base/vector_db/chroma/

总结与展望

本文详细介绍了LLM Universe项目中文档处理的关键技术,包括多格式文档解析、数据清洗和向量转换。通过合理利用这些技术,我们可以构建高效的知识库,为大模型应用提供有力支持。

未来,我们将进一步优化文档处理流程,支持更多格式的文件,如Word、Excel等,并探索更高效的文本分块和向量化方法。如果你对文档处理有任何疑问或建议,欢迎在项目的Issues中提出。

官方文档:docs/ 项目教程:README.md

【免费下载链接】llm-universe 本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/ 【免费下载链接】llm-universe 项目地址: https://gitcode.com/datawhalechina/llm-universe

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值