利用 langchain 和 LLM 来给 PDF 做总结
在网上看到一个PDF, 讲的是 Gstreamer 的的动态管道的构建, 一瞥而过, 没时间细看, 先写个小程序通过 langchain 和 LLM 给它做个快速总结
代码如下
from langchain.document_loaders import UnstructuredPDFLoader
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate# 加载 PDF 文件
pdf_loader = UnstructuredPDFLoader("path_to_your_pdf_file.pdf")
documents = pdf_loader.load()# 获取 PDF 的纯文本内容
pdf_text = ' '.join([doc.page_content for doc in documents])# 创建 LLM 对象 (使用 OpenAI GPT)
llm = OpenAI(temperature=0.7, openai_api_key="your_openai_api_key")# 定义总结的 Prompt
prompt_template = """
请总结以下内容:
{pdf_text}
总结:
"""prompt = PromptTemplate(input_variables=["pdf_text"],template=prompt_template,
)# 创建 LLMChain
chain = LLMChain(llm=llm, prompt=prompt)# 使用 LLM 生成总结
summary = chain.run(pdf_text)
print("PDF 总结:\n", summary)
代码输出如下
PDF summary:总结内容:1. **演讲者信息**:- 演讲者:José Antonio Santos Cadenas- 职位:软件工程师- 教育背景:Telematic Systems 硕士- 工作经历:Kurento Media Server (KMS) 管理员- 联系方式:santoscadenas@gmail.com2. **GStreamer 静态管道**:- 使用 `gst-launch` 命令创建复杂的媒体管道,例如将视频文件转码。- 示例:`gst-launch-1.0 filesrc location=sample.mp4 ! qtdemux ! avdec_h264 ! queue ! vp8enc ! webmmux ! filesink location=sample.webm`3. **GStreamer 动态元素**:- GStreamer 提供了一些动态元素(如 `autovideosrc`, `autovideosink`, `decodebin`, `playbin`),简化了动态管道的创建。- 示例:`gst-launch-1.0 filesrc location=sample.mp4 ! decodebin ! vp8enc ! webmmux ! filesink location=sample.webm`4. **动态管道不依赖于媒体**:- 动态管道可以根据媒体流而不是外部条件创建。- 例如:根据用户操作添加或替换元素。5. **创建动态管道的要求**:- 需要深入理解 GStreamer 的工作原理,包括媒体如何在 pads 之间流动、协商如何进行、流线程如何工作以及 probes 如何工作。6. **在播放时添加和移除元素**:- 错误方式:直接调用 `gst_pad_unlink`,可能导致死锁或竞争条件。- 正确方式:使用 probe 等待 pad 空闲,确保在断开连接时不会影响媒体流。7. **在 tee 后添加元素**:- tee 会处理断开的 pads,但建议在 idle 或 block 回调中处理元素连接,以避免状态更改或协商期间的问题。8. **注意协商**:- 在 tee 后连接元素时,需要注意协商可能会影响其他分支,建议使用 `capsfilter` 或转换器来简化协商。9. **移除元素**:- 有时需要允许元素处理所有队列中的缓冲区(例如录制时),断开连接后需要发送 EOS 并等待管道末端处理。10. **实时管道建议**:- 在实时管道中,元素应配置为尽可能快地工作,并添加队列以分离不同线程中的处理。11. **总结建议**:- 动态管道不容易,理解要尝试的操作及其对管道其他部分的影响。- 断开连接前阻塞 pads,连接前同步新元素的状态,始终先连接 sink 元素以避免媒体泄漏。12. **联系方式和资源**:- 演讲者邮箱:santoscadenas@gmail.com- Kurento 相关链接:[Kurento](http://www.kurento.org), [GitHub](http://www.github.com/kurento), [Twitter](https://twitter.com/kurentoms)- 其他相关组织:[NUBOMEDIA](http://www.nubomedia.eu), [FI-WARE](http://www.fi-ware.org), [EU](http://ec.europa.eu)
代码解释
这段代码的作用是从 PDF 文件中提取文本内容,并使用 OpenAI 的 GPT 模型对其进行总结。以下是各部分的解释:
1. 导入必要的库
from langchain.document_loaders import UnstructuredPDFLoader
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
-
UnstructuredPDFLoader
: 用于加载和解析 PDF 文件,将其转换为文本格式。 -
OpenAI
: 用于与 OpenAI 的 GPT 模型进行交互,生成自然语言的输出。 -
LLMChain
: 用于将模型与输入的提示(prompt)结合起来,创建一个完整的流程链。 -
PromptTemplate
: 用于定义向 GPT 提供的提示模板。
2. 加载 PDF 文件
pdf_loader = UnstructuredPDFLoader("path_to_your_pdf_file.pdf")
documents = pdf_loader.load()
-
UnstructuredPDFLoader
: 用来加载 PDF 文件。它会解析 PDF 并将其转换成文档对象列表,每个文档对象包含了对应的页面内容。 -
documents
: 加载后的 PDF 文件内容存储在documents
列表中,每个文档对象对应一页 PDF 文本。
3. 提取 PDF 文本
pdf_text = ' '.join([doc.page_content for doc in documents])
-
pdf_text
: 从文档对象中提取纯文本内容,将每一页的内容拼接在一起,生成完整的 PDF 文本。
4. 创建 OpenAI LLM 对象
llm = OpenAI(temperature=0.7, openai_api_key="your_openai_api_key")
-
OpenAI
: 实例化 GPT 模型,temperature=0.7
设置了生成文本的随机性,较高的值会导致模型生成更多样化的输出。需要使用 OpenAI 的 API 密钥来访问 GPT 服务。
5. 定义 Prompt 模板
prompt_template = """
请总结以下内容:
{pdf_text}
总结:
"""
-
prompt_template
: 定义了一个自然语言提示模板,包含一个占位符{pdf_text}
,用于替换成提取的 PDF 文本。该模板告诉 GPT 模型对 PDF 内容进行总结。
prompt = PromptTemplate(input_variables=["pdf_text"],template=prompt_template,
)
-
PromptTemplate
: 创建一个具体的提示模板,指定pdf_text
作为输入变量。
6. 创建 LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
-
LLMChain
: 将 GPT 模型和定义好的提示模板连接起来,形成一个可执行的链,链条会根据提示和模型生成输出。
7. 生成总结
summary = chain.run(pdf_text)
print("PDF 总结:\n", summary)
-
chain.run(pdf_text)
: 执行链,将提取的 PDF 文本传递给 LLM,GPT 模型根据提供的 prompt 对 PDF 文本进行总结。 -
print("PDF 总结:\n", summary)
: 打印生成的总结。
总结
该代码从 PDF 文件中提取纯文本内容,使用 OpenAI GPT 模型对其进行总结。你可以通过修改 prompt 或调整模型的参数来生成不同风格的总结。
你可以将此代码应用于任何 PDF 文件,得到简明的总结内容。
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。
相关文章:
利用 langchain 和 LLM 来给 PDF 做总结
在网上看到一个PDF, 讲的是 Gstreamer 的的动态管道的构建, 一瞥而过, 没时间细看, 先写个小程序通过 langchain 和 LLM 给它做个快速总结 代码如下 from langchain.document_loaders import UnstructuredPDFLoader from langchain.llms import OpenAI from langchain.chains i…...
props 不能轻易解构,注意maxLength类似这种,不能解构出来
当您从 props 对象中解构 msg 时,msg 变量将会获取到当时的 props.msg 值。解构操作仅仅是将当前值复制到 msg 变量中,它并不会建立响应式连接。因此,当 props.msg 发生变化时,解构出的 msg 变量仍保持其原始值,不会自…...
总结拓展十三:SAP系统采购订单关闭实例分享
1、案例分享 我们集团A基地和B基地存在外包加工业务。A基地向B基地外包采购了多起不同类型的物料,近期有部分外包采购暂停,需要采购关闭未完成交货的采购订单。采购在关闭时出现2类报错问题,向我们IT咨询解决方案。 1)报错类型 …...

内嵌服务器Netty Http Server
内嵌式服务器不需要我们单独部署,列如SpringBoot默认内嵌服务器Tomcat,它运行在服务内部。使用Netty 编写一个 Http 服务器的程序,类似SpringMvc处理http请求那样。举例:xxl-job项目的核心包没有SpringMvc的Controller层,客户端却…...
Maven打包运行,引入三方jar及打包,不导入本地库的方法
Maven打包运行,引入三方jar及打包,不导入本地库的方法 maven、打包、springboot、jar、本地、引入背景 业务系统要对接某硬件,需要用到其三方jar,maven官方仓库没有这个,我也没有maven,又不想mvn install…...

02复写零
复写零 我们先进行异地复写:代码如下 public class Test {public static void main(String[] args) {int []array {1,0,2,3,0,4};duplicateZeros(array);}public static void duplicateZeros(int[] arr) {int [] elemnew int[arr.length];for(int cur0,dest0;des…...
01-gcc编译c++过程
当然,可以为您简要概述GCC编译C程序的各个步骤及其对应的具体命令。 GCC编译C的四个主要步骤 预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking) 1…...

互动式教育技术:Spring Boot师生共评作业管理系统
3系统分析 3.1可行性分析 通过对本师生共评的作业管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本师生共评的作业管理系统采用JAVA作为开发语言&…...

【云从】三、计算机网络基础
文章目录 1、网络2、网络通信2.1 IP地址2.2 子网掩码2.3 网关2.4 私有地址和公有地址2.5 NAT网络地址转换 3、网络架构及设备 1、网络 网络,即通过通信线路(如光纤、网线)和通信设备(如路由器、光猫),将各…...
读书笔记《向上生长》关于记忆、链接的一些思考
摘录 NOTES 1.大脑非常低效,记性不好,还会自圆其说。很多成绩不好的学生绝大部分不记笔记,记了也不看。 2.注意力和肌肉一样,存在耗损,也可以通过锻炼来加强。 3. 所有知识必须链接到已经有的知识,到用的时…...

Kubesphere4.1版本创建应用Mysql并实现外网访问
目前Kubesphere4.1版本可查创建应用资料较少,特此记录作为参考。 目标 使用Kubesphere4.1完成Mysql服务部署并实现外网访问。 具体流程如下: 1.创建企业空间 2.创建项目 3.创建应用仓库 4.创建应用(mysql) 5.配置外网访…...
小猿口算跟风版——没想到吧,这也能暴力
前言 “接口也是口,算法也是算”,综合来看就是口算! 看到全网都在炸鱼也忍不住来玩一玩… 参考了大佬的OCR版,试用后发现影响速度的最大卡点并不是识别速度等,而是““由于检测异常导致的等待”。 基于体验几局的感受…...

【RabbitMQ——消息应答机制——分布式事务解决方式】
1. RabbitMQ高级-消息确认机制的配置 NONE值是禁用发布确认模式,是默认值 CORRELATED值是发布消息成功到交换器后会触发回调方法,如1示例SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功…...

Android Studio Koala中Kotlin引入序列化Parcelable
找了一堆资料没有新构建序列化的方法,踩坑经历如下: 前提是使用Kotlin创建的项目 之前的build.gradle版本写法如下: 但是新版Android Studio Koala使用序列化模式发生了改变,如下: 测试成功如下: 发出来…...
安装postgresql和对应wal2json和pg_tm_aux插件避坑
1、安装原则:要用源码都用源码,要用yum都用yum 安装wal2json避坑 涉及的yum源,可以解决安装postgresql缺少依赖导致的wal2json和pg_tm_aux的报错问题 [centos-sclo-rh] nameCentOS-7 - SCLo rh baseurlhttps://mirrors.aliyun.com/centos/7/…...

OneDrive 全新时代:AI、生产力和回忆触手可及
OneDrive,无人不知,无人不晓。 无论您是在公司、家庭还是在通勤的路上,OneDrive 都能让您无缝管理文件、照片和回忆。OneDrive 受到 94% 的财富 500 强公司、数百万小型企业和无数个人的信赖,它正在改变世界协作、存储和连接的方…...

List子接口
1.特点:有序,有下标,元素可以重复 2.方法:包含Collection中的所有方法,还包括自己的独有的方法(API中查找) 还有ListIterator(迭代器),功能更强大。 包含更多…...

快来了解 Java 内存数据库 H2,不要错过哦
H2 是一个用 Java 编写的开源关系型数据库管理系统,它具有小巧、快速、易于嵌入等特点。 H2 数据库可以以多种模式运行,包括嵌入式模式、服务器模式和内存模式。 在嵌入式模式下,H2 数据库直接嵌入到应用程序中,就像一个本地的库…...

基于Java的可携宠物酒店管理系统的设计与实现(论文+源码)_kaic
摘 要 随着社会经济的不断发展,现如今出行并住酒店的人越来越多,与之而来的是酒店行业的工作量日益增加,酒店的管理效率亟待提升。此外很多人出门旅游时会有携带宠物的情况,但是现如今酒店对宠物的限制,导致许多…...

吸毛效果好的宠物空气净化器分享,希喂、霍尼韦尔、米家实测
说起宠物空气净化器,几年前我可能会一脸鄙夷:为啥要花这种智商税冤枉钱? 直到之前养了一只猫,被家中乱飞的浮毛和滂臭的异味搞到头晕,于是作为i一个养宠的家电测评博主,索性对宠物空气净化器这玩意做了超级…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...