LangChain實戰(十七):構建與PDF/PPT文檔對話的AI助手

本文是《LangChain實戰課》系列的第十七篇,將專篇深入講解如何構建能夠與PDF和PPT文檔進行智能對話的AI助手。通過學習本文,您將掌握復雜格式文檔的解析技巧、文本與表格處理技術,以及實現精準問答的系統方法。

前言

在日常工作和學習中,PDF和PPT文檔是我們最常接觸的文檔格式之一。這些文檔包含了大量有價值的信息,但手動提取和分析這些信息往往耗時耗力。通過結合LangChain和先進的文檔解析技術,我們可以構建一個智能的文檔問答助手,讓用戶能夠像與人交談一樣與文檔進行交互,快速獲取所需信息。

面臨的挑戰與技術方案

PDF/PPT文檔解析的挑戰

  1. 格式復雜性:PDF和PPT具有復雜的布局和格式

  2. 文本提取困難:特別是掃描版PDF的OCR識別

  3. 表格處理:保持表格結構和數據的完整性

  4. 多模態內容:處理文本、圖像、圖表混合的內容

  5. 布局保持:保留文檔的原始布局和語義結構

技術解決方案

我們將使用以下技術棧來解決這些挑戰:

  • PyMuPDF:高效的PDF文本和表格提取

  • python-pptx:PPT文檔解析

  • Unstructured:處理復雜文檔結構

  • LangChain:構建問答流水線

  • Chroma/FAISS:向量存儲和檢索

  • OpenAI Embeddings:文本向量化

環境準備與安裝

首先安裝必要的依賴包:

# 安裝核心庫
pip install langchain openai python-dotenv# 安裝文檔處理庫
pip install pymupdf python-pptx unstructured# 安裝額外的文檔處理依賴
pip install pdf2image pillow# 安裝表格處理庫
pip install tabula-py camelot-py# 安裝向量數據庫
pip install chromadb# 安裝其他工具
pip install tiktoken sentence-transformers

構建PDF/PPT文檔處理流水線

1. 文檔加載與解析

讓我們首先創建專門處理PDF和PPT文檔的加載器:

import fitz  # PyMuPDF
from pptx import Presentation
import pandas as pd
from langchain.schema import Document
from typing import List, Dict, Any
import io
import osclass AdvancedDocumentLoader:def __init__(self):self.text_parser = TextParser()self.table_parser = TableParser()def load_pdf_document(self, file_path: str) -> List[Document]:"""加載并解析PDF文檔"""documents = []try:with fitz.open(file_path) as pdf_document:for page_num in range(len(pdf_document)):page = pdf_document.load_page(page_num)# 提取文本內容text_content = page.get_text()if text_content.strip():documents.append(Document(page_content=text_content,metadata={"source": file_path,"page": page_num + 1,"type": "text","content_type": "text"}))# 提取表格tables = self._extract_pdf_tables(page)for i, table in enumerate(tables):documents.append(Document(page_content=table,metadata={"source": file_path,"page": page_num + 1,"table_index": i + 1,"type": "table","content_type": "table"}))return documentsexcept Exception as e:print(f"PDF解析錯誤: {e}")return []def load_ppt_document(self, file_path: str) -> List[Document]:"""加載并解析PPT文檔"""documents = []try:presentation = Presentation(file_path)for slide_num, slide in enumerate(presentation.slides, 1):slide_text = []# 提取幻燈片文本for shape in slide.shapes:if hasattr(shape, "text") and shape.text.strip():slide_text.append(shape.text)if slide_text:content = "\n".join(slide_text)documents.append(Document(page_content=content,metadata={"source": file_path,"slide": slide_num,"type": "text","content_type": "slide_text"}))return documentsexcept Exception as e:print(f"PPT解析錯誤: {e}")return []def _extract_pdf_tables(self, page) -> List[str]:"""提取PDF頁面中的表格"""tables = []try:# 使用PyMuPDF提取表格tabs = page.find_tables()if tabs.tables:for table in tabs.tables:table_data = table.extract()if table_data:# 將表格數據轉換為字符串表示df = pd.DataFrame(table_data[1:], columns=table_data[0])tables.append(df.to_markdown(index=False))except Exception as e:print(f"表格提取錯誤: {e}")return tablesclass TextParser:"""文本內容解析器"""def preprocess_text(self, text: str) -> str:"""預處理文本內容"""# 移除多余的空格和換行text = ' '.join(text.split())# 其他清理操作...return textdef extract_key_phrases(self, text: str) -> List[str]:"""提取關鍵短語"""# 實現關鍵短語提取邏輯return []class TableParser:"""表格內容解析器"""def parse_table_structure(self, table_content: str) -> Dict[str, Any]:"""解析表格結構"""# 實現表格結構解析return {}

2. 高級表格處理與結構化

對于復雜的表格數據,我們需要更精細的處理:

import camelot
import tabula
from langchain.schema import Documentclass AdvancedTableProcessor:def __init__(self):passdef extract_tables_with_camelot(self, pdf_path: str) -> List[Document]:"""使用Camelot提取PDF表格"""documents = []try:tables = camelot.read_pdf(pdf_path, pages='all', flavor='stream')for i, table in enumerate(tables):if table.parsing_report['accuracy'] > 80:  # 準確率閾值df = table.dftable_content = self._format_table_content(df)documents.append(Document(page_content=table_content,metadata={"source": pdf_path,"table_index": i 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96115.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96115.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

魚眼相機模型

魚眼相機模型 最近涉及魚眼相機模型、標定使用等,作為記錄,更新很久不曾更新的博客。 文章目錄魚眼相機模型1 相機成像2 魚眼模型3 畸變3.1 適用針孔和MEI3.2 Kannala-Brandt魚眼模型4 代碼實現1 相機成像 針孔相機:所有光線從一個孔&#xf…

大語言模型提示詞工程詳盡實戰指南

引言:與大型語言模型(LLM)高效對話的藝術大型語言模型(LLM)——例如我們熟知的GPT系列、Claude、Llama等——在自然語言處理(NLP)領域展現了驚人的能力,能夠執行文本摘要、翻譯、代碼…

HTTP 請求體格式詳解

1. 概覽與概念 Content-Type:HTTP 請求/響應頭,表示消息體的媒體類型(MIME type)。服務端用它決定如何解析請求體。常見場景: 純結構化數據(JSON) → application/json表單 文件上傳 → multip…

事務設置和消息分發

事務 RabbitMQ是基于AMQP協議實現的,該協議實現了事務機制,因此RabbitMQ也支持事務機制. SpringAMQP也提供了對事務相關的操作,RabbitMQ事務允許開發者確保消息的發送和接收是原子性的,要么 全部成功,要么全部失敗.| 前…

Python 中 try / except / else / finally 異常處理詳解

1. 基本結構 try:# 可能會拋出異常的代碼 except SomeException as e:# 捕獲并處理異常 else:# 如果 try 中代碼沒有異常,就執行這里 finally:# 無論是否發生異常,最后都會執行這里2. 各部分的作用 try 用途:包含可能發生異常的代碼段。如果代…

冰火島 Tech 傳:Apple Foundation Models 心法解密(下集)

引子 上集說到冰火島冰屋內,謝遜、張翠山、殷素素三人親見 “指令(Instructions)” 如何讓 AI 脫胎換骨,從木訥報地名的 “愣頭青”,變身為文采斐然的 “旅行作家”。 正當素素驚嘆這 AI 武學的奇妙時,謝遜卻突然神色一凜,指著手腕上用冰屑刻的 “4096” 字樣道:“這等…

Qt信號與槽機制全面解析

? 1. 核心概念信號與槽是Qt獨創的一種對象間通信機制,它使得一個對象的狀態變化或事件發生能夠自動通知其他對象作出響應,從而實現高度解耦的代碼設計。1.1 信號(Signals)定義:信號是由對象在特定事件發生時發出&…

2025年COR SCI2區,基于近似細胞分解的能源高效無人機路徑規劃問題用于地質災害監測,深度解析+性能實測

目錄1.摘要2.問題描述與數學模型3.能源網格混合元啟發式算法4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 本文提出了一種能源高效的無人機路徑規劃方法(EURP)用于監測分散的地質災害易發區域,通過建立無人機飛行模式的…

LangChain關于提示詞的幾種寫法

上文中 <---->(可點擊移步查閱),我們已經了解到LangChain如何編寫調用大模型的一個基本框架, 在編寫完這個基本框架后,就要與大模型進行交互了,這時候,就需要我們編寫提示詞了, 那么以下,就會介紹提示詞的幾種編寫方式 1 可攜帶變量的提示詞 1.1 PromptTempla…

CyberPoC 是一個現代化的網絡安全練習和競賽平臺,支持容器化部署的安全挑戰,為用戶提供實踐網絡安全技能的環境。

工具介紹 CyberPoC 是一個現代化的網絡安全練習和競賽平臺&#xff0c;支持容器化部署的安全挑戰&#xff0c;為用戶提供實踐網絡安全技能的環境。 &#x1f680; 快速開始 使用 Docker Compose (推薦) 克隆項目 git clone https://github.com/dushixiang/cyberpoc.gitcd cy…

【單片機day03】

UART串口通用異步收發器&#xff0c;2個串口(1個串口被用于ISP下載程序&#xff0c;1個串口被用于和主機之間的通信)全雙工&#xff08;兩根線TX、RX&#xff09;、串行、異步通信方式&#xff1a;單工&#xff1a;發送方和接收方是固定的&#xff0c;數據只能從發送方 發給 …

react16到react19更新及底層實現是什么以及區別

好問題 &#x1f44d;。React 16 → 19 的更新跨度其實涵蓋了 React 的幾個“時代級”的演進&#xff1a;從 Fiber 架構 的重寫、到 并發特性 的引入&#xff0c;再到 React Server Components 和 現代語法支持。我幫你梳理下主要更新點和底層實現的區別&#xff0c;方便你系統…

【分享】基于百度腦圖,并使用Vue二次開發的用例腦圖編輯器組件

偶然間發現了這個項目&#xff0c;分享出來。 【分享】基于百度腦圖&#xff0c;并使用Vue二次開發的用例腦圖編輯器組件1 項目地址2 項目簡介3 項目部署3.1 安裝node和npm3.2 項目下載3.3 修改npm鏡像源3.4 部署4 項目中使用1 項目地址 基于百度腦圖&#xff0c;并使用Vue二次…

Kotlin中抽象類和開放類

抽象類 (Abstract Class) 定義和特點 抽象類使用 abstract 關鍵字聲明&#xff0c;是一種不能被直接實例化的特殊類&#xff0c;主要用于被其他類繼承。 abstract class Base {open fun f() {} }abstract class Derived : Base() {override abstract fun f() // 抽象成員在類中…

TensorFlow深度學習實戰(37)——深度學習的數學原理

TensorFlow深度學習實戰&#xff08;37&#xff09;——深度學習的數學原理0. 前言1. 反向傳播歷史2. 微積分相關概念2.1 向量2.2 導數和梯度2.3 梯度下降2.4 鏈式法則2.5 常用求導公式2.6 矩陣運算3. 激活函數4. 反向傳播4.1 前向計算4.2 反向傳播5. 交叉熵及其導數6. 批量梯度…

1.1 汽車運行滾動阻力

汽車運行阻力由4部分構成&#xff1a;滾動阻力、空氣阻力、坡度阻力、加速阻力。 1).汽車在水平道路上等速行駛時&#xff0c;必須克服來自地面的滾動阻力和來自空氣的空氣阻力。 2). 當汽車在坡道上上坡行駛時&#xff0c;還必須克服重力沿坡道的分力&#xff0c;稱為坡度阻…

e203000

1&#xff09;①BIU作為核心通信樞紐&#xff0c;主要承擔兩大功能&#xff1a;一是連接處理器核內的關鍵執行單元&#xff08;包括IFU、LSU和EAI協處理器&#xff09;&#xff0c;統一管理指令和數據的內部傳輸路徑&#xff1b;二是作為"核內計算"與"核外資源&…

Infortrend普安科技IEC私有云平臺VM解決方案

Infortrend企業云&#xff08;IEC&#xff09;內置Hypervisor運行VM。功能完整、無需額外付費。在本文中&#xff0c;我們將為您詳細介紹IEC是如何支持 VM的。市場現狀與挑戰市場現狀 虛擬化市場面臨轉型&#xff0c;主流廠商&#xff08;如 VMware&#xff09;改用訂閱制…

【代碼隨想錄算法訓練營——Day6(Day5周日休息)】哈希表——242.有效的字母異位詞、349.兩個數組的交集、202.快樂數、1.兩數之和

LeetCode題目鏈接 https://leetcode.cn/problems/valid-anagram/ https://leetcode.cn/problems/intersection-of-two-arrays/ https://leetcode.cn/problems/happy-number/ https://leetcode.cn/problems/two-sum/ 題解 242.有效的字母異位詞 這道題要想到用哈希表來做。同時注…

安科瑞基站智慧運維云平臺:安全管控與節能降耗雙效賦能

功能&#xff1a;基站智慧用電云平臺通過對5G宏站和室分站點加裝交/直流智能監控設備、無線采集設備以及系統管理平臺&#xff0c;完成夜間無業務時段的下電操作&#xff0c;減少電能消耗&#xff0c;降低運營成本支出&#xff0c;以及提升通信設備供電線路狀態的實時監測保護功…