大家好,我是靜幽水,目前是一名大廠全棧工程師,練習(xí)時(shí)長兩年,擅長Java后端,Vue前端,小程序編程,Python編程,ChatGPT 提示詞等技術(shù)。現(xiàn)在正在系統(tǒng)地進(jìn)行學(xué)習(xí),擴(kuò)展自己技術(shù)的廣度和深度,我會(huì)分享一些相關(guān)的知識(shí)干貨,感興趣的話就關(guān)注我吧,希望對(duì)你有所幫助。
一、前言
現(xiàn)在非?;鸬腃hatGPT,就是OpenAI公司提供的智能聊天機(jī)器人,但是如果你只會(huì)用它來聊天,那么你就OUT了,其實(shí)OpenAI為開發(fā)者提供了很多接口,這些接口可以實(shí)現(xiàn)非常強(qiáng)大的功能。
主要有Chat:用于聊天對(duì)話,Completions:用于內(nèi)容補(bǔ)全,Image:根據(jù)用戶提供的圖片,生成一個(gè)新的圖片,Embedding:獲取輸入文本的潛入向量,Audio:將音頻輸入轉(zhuǎn)為文字,Moderations:用于內(nèi)容審核。
本次主要通過情感分析,來介紹一下Embedding和Completions的功能以及使用方式。我將會(huì)使用Python腳本,直接在服務(wù)器上執(zhí)行,更加直觀地看到執(zhí)行結(jié)果
二、環(huán)境搭建
由于訪問OpenAI對(duì)于網(wǎng)絡(luò)環(huán)境有著特殊要求,所以我會(huì)直接在服務(wù)器上編寫并運(yùn)行代碼
1.安裝Anaconda,Anaconda是一個(gè)用于科學(xué)計(jì)算和數(shù)據(jù)分析的Python環(huán)境,它的主要優(yōu)勢(shì)在于它解決了Python環(huán)境和依賴管理的痛點(diǎn),使得開發(fā)者能夠更加輕松地搭建和管理復(fù)雜的Python環(huán)境。
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.添加環(huán)境變量,編輯.bashrc文件,添加下面這行代碼,目錄根據(jù)你的實(shí)際情況進(jìn)行修改
export PATH=/home/ubuntu/anaconda3/bin:$PATH
保存后執(zhí)行
source ~/.bashr
3.創(chuàng)建虛擬環(huán)境,指定python版本,ChatGPT為環(huán)境命名,可以隨意更換,創(chuàng)建完成之后,激活該環(huán)境,然后進(jìn)入python控制臺(tái)。
conda create -n ChatGPT python==3.10
conda activate ChatGPT
當(dāng)我執(zhí)行import openai時(shí)報(bào)錯(cuò),因?yàn)槲覀冞€沒有安裝該模塊,執(zhí)行下面語句進(jìn)行安裝,必須指定源,否者安裝不成功。
pip install openai -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
三、編寫代碼
上面我們已經(jīng)安裝好了Python環(huán)境,并且安裝了openai依賴,接下來,我們就可以在控制臺(tái)寫代碼了,當(dāng)然,你也可以在本地寫好上傳到服務(wù)器執(zhí)行。
首先,我們需要導(dǎo)入openai,然后設(shè)置我們的api_key,這個(gè)需要我們?nèi)penAI官網(wǎng)查看,然后定義一個(gè)model,這里我使用的是用于補(bǔ)充對(duì)話的text-davinci-003模型,然后定義一個(gè)提示詞prompt,這里就是一個(gè)簡(jiǎn)單的測(cè)試。定義一個(gè)函數(shù),用來創(chuàng)建Completion,并調(diào)用OpenAI,返回響應(yīng)結(jié)果,返回結(jié)果如上圖所示。
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))
上面代碼中,創(chuàng)建Completion需要一些參數(shù),這里簡(jiǎn)單介紹一些,首先是engine,指的是你使用的模型ID,可以通過https://api.openai.com/v1/models查看所有模型及描述信息。
prompt為提示詞,主要是你對(duì)ChatGPT的提問和要求。
max_tokens為調(diào)用生成內(nèi)容允許的最大token數(shù)量,通常75個(gè)單詞就需要1000個(gè)token,這里的值會(huì)包含用戶輸入的和AI產(chǎn)生返回的,text-davinci-003模型最大支持4096個(gè)token,如果你的輸入有1000個(gè)token,而你要求AI返回的最大token就不能超過3096,否則就會(huì)報(bào)錯(cuò)。
n指的是你希望chatGPT生成幾條內(nèi)容,通常為1。
stop指的是當(dāng)遇到什么字符時(shí),chatGPT就停止輸出,比如換行符\n或者句號(hào)。
temperature指的是輸出的內(nèi)容的隨機(jī)性,0-2之間,值越高,生成的內(nèi)容越隨機(jī)多樣。
通過上面的例子,我們已經(jīng)調(diào)試通了,接下來就是如何用它來做情感分析了,我們的測(cè)試目標(biāo)是使用它來為電影《八角籠中》的評(píng)論,判斷是好評(píng)還是壞評(píng)。
我們?cè)赑rompt中,對(duì)它提出這樣的要求,“判斷下面的句子是好評(píng)還是壞評(píng),并以json的格式輸出”,同時(shí)我們提供給它一些文本,格式為:Q是問題,A是回答,并且我們?cè)O(shè)置好回答,讓它進(jìn)行仿造。
import openai
import os
openai.api_key = 'sk-XXX'
model = 'text-davinci-003'
prompt='''
請(qǐng)判斷下面句子哪些是好評(píng)哪些是壞評(píng),并通過JSON的格式輸出
Q:心里堵了好久……沒有華麗的詞句,沒有專業(yè)的影評(píng)基礎(chǔ),只知道作為普通人的一員,自己內(nèi)心發(fā)出了強(qiáng)烈的共鳴。
A:好評(píng)
Q:那個(gè)吃飯散伙的戲略生硬,為了散伙而散伙 發(fā)現(xiàn)一個(gè)小套路:這類商業(yè)片男主設(shè)定都是一堆小毛病,但心理必須根紅苗正
A:
Q:感觸不深,是那種看開頭就能知道結(jié)局的電影。就一般普遍理性而言,精彩的應(yīng)該在過程。
A:
Q:上映半月了終于有時(shí)間來看寶強(qiáng)的新片了,八角籠中著很勵(lì)志,被涼山的格斗少年打動(dòng),本人淚點(diǎn)低,中途偷偷摸了幾次淚水
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))
最后,它會(huì)返回下面這種格式,以json格式返回,并且結(jié)果是有范圍的,要么是好評(píng)要么是壞評(píng),這樣的話我們就可以針對(duì)這個(gè)結(jié)果進(jìn)行二次處理,可以用于生成統(tǒng)計(jì)圖像等。
{'Q1': '好評(píng)', 'Q2': '壞評(píng)', 'Q3': '壞評(píng)', 'Q4': '好評(píng)'}
我們細(xì)心觀察可以發(fā)現(xiàn),針對(duì)上面的四條評(píng)論,它返回的結(jié)果是完全正確的。
我們換一種實(shí)現(xiàn)方式,通過獲取評(píng)論的嵌入向量,通過計(jì)算給定評(píng)論的文本向量與好評(píng)和差評(píng)的文本向量之間的余弦相似度差值來計(jì)算相似度,然后拿評(píng)論與“好評(píng)”Embedding之間的相似度,減去與“差評(píng)”之間的相似度,當(dāng)結(jié)果大于0時(shí),說明更加接近好評(píng),否則更加接近差評(píng)。
代碼如下:
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('好評(píng)')
negative_review = get_embedding('差評(píng)')
text1 = get_embedding('電影整體敘事過于平淡,就像是紀(jì)錄片刪去煽情片段。其次演員演技在線,值得大人觀看,不適合小孩看,不是因?yàn)檠榷沁@部戲本身就是拍給成年人看的。')
text2 = get_embedding('要為那些默默付出,為了改變他人命運(yùn)而不懈努力的人鼓掌,那是真正勇敢的人。沒有多少人理解,沒有幾個(gè)人幫助,道阻且長,前路漫漫,目標(biāo)遠(yuǎn)在遙遠(yuǎn)的遠(yuǎn)方,有且只有自己負(fù)重前行。')
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
是一個(gè)函數(shù),它用于獲取文本的嵌入向量(embedding)。嵌入向量是將文本表示為數(shù)值化的向量形式,具有一定的語義信息和表征能力。
在這段代碼中,get_embedding
被用來獲取給定文本的嵌入向量。通過將文本輸入到模型中,它會(huì)返回一個(gè)表示該文本的向量。這個(gè)嵌入向量可以被用作后續(xù)的文本分析、相似度比較或其他自然語言處理任務(wù)中。
在本例中,通過使用get_embedding
函數(shù),獲取了'好評(píng)'、'差評(píng)'以及兩段待評(píng)分文本的嵌入向量。這些嵌入向量將被用于計(jì)算文本之間的相似度,從而得出評(píng)分。
cosine_similarity
是一種用來計(jì)算兩個(gè)向量之間的余弦相似度的函數(shù)。余弦相似度是衡量?jī)蓚€(gè)向量之間的相似性的一種常用指標(biāo)。它通過計(jì)算兩個(gè)向量的夾角的余弦值來衡量它們之間的相似程度。
在這段代碼中,cosine_similarity
被用來計(jì)算待評(píng)論文本向量與好評(píng)和差評(píng)文本向量之間的相似度差值。通過比較待評(píng)論文本與好評(píng)文本和差評(píng)文本的相似度差異,可以獲得一個(gè)評(píng)分,用于表示待評(píng)論文本的積極或消極程度。
四、總結(jié)
本文通過一個(gè)簡(jiǎn)單的例子,分別使用embeddings接口和completions接口,來實(shí)現(xiàn)了對(duì)電影《八角籠中》評(píng)論的分類。后續(xù)我們可以使用python爬蟲,爬取到大量的評(píng)論,然后再通過調(diào)用OpenAI的接口,獲取到每一條評(píng)論是好評(píng)還是差評(píng),或者是每一條評(píng)論的得分,以JSON格式輸出,我們?cè)賹?duì)這些數(shù)據(jù)進(jìn)行進(jìn)一步處理。
程序員修煉
后端 | 前端 | 面試 | ChatGPT
聯(lián)系客服