利用C++與Python調用千帆免費大模型,構建個性化AI對話系統

千帆大模型已于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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19257.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【以太網端口浪涌靜電防護設計電路】

以太網端口浪涌靜電防護設計電路 注&#xff1a;資料來自 深圳市浪拓電子技術有限公司 方案圖 方案圖 方案圖 方案圖 方案圖 方案圖 方案圖 方案圖 方案圖 方案圖

python如何安裝tar.gz

首先我們到官網下載tar.gz。 然后解壓我們下載的pip-9.0.1文件&#xff0c;我的解壓后放在d&#xff1a;/p下 運行cmd&#xff0c;輸入cd d:\p&#xff0c;按回車鍵&#xff0c;隨后再次輸入d: 在d:\p>的光標處輸入pip-9.0.1\setup.py install&#xff0c;然后按回車鍵。 最…

水電收費遠程抄表

1.前言&#xff1a;從傳統到現代的改變 水電收費遠程抄表&#xff0c;是科學技術在公共服務領域的一次重要運用&#xff0c;它改變了過去人力上門服務抄表的傳統模式&#xff0c;提高了高效率&#xff0c;降低了偏差&#xff0c;為群眾與企業帶來了極大的便利。這種系統運用智…

【保姆級介紹下Foxmail 郵箱】

&#x1f308;個人主頁: 程序員不想敲代碼啊 &#x1f3c6;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f44d;點贊?評論?收藏 &#x1f91d;希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff0c;讓我們共…

LVM、磁盤配額

LVM與磁盤配額 一、LVM LVM(邏輯卷管理)&#xff1a;是Linux系統下對硬盤分區的管理機制。 LVM機制適合于管理管理大存儲設備。可以動態對硬盤進行擴容。 邏輯上的磁盤&#xff0c;概念上的磁盤&#xff0c;文件系統創建之后不考慮底層的物理磁盤。 若干個磁盤分區或者物理…

LORA微調,讓大模型更平易近人

技術背景 最近和大模型一起爆火的&#xff0c;還有大模型的微調方法。 這類方法只用很少的數據&#xff0c;就能讓大模型在原本表現沒那么好的下游任務中“脫穎而出”&#xff0c;成為這個任務的專家。 而其中最火的大模型微調方法&#xff0c;又要屬LoRA。 增加數據量和模…

【數據結構與算法 | 鏈表篇】力扣876

1. 力扣876 : 鏈表的中間節點 (1). 題 給你單鏈表的頭結點 head &#xff0c;請你找出并返回鏈表的中間結點。 如果有兩個中間結點&#xff0c;則返回第二個中間結點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[3,4,5] 解釋&#xff1a;鏈表…

技術架構設計指南:從需求到實現

技術架構是軟件系統的骨架&#xff0c;它決定了系統的性能、可靠性、擴展性等關鍵特性。本文將介紹技術架構設計的一般步驟和方法。 第一步&#xff1a;需求分析 在設計技術架構之前&#xff0c;首先要對系統需求進行全面深入的分析。這包括功能需求、非功能需求&#xff08;如…

java使用jdbcTemplatep批量插入數據

JdbcTemplate 是 Spring 框架中提供的一個簡化 JDBC 操作的工具類&#xff0c;它封裝了 JDBC 的核心功能&#xff0c;使得開發者能夠更方便、簡潔地進行數據庫操作。 下面是一個使用 JdbcTemplate 進行批量插入的示例&#xff1a; import org.springframework.jdbc.core.Batch…

理解OAuth:服務間的授權機制

理解OAuth:服務間的授權機制 好的,讓我來教你一下關于這個奇怪的東西。 在不同的項目中,認證有很多不同的方式。但在我們深入探討它的使用方式之前,讓我們先來看看它最初的用途。 首先,我們可以從名稱中得到一些線索。“auth”這個詞與什么有關呢?問題是,這里的“aut…

開抖店必須要辦理營業執照嗎?不用營業執照開店的個人店能用嗎?

大家好&#xff0c;我是電商花花。 可能大家都發現了&#xff0c;抖音小店個人店不用營業執照&#xff0c;只憑借身份證就能開店。 但是這個個人店花花并不建議大家去開&#xff0c;雖然說用用身份證也能開店&#xff0c;有效的幫我們減少了開店的成本&#xff0c;但是個人店…

QT基礎初學

目錄 1.什么是QT 2.環境搭建 QT SDK的下載 QT的使用 QT構建項目 快捷指令 QT的簡單編寫 對象樹 編碼問題 組件 初識信號槽 窗口的釋放 窗口坐標體系 1.什么是QT QT 是一個跨平臺的 C 圖形用戶界面庫&#xff0c;支持多個系統&#xff0c;用于開發具有圖形界面的應…

比較kube-proxy模式:iptables還是IPVS?

kube-proxy是任何 Kubernetes 部署中的關鍵組件。它的作用是將流向服務&#xff08;通過集群 IP 和節點端口&#xff09;的流量負載均衡到正確的后端pod。kube-proxy可以運行在三種模式之一&#xff0c;每種模式都使用不同的數據平面技術來實現&#xff1a;userspace、iptables…

QT::QNetworkReply類readAll()讀取不到數據的可能原因

程序中&#xff0c;當發送請求時&#xff0c;并沒有加鎖&#xff0c;而是在響應函數中加了鎖&#xff0c;導致可能某個請求的finished信號影響到其他請求響應數據的讀取 connect(reply,&QNetworkReply::finished,this,&Display::replyFinished);參考這篇文章&#xff…

[LLM]從GPT-4o原理到下一代人機交互技術

一 定義 背景&#xff1a;在推出GPT-4o之前&#xff0c;使用語音模式與ChatGPT交流的延遲較長&#xff0c;無法直接觀察語調、多個說話者或背景噪音&#xff0c;且無法輸出笑聲、歌唱或表達情感。 GPT-4o作為OpenAI推出的一款多模態大型語言模型&#xff0c;代表了這一交互技…

聽說京東618裁員?所以日常準備很重要呀

文末有最少必要的面試題&#xff0c;還準備了離線 PDF 版本。 京東也要向市場輸送人才了? 這幾天看到技術群里不少朋友在討論京東裁員相關的信息。 我去看了下京東近期的操作&#xff0c;京東內部考勤調整和午休時間縮短&#xff0c;以及強化打卡機制等管理調整&#xff1b;有…

R可視化:生存分析森林圖

生存分析森林圖 生存分析森林圖 介紹 ggplot2繪制生存分析森林圖加載R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE)library(tidyverse) library(survival) library(survminer) library(tableone) library(forestplot)# rm(list = ls()) options(stringsAsFa…

AMEYA360代理 | 村田電子去寄生電感降噪元件(LCT)特點和規格

株式會社村田制作所(以下簡稱“村田”)開發了行業首款(1)利用負互感(2)、能對從數MHz到1GHz的諧波(3)范圍內電源噪聲進行抑制的去寄生電感降噪元件“LXLC21系列”(以下簡稱“本產品”)。只需將1件本產品連接至電源電路中的電容器&#xff0c;即可消除與本產品連接的電容器的ESL…

鏈表5(考試用)7-5 sdut-C語言實驗-鏈表的逆置

7-5 sdut-C語言實驗-鏈表的逆置 分數 20 全屏瀏覽 作者 馬新娟 單位 山東理工大學 輸入多個整數&#xff0c;以-1作為結束標志&#xff0c;順序建立一個帶頭結點的單鏈表&#xff0c;之后對該單鏈表的數據進行逆置&#xff0c;并輸出逆置后的單鏈表數據。 輸入格式: 輸入…

OpenMv圖片預處理

本博客講述的是獲取一張圖片首先對圖像進行處理,比如畸形矯正,圖像濾波等操作。 1.histeq()自適應直方圖均衡 # 自適應直方圖均衡例子 # # 此示例展示了如何使用自適應直方圖均衡來改善圖像中的對比度。 #自適應直方圖均衡將圖像分割成區域,然后均衡這些區域中的直方圖,…