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属性则包含了文档的源路径、页码等信息。
相关代码实现可参考: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-large | 9,615 | 64.6 | 54.9 |
| text-embedding-3-small | 62,500 | 62.3 | 44.0 |
| text-embedding-ada-002 | 12,500 | 61.0 | 31.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中提出。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




