利用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
相关文章:

利用C++与Python调用千帆免费大模型,构建个性化AI对话系统
千帆大模型已于2024年4月25日正式免费,调用这个免费的模型以实现自己的AI对话功能,遵循以下步骤: 了解千帆大模型: 千帆大模型是百度智能云推出的一个平台,提供了一系列AI能力和工具,用于快速开发和应用A…...

VTK9.2.0+QT5.14.0绘制三维显示背景
背景 上一篇绘制点云的博文中,使用的vtkCameraOrientationWidget来绘制的坐标轴,最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴,但是会随着鼠标操作旋转和平移时…...

Vue.js2+Cesium1.103.0 十六、多模型轨迹运动
Vue.js2Cesium1.103.0 十六、多模型轨迹运动 Demo <template><div id"cesium-container" style"width: 100%; height: 100%;"><ul class"ul"><li v-for"(item, index) of deviceInfo" :key"index" cl…...

Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计
主要内容 程序采用三种方法对14节点和30节点电力系统状态进行评估: ①PMU同步相量测量单元结合加权最小二乘法(WLS)分析电力系统的电压幅值和相角状态; ②并采用牛顿-拉夫逊方法进行系统潮流计算,结果作为理论分…...

【C++】---二叉搜索树
【C】---二叉搜索树 一、二叉搜索树概念二、二叉搜索树操作(非递归)1.二叉搜索树的查找 (非递归)(1)查找(2)中序遍历 2.二叉搜索树的插入(非递归)3.二叉搜索树…...
FastAPI - 依赖注入3
在FastAPI中,依赖注入是一种强大的功能,它允许你轻松地将依赖项注入到你的路由处理程序函数中,以处理不同的任务,例如数据库访问、认证和配置管理。 FastAPI支持依赖注入通过以下方式: 使用参数注解: 你可…...

【网络运维的重要性】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在图像识别中,学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系,但这种形式效率极低。因此&…...

自用网站合集
总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m,别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…...
【Golang】gin框架如何在中间件中捕获响应并修改后返回
【Golang】gin框架如何在中间件中捕获响应并修改后返回 本文讲述如何捕获中间件响应以及重写响应如果想在中间件中记录响应日志等操作,我们该如何获取响应数据呢?假如需要统一对响应数据做加密,如何修改这个返回数据再响应给客户端呢…...

电脑同时配置两个版本mysql数据库常见问题
1.配置时,要把bin中的mysql.exe和mysqld.exe 改个名字,不然两个版本会重复,当然,在初始化数据库的时候,如果时57版本的,就用mysql57(已经改名的)和mysqld57 代替 mysql 和 mysqld 例如 mysql -u root -p …...

Java | Leetcode Java题解之第112题路径总和
题目: 题解: class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…...

HaloDB 的 Oracle 兼容模式
↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ 前倾回顾 前面介绍了“光环”数据库的基本情况和安装办法。 哈喽,国产数据库!Halo DB! 三步走,Halo DB 安装指引 ★ HaloDB是基于原生PG打造的新一代高性能安…...

【Python】解决Python报错:TypeError: ‘xxx‘ object does not support item assignment
🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...

Spring-注解
Spring 注解分类 Spring 注解驱动模型 Spring 元注解 Documented Retention() Target() // 可以继承相关的属性 Inherited Repeatable()Spirng 模式注解 ComponentScan 原理 ClassPathScanningCandidateComponentProvider#findCandidateComponents public Set<BeanDefin…...

旧手机翻身成为办公利器——PalmDock的介绍也使用
旧手机有吧!!! 破电脑有吧!!! 那恭喜你,这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…...

期货交易的雷区
一、做自己看不懂的行情做交易计划一样要做有把握的,倘若你在盘中找机会交易,做自己看不懂的行情,即便你做进去了,建仓时也不会那么肯定,自然而然持仓也不自信,有点盈利就想平仓,亏损又想扛单。…...

东方通TongWeb结合Spring-Boot使用
一、概述 信创需要; 原状:原来的服务使用springboot框架,自带的web容器是tomcat,打成jar包启动; 需求:使用东方通tongweb来替换tomcat容器; 二、替换步骤 2.1 准备 获取到TongWeb7.0.E.6_P7嵌入版 这个文件,文件内容有相关对应的依赖包,可以根据需要来安装到本地…...

6.S081的Lab学习——Lab5: xv6 lazy page allocation
文章目录 前言一、Eliminate allocation from sbrk() (easy)解析: 二、Lazy allocation (moderate)解析: 三、Lazytests and Usertests (moderate)解析: 总结 前言 一个本硕双非的小菜鸡,备战24年秋招。打算尝试6.S081࿰…...

在WHM中如何调整max_post_size参数大小
今日我们在搭建新网站时需要调整一下PHP参数max_post_size 的大小,我们公司使用的Hostease的美国独立服务器产品默认5个IP地址,也购买了cPanel面板,因此联系Hostease的技术支持,寻求帮助了解到如何在WHM中调整PHP参数,…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...