?????????不知道大家是否有這樣的感覺,上網瀏覽信息,看到好的文章就興奮地下載了下來,文件的名稱通常是一串奇奇怪怪的字符串。過了幾天就在電腦中找不著了。沒有網絡上搜索不到的文章,而是在你的電腦中卻找不到它們。幾年下來,辛辛苦苦收集的技術文檔,書籍成了電腦中的垃圾堆。一個治學嚴謹的信息收納狂也許會迅速地整理自己的文件夾。更換文件名,分門別類地存儲下載文檔。但是我不會。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 程序先要將事情搞明白,然后講明白。有點類似于給秘書交代工作。需要有解決問題的思路。為文檔寫一個簡介,看上去很簡單的問題。實際上也有許多因素需要考慮。使用大模型整理下載的內容是十分有用的工具。