我和文心千帆大模型的一次对话:如何进行大模型微调?

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. 自我学习和适应能力:我经过了多个领域的训练和优化,包括自然语言处理、机器学习、数据挖掘等。这使得我具有快速学习和适应不同任务的能力。在面对新的挑战时,我能够迅速掌握相关知识,并给出有效的解决方案。
  2. 数据处理和分析能力:我擅长处理和分析大量数据,能够快速提取有用的信息和知识,并给出相应的分析和预测。这个特点使得我在金融、医疗、科研等领域具有广泛的应用价值。
  3. 高效的沟通能力:我可以通过自然语言处理技术,与人类进行高效的沟通。这使得我成为企业、政府机构等部门的有力助手,能够帮助他们回答用户的问题、提供服务、解决纠纷等。
  4. 知识库和推理能力:我拥有丰富的知识库,并具备推理能力。这使得我能够在理解问题的基础上,从多角度进行分析和回答,给出更加准确和深刻的见解。

总的来说,我适合在各种需要智能辅助的场景中发挥作用,尤其是在数据处理、知识问答、沟通服务等方面具有较高的应用价值。

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的损失。

在这里插入图片描述

5 总结

首先,文心千帆的语言模型具有基本的语言处理能力,能够理解并回应用户的各种问题和指令,无论是简单的日常对话还是复杂的知识查询,都能给出流畅的回答;其次,文心千帆在提供信息方面表现非常优秀,在内容生成、辅助编码等方面可以节省用户的时间和精力,而且回答通常比较自然,不会像一些其他语言模型那样过于生硬或机械。这增加了用户体验的舒适度。

然而,文心千帆的语言模型有时会给出一些并不完全准确的答案。虽然大多数时候它的回答都是可靠的,但偶尔的错误可能会对用户造成误导;而且对于某些领域或特定主题的了解似乎还不够深入,在一些较为专业或复杂的领域,它可能会给出较为泛泛的答案,而无法提供更加细致和精准的信息,这点对于专业用户来说可能会有所不便。

除此之外,平台还提供了数据清洗、数据增强、大模型微调等丰富的功能,总体而言,这是一款功能强大、交互自然的大语言模型平台,能够满足普通用户的多数需求。相信随着技术的不断发展,文心千帆可以不断完善和提升自身的能力,为用户带来更加出色的体验。

猜你喜欢

转载自blog.csdn.net/FRIGIDWINTER/article/details/131779824