Python 搭建属于自己的 AI
2024 07 07
2406 words · 13 minutes

Python 搭建属于自己的 AI


Table of Contents

前言 Link to 前言

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

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

准备工作 Link to 准备工作

环境搭建 Link to 环境搭建

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

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

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

PLAINTEXT
1
2
3
4
python-dotenv
openai
langchain
langchain_openai

获取 API KEY Link to 获取 API KEY

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

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

点击 新建

名字随便输

pkXuqun.png

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

pkXuLBq.png

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

在打码的地方填写 api key

pkXuOH0.png

OK,准备工作完成啦!

写代码 Link to 写代码

引用库 Link to 引用库

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

创建用户 Link to 创建用户

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

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

PYTHON
1
2
3
4
5
load_dotenv()

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

创建对话 Link to 创建对话

这是最重要的一步!

先看代码:

PYTHON
1
2
3
4
5
6
7
8
9
10
11
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 为美食写点评词,你当然也可以按照自己的需要修改。

输出内容 Link to 输出内容

激动人心的时刻!

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

这个程序输出的内容:

PYTHON
1
2
3
4
5
6
7
8
9
南京盐水鸭,是金陵古城的美食瑰宝,承载着六朝古都深厚的文化底蕴。这道佳肴以其独特的制作工艺和绝妙的风味,在众多美食中独树一帜。

选材讲究,选用的是肉质细嫩、肥而不腻的南京本地麻鸭。经过精细的宰杀、清洗、腌制等工序,使得鸭肉的每一寸肌理都渗透着独特的风味。腌制过程中,恰到好处的盐分与鸭肉的鲜美完美融合,使鸭肉更加鲜嫩可口。

烹饪技艺更是令人赞叹。将腌制好的鸭肉放入特制的卤水中,用文火慢炖,使鸭肉在不断吸收卤水精华的同时,保持了肉质的嫩滑。卤水中的香料与鸭肉的鲜美相互交融,形成了一种独特的香气,令人垂涎三尺。

成品的南京盐水鸭,色泽金黄,皮脆肉嫩,鲜美可口。轻轻一咬,鸭肉的鲜嫩与卤水的香味瞬间在口腔中爆发,让人回味无穷。鸭肉的鲜美与卤水的香料,形成了一种绝妙的平衡,既不会过于咸腻,也不会过于清淡,恰到好处地满足了味蕾的需求。

品尝南京盐水鸭,就像是在品味一段历史,感受一种文化,让人在享受美味的同时,也能感受到南京这座城市的韵味。

调试 Link to 调试

嘶~

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

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

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

看看结果:

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

果然好多了。

全部代码 Link to 全部代码

PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from dotenv import load_dotenv
from openai import OpenAI

load_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)

简短的总结 Link to 简短的总结

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

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

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

优化代码 Link to 优化代码

规范代码 Link to 规范代码

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

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

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

引用库 Link to 引用库

PYTHON
1
2
3
4
5
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

load_dotenv()

创建提示词 Link to 创建提示词

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

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

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

创建模型 Link to 创建模型

修改了原来的 创建对话。

PYTHON
1
2
3
4
5
6
model = ChatOpenAI(
    model="moonshot-v1-32k",
    openai_api_base="https://api.moonshot.cn/v1",
    max_tokens=500,
    temperature=0.7,
)

规范输出(非必须) Link to 规范输出(非必须)

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

PYTHON
1
2
3
4
5
6
7
8
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))

用户输入 Link to 用户输入

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

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

连接步骤 Link to 连接步骤

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

PYTHON
1
2
3
4
chain = prompt_template | model

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

循环输入 Link to 循环输入

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

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

这下再来看看结果吧! pkXujEV.png

真的是太 NICE 了!

全部代码 Link to 全部代码

PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

load_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)

Link to

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

Thanks for reading!

Python 搭建属于自己的 AI

2024 07 07
2406 words · 13 minutes