在deepseek中输入提示词:
你现在是一个Python编程专家,要调用siliconflow平台的Qwen2.5-7B-Instruct模型来总结文档,具体步骤如下:
打开文件夹:F:\AI自媒体内容\AI炒股\已经阅读\已经上传
读取里面所有的pdf文档;
用Qwen2.5-7B-Instruct模型总结pdf文档;
总结完后保存为一个docx文档,文件名在原pdf文档名后面加上“_总结”
siliconflow平台的基础URL: https://api.siliconflow.cn/v1
API密钥为:XXX
模型为:Qwen/Qwen2.5-7B-Instruct,上下文长度32K;
提示词为:总结下面这篇券商研究报告的核心内容,不需要总结“投资建议”、“风险提示”、“投资评级”、“免责声明”这些。输出部分包括:报告标题、报告发布日期、证券分析师姓名、研报所用的研究方法、数据来源、研报的核心逻辑和要点(这部分要不少于500字)、具体的股票投资标的(股票名称和股票代码)。
代码示例:
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.siliconflow.cn/v1")
response = client.chat.completions.create(
model='alibaba/Qwen1.5-110B-Chat',
messages=[
{'role': 'user', 'content': "抛砖引玉是什么意思呀"}
],
stream=True
)
for chunk in response:
print(chunk.choices[0].delta.content, end='')
注意:模型有限速,RPM=1K TPM=50K, 为了解决这个问题,我们可以采取以下措施:增加请求间隔:在每次请求之间增加一定的延迟,以避免短时间内发送过多的请求。批量处理:将多个文档的总结任务分成多个批次,每个批次之间增加一定的延迟。错误重试:在遇到错误时,等待一段时间后重试请求。
如果pdf文档的内容超过模型的上下文长度(32K 字符),模型将无法处理整个文档。为了解决这个问题,我们可以将文档分块处理,确保每个块的长度不超过模型的上下文长度限制。
如果分块处理不当,可能会导致某些内容在多个块中重复出现,从而导致总结内容重复。
为了解决这个问题,我们可以采取以下措施:优化分块处理:确保每个块的内容尽可能独立,避免重叠。去重处理:在拼接总结内容时,进行去重处理,避免重复内容。检查模型输出:在调用模型时,检查输出内容,确保没有重复。
在把总结内容写入word时,要把### 、**等这些markdown符号转换成对应的word文档符号;
每一步都要输出信息到屏幕上
Deepseek生成的代码:
# -*- coding: utf-8 -*-
import os
import warnings
import re
from openai import OpenAI
from PyPDF2 import PdfReader
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# 忽略PyPDF2的警告
warnings.filterwarnings("ignore", category=UserWarning, module="PyPDF2")
# 设置API密钥和基础URL
api_key = XXX
base_url = "https://api.siliconflow.cn/v1"
# 初始化OpenAI客户端
client = OpenAI(api_key=api_key, base_url=base_url)
# 定义文件夹路径
folder_path = r"F:\AI自媒体内容\AI炒股\已经阅读\已经上传"
# 定义模型的上下文长度限制
MAX_CONTEXT_LENGTH = 32000 # 32K characters
def split_text_into_chunks(text, max_length):
"""将文本分割成不超过指定长度的块"""
chunks = []
current_chunk = ""
current_length = 0
for line in text.splitlines():
if current_length + len(line) + 1 > max_length:
chunks.append(current_chunk.strip())
current_chunk = line
current_length = len(line)
else:
if current_chunk:
current_chunk += "\n" + line
else:
current_chunk = line
current_length += len(line) + 1
if current_chunk:
chunks.append(current_chunk.strip())
return chunks
def remove_duplicates(text):
"""去除文本中的重复内容"""
lines = text.splitlines()
seen = set()
unique_lines = []
for line in lines:
if line not in seen:
seen.add(line)
unique_lines.append(line)
return "\n".join(unique_lines)
def markdown_to_word(text):
"""将Markdown格式的文本转换成Word文档格式"""
# 替换标题
text = re.sub(r'^### (.*)', r'\1', text, flags=re.MULTILINE)
text = re.sub(r'^## (.*)', r'\1', text, flags=re.MULTILINE)
text = re.sub(r'^# (.*)', r'\1', text, flags=re.MULTILINE)
# 替换加粗
text = re.sub(r'\*\*(.*?)\*\*', r'\1', text)
# 替换列表
text = re.sub(r'^- (.*)', r'\1', text, flags=re.MULTILINE)
return text
# 遍历文件夹中的所有pdf文件
for filename in os.listdir(folder_path):
if filename.endswith(".pdf"):
# 读取PDF文档
pdf_path = os.path.join(folder_path, filename)
print(f"正在读取PDF文档: {pdf_path}")
try:
reader = PdfReader(pdf_path)
text = ""
for page in reader.pages:
text += page.extract_text()
except Exception as e:
print(f"读取PDF文档时出错: {e}")
continue
# 分块处理
chunks = split_text_into_chunks(text, MAX_CONTEXT_LENGTH)
# 总结每个块
summary_chunks = []
for i, chunk in enumerate(chunks):
print(f"正在总结文档: {filename} 的第 {i+1}/{len(chunks)} 块")
try:
response = client.chat.completions.create(
model='Qwen/Qwen2.5-7B-Instruct',
messages=[
{'role': 'user', 'content': f"总结下面这篇券商研究报告的核心内容,不需要总结“投资建议”、“风险提示”、“投资评级”、“免责声明”这些。输出部分包括:报告标题、报告发布日期、证券分析师姓名、研报所用的研究方法、数据来源、研报的核心逻辑和要点(这部分要不少于500字)、具体的股票投资标的(股票名称和股票代码)。\n{chunk}"}
],
stream=False
)
summary_chunks.append(response.choices[0].message.content)
except Exception as e:
print(f"总结文档时出错: {e}")
continue
# 拼接总结后的内容并去除重复
summary_content = "\n".join(summary_chunks)
summary_content = remove_duplicates(summary_content)
# 将Markdown格式的文本转换成Word文档格式
summary_content = markdown_to_word(summary_content)
# 创建新的文档并写入总结后的内容
new_doc = Document()
for line in summary_content.split("\n"):
if line.startswith("报告标题"):
p = new_doc.add_paragraph()
p.add_run(line).bold = True
p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
elif line.startswith("报告发布日期"):
p = new_doc.add_paragraph()
p.add_run(line).bold = True
elif line.startswith("证券分析师"):
p = new_doc.add_paragraph()
p.add_run(line).bold = True
elif line.startswith("研究方法和数据来源"):
p = new_doc.add_paragraph()
p.add_run(line).bold = True
elif line.startswith("核心逻辑和要点"):
p = new_doc.add_paragraph()
p.add_run(line).bold = True
elif line.startswith("具体的股票投资标的"):
p = new_doc.add_paragraph()
p.add_run(line).bold = True
else:
new_doc.add_paragraph(line)
# 保存总结后的文档
new_filename = filename.replace(".pdf", "_总结.docx")
new_doc_path = os.path.join(folder_path, new_filename)
new_doc.save(new_doc_path)
print(f"总结完成,保存为: {new_doc_path}")
print("所有文档总结完成!")
程序运行结果:
其中一个总结:
本文分享自 Dance with GenAI 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!