【Python】搭建属于自己 AI 机器人

目录

前言

1 准备工作

1.1 环境搭建

1.2 获取 API KEY

2 写代码

2.1 引用库

2.2 创建用户

2.3 创建对话

2.4 输出内容

2.5 调试

2.6 全部代码

2.7 简短的总结

3 优化代码

3.1 规范代码

3.1.1 引用库

3.1.2 创建提示词

3.1.3 创建模型

3.1.4 规范输出(非必须)

3.2 用户输入

3.3 连接步骤

3.4 循环输入

3.5 全部代码

4 总结


前言

现在,AI 已经进入了人们生活的每个角落,而 AI 大模型更是大火,诸如文心一言、Chatgpt、Kimi、清谱智言等等。

那为什么不能拥有一个自己的 AI 呢?于是我稍微研究了一下,本篇文章就将介绍如何搭建一个属于自己的 AI 机器人。话不多说,正片开始——

1 准备工作

1.1 环境搭建

自己训练一个 AI 机器人费时费力又费钱,所以搭建 AI 用的肯定是 API 接口

本文我用的是月之暗面的 Kimi AI 做演示(当然,清谱智言或其他也可以,但是注意,文心一言的API要钱!

至于写代码的依赖库,如下:

python-dotenv
openai
langchain
langchain_openai

1.2 获取 API KEY

获取 API key 其实很简单,这里用 Kimi 举例,其他平台也大同小异。

首先访问 Moonshot AI - 开放平台 (前提是你要先登录

点击 新建

 名字随便输

接着它会显示密钥,复制好别告诉别人

 

接着,在项目文件夹中新建一个.venv文件,如图,把 api key 复制进去:

在打码的地方填写 api key

OK,准备工作完成啦!

2 写代码

2.1 引用库

from dotenv import load_dotenv    # 虚拟环境
from openai import OpenAI         # 调用 API

2.2 创建用户

其中 load_dotenv() 就是获取 .venv 中的信息。

下面的函数中,base_url 就是你想调用的 AI 它的接口网址,一般都能在开发文档中找到。

load_dotenv()client = OpenAI(base_url="https://api.moonshot.cn/v1"
)

2.3 创建对话

这是最重要的一步!

先看代码:

ask = "南京盐水鸭怎么样?"completion = client.chat.completions.create(model="moonshot-v1-32k",messages=[{"role": "system", "content": "你是一个美食家,你要为用户说的美食写一段有文采的点评词。"},{"role": "user", "content": ask},],max_tokens=500,temperature=0.7,
)

接下来请看讲解:

  • model:这个就是大模型的名称,一般也能在开发文档中找到;
  • messages:AI 接收的信息一般分为 3 个来源:系统(system)、用户(user)、AI(assistant)。这些信息中包括系统对 AI 的指示,用于确定 AI 的身份、用处,以及用户所说的话,还有之前的所有对话。在代码中,用一个字典组成的列表来储存;
  • max_tokens:这个参数用于限定 AI 输出的内容最大值,一个 token 表示一个词语;
  • temperature:这个参数用于规定 AI 输出内容的确定性,设成 0.7 就行了;

像这个程序中,我设置的功能就是让 AI 为美食写点评词,你当然也可以按照自己的需要修改。

2.4 输出内容

激动人心的时刻! 

print(completion.choices[0].message.content)

这个程序输出的内容:

南京盐水鸭,是金陵古城的美食瑰宝,承载着六朝古都深厚的文化底蕴。这道佳肴以其独特的制作工艺和绝妙的风味,在众多美食中独树一帜。选材讲究,选用的是肉质细嫩、肥而不腻的南京本地麻鸭。经过精细的宰杀、清洗、腌制等工序,使得鸭肉的每一寸肌理都渗透着独特的风味。腌制过程中,恰到好处的盐分与鸭肉的鲜美完美融合,使鸭肉更加鲜嫩可口。烹饪技艺更是令人赞叹。将腌制好的鸭肉放入特制的卤水中,用文火慢炖,使鸭肉在不断吸收卤水精华的同时,保持了肉质的嫩滑。卤水中的香料与鸭肉的鲜美相互交融,形成了一种独特的香气,令人垂涎三尺。成品的南京盐水鸭,色泽金黄,皮脆肉嫩,鲜美可口。轻轻一咬,鸭肉的鲜嫩与卤水的香味瞬间在口腔中爆发,让人回味无穷。鸭肉的鲜美与卤水的香料,形成了一种绝妙的平衡,既不会过于咸腻,也不会过于清淡,恰到好处地满足了味蕾的需求。                                                                                                            品尝南京盐水鸭,就像是在品味一段历史,感受一种文化,让人在享受美味的同时,也能感受到南京这座城市的韵味。

2.5 调试

嘶~

AI 输出的内容好像有点太长了,于是我们需要为它所以点调试。(毕竟任何程序都要调试)

比如把它的要求改一下,限定一下字数。

messages=[{"role": "system", "content": "你是一个美食家,你要为用户说的美食写一段有文采的点评词,精简一点,100字以内。"},{"role": "user", "content": ask},
],

看看结果:

南京盐水鸭,传统佳肴。鸭肉鲜嫩爽口,咸香适中,令人回味无穷。腌制工艺独特,肉质细腻,皮薄肉厚,食之不腻。每一口都是对南京风味的深刻体验。

果然好多了。

2.6 全部代码

from dotenv import load_dotenv
from openai import OpenAIload_dotenv()client = OpenAI(base_url="https://api.moonshot.cn/v1"
)ask = "南京盐水鸭怎么样?"completion = client.chat.completions.create(model="moonshot-v1-32k",messages=[{"role": "system", "content": "你是一个美食家,你要为用户说的美食写一段有文采的点评词,精简一点,100字以内。"},{"role": "user", "content": ask},],max_tokens=500,temperature=0.7,
)print(completion.choices[0].message.content)

2.7 简短的总结

我们现在已经有了一个简单的 AI,但是还有一些问题:

  • 代码流程不够规范
  • 只能通过修改代码来实现问题的修改
  • 只能实现一轮对话

接下来就来解决这些问题吧!

3 优化代码

3.1 规范代码

这里,就要隆重请出:langchain 第三方库

它可以帮我们很好的流程化这段代码。

可以新建一个代码文件,因为代码要大改

3.1.1 引用库

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplateload_dotenv()

3.1.2 创建提示词

其实就是修改了之前的 创建用户 中的代码。

注意:这里用户的名字从user变为了human

prompt_template = ChatPromptTemplate.from_messages([("system", "你是一个美食家,你要为用户说的美食写一段有文采的点评词,精简一点,100字以内。"),("human", "南京盐水鸭怎么样?")]
)

3.1.3 创建模型

修改了原来的 创建对话。

model = ChatOpenAI(model="moonshot-v1-32k",openai_api_base="https://api.moonshot.cn/v1",max_tokens=500,temperature=0.7,
)

3.1.4 规范输出(非必须)

一般会用另一个大模型来规范前一个大模型的输出,但并非必要。

def output_parser(output: str):parser_model = ChatOpenAI(model = 'moonshot-v1-32k',temperature=0.8,openai_api_base = "https://api.moonshot.cn/v1")message = "你需要润色这段文字:`{text}`"return parser_model.invoke(message.format(text=output))

3.2 用户输入

先把问题中的输入部分修改即可:

prompt_template = ChatPromptTemplate.from_messages([("system", "你是一个美食家,你要为用户说的美食写一段有文采的点评词,精简一点,100字以内。"),("human", "{food}怎么样?")]
)

3.3 连接步骤

用 langchain 连接步骤非常简单,用 | 符号就行了:

chain = prompt_template | model# 若加入规范输出的部分,代码如下
# chain = prompt_template | model | output_parser

3.4 循环输入

利用 while True 进行用户循环输入,非常简单不是吗?

while True:food = input("你想点评什么:")answer = chain.invoke(input = {'food': food})print(answer.content)

这下再来看看结果吧!

真的是太 NICE 了!

3.5 全部代码

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplateload_dotenv()prompt_template = ChatPromptTemplate.from_messages([("system", "你是一个美食家,你要为用户说的美食写一段有文采的点评词,精简一点,100字以内。"),("human", "{food}怎么样?")]
)model = ChatOpenAI(model="moonshot-v1-32k",openai_api_base="https://api.moonshot.cn/v1",max_tokens=500,temperature=0.7,
)chain = prompt_template | model
while True:food = input("你想点评什么:")answer = chain.invoke(input = {'food': food})print(answer.content)

4 总结

我们成功通过调用 API 实现了一个本地的定制机器人,感觉如何?

文章如有疏漏,欢迎提出!如果对你有帮助的话,别忘 点赞收藏👍

下期再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1474328.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Git详细安装和使用教程

文章目录 准备工作-gitee注册认识及安装GitGit配置用户信息本地初始化Git仓库记录每次更新到仓库查看及切换历史版本Git忽略文件和查看文件状态Git分支-查看及切换Git分支-创建分支Git分支-合并及删除分支Git分支-命令补充Git分支-冲突需求: 准备工作-gitee注册 传送门: gite…

HDF4文件转TIF格式

HDF4 HDF4(Hierarchical Data Format version 4)是一种用于存储和管理机器间数据的库和多功能文件格式。它是一种自描述的文件格式,用于存档和管理数据。 HDF4与HDF5是两种截然不同的技术,HDF5解决了HDF4的一些重要缺陷。因此&am…

[终端安全]-3 移动终端之硬件安全(TEE)

(参考资料:TrustZone for V8-A. pdf,来源ARM DEVELOPER官网) TEE(Trusted Execution Environment,可信执行环境)是用于执行敏感代码和处理敏感数据的独立安全区域;以ARM TrustZone为…

cs231n作业1——Softmax

参考文章:cs231n assignment1——softmax Softmax softmax其实和SVM差别不大,两者损失函数不同,softmax就是把各个类的得分转化成了概率。 损失函数: def softmax_loss_naive(W, X, y, reg):loss 0.0dW np.zeros_like(W)num_…

信号与系统笔记分享

文章目录 一、导论信号分类周期问题能量信号和功率信号系统的线性判断时变,时不变系统因果系统判断记忆性系统判断稳定性系统判断 二、信号时域分析阶跃函数冲激函数取样性质四种特性1 筛选特性2 抽样特性3 展缩特性4 卷积特性卷积作用 冲激偶函数奇函数性质公式推导…

Ubuntu 20.04下多版本CUDA的安装与切换 超详细教程

目录 前言一、安装 CUDA1.找到所需版本对应命令2.下载 .run 文件3.安装 CUDA4.配置环境变量4.1 写入环境变量4.2 软连接 5.验证安装 二、安装 cudnn1.下载 cudnn2.解压文件3.替换文件4.验证安装 三、切换 CUDA 版本1.切换版本2.检查版本 前言 当我们复现代码时,总会…

彻底解决Path with “WEB-INF“ or “META-INF“: [WEB-INF/views/index.jsp]

背景描述 项目使用的是springboot2jsp的架构。以前好好的项目复制了一份,然后就无法访问报错。百度了好久都乱七八糟的,还没有解决问题。错误消息如下: 2024-07-05 15:45:51.335 INFO [http-nio-12581-exec-1]org.springframework.web.ser…

Linux服务器使用总结-不定时更新

# 查看升级日志 cat /var/log/dpkg.log |grep nvidia|grep libnvidia-common

阶段三:项目开发---搭建项目前后端系统基础架构:任务13:实现基本的登录功能

任务描述 任务名称: 实现基本的登录功能 知识点: 了解前端Vue项目的基本执行过程 重 点: 构建项目的基本登陆功能 内 容: 通过实现项目的基本登录功能,来了解前端Vue项目的基本执行过程,并完成基…

firewalld(8) policies

简介 前面的文章中我们介绍了firewalld的一些基本配置以及NAT的相关配置。在前面的配置中,我们所有的策略都是与zone相关的,例如配置的rich rule,--direct,以及NAT,并且这些配置都是数据包进入zone或者从zone发出时设置的策略。 我们在介绍…

昇思25天学习打卡营第15天 | Vision Transformer图像分类

内容介绍: 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩展性,它已经能够训练…

在VMware虚拟机的创建以及安装linux操作系统

一、创建虚拟机 1.双击打开下载好的VMware Workstation软件 2.点击“创建新的虚拟机” 3.根据个人选择需要创建的虚拟机,点击下一步 4.直接点击下一步 5.选择稍后安装操作系统,点击下一步 、 6.选择需要的操作系统,点击下一步 7.根据…

YOLOv8改进---BiFPN特征融合

一、BiFPN原理 1.1 基本原理 BiFPN(Bidirectional Feature Pyramid Network),双向特征金字塔网络是一种高效的多尺度特征融合网络,其基本原理概括分为以下几点: 双向特征融合:BiFPN允许特征在自顶向下和自…

【踩坑】修复pyinstaller报错 No module named pkg_resources.extern

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 报错如下: 修复方法: pip install --upgrade setuptools pippyinstaller -F -w main.py --hidden-importpkg_resources.py2_wa…

算法系列--分治排序|归并排序|逆序对的求解

一.基本概念与实现 归并排序(mergeSort)也是基于分治思想的一种排序方式,思路如下: 分解:根据中间下标mid将数组分解为两部分解决:不断执行上述分解过程,当分解到只有一个元素时,停止分解,此时就是有序的合并:合并两个有序的子区间,所有子区间合并的结果就是原问题的解 归并…

【TB作品】51单片机 Proteus仿真 00002仿真-智能台灯色调倒计时光强

实验报告:基于51单片机的智能台灯控制系统 背景 本实验旨在设计一个基于51单片机的智能台灯控制系统,该系统可以通过按键进行手动控制,并能根据环境光强度自动调节台灯亮度。此外,系统还具备倒计时关灯功能。 器件连接 51单片…

Xilinx FPGA:vivado关于真双端口的串口传输数据的实验

一、实验内容 用一个真双端RAM,端口A和端口B同时向RAM里写入数据0-99,A端口读出单数并存入单端口RAM1中,B端口读出双数并存入但端口RAM2中,当检测到按键1到来时将RAM1中的单数读出显示到PC端,当检测到按键2到来时&…

强化学习的数学原理:时序差分算法

概述 之前第五次课时学习的 蒙特卡洛 的方法是全课程当中第一次介绍的第一种 model-free 的方法,而本次课的 Temporal-Difference Learning 简称 TD learning (时序差分算法)就是第二种 model-free 的方法。而对于 蒙特卡洛方法其是一种 non…

QWidget窗口抗锯齿圆角的一个实现方案(支持子控件)2

QWidget窗口抗锯齿圆角的一个实现方案(支持子控件)2 本方案使用了QGraphicsEffect,由于QGraphicsEffect对一些控件会有渲染问题,比如列表、表格等,所以暂时仅作为研究,优先其他方案 在之前的文章中&#…

论文辅助笔记:ST-LLM

1 时间嵌入 2 PFA(Partial Frozen Architecture) 3 ST_LLM 3.1 初始化 3.2 forward