【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.mzph.cn/diannao/42321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线调试网络接口的免费网站

免费接口网站 GET接口 https://httpbin.org/get https://httpbin.org/ip https://publicobject.com/helloworld.txt POST接口 https://httpbin.org/post 调试网站 Postman需要下载安装,还要登录账号。对于简单测试,麻烦! http://coolaf.…

西门子1200高速计数器编码器的应用 接线 组态 编程 调试 测距测速

编码器的应用、接线、组态、博途1200编程与调试:高速计数器,用于给PLC发高速脉冲,接I点 用来例如:检测电机转速,皮带输送机运行的距离 (粗略定位) 360:代表转一圈会对外发360个脉冲&…

系统化学习 H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的…

Python类实例的json

web开发中有这么一个场景,我们从数据库中查询某一数据的时候,往往需要对数据进行一些转化之后才能传给前端。 当然我们可以根据查询出来的实例对象,构建一个dict返回,这样会导致我们的代码非常的臃肿。但是这也确实是一种最直接的…

网络空间测绘是什么?

网络空间测绘是一种技术过程,用于探测、分析和可视化互联网及其他网络环境中的各种资源和连接。这个概念在2016年开始广泛使用,它涉及到收集有关网络节点(如服务器、路由器、个人电脑和其他设备)的信息,并建立这些节点…

C++ STL 多线程库用法介绍

目录 一:Atomic: 二:Thread 1. 创建线程 2. 小心移动(std::move)线程 3. 如何创建带参数的线程 4. 线程参数是引用类型时,要小心谨慎。 5. 获取线程ID 6. jthread 7. 如何在线程中使用中断 stop_token 三:如何解决数据竞争 1.有问题的代码 2.使用互斥 3.预防…

Vue3+.NET6前后端分离式管理后台实战(二十八)

1,Vue3.NET6前后端分离式管理后台实战(二十八)

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致(Inconsistent)状态 2.2.日志式文件系统(Journaling filesystem) 3.Linux文件系统的运行 4、文件的删…

动态规划算法-以中学排班管理系统为例

1.动态规划算法介绍 1.算法思路 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若…

干货 | 2024大模型场景下智算平台的设计与优化实践(免费下载)

诚挚邀请您微信扫描以下二维码加入方案驿站知识星球,获取上万份PPT/WORD解决方案!!!感谢支持!!!

android pdf框架-11,查看图片

前10篇文章,9章关于pdf的,pdf解析后,里面也是有各种图片,于是利用pdf的view来展示图片,似乎也是个不错的想法. android手机中的图片查看功能,有的可以展示,有的不能.比如华为,荣耀对大体积的png是可以显示的,小米是不显示,只有缩略图. 一张png50m大,比如清明上河图,原图是tif…

【C++】string的底层原理及实现

文章目录 string类的存储结构默认成员函数构造函数析构函数拷贝构造函数赋值重载 容量操作size()capacity()reserve()resize()clear() 遍历与访问operator[ ]迭代器范围与for 增删查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成员函数op…

c#的List<T>的SelectMany 和Select

在C#中&#xff0c;List<T>&#xff08;以及任何实现了IEnumerable<T>的集合&#xff09;的Select和SelectMany扩展方法都是LINQ&#xff08;Language Integrated Query&#xff09;的一部分&#xff0c;用于对集合中的元素进行查询和转换。 尽管它们的作用有些相…

Virtualbox和ubuntu之间的关系

1、什么是ubuntu Ubuntu 是一个类似于 Windows 的操作系统&#xff0c;但它是基于 Linux 内核开发的开源操作系统 2、什么是Virtualbox VirtualBox 是一款虚拟机软件&#xff0c;使我们可以物理机上创建和运行虚拟机 也就是说,VirtualBox 提供了一个可以安装和运行其他操作系…

力扣考研经典题 反转链表

核心思想 头插法&#xff1a; 不断的将cur指针所指向的节点放到头节点之前&#xff0c;然后头节点指向cur节点&#xff0c;因为最后返回的是head.next 。 解题思路 1.如果头节点是空的&#xff0c;或者是只有一个节点&#xff0c;只需要返回head节点即可。 if (head null …

算法训练营day70

题目1&#xff1a;108. 冗余连接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…

Echarts中的热力图和漏斗图(在Vue中使用热力图和漏斗图)

热力图 (Heatmap) Echarts的热力图用于展示两个维度数据矩阵中的值分布情况。它通过在平面上划分成多个矩形区域&#xff0c;并用不同的颜色填充这些区域来表示数据的大小或强度。颜色渐变从浅到深通常映射着数值从小到大&#xff0c;从而直观展示数据的集中程度和分布模式。热…

Mojolicious测试驱动开发:单元与集成测试的艺术

标题&#xff1a;Mojolicious测试驱动开发&#xff1a;单元与集成测试的艺术 Mojolicious是一个现代化的Perl Web开发框架&#xff0c;它不仅提供了强大的Web应用开发能力&#xff0c;还内置了丰富的测试工具来支持单元测试和集成测试。本文将深入探讨如何在Mojolicious中进行…

人工智能期末复习简答题

简答: 子句集的化简(1).消去连接词”—>”和”<—>” (2)减少否定符号的辖域 (3)对变元标准化 (4)化为前束范式 (5)消去存在量词 (6)化为Skolem标准形 (7)消去全称量词 (8)消去合取词 (9)更换变元名称 2.在状态空间搜索中,Open表与Close…

半同步主从复制

半同步主从复制的概念 半同步主从复制&#xff08;Semisynchronous Replication, SBR&#xff09;是MySQL数据库中的一种数据复制方式&#xff0c;它在异步复制的基础上增加了一定程度的同步性&#xff0c;旨在提高数据安全性&#xff0c;减少数据丢失的风险。 半同步主从复制…