当前位置: 首页 > news >正文

利用 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 国际许可协议进行许可。
http://www.lryc.cn/news/458285.html

相关文章:

  • props 不能轻易解构,注意maxLength类似这种,不能解构出来
  • 总结拓展十三:SAP系统采购订单关闭实例分享
  • 内嵌服务器Netty Http Server
  • Maven打包运行,引入三方jar及打包,不导入本地库的方法
  • 02复写零
  • 01-gcc编译c++过程
  • 互动式教育技术:Spring Boot师生共评作业管理系统
  • 【云从】三、计算机网络基础
  • 读书笔记《向上生长》关于记忆、链接的一些思考
  • Kubesphere4.1版本创建应用Mysql并实现外网访问
  • 小猿口算跟风版——没想到吧,这也能暴力
  • 【RabbitMQ——消息应答机制——分布式事务解决方式】
  • Android Studio Koala中Kotlin引入序列化Parcelable
  • 安装postgresql和对应wal2json和pg_tm_aux插件避坑
  • OneDrive 全新时代:AI、生产力和回忆触手可及
  • List子接口
  • 快来了解 Java 内存数据库 H2,不要错过哦
  • 基于Java的可携宠物酒店管理系统的设计与实现(论文+源码)_kaic
  • 吸毛效果好的宠物空气净化器分享,希喂、霍尼韦尔、米家实测
  • Sqlite3入门看这一篇就够(超级详细,从零学起)
  • 搭建知识库:助力大健康零售电商的快速发展
  • 纠删码参数自适应匹配问题ECP-AMP实验方案(中)
  • 在设计接口时,什么时候应该用路径参数,什么时候将数据保存到方法体中,它们各自的优势是什么?
  • JVa冒泡排序
  • 10/11
  • C语言复习第6章 指针(未完成)
  • Carrier Aggregation 笔记
  • JAVA的ArrayList 和 LinkedList的区别
  • AI知识库如何提升服装电商的运营效率
  • 鸿蒙开发(NEXT/API 12)【使用fetch发送网络请求】远场通信服务