赞
踩
如何从一段代码行对话,变成我们日常使用的APP、小程序、网页等工具?
如果我们想
快速添加常用的Prompt模板
、或是想要拥有一个历史会话功能
,应该怎么办?此时,我们就需要通过代码级开发来自定义前端了,前面大家已经在Task1快速入门了代码级开发,复刻了自己的应用demo,相信下面的内容对你来说也绝对不在话下——
配套魔搭示例代码项目可见:https://modelscope.cn/studios/Datawhale/datawhale_spark_2024
关于开发类的内容,可能会涉及到很多新概念,
为了尽量压缩篇幅,且让大家不用有那么多认知负担,
我们仅会对Gradio框架以及相关术语进行简单介绍,
主要目标是引导大家进入实操,且开始掌握如何解决问题的思路,
大家如果对相关信息有更多的学习需求,可以通过官方文档、浏览器搜索等方式研习。
Gradio 官方文档详见:https://www.gradio.app/
要想拥有更符合心意的应用,需要自己进行开发,即:我们需要把星火大模型的 API 作为一个功能组件,加入到我们自己的应用中去,做出属于我们创意的内容~
创建应用有很多种方式,常见如:网页、浏览器插件、小程序、移动应用程序(App)、桌面应用软件等。
一般来说,小程序、App、企业微信、订阅号服务等还有一定的开发及审核门槛,且需要学习较多的前端甚至UI设计相关的知识,需要具有一定的专业度和人力投入。
因此我们在快速验证功能和设计demo时,往往较优的选择是直接通过 Gradio/Streamlit 快捷开发可交互的demo。
使用 飞桨AI Studio 、魔搭Notebook 等云开发平台,可以减少很多本地环境配置的麻烦。
dwspark、Gradio 、也只需要简单通过pip安装对应的Python库即可。
在学习之前,这里还有几个基础概念你需要知道:
Python:一种简洁、易读、功能强大的高级编程语言,常言道“人生苦短,我用Python”。Gradio 是基于Python开发并开源的库。
pip:Python的包管理工具,主要用于安装、管理和卸载Python的第三方库。它是Python开发中不可或缺的工具之一,常用命令:
pip install xxx
、pip install --upgrade xxx
、pip uninstall xxx
、pip show xxx
、pip install xxx==1.1.1
、pip list
安装指定python库、升级指定python库、卸载指定python库、查看指定Python库的安装情况、安装指定Python库的指定版本、列出所有通过pip安装的Python库
在使用gradio、streamlit、以及appbuilder-SDK时,记得安装这些库哟~
SDK:即“软件开发工具包”(Software Development Kit),一般会包含一系列工具和文档的集合,旨在帮助开发者更有效地开发特定的软件应用程序。工具可能包括编程语言的库、APIs、开发环境(IDE)、编译器、调试&性能分析工具、相关文档等。
dwspark 就是我们为了方便大家调用星火大模型API而封装开发的SDK
飞桨 AI Studio:基于百度深度学习平台飞桨(PaddlePaddle)的人工智能学习与实训社区。它提供了一站式的模型在线开发与应用环境,支持多种编程语言和深度学习框架。
我们可以在AI Studio上进行python代码编写与运行,且可以免费使用其CPU环境(GPU环境需要付费)
另外我们的 Gradio 项目完成开发后,还可以通过其进行部署,分享给他人体验
魔搭ModelScope:
官方提供了很多模型,但各自有自己的SDK且调用起来较为麻烦,所以对基础模型进行了代码封装,以方便较为简洁的方式调用这些模型。
具体的模型官方接口文档见下表:
2.1 安装SDK
pip install dwspark
2.2 加载配置
- from dwspark.config import Config
- # 加载系统环境变量:SPARKAI_APP_ID、SPARKAI_API_KEY、SPARKAI_API_SECRET
- config = Config()
- # 自定义key写入
- config = Config('14****93', 'eb28b****b82', 'MWM1MzBkOD****Mzk0')
2.3 调用模型
- # SDK引入模型
- from dwspark.models import ChatModel, Text2Img, ImageUnderstanding, Text2Audio, Audio2Text, EmbeddingModel
- # 讯飞消息对象
- from sparkai.core.messages import ChatMessage
- # 日志
- from loguru import logger
- '''
- 对话
- '''
- # 模拟问题
- question = '你好呀'
- logger.info('----------批式调用对话----------')
- model = ChatModel(config, stream=False)
- logger.info(model.generate([ChatMessage(role="user", content=question)]))
- logger.info('----------流式调用对话----------')
- model = ChatModel(config, stream=True)
- [ logger.info(r) for r in model.generate_stream(question)]
- logger.info('done.')
- '''
- 文字生成语音
- '''
- text = '2023年5月,讯飞星火大模型正式发布,迅速成为千万用户获取知识、学习知识的“超级助手”,成为解放生产力、释放想象力的“超级杠杆”。2024年4月,讯飞星火V3.5春季升级长文本、长图文、长语音三大能力。一年时间内,讯飞星火从1.0到3.5,每一次迭代都是里程碑式飞跃。'
- audio_path = './demo.mp3'
- t2a = Text2Audio(config)
- # 对生成上锁,预防公有变量出现事务问题,但会降低程序并发性能。
- t2a.gen_audio(text, audio_path)
- '''
- 语音识别文字
- '''
- a2t = Audio2Text(config)
- # 对生成上锁,预防公有变量出现事务问题,但会降低程序并发性能。
- audio_text = a2t.gen_text(audio_path)
- logger.info(audio_text)
- '''
- 生成图片
- '''
- logger.info('----------生成图片----------')
- prompt = '一只鲸鱼在快乐游泳的卡通头像'
- t2i = Text2Img(config)
- t2i.gen_image(prompt, './demo.jpg')
- '''
- 图片解释
- '''
- logger.info('----------图片解释----------')
- prompt = '请理解一下图片'
- iu = ImageUnderstanding(config)
- logger.info(iu.understanding(prompt, './demo.jpg'))
- '''
- 获取文本向量
- '''
- logger.info('----------获取文本向量----------')
- em = EmbeddingModel(config)
- vector = em.get_embedding("我们是datawhale")
- logger.info(vector)
模型名称 | 调用方式 |
批式调用对话 | |
流式调用对话 | |
文字生成语音 | |
生成图片 | |
图片解释 | |
获取文本向量 | |
dwspark主要包含以下几个文件:
config.py:统一的配置文件
utils:一些工具类
models:存放模型的地方
models.ChatModel.py:对话相关模型
models.AudioModel.py:音频相关模型
models.ImageModel.py:图片相关模型
models.EmbeddingModel.py:向量化模型
基于Gradio开发应用,必须了解 Gradio有输入输出组件、控制组件、布局组件几个基础模块:
输入输出组件用于展示内容和获取内容,如:
Textbox
文本、Image
图像布局组件用于更好地规划组件的布局,如:
Column
(把组件放成一列)、Row
(把组件放成一行)
推荐使用
gradio.Blocks()
做更多丰富交互的界面,gradio.Interface()
只支持单个函数交互控制组件用于直接调用函数,无法作为输入输出使用,如:
Button
(按钮)、ClearButton
(清除按钮)Gradio的设计哲学是将输入和输出组件与布局组件分开。输入组件(如
Textbox
、Slider
等)用于接收用户输入,输出组件(如Label
、Image
等)用于显示函数的输出结果。而布局组件(如Tabs
、Columns
、Row
等)则用于组织和排列这些输入和输出组件,以创建结构化的用户界面。
大部分输入输出组件都有以下三个参数:
fn
:绑定的函数,输入参数需与inputs
列表类型对应
inputs
:输入组件变量名列表,(例如:[msg, chatbot]
)
ouputs
:输出组件变量名列表,(例如:[msg, chatbot]
)另外不同的 输入输出组件、控制组件 有不同动作可响应(对应一些.方法,如下面的
msg.submit()
)
需要注意,Gradio的组件更新,实现交互,都只能通过绑定的
fn
进行实现:
fn
中需要使用的用户指定的数据来源,均需要放入inputs
中,需要更新的组件均需要通过
fn
return 回来,并与outputs
中的组件类型意义对应对应到 飞桨项目:"一键"跑通大模型应用开发!中的
“体验随机回复应用”
的示例代码中即:
- # 导入gradio、random、time库,他们的功能大致如名字所示
- import gradio as gr # 通过as指定gradio库的别名为gr
- import random
- import time
-
- # 自定义函数,功能是随机选返回指定语句,并与用户输入的 chat_query 一起组织为聊天记录的格式返回
- def chat(chat_query, chat_history):
- # 在How are you 等语句里随机挑一个返回,放到 bot_message 变量里
- bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
- # 添加到 chat_history 变量里
- chat_history.append((chat_query, bot_message))
- # 返回 空字符,chat_history 变量,空字符用于清空 chat_query 组件,chat_history 用于更新 chatbot组件
- return "", chat_history
-
- # gr.Blocks():布局组件,创建并给了他一个名字叫 demo
- with gr.Blocks() as demo:
- # gr.Chatbot():输入输出组件,用于展示对话效果
- chatbot = gr.Chatbot([], elem_id="chat-box", label="聊天历史")
- # gr.Textbox():输入输出组件,用于展示文字
- chat_query = gr.Textbox(label="输入问题", placeholder="输入需要咨询的问题")
- # gr.Button:控制组件,用于点击,可绑定不同的函数触发处理
- llm_submit_tab = gr.Button("发送", visible=True)
-
- # gr.Examples(): 输入输出组件,用于展示组件的样例,点击即可将内容输入给 chat_query 组件
- gr.Examples(["请介绍一下Datawhale。", "如何在大模型应用比赛中突围并获奖?", "请介绍一下基于Gradio的应用开发"], chat_query)
-
- # 定义gr.Textbox()文字组件 chat_query 的 submit 动作(回车提交)效果,执行函数为 chat, 第一个[chat_query, chatbot]是输入,第二个 [chat_query, chatbot] 是输出
- chat_query.submit(fn=chat, inputs=[chat_query, chatbot], outputs=[chat_query, chatbot])
- # 定义gr.Button()控制组件 llm_submit_tab 的 点击动作 效果,执行函数为 chat, 第一个[chat_query, chatbot]是输入,第二个 [chat_query, chatbot] 是输出,效果与上一行代码同
- llm_submit_tab.click(fn=chat, inputs=[chat_query, chatbot], outputs=[chat_query, chatbot])
-
- # 运行demo
- if __name__ == '__main__':
- demo.queue().launch()
运行结果:
官方提供多款星火大模型API的token。其中包括:星火大模型、语音合成、语音识别、图片生成、图片理解、文本向量化以及智能PPT生成。这些模型API让我们能够把更多的注意力放在idea实现和应用开发当中。
下面将介绍大模型的API调用原理及学习使用的思路
API流程(图像生成为例)
根据模型需求,进入API接口文档。根据下列步骤查看API关键信息(其他API类似)
这一步主要目的是了解API的网络协议,特别是传输方式、请求地址、Content-Type和接口鉴权4部分。因为讯飞星火不同的模型有不同的调用方式,所以我们需要根据要求调整我们的网络调用协议。
讯飞API有一个特点,就是需要先使用我们的key进行加密鉴权,然后填充新的url进行实际调用。所以我们需要根据鉴权文档步骤,实时调整我们的url。具体方式如图中所示:
返回API文档,根据文档查看模型的可用调用参数。具体如下图所示,分别为参数实例与参数说明。为了让我们的应用更加的具有特色,通常更简易针对需求调整API的参数。相同的模型相同的API,在不同参数的调整下可能会有不同的效果。
返回结果参数便于我们针对式的开发我们的模型后处理的代码,而异常信息码则便于我们实现异常处理问题,提高应用高可用。
为了降低参赛选手的门槛,我们基于讯飞星火大模型常用的API封装了一个较为简单的SDK包。[点我查看]
- # 本地安装
- pip install dwspark-2024.0.2-py3-none-any.whl
- # 线上安装
- pip install dwspark
- from dwspark.config import Config
- '''
- 初始化配置文件(二选一)
- '''
- # 加载系统环境变量:SPARKAI_APP_ID、SPARKAI_API_KEY、SPARKAI_API_SECRET
- config = Config()
- # 自定义key写入
- #config = Config('14****93', 'eb28b****b82', 'MWM1MzBkOD****Mzk0')
-
- '''
- SDK使用示例
- '''
- # SDK引入模型
- from dwspark.models import ChatModel, Text2Img, ImageUnderstanding, Text2Audio, Audio2Text, EmebddingModel
- # 讯飞消息对象
- from sparkai.core.messages import ChatMessage
- # 日志
- from loguru import logger
- '''
- 对话
- '''
- # 模拟问题
- question = '你好呀'
- logger.info('----------批式调用对话----------')
- model = ChatModel(config, stream=False)
- logger.info(model.generate([ChatMessage(role="user", content=question)]))
- logger.info('----------流式调用对话----------')
- model = ChatModel(config, stream=True)
- [logger.info(r) for r in model.generate_stream(question)]
- '''
- 文字生成语音
- '''
- text = '2023年5月,讯飞星火大模型正式发布,迅速成为千万用户获取知识、学习知识的“超级助手”,成为解放生产力、释放想象力的“超级杠杆”。2024年4月,讯飞星火V3.5春季升级长文本、长图文、长语音三大能力。一年时间内,讯飞星火从1.0到3.5,每一次迭代都是里程碑式飞跃。'
- audio_path = './demo.mp3'
- t2a = Text2Audio(config)
- # 对生成上锁,预防公有变量出现事务问题,但会降低程序并发性能。
- t2a.gen_audio(text, audio_path)
- '''
- 语音识别文字
- '''
- a2t = Audio2Text(config)
- # 对生成上锁,预防公有变量出现事务问题,但会降低程序并发性能。
- audio_text = a2t.gen_text(audio_path)
- logger.info(audio_text)
- '''
- 生成图片
- '''
- logger.info('----------生成图片----------')
- prompt = '一只鲸鱼在快乐游泳的卡通头像'
- t2i = Text2Img(config)
- t2i.gen_image(prompt, './demo.jpg')
- '''
- 图片解释
- '''
- logger.info('----------图片解释----------')
- prompt = '请理解一下图片'
- iu = ImageUnderstanding(config)
- logger.info(iu.understanding(prompt, './demo.jpg'))
- '''
- 获取文本向量
- '''
- logger.info('----------获取文本向量----------')
- em = EmebddingModel(config)
- vector = em.get_embedding("我们是datawhale")
- logger.info(vector)
但SDK带来便捷性的同时,它也丧失了个性化的“本领”,同时也难以兼容到讯飞所有的模型产品。所以我们更推荐大家基于API文档开发适合自己的调用方式。
讯飞为每一个API都打包了一个调用demo,demo通常放在对应API文档的上方。我们可以下载查看demo里面的代码,然后基于demo再进行二次开发。
如有实在不会的,可以在学习群里请教助教。
项目链接:https://modelscope.cn/studios/Datawhale/Dw_spark_baseline
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。