目录前言环境准备读取图片中的文字OCR读取 PPT 文档多模态 RAG 的应用场景常见问题下一步学习前言在前面的文章中我们学习了如何读取纯文本数据。但在实际应用中很多重要信息都存储在图片、PPT、扫描件等非文本格式中。比如产品宣传图中的文字说明PPT 演示文稿中的内容扫描的合同和发票截图中的代码和配置这些数据如果不能被 RAG 系统处理就会造成信息的缺失。本文将介绍如何使用 Unstructured 库来处理这些多媒体数据。环境准备1. 安装依赖包# 基础依赖 pip install langchain langchain-community # Unstructured 完整版包含图片处理 pip install unstructured[all-docs] # OCR 依赖用于图片文字识别 pip install pdfminer.six # 如果需要更好的 OCR 效果可以安装 Tesseract # macOS: brew install tesseract # Ubuntu: sudo apt-get install tesseract-ocr # Windows: 下载安装包 https://github.com/UB-Mannheim/tesseract/wiki2. 安装 LibreOffice处理 PPT 必需Unstructured 处理 Office 文档时需要 LibreOffice 的命令行工具# macOS brew install libreoffice # Ubuntu/Debian sudo apt-get update sudo apt-get install -y libreoffice # Windows # 下载安装https://www.libreoffice.org/download/download/为什么需要 LibreOfficeUnstructured 会调用soffice命令将 PPT/Word/Excel 转换为可解析的格式。如果没有安装会报错FileNotFoundError: [Errno 2] No such file or directory: soffice3. 准备测试数据准备一些测试文件一张包含文字的图片如截图、海报一个 PPT 文件读取图片中的文字OCR使用 Unstructured 的 OCR 功能提取图片中的文字。文件名01-Unstructured读图.pyfrom langchain_community.document_loaders import UnstructuredImageLoader # 图片路径 image_path ../99-doc-data/黑悟空/黑悟空英文.jpg # 创建加载器 loader UnstructuredImageLoader(image_path) # 加载并提取文字 data loader.load() print(data)输出结果Warning: No languages specified, defaulting to English. [Document( metadata{source: ../99-doc-data/黑悟空/黑悟空英文.jpg}, page_content2\n\nPons\n\nBLACK MYTH. WUKONGY\n\n4 )]关键点语言设置默认使用英文 OCR如果是中文图片识别效果可能不佳OCR 引擎Unstructured 默认使用 Tesseract可以通过参数指定其他引擎图片质量清晰度越高识别准确率越高改进版本支持中文from langchain_community.document_loaders import UnstructuredImageLoader # 指定中文语言 loader UnstructuredImageLoader( image_path, strategyhi_res, # 高分辨率模式识别更准确 languages[chi_sim, eng] # 支持简体中文和英文 ) data loader.load() print(data[0].page_content)strategy参数说明策略说明适用场景fast快速模式不使用 OCR图片中没有文字hi_res高分辨率模式使用 OCR需要提取图片中的文字ocr_only仅使用 OCR扫描件、纯文字图片读取 PPT 文档PPT 是常见的演示文稿格式包含文字、图片、图表等多种元素。文件名02-Unstructured读PPT.pyfrom unstructured.partition.ppt import partition_ppt from langchain_core.documents import Document # 解析 PPT 文件 ppt_elements partition_ppt(filename../99-doc-data/黑悟空/黑神话悟空.pptx) print(PPT 内容) for element in ppt_elements: print(分页) print(element.text) # 转换为 LangChain 的 Document 格式 documents [ Document( page_contentelement.text, metadata{ source: data/黑神话悟空PPT.pptx, page: i, type: str(type(element).__name__) } ) for i, element in enumerate(ppt_elements) ] # 输出转换后的 Documents print(f\n共提取 {len(documents)} 个元素) for doc in documents[:3]: # 只打印前 3 个 print(f类型: {doc.metadata[type]}) print(f内容: {doc.page_content[:100]}...) print(- * 50)PPT 元素类型Unstructured 会将 PPT 解析为不同类型的元素Title标题NarrativeText正文段落ListItem列表项Table表格Image图片会尝试 OCR保留更多元数据documents [ Document( page_contentelement.text, metadata{ source: data/黑神话悟空PPT.pptx, page: i, type: str(type(element).__name__), category: element.category if hasattr(element, category) else None, element_id: element.id if hasattr(element, id) else None } ) for i, element in enumerate(ppt_elements) ]处理 PPT 中的图片from unstructured.partition.ppt import partition_ppt # 启用图片推断会对图片进行 OCR ppt_elements partition_ppt( filename../99-doc-data/黑悟空/黑神话悟空.pptx, infer_table_structureTrue, # 推断表格结构 strategyhi_res, # 高分辨率模式 extract_images_in_pdfTrue # 提取图片 )多模态 RAG 的应用场景处理图片和 PPT 数据后可以构建更强大的多模态 RAG 系统1. 企业知识库# 场景公司有大量 PPT 培训资料 from langchain_community.document_loaders import DirectoryLoader from unstructured.partition.ppt import partition_ppt # 批量加载所有 PPT loader DirectoryLoader( ./training_materials/, glob**/*.pptx, show_progressTrue ) # 构建知识库 documents [] for doc in loader.load(): ppt_elements partition_ppt(filenamedoc.metadata[source]) for element in ppt_elements: documents.append(Document( page_contentelement.text, metadata{source: doc.metadata[source]} )) # 后续可以进行向量化和检索2. 产品文档助手# 场景产品手册包含大量截图和说明 from langchain_community.document_loaders import UnstructuredImageLoader # 处理产品截图 screenshots [feature1.png, feature2.png, feature3.png] docs [] for img in screenshots: loader UnstructuredImageLoader( img, strategyhi_res, languages[chi_sim, eng] ) docs.extend(loader.load()) # 结合文本文档构建完整知识库3. 合同和发票处理# 场景扫描的合同需要提取关键信息 from langchain_community.document_loaders import UnstructuredImageLoader # 处理扫描件 loader UnstructuredImageLoader( contract_scan.jpg, strategyocr_only, # 纯 OCR 模式 languages[chi_sim] ) contract_docs loader.load() # 提取关键信息可以结合 LLM from langchain_openai import ChatOpenAI llm ChatOpenAI() result llm.invoke(f从以下合同中提取甲方、乙方、金额\n{contract_docs[0].page_content})4. 学术论文分析# 场景论文中的图表和公式 # 可以结合多模态模型如 GPT-4V进行更深入的理解 from langchain_community.document_loaders import UnstructuredImageLoader # 提取论文中的图表 loader UnstructuredImageLoader( paper_figure.png, strategyhi_res ) figure_docs loader.load() # 使用多模态模型理解图表 # 需要支持图片输入的模型常见问题1. LibreOffice 未安装# 错误FileNotFoundError: [Errno 2] No such file or directory: soffice # 解决安装 LibreOffice # macOS brew install libreoffice # Ubuntu sudo apt-get install libreoffice2. OCR 识别效果差问题原因图片分辨率太低文字太小或模糊语言设置不正确解决方案# 1. 使用高分辨率模式 loader UnstructuredImageLoader( image_path, strategyhi_res # 而不是 fast ) # 2. 指定正确的语言 loader UnstructuredImageLoader( image_path, languages[chi_sim, eng] # 中英文混合 ) # 3. 预处理图片提高对比度、去噪等 from PIL import Image, ImageEnhance img Image.open(image_path) enhancer ImageEnhance.Contrast(img) img enhancer.enhance(2.0) # 增强对比度 img.save(enhanced.jpg) # 再进行 OCR loader UnstructuredImageLoader(enhanced.jpg)3. PPT 解析速度慢# 问题大型 PPT 文件解析很慢 # 解决跳过不必要的处理 ppt_elements partition_ppt( filenamelarge.pptx, include_page_breaksFalse, # 不包含分页符 infer_table_structureFalse, # 不推断表格结构如果不需要 extract_images_in_pdfFalse # 不提取图片如果不需要 )4. 中文 OCR 支持# 如果使用 Tesseract需要下载中文语言包 # macOS brew install tesseract-lang # Ubuntu sudo apt-get install tesseract-ocr-chi-sim # 验证安装 tesseract --list-langs # 应该能看到 chi_sim简体中文5. 内存占用过高# 问题处理大量图片时内存不足 # 解决分批处理 def process_images_in_batches(image_paths, batch_size10): results [] for i in range(0, len(image_paths), batch_size): batch image_paths[i:ibatch_size] for img_path in batch: loader UnstructuredImageLoader(img_path) results.extend(loader.load()) # 可以在这里保存中间结果 return results # 使用 all_docs process_images_in_batches(image_list, batch_size10)进阶技巧1. 结合多模态大模型对于复杂的图片如图表、流程图纯 OCR 可能不够# 使用支持图片输入的模型如 GPT-4V、Claude 3 from langchain_openai import ChatOpenAI import base64 def encode_image(image_path): with open(image_path, rb) as image_file: return base64.b64encode(image_file.read()).decode(utf-8) # 创建多模态消息 base64_image encode_image(chart.png) llm ChatOpenAI(modelgpt-4-vision-preview) response llm.invoke([ {type: text, text: 请描述这张图表的内容}, {type: image_url, image_url: fdata:image/png;base64,{base64_image}} ]) print(response.content)2. 图片预处理流程from PIL import Image, ImageEnhance, ImageFilter def preprocess_image(image_path, output_path): 图片预处理提高 OCR 准确率 img Image.open(image_path) # 1. 转为灰度图 img img.convert(L) # 2. 增强对比度 enhancer ImageEnhance.Contrast(img) img enhancer.enhance(2.0) # 3. 锐化 img img.filter(ImageFilter.SHARPEN) # 4. 调整大小如果太小 if img.width 1000: scale 1000 / img.width new_size (int(img.width * scale), int(img.height * scale)) img img.resize(new_size, Image.LANCZOS) img.save(output_path) return output_path # 使用 enhanced_path preprocess_image(low_quality.jpg, enhanced.jpg) loader UnstructuredImageLoader(enhanced_path) docs loader.load()3. 构建混合文档索引from langchain_community.document_loaders import ( TextLoader, UnstructuredImageLoader, DirectoryLoader ) from unstructured.partition.ppt import partition_ppt def load_mixed_documents(directory): 加载目录下的所有文档文本、图片、PPT all_docs [] # 1. 加载文本文件 text_loader DirectoryLoader( directory, glob**/*.txt, loader_clsTextLoader, loader_kwargs{encoding: utf-8} ) all_docs.extend(text_loader.load()) # 2. 加载图片 image_loader DirectoryLoader( directory, glob**/*.{jpg,png,jpeg}, loader_clsUnstructuredImageLoader ) all_docs.extend(image_loader.load()) # 3. 加载 PPT import glob for ppt_file in glob.glob(f{directory}/**/*.pptx, recursiveTrue): ppt_elements partition_ppt(filenameppt_file) for element in ppt_elements: all_docs.append(Document( page_contentelement.text, metadata{source: ppt_file, type: ppt} )) return all_docs # 使用 docs load_mixed_documents(./knowledge_base/) print(f共加载 {len(docs)} 个文档)学习路径简易RAG 学习LCEL 语法学习LangChain 读取数据LangChain 读取文本数据LangChain 读取图片数据LangChain 读取 PDF 数据LangChain 读取表格数据文本切块向量嵌入向量存储检索前处理索引优化检索后处理响应生成系统评估