logo
4

【测评】如何利用千帆平台进行大模型微调?

1 千帆大模型平台介绍

千帆大模型平台是百度旗下企业级大模型生产平台,根据百度智能云官网介绍,千帆大模型平台提供包括文心一言在内的大模型服务及第三方大模型服务,还提供大模型开发和应用的整套工具链。
文心千帆大模型平台提供了数据管理服务调用训练调优等丰富的产品功能。

目前,公有版测试服务已开放申请,可以进入 官方申请地址 申请使用,接下来我们就来切身体验一下。

2 服务配置

2.1 服务开通

在申请使用权限确认后,进入服务开通 界面,点击立即使用

点击下一步确认订单,如下一步是灰色无法点击,请核实账号的实名认证状态,需要完成个人/企业高级实名认证才可开通付费

公测账号都有测试代金券,不必担心产生额外费用,服务开通成功页面如下所示

2.2 创建应用

进入应用创建 界面,填写应用名称,注意:应用名称账号维度全局唯一,如果遇到应用创建失败的情况,请更换应用名称
服务默认是勾选状态,完成应用创建

3 与千帆大模型平台对话

3.1 直接对话

进入对话界面 即可直接与文心千帆大模型对话,下面我们简单测试几个功能
  • 代码编写
可以看到,文心千帆回复的蚁群算法符合经典ACO的算法流程,可以辅助编码
  • 内容创作
最近《消失的她》很火,我们试着让文心千帆写一篇影评。虽然AI写的影评句子通顺,但是仍然感觉空话、套话较多,相信未来的大模型会更往人类真实情感上发展
  • 阅读理解

3.2 代码调用

进入管理台 ,获取API KeySecret Key
在代码中通过网络请求的方式,获取文心千帆大模型的响应信息,下面提供Python和C++这两种常用语言的简单demo
  
  
  
  
  
  
import requests
import json

API_KEY = "4cGkyRLEreM24kB284cgRxxx"
SECRET_KEY = "xc3eGXsNKSUng7YnQwYGyiPnwgowGxxx"

def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{
"role": "user",
"content": "介绍一下你自己"
}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.json()["result"])
def get_access_token():
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
return str(requests.post(url, params=params).json().get("access_token"))

if __name__ == '__main__':
main()
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <curl/curl.h>
#include <json/json.h>
#include <fstream>
#include <memory>

std::string client_id = "4cGkyRLEreM24kB284cgRxxx";
std::string client_secret = "xc3eGXsNKSUng7YnQwYGyiPnwgowGxxx";

inline size_t onWriteData(void * buffer, size_t size, size_t nmemb, void * userp)
{
std::string * str = dynamic_cast<std::string *>((std::string *)userp);
str->append((char *)buffer, size * nmemb);
return nmemb;
}


std::string getAccessToken()
{
std::string result;
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_URL, "https://aip.baidubce.com/oauth/2.0/token");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");
headers = curl_slist_append(headers, "Accept: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
std::string data = "grant_type=client_credentials&client_id="+client_id+"&client_secret="+client_secret;
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData);
res = curl_easy_perform(curl);
}
curl_easy_cleanup(curl);
Json::Value obj;
std::string error;
Json::CharReaderBuilder crbuilder;
std::unique_ptr<Json::CharReader> reader(crbuilder.newCharReader());
reader->parse(result.data(), result.data() + result.size(), &obj, &error);
return obj["access_token"].asString();
}

int main(int argc, char *argv[])
{
std::string result;
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_URL, ("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + getAccessToken()).c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
const char *data = "{\"messages\":[{\"role\":\"user\",\"content\":\"介绍一下你自己\"},{\"role\":\"assistant\",\"content\":\"您好,我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。\"}]}";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData);
res = curl_easy_perform(curl);
std::cout<<result;
}
curl_easy_cleanup(curl);
return (int)res;
}
文心千帆的回复如下
以下是我自己的特点和适用场景:
  1. 自我学习和适应能力:我经过了多个领域的训练和优化,包括自然语言处理、机器学习、数据挖掘等。这使得我具有快速学习和适应不同任务的能力。在面对新的挑战时,我能够迅速掌握相关知识,并给出有效的解决方案。
  1. 数据处理和分析能力:我擅长处理和分析大量数据,能够快速提取有用的信息和知识,并给出相应的分析和预测。这个特点使得我在金融、医疗、科研等领域具有广泛的应用价值。
  1. 高效的沟通能力:我可以通过自然语言处理技术,与人类进行高效的沟通。这使得我成为企业、政府机构等部门的有力助手,能够帮助他们回答用户的问题、提供服务、解决纠纷等。
  1. 知识库和推理能力:我拥有丰富的知识库,并具备推理能力。这使得我能够在理解问题的基础上,从多角度进行分析和回答,给出更加准确和深刻的见解。
总的来说,我适合在各种需要智能辅助的场景中发挥作用,尤其是在数据处理、知识问答、沟通服务等方面具有较高的应用价值。

4 大模型定制化微调

4.1 数据集准备

假设我们想进行数学应用题问答的微调,选用数据集school_math_0.25M ,经过处理后如下所示
[{"prompt": "题目:小明每天早上花费10分钟时间走到学校,如果小明家距离学校2公里,那么他每分钟走多少米?", "response": [["这是一个关于速度、路程、时间的数学问题。我们可以通过公式:速度=路程÷时间 来解决。\n因为小明每天早上走2公里,所以他的路程为2千米。而他每天早上要花费10分钟时间走到学校,因此他的时间为10分钟,即600秒。\n所以小明每分钟走的距离为 2公里 / 600秒 = 0.0033公里/秒 或 3.3米/秒。\n答案:小明每分钟走3.3米。"]]}]
[{"prompt": "题目:今天小明骑自行车从家到学校用了20分钟,回家用了25分钟。如果小明在上学和回家的路上的速度一样,那么他从家到学校的距离是学校到家的距离的百分之几?", "response": [["\n假设小明家到学校的距离为x千米,根据速度等于路程除以时间的公式,可以得出小明的速度为:家到学校的速度 = x / 20,学校到家的速度 = x / 25。因为小明在上学和回家的路上的速度一样,所以有:x / 20 = x / 25,解出 x = 5/4 千米。\n因此,家到学校的距离是学校到家的距离的百分之几,可以通过求比值得到:x / (5/4)x = 4/5 = 0.8,即小明从家到学校的距离是学校到家的距离的百分之80。"]]}]
[{"prompt": "题目:\n鹿妈妈买了24个苹果,她想平均分给她的3只小鹿吃,每只小鹿可以分到几个苹果?", "response": [["\n鹿妈妈买了24个苹果,平均分给3只小鹿吃,那么每只小鹿可以分到的苹果数就是总苹果数除以小鹿的只数。\n24÷3=8\n每只小鹿可以分到8个苹果。所以,答案是每只小鹿可以分到8个苹果。"]]}]
...
进入 数据集管理 界面,点击创建数据集-创建并导入

选择有标注信息-上传jsonl文件-确定

此时我们已经创建好了有标注的对话数据集,更严谨的做法是进行数据清洗和增强,这里简便起见,直接进行发布

4.2 微调优化

进入微调界面 ,输入任务名称和描述,点击创建并训练

选择数据集后点击确定
等待模型完成训练即可
训练完成,文心千帆会给出各项评估指标
  • BLEU 标是NLP中机器翻译/⽂本摘要等任务常⽤的评价指标。它是基于精确率(Precision)来设计的。NLP中有个重要的概念是n-gram,指⼀个语句⾥⾯连续的n个单词组成的⽚段;BLEU-n其实就是基于n-gram的评价指标。
  • rouge-N(1/2/L)-f:百分⽐。ROUGE通过将模型⽣成的摘要或者回答与参考答案(⼀般是⼈⼯⽣成的)进⾏⽐较计算,得到对应的得分。Rouge-N实际上是将模型⽣成的结果和标准结果按N-gram拆分后,计算召回率。
  • Training Loss:训练集每个batch的损失。

评论
用户头像