不知道大家是否有这样的感觉,上网浏览信息,看到好的文章就兴奋地下载了下来,文件的名称通常是一串奇奇怪怪的字符串。过了几天就在电脑中找不着了。没有网络上搜索不到的文章,而是在你的电脑中却找不到它们。几年下来,辛辛苦苦收集的技术文档,书籍成了电脑中的垃圾堆。一个治学严谨的信息收纳狂也许会迅速地整理自己的文件夹。更换文件名,分门别类地存储下载文档。但是我不会。AI 出现后,是否能帮我做个电脑文件整理助手呢?我一直想做这件事情。这几天有空,就尝试写一个python小程序。
麻烦存在于细节中
许多事情想想容易,一动手就发现问题没想象的简单。下载的文档包括下面几种
- 论文
网络上下载的论文比较简单,它在开头包含了一个摘要,只要通过AI 大模型提取出来就可以了。我使用豆包doubao-1-5-pro-32k 最大输入文字长度128K。普通的论文都能全部输入。
- 书籍
书籍的长度比较大,通常有几百页。也没有书籍摘要,为了写出图书介绍,可以采取两种方式,一种方式是将图书分段(chunk_size) 逐段提取重要的内容,然后合并起来,写摘要。另一种方法是提取前10页的内容,做图书的介绍,因为通常图书的前几页包括了前言,目录等,前言中作者会重点介绍图书的主要内容,适合的读者和如何阅读这本书。 我尝试了一下,好像第二种方法效果更好一点。
普通的文章
普通的文章,如果不超过大模型输入的限制,就直接丢给它,请他去归纳总结。对于超长的文章,可以分段提取段落大意,然后在总结出文章的摘要。
代码
图书写简介
from chromadb import PersistentClient
from PyPDF2 import PdfReader
from openai import OpenAI
import osos.environ['OPENAI_API_KEY'] ="your API Key"
os.environ['OPENAI_BASE_URL'] ="https://ark.cn-beijing.volces.com/api/v3"
LLM_client = OpenAI(# 此为默认路径,您可根据业务所在地域进行配置base_url="https://ark.cn-beijing.volces.com/api/v3",# 从环境变量中获取您的 API Keyapi_key=os.environ.get("0102f8a9-8727-4770-b67e-d289d4592343"),
)
def Summary(Text,Prompt):response = LLM_client.chat.completions.create(# 指定您创建的方舟推理接入点 ID,此处已帮您修改为您的推理接入点 IDmodel="doubao-1-5-pro-32k-250115",messages=[{"role": "system", "content": Prompt},{"role": "user", "content": Text}])response_message = response.choices[0].message.contentreturn response_message
def extract_text_from_pdf(pdf_path):with open(pdf_path, 'rb') as file:reader = PdfReader(file)text=""number=len(reader.pages)if number>10:number=10for index in range(number):text += reader.pages[index].extract_text()return text
def split_text(text, chunk_size=500):return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
Chroma_client = PersistentClient()
text = extract_text_from_pdf("./pythonBook1.pdf")
split_doc=split_text(text,120000)
print("Slipt_doc:",len(split_doc))
split_summary=[]
index=0
for doc in split_doc:print(index)index=index+1#print(doc)split_summary.append(Summary(doc,"为一本书写一个推荐文章,下面书中的前10页,请摘录本书的主要内容,写作的目的,方法,适合的读者,保持简短扼要"))
summary_text=""
for text in split_summary: summary_text += text
print(len(summary_text))
SummaryText=Summary(summary_text,"这是一本书中前10页的分段摘录,请依此为依据,这本书生成一个推荐文章,以中文输出")
print(SummaryText)
论文提取摘要
from chromadb import PersistentClient
from PyPDF2 import PdfReader
from openai import OpenAI
import os
import json
os.environ['OPENAI_API_KEY'] ="your API Key"
os.environ['OPENAI_BASE_URL'] ="https://ark.cn-beijing.volces.com/api/v3"
LLM_client = OpenAI(# 此为默认路径,您可根据业务所在地域进行配置base_url="https://ark.cn-beijing.volces.com/api/v3",# 从环境变量中获取您的 API Keyapi_key=os.environ.get("0102f8a9-8727-4770-b67e-d289d4592343"),
)
def Summary(Text):Prompt="""为一篇文章写一个摘要(Abstract),并且提取文章的标题,作者名称。如果没有提及作者,设置为空字符串如果文章中包含了摘要,就直接提取出来。否则,请生成文章的摘要。输出Json 格式。格式为:{"Name":Paper's Name,"Author":Writer's Name"Abstract" Paper's Abstract}摘要 Abstract 以中文输出。"""response = LLM_client.chat.completions.create(# 指定您创建的方舟推理接入点 ID,此处已帮您修改为您的推理接入点 IDmodel="doubao-1-5-pro-32k-250115",messages=[{"role": "system", "content": Prompt},{"role": "user", "content": Text}])response_message = response.choices[0].message.contentreturn response_message
def extract_text_from_pdf(pdf_path):with open(pdf_path, 'rb') as file:reader = PdfReader(file)text=""for page in reader.pages:text += page.extract_text()return text
def split_text(text, chunk_size=500):return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
Chroma_client = PersistentClient()
InputFilePath="./DETC.2007-35530.pdf"
text = extract_text_from_pdf(InputFilePath)
SummaryText=Summary(text)
#print(SummaryText)
SummaryJson=json.loads(SummaryText)
print(SummaryJson["Name"])
print(SummaryJson["Author"])
print(SummaryJson["Abstract"])
FilePath="./"+SummaryJson["Name"]+"_Abstract.txt"
OutputFilePath="./"+SummaryJson["Name"]+".pdf"
with open(FilePath, "w", encoding="utf-8") as f:f.write(SummaryJson["Abstract"])
os.rename(InputFilePath, OutputFilePath)
结论
与传统的程序设计不同,编写AI 程序先要将事情搞明白,然后讲明白。有点类似于给秘书交代工作。需要有解决问题的思路。为文档写一个简介,看上去很简单的问题。实际上也有许多因素需要考虑。使用大模型整理下载的内容是十分有用的工具。