大家好,我是静幽水,目前是一名大厂全栈工程师,练习时长两年,擅长Java后端,Vue前端,小程序编程,Python编程,ChatGPT 提示词等技术。现在正在系统地进行学习,扩展自己技术的广度和深度,我会分享一些相关的知识干货,感兴趣的话就关注我吧,希望对你有所帮助。
一、前言
现在非常火的ChatGPT,就是OpenAI公司提供的智能聊天机器人,但是如果你只会用它来聊天,那么你就OUT了,其实OpenAI为开发者提供了很多接口,这些接口可以实现非常强大的功能。
主要有Chat:用于聊天对话,Completions:用于内容补全,Image:根据用户提供的图片,生成一个新的图片,Embedding:获取输入文本的潜入向量,Audio:将音频输入转为文字,Moderations:用于内容审核。
本次主要通过情感分析,来介绍一下Embedding和Completions的功能以及使用方式。我将会使用Python脚本,直接在服务器上执行,更加直观地看到执行结果
二、环境搭建
由于访问OpenAI对于网络环境有着特殊要求,所以我会直接在服务器上编写并运行代码
1.安装Anaconda,Anaconda是一个用于科学计算和数据分析的Python环境,它的主要优势在于它解决了Python环境和依赖管理的痛点,使得开发者能够更加轻松地搭建和管理复杂的Python环境。
wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh
chmod x Anaconda3-5.3.0-Linux-x86_64.sh
./Anaconda3-5.3.0-Linux-x86_64.sh
然后一路回车输入yes即可。
2.添加环境变量,编辑.bashrc文件,添加下面这行代码,目录根据你的实际情况进行修改
export PATH=/home/ubuntu/anaconda3/bin:$PATH
保存后执行
source ~/.bashr
3.创建虚拟环境,指定python版本,ChatGPT为环境命名,可以随意更换,创建完成之后,激活该环境,然后进入python控制台。
conda create -n ChatGPT python==3.10
conda activate ChatGPT
当我执行import openai时报错,因为我们还没有安装该模块,执行下面语句进行安装,必须指定源,否者安装不成功。
pip install openai -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
三、编写代码
上面我们已经安装好了Python环境,并且安装了openai依赖,接下来,我们就可以在控制台写代码了,当然,你也可以在本地写好上传到服务器执行。
首先,我们需要导入openai,然后设置我们的api_key,这个需要我们去OpenAI官网查看,然后定义一个model,这里我使用的是用于补充对话的text-davinci-003模型,然后定义一个提示词prompt,这里就是一个简单的测试。定义一个函数,用来创建Completion,并调用OpenAI,返回响应结果,返回结果如上图所示。
import openai
import os
openai.api_key = 'sk-XXX'
model = 'text-davinci-003'
prompt='你是谁'
def get_response(prompt):
completions = openai.Completion.create(
engine = model,
prompt = prompt,
max_tokens = 1024,
n = 1,
stop = None,
temperature = 0.0,
)
result = completions.choices[0].text
return result
print(get_response(prompt))
上面代码中,创建Completion需要一些参数,这里简单介绍一些,首先是engine,指的是你使用的模型ID,可以通过https://api.openai.com/v1/models查看所有模型及描述信息。
prompt为提示词,主要是你对ChatGPT的提问和要求。
max_tokens为调用生成内容允许的最大token数量,通常75个单词就需要1000个token,这里的值会包含用户输入的和AI产生返回的,text-davinci-003模型最大支持4096个token,如果你的输入有1000个token,而你要求AI返回的最大token就不能超过3096,否则就会报错。
n指的是你希望chatGPT生成几条内容,通常为1。
stop指的是当遇到什么字符时,chatGPT就停止输出,比如换行符\n或者句号。
temperature指的是输出的内容的随机性,0-2之间,值越高,生成的内容越随机多样。
通过上面的例子,我们已经调试通了,接下来就是如何用它来做情感分析了,我们的测试目标是使用它来为电影《八角笼中》的评论,判断是好评还是坏评。
我们在Prompt中,对它提出这样的要求,“判断下面的句子是好评还是坏评,并以json的格式输出”,同时我们提供给它一些文本,格式为:Q是问题,A是回答,并且我们设置好回答,让它进行仿造。
import openai
import os
openai.api_key = 'sk-XXX'
model = 'text-davinci-003'
prompt='''
请判断下面句子哪些是好评哪些是坏评,并通过JSON的格式输出
Q:心里堵了好久……没有华丽的词句,没有专业的影评基础,只知道作为普通人的一员,自己内心发出了强烈的共鸣。
A:好评
Q:那个吃饭散伙的戏略生硬,为了散伙而散伙 发现一个小套路:这类商业片男主设定都是一堆小毛病,但心理必须根红苗正
A:
Q:感触不深,是那种看开头就能知道结局的电影。就一般普遍理性而言,精彩的应该在过程。
A:
Q:上映半月了终于有时间来看宝强的新片了,八角笼中着很励志,被凉山的格斗少年打动,本人泪点低,中途偷偷摸了几次泪水
A:
'''
def get_response(prompt):
completions = openai.Completion.create(
engine = model,
prompt = prompt,
max_tokens = 1024,
n = 1,
stop = None,
temperature = 0.0,
)
result = completions.choices[0].text
return result
print(get_response(prompt))
最后,它会返回下面这种格式,以json格式返回,并且结果是有范围的,要么是好评要么是坏评,这样的话我们就可以针对这个结果进行二次处理,可以用于生成统计图像等。
{'Q1': '好评', 'Q2': '坏评', 'Q3': '坏评', 'Q4': '好评'}
我们细心观察可以发现,针对上面的四条评论,它返回的结果是完全正确的。
我们换一种实现方式,通过获取评论的嵌入向量,通过计算给定评论的文本向量与好评和差评的文本向量之间的余弦相似度差值来计算相似度,然后拿评论与“好评”Embedding之间的相似度,减去与“差评”之间的相似度,当结果大于0时,说明更加接近好评,否则更加接近差评。
代码如下:
import openai
import os
from openai.embeddings_utils import cosine_similarity, get_embedding
openai.api_key = 'sk-XXX'
model = 'text-embedding-ada-002'
positive_review = get_embedding('好评')
negative_review = get_embedding('差评')
text1 = get_embedding('电影整体叙事过于平淡,就像是纪录片删去煽情片段。其次演员演技在线,值得大人观看,不适合小孩看,不是因为血腥而是这部戏本身就是拍给成年人看的。')
text2 = get_embedding('要为那些默默付出,为了改变他人命运而不懈努力的人鼓掌,那是真正勇敢的人。没有多少人理解,没有几个人帮助,道阻且长,前路漫漫,目标远在遥远的远方,有且只有自己负重前行。')
def get_score(text):
return cosine_similarity(text, positive_review) - cosine_similarity(text, negative_review)
text1_score = get_score(text1)
text2_score = get_score(text2)
print('text1 score: %f' % (text1_score))
print('text2 score: %f' % (text2_score))
get_embedding
是一个函数,它用于获取文本的嵌入向量(embedding)。嵌入向量是将文本表示为数值化的向量形式,具有一定的语义信息和表征能力。
在这段代码中,get_embedding
被用来获取给定文本的嵌入向量。通过将文本输入到模型中,它会返回一个表示该文本的向量。这个嵌入向量可以被用作后续的文本分析、相似度比较或其他自然语言处理任务中。
在本例中,通过使用get_embedding
函数,获取了'好评'、'差评'以及两段待评分文本的嵌入向量。这些嵌入向量将被用于计算文本之间的相似度,从而得出评分。
cosine_similarity
是一种用来计算两个向量之间的余弦相似度的函数。余弦相似度是衡量两个向量之间的相似性的一种常用指标。它通过计算两个向量的夹角的余弦值来衡量它们之间的相似程度。
在这段代码中,cosine_similarity
被用来计算待评论文本向量与好评和差评文本向量之间的相似度差值。通过比较待评论文本与好评文本和差评文本的相似度差异,可以获得一个评分,用于表示待评论文本的积极或消极程度。
四、总结
本文通过一个简单的例子,分别使用embeddings接口和completions接口,来实现了对电影《八角笼中》评论的分类。后续我们可以使用python爬虫,爬取到大量的评论,然后再通过调用OpenAI的接口,获取到每一条评论是好评还是差评,或者是每一条评论的得分,以JSON格式输出,我们再对这些数据进行进一步处理。
程序员修炼
后端 | 前端 | 面试 | ChatGPT
联系客服