不知道大家是否有这样的感觉,上网浏览信息,看到好的文章就兴奋地下载了下来,文件的名称通常是一串奇奇怪怪的字符串。过了几天就在电脑中找不着了。没有网络上搜索不到的文章,而是在你的电脑中却找不到它们。几年下来,辛辛苦苦收集的技术文档,书籍成了电脑中的垃圾堆。一个治学严谨的信息收纳狂也许会迅速地整理自己的文件夹。更换文件名,分门别类地存储下载文档。但是我不会。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 os
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 Key
api_key=os.environ.get("0102f8a9-8727-4770-b67e-d289d4592343"),
)
def Summary(Text,Prompt):
response = LLM_client.chat.completions.create(
# 指定您创建的方舟推理接入点 ID,此处已帮您修改为您的推理接入点 ID
model="doubao-1-5-pro-32k-250115",
messages=[
{"role": "system", "content": Prompt},
{"role": "user", "content": Text}
]
)
response_message = response.choices[0].message.content
return 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=10
for 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 Key
api_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,此处已帮您修改为您的推理接入点 ID
model="doubao-1-5-pro-32k-250115",
messages=[
{"role": "system", "content": Prompt},
{"role": "user", "content": Text}
]
)
response_message = response.choices[0].message.content
return 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 程序先要将事情搞明白,然后讲明白。有点类似于给秘书交代工作。需要有解决问题的思路。为文档写一个简介,看上去很简单的问题。实际上也有许多因素需要考虑。使用大模型整理下载的内容是十分有用的工具。