一、 前言
国产大模型有很多,比如文心一言、通义千问、星火、MOSS 和 ChatGLM 等等,但现在明确可以部署在本地并且开放 api 的只有 MOOS 和 ChatGLM。MOOS 由于需要的 GPU 显存过大(不量化的情况下需要80GB,多轮对话还是会爆显存),但 ChatGLM 可以在笔记本电脑部署(int4版本只需要6GB显存即可)。所以本文采用ChatGLM 与 ChatGPT 做对比,看看国产模型的优点和缺点。
会在选取本教程的各个方面进行对比,最后会总结 ChatGPT 与 ChatGLM 各自的优缺点。
二、ChatGLM 环境配置
ChatGLM 官网(现可申请内测)
ChatGLM 的环境配置可以参考 DataWhale 的这篇文章:ChatGLM-6B 本地部署指南!
部署好了之后,运行项目中的api.py
文件即可。下面是使用 ChatGLM 的 api 封装的类似 ChatGPT 一样的get_completion
函数,只需要传进去 ChatGPT 参数即可。
import requests
import json
如果你没有 openai 的 key 的话,部署好 chatglm-6B 之后,使用此函数也可以学完整个课程,加油~
def get_completion(prompt):
headers = {'Content-Type': 'application/json'}
data = {"prompt": prompt, "history": []}
response = requests.post(url='http://127.0.0.1:8000', headers=headers, data=json.dumps(data))
return response.json()['response']
get_completion("你好")
输出结果
你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
三、ChatGPT 环境配置
本教程使用 OpenAI 所开放的 ChatGPT API,因此你需要首先拥有一个 ChatGPT 的 API_KEY(也可以直接访问官方网址在线测试),然后需要安装 openai 的第三方库。
首先需要安装所需第三方库:
openai
pip install openai
dotenv
pip install -U python-dotenv
导入系统环境变量
# 将自己的 API-KEY 导入系统环境变量
!export OPENAI_API_KEY='api-key'
import openai
import os
from dotenv import load_dotenv, find_dotenv
# 导入第三方库
_ = load_dotenv(find_dotenv())
# 读取系统中的环境变量
openai.api_key = os.getenv('OPENAI_API_KEY')
# 设置 API_KEY
封装一个函数
def get_completion_gpt(prompt, model="gpt-3.5-turbo", temperature=0):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # 值越低则输出文本随机性越低
)
return response.choices[0].message["content"]
get_completion_gpt('你好')
输出结果
你好!有什么我可以帮助你的吗?
四、文本理解
1. 有步骤的文本
# 有步骤的文本
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果你愿意,可以加一些糖或牛奶调味。\
就这样,你可以享受一杯美味的茶了。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - …
…
第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_1}\"\"\"
"""
response = get_completion_glm(prompt)
print(response)
chatglm 的输出结果
response = get_completion_gpt(prompt)
print(response)
chatgpt 的输出结果
注:这里可以看出,提供的文本是有步骤的文本。chatglm 给出了步骤,但在最后说了未提供步骤
。但 chatgpt 给出步骤,而且步骤要比 chatglm 的完整,而且回答正确。
2. 无步骤的文本
# 无步骤的文本
text_2 = f"""
今天阳光明媚,鸟儿在歌唱。\
这是一个去公园散步的美好日子。\
鲜花盛开,树枝在微风中轻轻摇曳。\
人们外出享受着这美好的天气,有些人在野餐,有些人在玩游戏或者在草地上放松。\
这是一个完美的日子,可以在户外度过并欣赏大自然的美景。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - …
…
第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_2}\"\"\"
"""
response = get_completion_glm(prompt)
print(response)
chatglm 的输出结果
response = get_completion_gpt(prompt)
print(response)
chatgpt 的输出结果
注: 提供的是一个无步骤文本,但 chatglm 回答了一个步骤,在最后说了无步骤,这跟上面的有步骤文本回答几乎一样。chatgpt 则是直接给出未提供步骤
的回答。
3. 提供少量示例的文本
prompt = f"""
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
"""
response = get_completion_glm(prompt)
print(response)
chatglm 的输出结果
response = get_completion_gpt(prompt)
print(response)
chatgpt 的输出结果