如何基于大语言模型和MaxKB实现PPT自动生成方案
一、实现方案
利用讯飞大模型智能 PPT 生成接口实现,具体参见:讯飞开放平台智能PPT生成 https://www.xfyun.cn/services/aippt#anchor4503211

二、新增函数
2.1函数脚本
# -*- coding:utf-8 -*-
import hashlib
import hmac
import base64
import json
import time
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
class AIPPT():
def __init__(self, APPId, APISecret, Text, templateId):
self.APPid = APPId
self.APISecret = APISecret
self.text = Text
self.header = {}
self.templateId = templateId
# 获取签名
def get_signature(self, ts):
try:
# 对app_id和时间戳进行MD5加密
auth = self.md5(self.APPid + str(ts))
# 使用HMAC-SHA1算法对加密后的字符串进行加密
return self.hmac_sha1_encrypt(auth, self.APISecret)
except Exception as e:
print(e)
return None
def hmac_sha1_encrypt(self, encrypt_text, encrypt_key):
# 使用HMAC-SHA1算法对文本进行加密,并将结果转换为Base64编码
return base64.b64encode(
hmac.new(encrypt_key.encode('utf-8'), encrypt_text.encode('utf-8'), hashlib.sha1).digest()).decode('utf-8')
def md5(self, text):
# 对文本进行MD5加密,并返回加密后的十六进制字符串
return hashlib.md5(text.encode('utf-8')).hexdigest()
# 创建PPT生成任务
def create_task(self):
url = 'https://zwapi.xfyun.cn/api/ppt/v2/create'
timestamp = int(time.time())
signature = self.get_signature(timestamp)
# body= self.getbody(self.text)
formData = MultipartEncoder(
fields={
# "file": (path, open(path, 'rb'), 'text/plain'), # 如果需要上传文件,可以将文件路径通过path 传入
# "fileUrl":"", #文件地址(file、fileUrl、query必填其一)
# "fileName":"", # 文件名(带文件名后缀;如果传file或者fileUrl,fileName必填)
"query": self.text,
"templateId": "20240718489569D", # 模板的ID,从PPT主题列表查询中获取
"author": "XXXX", # PPT作者名:用户自行选择是否设置作者名
"isCardNote": str(True), # 是否生成PPT演讲备注, True or False
"search": str(False), # 是否联网搜索,True or False
"isFigure": str(True), # 是否自动配图, True or False
"aiImage": "normal"
# ai配图类型: normal、advanced (isFigure为true的话生效); normal-普通配图,20%正文配图;advanced-高级配图,50%正文配图
}
)
print(formData)
headers = {
"appId": self.APPid,
"timestamp": str(timestamp),
"signature": signature,
"Content-Type": formData.content_type
}
self.header = headers
print(headers)
response = requests.request(method="POST", url=url, data=formData, headers=headers).text
print("生成PPT返回结果:", response)
resp = json.loads(response)
if (0 == resp['code']):
return resp['data']['sid']
else:
print('创建PPT任务失败')
return None
# 构建请求body体
def getbody(self, text):
body = {
"query": text,
"templateId": self.templateId # 模板ID举例,具体使用 /template/list 查询
}
return body
# 轮询任务进度,返回完整响应信息
def get_process(self, sid):
# print("sid:" + sid)
if (None != sid):
response = requests.request("GET", url=f"https://zwapi.xfyun.cn/api/ppt/v2/progress?sid={sid}",
headers=self.header).text
print(response)
return response
else:
return None
# 获取PPT,以下载连接形式返回
def get_result(self, task_id):
# 创建PPT生成任务
# task_id = self.create_task()
# PPTurl = ''
# 轮询任务进度
while (True):
response = self.get_process(task_id)
resp = json.loads(response)
pptStatus = resp['data']['pptStatus']
aiImageStatus = resp['data']['aiImageStatus']
cardNoteStatus = resp['data']['cardNoteStatus']
if ('done' == pptStatus and 'done' == aiImageStatus and 'done' == cardNoteStatus):
PPTurl = resp['data']['pptUrl']
break
else:
time.sleep(3)
return PPTurl
def getHeaders(self):
timestamp = int(time.time())
signature = self.get_signature(timestamp)
# body = self.getbody(self.text)
headers = {
"appId": self.APPid,
"timestamp": str(timestamp),
"signature": signature,
"Content-Type": "application/json; charset=utf-8"
}
return headers
def getTheme(self):
url = "https://zwapi.xfyun.cn/api/ppt/v2/template/list"
self.header = self.getHeaders()
body = {
"payType": "not_free",
# "style": "简约", # 支持按照类型查询PPT 模板
# "color": "红色", # 支持按照颜色查询PPT 模板
# "industry": "教育培训", # 支持按照颜色查询PPT 模板
"pageNum": 2,
"pageSize": 10
}
response = requests.request("GET", url=url, headers=self.header).text
print(response)
return response
def createOutline(self):
# if('' ==fileUrl and '' == filePath):
url = "https://zwapi.xfyun.cn/api/ppt/v2/createOutline"
body = {
"query": self.text,
"language": "cn",
"search": str(False), # 是否联网搜索,True or False
}
response = requests.post(url=url, json=body, headers=self.getHeaders()).text
print("生成大纲完成:\n", response)
return response
def createOutlineByDoc(self, fileName, fileUrl=None, filePath=None):
# if('' ==fileUrl and '' == filePath):
url = "https://zwapi.xfyun.cn/api/ppt/v2/createOutlineByDoc"
formData = MultipartEncoder(
fields={
"file": (filePath, open(filePath, 'rb'), 'text/plain'), # 如果需要上传文件,可以将文件路径通过path 传入
"fileUrl": fileUrl, # 文件地址(file、fileUrl必填其一)
"fileName": fileName, # 文件名(带文件名后缀;如果传file或者fileUrl,fileName必填)
"query": self.text,
"language": "cn",
"search": str(False), # 是否联网搜索,True or False
}
)
timestamp = int(time.time())
signature = self.get_signature(timestamp)
headers = {
"appId": self.APPid,
"timestamp": str(timestamp),
"signature": signature,
"Content-Type": formData.content_type
}
self.header = headers
response = requests.post(url=url, data=formData, headers=headers).text
print("生成大纲完成:\n", response)
return response
def createPptByOutline(self, outline):
url = "https://zwapi.xfyun.cn/api/ppt/v2/createPptByOutline"
body = {
"query": self.text,
"outline": outline,
"templateId": self.templateId, # 模板的ID,从PPT主题列表查询中获取
"author": "XXXX", # PPT作者名:用户自行选择是否设置作者名
"isCardNote": True, # 是否生成PPT演讲备注, True or False
"search": False, # 是否联网搜索,True or False
"isFigure": True, # 是否自动配图, True or False
"aiImage": "normal",
# ai配图类型: normal、advanced (isFigure为true的话生效); normal-普通配图,20%正文配图;advanced-高级配图,50%正文配图
}
print(body)
response = requests.post(url, json=body, headers=self.getHeaders()).text
print("创建生成任务成功:\n", response)
resp = json.loads(response)
if (0 == resp['code']):
return resp['data']['sid']
else:
print('创建PPT任务失败')
return None
def generate_ppt(count):
# 控制台获取
APPId = "*****"
APISecret = "************"
# 查询PPT主题列表
# demo1 = AIPPT(APPId,APISecret,'','')
# templateId = demo1.getTheme() # 获取模板列表
# print("支持模板列表:\n",templateId)
templateId = "20240718489569D" # 该模板ID,需要通过getTheme() 方法获取模板列表,然后从中挑选
# 流程一:根据描述或者文档直接生成PPT;(流程一、流程二代码不能同时打开)
# # 流程一开始
Text = count
demo = AIPPT(APPId, APISecret, Text, templateId)
taskid = demo.create_task()
# # 流程一结束
# 流程二: 先生成大纲(支持上传文本),再通过大纲生成PPT;(流程一、流程二代码不能同时打开)
# # 流程二开始
# title = "秋分时节的农业管理策略" #设定大纲主题
# filename = "test.pdf" # 需要根据文档上传时,请填写文档路径;要求:字数不得超过8000字,文件限制10M。上传文件支持pdf(不支持扫描件)、doc、docx、txt、md格式的文件。
# filePath = "data/test.pdf" # 文件路径,也可以通过fileurl 字段上传对象存储地址,具体见方法:createOutlineByDoc
# demo = AIPPT(APPId, APISecret, title, templateId)
# res = demo.createOutlineByDoc(fileName=filename,filePath=filePath)
# data = json.loads(res)
# outline = data["data"]["outline"]
# taskid = demo.createPptByOutline(outline)
# # 流程二结束
result = demo.get_result(taskid)
print("生成的PPT请从此地址获取:\n" + result)
return result
2.2函数参数配置
如下图所示添加 count 参数:

三、设计流程
使用 MaxKB 中的高级编排,其中工作流编排流程如下所示:

其中指定回复使用 Office Online Viewer 展示 PPT。
<iframe src="https://view.officeapps.live.com/op/embed.aspx?src={{讯飞智能生成PPT.result}}"
width="800" height="600" frameborder="0">
</iframe>
四、效果展示

相关资料:
MaxKB在线使用手册:https://maxkb.cn/docs/
MaxKB安装包:https://maxkb.cn/docs/installation/offline_installtion/
如何基于大语言模型和MaxKB实现PPT自动生成方案的更多相关文章
- python实战-基于正交实验(工具:allpairs)自动生成接口异常测试用例
实现思路 1.抓取api信息(目前公司用的swagger),uri.method.params.response,解析完成后写入excle 2.读取抓取完毕的api信息,处理为allpairs所需要的 ...
- 基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具
基于OCILIB的oracle数据库操作总结 1. 类图 2. 基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once /* ----- ...
- 基于贝叶斯模型和KNN模型分别对手写体数字进行识别
首先,我们准备了0~9的训练集和测试集,这些手写体全部经过像素转换,用0,1表示,有颜色的区域为0,没有颜色的区域为1.实现代码如下: # 图片处理 # 先将所有图片转为固定宽高,比如32*,然后再进 ...
- c语言int型和char型的自动类型转换
; //机器码为0xff unsigned ; //机器码0xfe if (a <= b){ printf("a <= b\n"); } else{ printf(&q ...
- Go 语言,开源服务端代码自动生成 框架 - EasyGoServer
EasyGoServer 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblog ...
- 一个基于GPT模型实现的Git Commit信息自动生成工具
每次提交代码的时候,你是否有为如何写Commit Message而迟迟按不下提交的时刻呢?然后,死磨硬泡写了一些并提交后,又被review的小伙伴吐槽了呢?相信很多小伙伴有过这样的经历吧? 趁着最近C ...
- API的文档自动生成——基于CDIF的SOA基本能力
当前,作为大部分移动app和云服务后台之间的标准连接方式,REST API已经得到了绝大部分开发者的认可和广泛的应用.近年来,在新兴API经济模式逐渐兴起,许多厂商纷纷将自己的后台业务能力作为REST ...
- 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程
许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
- 系统间通信(5)——IO通信模型和JAVA实践 下篇
7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...
随机推荐
- docker容器间互相访问 docker bridge网络
方式一.虚拟ip访问安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问. [root@33fcf82ab4dd / ...
- Web网页端IM产品RainbowChat-Web的v5.0版已发布
一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...
- (.net core)Kong网关的使用
一.优势: 提供统一的 API 管理,简化流量控制.负载均衡.安全性控制等工作. 有可视化界面可操作,支持高度 可扩展性,可以通过插件来扩展功能. 在 微服务架构 中表现优异,支持多种协议和高并发场景 ...
- GIMP 开源、免费,功能强大的图像编辑软件
引言 万事开头难,打造个人网站,图片处理是必不可少的,老王的电脑还是 10 年前配置的,日常使用倒还流畅,但要是使用 Photoshop 就有些吃力,特别是越新的版本.然后,发现 GIMP 这个开源的 ...
- 深入理解ReentrantLock的实现原理
文章目录ReentrantLock简介AQS回顾ReentrantLock原理ReentrantLock结构非公平锁的实现原理lock方法获取锁tryRelease锁的释放公平锁的实现原理lock方法 ...
- 第二章 dubbo源码解析目录
6.1 如何在spring中自定义xml标签 dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个 ...
- Linux常见问题合集
Linux基本指令 连接SSH ssh uesrname@ip 例如:ssh root@192.168.43.217 Linux 创建多级目录命令: mkdir -p 示例:mkdir -p proj ...
- 【Git】---工作区、暂存区、版本库、远程仓库
工作区.暂存区.版本库.远程仓库 一.概念 1.四个工作区域 Git本地有四个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或 ...
- IDEA 2020.3.2 安装激活教程
注意 本教程适用于 IntelliJ IDEA 2020.3.2 以下所有版本,请放心食用~ 本教程适用于 JetBrains 全系列产品,包括 Pycharm.IDEA.WebStorm.Phpst ...
- python的typing模块
python的typing模块 参考:3个提高 Python 开发效率的小工具.Python3 Typing模块详解 typeing模块在python中提供类型支持,主要功能有: 类型检查,防止运行时 ...