当前位置: 首页 > news >正文

利用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日正式免费&#xff0c;调用这个免费的模型以实现自己的AI对话功能&#xff0c;遵循以下步骤&#xff1a; 了解千帆大模型&#xff1a; 千帆大模型是百度智能云推出的一个平台&#xff0c;提供了一系列AI能力和工具&#xff0c;用于快速开发和应用A…...

VTK9.2.0+QT5.14.0绘制三维显示背景

背景 上一篇绘制点云的博文中&#xff0c;使用的vtkCameraOrientationWidget来绘制的坐标轴&#xff0c;最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴&#xff0c;但是会随着鼠标操作旋转和平移时…...

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节点电力系统状态进行评估&#xff1a; ①PMU同步相量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; ②并采用牛顿-拉夫逊方法进行系统潮流计算&#xff0c;结果作为理论分…...

【C++】---二叉搜索树

【C】---二叉搜索树 一、二叉搜索树概念二、二叉搜索树操作&#xff08;非递归&#xff09;1.二叉搜索树的查找 &#xff08;非递归&#xff09;&#xff08;1&#xff09;查找&#xff08;2&#xff09;中序遍历 2.二叉搜索树的插入&#xff08;非递归&#xff09;3.二叉搜索树…...

FastAPI - 依赖注入3

在FastAPI中&#xff0c;依赖注入是一种强大的功能&#xff0c;它允许你轻松地将依赖项注入到你的路由处理程序函数中&#xff0c;以处理不同的任务&#xff0c;例如数据库访问、认证和配置管理。 FastAPI支持依赖注入通过以下方式&#xff1a; 使用参数注解&#xff1a; 你可…...

【网络运维的重要性】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在图像识别中&#xff0c;学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系&#xff0c;但这种形式效率极低。因此&…...

自用网站合集

总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m&#xff0c;别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…...

【Golang】gin框架如何在中间件中捕获响应并修改后返回

【Golang】gin框架如何在中间件中捕获响应并修改后返回 本文讲述如何捕获中间件响应以及重写响应如果想在中间件中记录响应日志等操作&#xff0c;我们该如何获取响应数据呢&#xff1f;假如需要统一对响应数据做加密&#xff0c;如何修改这个返回数据再响应给客户端呢&#xf…...

电脑同时配置两个版本mysql数据库常见问题

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

Java | Leetcode Java题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; 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 兼容模式

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

【Python】解决Python报错:TypeError: ‘xxx‘ object does not support item assignment

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…...

Spring-注解

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

旧手机翻身成为办公利器——PalmDock的介绍也使用

旧手机有吧&#xff01;&#xff01;&#xff01; 破电脑有吧&#xff01;&#xff01;&#xff01; 那恭喜你&#xff0c;这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…...

期货交易的雷区

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

东方通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)解析&#xff1a; 二、Lazy allocation (moderate)解析&#xff1a; 三、Lazytests and Usertests (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0…...

在WHM中如何调整max_post_size参数大小

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

智能监控技术助力山林生态养鸡:打造智慧安全的养殖新模式

随着现代科技的不断发展&#xff0c;智能化、自动化的养殖方式逐渐受到广大养殖户的青睐。特别是在山林生态养鸡领域&#xff0c;智能化监控方案的引入不仅提高了养殖效率&#xff0c;更有助于保障鸡只的健康与安全。视频监控系统EasyCVR视频汇聚/安防监控视频管理平台在山林生…...

那些不起眼但很好玩的API合辑

那些不起眼但很好玩的API&#xff0c;为我们带来了许多出人意料的乐趣和惊喜。这些API可能看起来并不起眼&#xff0c;但它们却蕴含着无限的创意和趣味性。它们可以是一些小游戏API&#xff0c;让我们可以在闲暇时刻尽情娱乐&#xff1b;也可以是一些奇特的音乐API&#xff0c;…...

java —— 克隆对象、枚举

一、克隆对象 &#xff08;一&#xff09;在基本数据类型中&#xff0c;直接将对象 A 的值赋给对象 B&#xff0c;当更改对象 B 的时候&#xff0c;对象 A 的值保持不变。例如&#xff1a; public static void main(String[] args) {int a5;int ba; //将…...

STM32-GPIO八种输入输出模式

图片取自 江协科技 STM32入门教程-2023版 细致讲解 中文字幕 p5 【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?p5&share_sourcecopy_web&vd_source327265f5c70f26411a53a9226af0b35c 目录 ​编辑 一.STM32的四种输…...

windows镜像虚拟机创建共享文件夹详细步骤 -- 和本地电脑传输文件

第一步&#xff1a;关闭客户机 第二步&#xff1a;右击“虚拟机名称”或菜单栏的“虚拟机”–>“设置” 网络适配器选择NAT或者其他的都可以 来到“选项”&#xff0c;启用共享文件夹&#xff0c;具体如下图&#xff1a;点击添加&#xff0c;添加主机文件夹。然后确定 第三步…...

通关!游戏设计之道Day18

过场动画&#xff0c;或者说根本没人看的东西 过场动画是一系列的动画或实时的动作序列&#xff0c;用来推进剧情制造大场面&#xff0c;烘托气氛&#xff0c;展示对话和角色成长&#xff0c;以及显现在某些情况下被玩家忽略的相关线索。 过场动画是一把双刃剑&#xff0c;一方…...

写Python时不用import,你会遭遇什么

from *** import *** 想必你已经再熟悉不过这样的python语法。 当你的 python 代码需要获取外部的一些功能&#xff08;一些已经造好的轮子&#xff09;&#xff0c;你就需要使用到 import 这个声明关键字。import可以协助导入其他 module 。&#xff08;类似 C 预约的 inclu…...

java网络:过滤器修改请求头

目录 一、gateway的全局过滤器 二、web的OncePerRequestFilter以及常见过滤器Filter 三、过滤器排序 一、gateway的全局过滤器 Component Slf4j public class GatewayAuthFilter implements GlobalFilter, Ordered {Overridepublic Mono<Void> filter(ServerWebExchan…...

yolov10 快速使用及训练

参考: https://docs.ultralytics.com/models/yolov10/ ultralytics其实大多数系列都能加载使用: 官方: https://github.com/THU-MIG/yolov10.git 代码参考: https://colab.research.google.com/github/roboflow-ai/notebooks/blob/main/notebooks/train-yolov10-object-…...

CSS变量 -- var() 使用教程

目录 1 CSS变量的基本使用1.1 变量定义1.1 变量使用1.3 全局/局部变量 2 CSS变量的参数3 CSS变量的拼接和计算3.1 拼接3.2 计算 4 JS 修改 CSS变量 CSS 自定义属性&#xff08;有时候也被称作CSS 变量或者级联变量&#xff09;&#xff0c;它的值可以在整个文档中重复使用。 复…...