利用C++与Python调用千帆免费大模型,构建个性化AI对话系统

玄武 剑 2024-06-17 13:01:02 阅读 70

千帆大模型已于2024年4月25日正式免费,调用这个免费的模型以实现自己的AI对话功能,遵循以下步骤:

了解千帆大模型:

千帆大模型是百度智能云推出的一个平台,提供了一系列AI能力和工具,用于快速开发和应用AI技术。该平台提供了从数据管理、数据标注、模型开发、模型纳管到部署上线的全生命周期AI能力研发与应用管理服务。

注册与登录:

如果已经是开发者,可以直接登录百度智能云千帆大模型平台。如果没有账号,需要先进行注册,并按照提示完成账号的创建和登录。

数据准备:

在开始之前,需要准备用于训练和测试的数据。这些数据应该包含对话的输入和期望的输出。千帆大模型平台支持多种数据格式和导入方式,可以根据实际情况选择合适的方式进行数据导入。

数据标注:

对于导入的数据,需要进行标注,以便模型能够理解和学习对话的模式和规则。在千帆大模型平台上,可以使用平台提供的工具进行数据的标注工作。

模型训练:

在完成数据标注后,可以使用千帆大模型平台提供的工具进行模型的训练。训练过程中,可以根据需要调整模型的参数和配置,以获得更好的对话效果。

模型评估与优化:

训练完成后,可以对模型进行评估,查看其在测试数据上的表现。如果模型的表现不佳,可以根据评估结果进行模型的优化和调整。

部署与测试:

当模型训练和优化完成后,可以将其部署到千帆大模型平台上,并进行实际的测试。通过与模型进行对话,验证模型的性能和效果,并根据需要进行进一步的调整和优化。

集成与应用:

如果模型的表现符合预期,可以将其集成到自己的应用中,实现自己的AI对话功能。在集成过程中,需要注意与千帆大模型平台的接口和协议进行匹配和对接。需要注意的是,虽然千帆大模型已经免费,但在使用过程中可能会产生一些额外的费用,如数据存储、计算资源等。因此,在使用之前需要了解平台的收费标准和计费方式,以便做好预算和规划。

python实现与千帆大模型交互

import sys

sys.path.append(r'C:\Users\XXX\AppData\Local\Programs\Python\Python312-32\Lib\site-packages')

import requests

import json

def getcookies():  

  url = " https://aip.baidubce.com/oauth/2.0/token"  

  params = {  

      'grant_type': 'client_credentials',  

      'client_id':'4O0GgKpCfUT5mxZ4s3f',  # 替换为你的客户端ID  

      'client_secret': 'RKETeu3iLn4YbCclMUei21ZVVnD6Y' # 替换为你的客户端密钥  

    }  

  headers = {  

      'Content-Type': 'application/x-www-form-urlencoded',  

      'Accept': 'application/json'  

    }  

     

  response = requests.post(url, params=params, headers=headers)  

  if response.status_code == 200:  

      data = response.json()  

      if'access_token' in data:  

          print(data['access_token'])

          return data['access_token']  

      else:  

          print("服务器响应中未找到 access_token")  

          return None  

  else:  

      print(f"请求失败,状态码:{response.status_code}")  

      returnNone

   

def getvalue(content, token):  

  token = getcookies()        

#如果成功获取的token格式如下,一个月获取一次

 # token = "24.0a2e1101e19ebe5e500a0962b30468fb.2592000.1700073516.282335-70004478"

  url = " https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-speed-128k?access_token=" + token

  #content为填充的润色语句,要求可以自行改进

  payload = json.dumps({

      "messages": [

            {    

              "content": "原文内容:{ {" + content + "}}\

要求:\

1. 使用更专业与精准的词汇,提取关键内容,重构文本表达更加简洁、准确和有层次。\

2. 调整结构顺序,使文字更具吸引力、可读性和说服力,内容简短精炼,字数不超过原始内容的70%。\

3. 重构后的文本相较于原文有较大的提升和改良,无需展示修改过程。\

4. 直接按新序号展示最终修订后的内容,无需添加任何说明。",

"role": "user"

            }

        ]

    })

  headers = {

      'Content-Type': 'application/json'

    }

   

  response = requests.request("POST", url, headers=headers, data=payload)

   

  #print(response.text)

  return response.text

C++调用pyhton文件中的函数

头文件定义

#ifndef PYTHONCALLER_H

#define PYTHONCALLER_H

#include <Python.h>

#include <string>

class PythonCaller {

private:

  PyObject* pModule;

  PyObject* pGetvalueFunc;

  PyObject* pGetcookiesFunc;

public:

  PythonCaller();

  ~PythonCaller();

  bool Initialize(std::string path, std::string name);

  void Finalize();

  std::string CallGetValue(const std::string& url, const std::string& cookies);

  std::string CallGetCookies();

};

#endif  // PYTHONCALLER_H

#else

#endif

源文件定义

#include "PythonCaller.h"

PythonCaller::PythonCaller() : pModule(nullptr) {}

PythonCaller::~PythonCaller() {

  Finalize();

}

bool PythonCaller::Initialize(std::string path, std::string name) {

  Py_Initialize();

  PyRun_SimpleString("import sys");

  PyRun_SimpleString(("sys.path.append('" + path + "')").c_str());

  PyObject* pName = PyUnicode_DecodeFSDefault(name.c_str());

  pModule = PyImport_Import(pName);

  Py_DECREF(pName);

  if (pModule == nullptr) {

      return0;

    }

  pGetvalueFunc = PyObject_GetAttrString(pModule,"getvalue");

  if (!pGetvalueFunc || !PyCallable_Check(pGetvalueFunc)) {

      Py_XDECREF(pGetvalueFunc);

      return0;

    }

  pGetcookiesFunc = PyObject_GetAttrString(pModule,"getcookies");

  if (!pGetcookiesFunc || !PyCallable_Check(pGetcookiesFunc)) {

      Py_XDECREF(pGetcookiesFunc);

      return0;

    }

  return 1;

}

void PythonCaller::Finalize() {

  if (pModule != nullptr) {

      Py_DECREF(pModule);

      pModule = nullptr;  //将 pModule 置为 nullptr

    }

  if (pGetvalueFunc != nullptr) {

      Py_DECREF(pGetvalueFunc);

      pGetvalueFunc = nullptr;  //将 pModule 置为 nullptr

    }

  if (pGetcookiesFunc != nullptr) {

      Py_DECREF(pGetcookiesFunc);

      pGetcookiesFunc = nullptr;  //将 pModule 置为 nullptr

    }

  Py_Finalize();

}

std::string PythonCaller::CallGetValue(const std::string& url, const std::string& cookies) {

  if (!pGetvalueFunc || !PyCallable_Check(pGetvalueFunc)) {

      Py_XDECREF(pGetvalueFunc);

      return"";

    }

   

  PyObject* pArgs = PyTuple_New(2);

  PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(url.c_str()));

  PyTuple_SetItem(pArgs, 1, PyUnicode_FromString(cookies.c_str()));// 设置第二个参数为字符串

  PyObject* pValue = PyObject_CallObject(pGetvalueFunc, pArgs);

  Py_DECREF(pArgs);

  if (pValue == nullptr) {

      PyErr_Print();

      return"Error: Call to 'getvalue' failed";

    }

  std::string result;

  if (pValue == Py_None) {

      result = "Result of call: None";

    }

  else {

      PyObject* pStr = PyObject_Str(pValue);

      if (pStr != nullptr) {

          const char* utf8_str = PyUnicode_AsUTF8(pStr);

          result = std::string(utf8_str);

          Py_DECREF(pStr);

        }

      else {

          result = "Error: Unable to convert result to string";

        }

    }

  Py_DECREF(pValue);

  return result;

}

std::string PythonCaller::CallGetCookies() {

  if (!pGetcookiesFunc || !PyCallable_Check(pGetcookiesFunc)) {

      Py_XDECREF(pGetcookiesFunc);

      return"";

    }

  PyObject* pArgs = PyTuple_New(0);

  PyObject* pValue = PyObject_CallObject(pGetcookiesFunc, pArgs);

  Py_DECREF(pArgs);

  if (pValue == nullptr) {

      PyErr_Print();

      return"Error: Call to 'getvalue' failed";

    }

  std::string result;

  if (pValue == Py_None) {

      result = "Result of call: None";

    }

  else {

      PyObject* pStr = PyObject_Str(pValue);

      if (pStr != nullptr) {

          const char* utf8_str = PyUnicode_AsUTF8(pStr);

          result = std::string(utf8_str);

          Py_DECREF(pStr);

        }

      else {

          result = "Error: Unable to convert result to string";

        }

    }

  Py_DECREF(pValue);

  return result;

}

C++与python函数的交互过程

  if (mgIspythonCaller == 0) {

      mgIspythonCaller = mgpythonCaller.Initialize(mgSelfPath, "ai");

    }

   

  if (!mgIspythonCaller) {

      return1;

    }

  string str = mgpythonCaller.CallGetValue(content, "");

visualstudio中python环境设置

根据程序环境,选择对应版本的python安装

图片

图片

图片

下载源码地址:https://www.lanzoub.com/iAFK0203yd4h



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。