80%的时间消耗在了文档解析以及清洗上,当针对PDF、PPT、扫描件等非结构化数据,去开展RAG或者Agent应用开发的时候。xParse LangChain插件把专业的文档解析能力直接整合进LangChain框架里,借助几行代码便能够达成从文件至向量的全流程处理,明显提高开发效率。
export XPARSE_APP_ID="your-app-id"
export XPARSE_SECRET_CODE="your-secret-code"
import os
os.environ["XPARSE_APP_ID"] = "your-app-id"
os.environ["XPARSE_SECRET_CODE"] = "your-secret-code"
LangChain身为构建大语言模型应用的主流框架,给出了检索增强生成、智能代理以及信息提取等核心元件,可是,这些元件的有效运作极为依赖格式规范的输入数据,现实里的业务文档涵盖表格、图表、多栏布局以及复杂公式,常规文本提取器会遗失诸多关键结构信息。
xParse是聚焦于非结构化文档处理的AI基础设施,它能够把杂乱的文档转变为可进行查询、可开展分析的数据资产。langchain - xparse插件作为这两者之间的桥梁,借助XParseLoader类将xParse Pipeline API的解析能力毫无缝隙地接入LangChain生态。开发者不用额外去处理文档格式方面的问题,直接就能获取可用于下游任务的纯净内容。
from langchain_xparse import XParseLoader
loader = XParseLoader(
file_path="doc.pdf",
app_id="your-app-id",
secret_code="your-secret-code",
)
from langchain_xparse import XParseLoader
# 创建加载器
loader = XParseLoader(file_path="example.pdf")
# 加载文档
docs = loader.load()
# 查看解析结果
print(docs[0].page_content[:200]) # 文档内容(Markdown 格式)
print(docs[0].metadata) # 元数据:source, category, element_id, filename, page_number, ...
需要在使用之前,前往TextIn工作台去获取API凭证,登录控制台之后,在“账号与开发者信息”这个页面能够找到XPARSE_APP_ID以及XPARSE_SECRET_CODE,这两个参数属于调用解析服务的身份标识,要妥善保管防止泄露,工作台地址是:https://www.textin.com/console/dashboard/setting
插件的安装是极为简便的,借助pip命令便可达成。于Python环境里执行“pip install langchain-xparse”,便能够自动安装全部依赖包。要是在Jupyter Notebook或者云开发环境当中运用,建议先将pip升级至最新版本,以此避免依赖冲突。安装完毕后,不需要进行额外配置,就能于代码里导入XParseLoader类。
from langchain_xparse import XParseLoader
loader = XParseLoader(file_path="large_document.pdf")
# 懒加载,逐个返回文档
for doc in loader.lazy_load():
print(f"页码: {doc.metadata.get('page_number')}")
print(f"内容: {doc.page_content[:100]}...")
# 处理文档
import asyncio
from langchain_xparse import XParseLoader
async def load_documents():
loader = XParseLoader(file_path="example.pdf")
async for doc in loader.alazy_load():
print(doc.page_content[:100])
# 处理文档
# 运行异步函数
asyncio.run(load_documents())
最为基础的运用方式乃是仅仅调用解析功能,在创建XParseLoader对象之际将文件路径以及API凭证传入,调用load方法就能够获取Document对象列表,每一个Document涵盖页面内容以及元数据,像是页码、文件来源等诸般信息,对于单页文档或者小文件而言,此种方式代码最为简洁,适宜于进行快速验证。
from langchain_xparse import XParseLoader
# 解析 + 分块
loader = XParseLoader(
file_path="doc.pdf",
parse_provider="textin",
chunk_strategy="by_title", # 按标题分块
chunk_max_characters=500, # 最大字符数
chunk_overlap=50, # 重叠字符数
)
docs = loader.load()
在处理大文件之际,或是面对多个文件之时,懒加载模式能够极大程度地降低内存占用情况。把load运用lazy_load方法予以替代,此方法返回的是迭代器,并非完整列表。程序会逐页进行读取,进而处理内容,并非一次性把所有数据都加载至内存当中。在解析上百页的PDF时,或者在批量处理数十个文件时,这种模式能够避免出现内存溢出状况,使之让应用运行表现得更加稳定。
from langchain_xparse import XParseLoader
loader = XParseLoader(
file_path="doc.pdf",
parse_provider="textin",
chunk_strategy="basic",
chunk_max_characters=1000,
embed_provider="qwen",
embed_model_name="text-embedding-v4",
)
docs = loader.load()
# docs 中的每个文档都包含向量(embedding)
from langchain_xparse import XParseLoader
loader = XParseLoader(
file_path="doc.pdf",
stages=[
{"type": "parse", "config": {"provider": "textin"}},
{"type": "chunk", "config": {"strategy": "by_page", "max_characters": 800}},
],
)
docs = loader.load()
在异步应用场景里头,同步加载这种方式会使得事件循环被阻塞,进而对系统吞吐量造成影响。XParseLoader给出了异步加载的办法aload,它跟Python的asyncio机制配合得相当完美。在Web服务或者高并发API那里,运用async/await语法去调用aload便能让解析任务在后台开展执行,与此同时还能处理别的请求。经过实际测试显示,异步模式能够把并发能力提高3到5倍。
可以一步到位的解析与分块是那些便捷参数所成就的。具体而言,在创建加载器这一行为发生的时候,设置chunking_strategy参数,该操作旨在确切地指定分块策略类型,后续系统就会自动地达成内容切分这一动作。其中,常用的策略涵盖了按段落进行分块、按固定长度进行分块或者按语义边界进行分块这几种情况。对于开发者来说,不需要单独去调用分块器,如此一来,代码量缩减了,配置步骤也相应减少了。像这种方式,对于标准化的文档处理流程而言是极为适配的,所以能够迅速生产品质达标的文本块。
from langchain_xparse import XParseLoader
loader = XParseLoader(file_path=["a.pdf", "b.pdf", "c.pdf"])
for doc in loader.lazy_load():
print(f"文件: {doc.metadata.get('source')}")
print(f"内容预览: {doc.page_content[:50]}...")
from langchain_xparse import XParseLoader
with open("doc.pdf", "rb") as f:
loader = XParseLoader(file=f, metadata_filename="doc.pdf")
docs = loader.load()
若要再进一步,能够同时达成解析、分块以及向量化这三个步骤。设置vector_store参数用以指定向量数据库实例;调用load_and_vectorize方可方法,如此系统便会把分块之后的内容径直存入向量库。此过程对Chroma、FAISS、Pinecone等多种向量数据库予以支持,开发者仅需预先创建好数据库实例就行。
在存在精细控制需求的场景当中,能够选择运用自定义的stages参数。stages这一参数会接收一个配置字典,它是允许去指定很多高级选项的,像解析引擎,OCR开关,表格识别模式,公式提取规则这种。比如说,要是针对学术论文的话,就能够启用LaTeX公式识别。要是针对财务报表,那就可以强化表格结构还原。要是针对古籍扫描件,就能够开启高精度OCR。借助对这些参数进行调整,开发者是能够针对特定的文档类型来优化解析效果的。
async for doc in loader.alazy_load():
# 处理文档
实际开展的业务里面,常常会有需要进行批量文档处理的情况。XParseLoader具备能够传入文件路径列表的特性,即可以一次性去创建多个加载器的实例。在系统的内部,会自动地去分配资源从而进行并行处理,这样能大幅度地缩短总的耗时时间。经过测试的数据表明,当处理10个平均页数为50页的PDF文件时,在并行模式下相较于串行模式能够节省60%以上的时间。
loader = XParseLoader(file_path=["file1.pdf", "file2.pdf"])
除去文件路径之外,插件还支持直接传入文件对象,这在从Web上传或者内存缓存里获取数据之际是非常实用的,只需要保证文件对象具备read方法,与此同时必须设置metadata_filename参数,该参数是拿来记录原始文件名的,方便进行追溯以及调试,要注意,使用文件对象的时候不会自动开展格式推断,需要开发者明确地告知文件类型。
loader = XParseLoader(
file_path="doc.pdf",
stages=[
{"type": "parse", "config": {"provider": "textin", "parse_mode": "auto"}},
{"type": "chunk", "config": {"strategy": "by_title", "max_characters": 800}},
],
)
在您着手处理RAG应用开发之际,碰到的棘手文档格式方面的问题都有哪一些呢?欢迎于评论区域分享您置身其中的案例 ,为这份文本添加赞赏的操作并将它进行转发分享 ,以便让数量更为众多的开发者能够目睹这个具备实用价值的插件。
相关标签: # TextIn # xParse # LangChain # 文档解析 # RAG