OpenAI × Python 實作翻譯工具:用正確的提示引導OpenAI模型

Sean Yeh
Python Everywhere -from Beginner to Advanced
11 min readDec 25, 2023

--

Yokohama, Japan, photo by Sean Yeh

在這個以資訊為王的年代,我們經常聽到「AI」這個詞,彷彿它是個擁有萬能鑰匙的神奇盒子。特別是OpenAI的AI模型,它不僅僅是一個技術的展現,更是我們與機器溝通的新方式。就像是在暗室中尋找開關,我們不需要特別的專業知識或設定,只需給予它一個提示,它便能照亮我們的思路。

這種能力,源自於OpenAI的AI模型擅長解析文字,並從中抓取意圖的特性。當我們對它提問時,它會依照輸入的文字,給予適當的回應。然而,這也意味著依據我們提供的提示不同,AI模型給出的答案也會有所變化。這就像是對一面鏡子,你對它笑,它也會回以微笑;你若皺眉,它也會皺眉。

因此,學會如何提示已成當今非常重要的一種技能。或許有些人可能會說,這未免太誇張了吧,「提示」不過是「問問題」而已。但事實上,提示詞就像是我們與AI模型間對話的語言,它不僅僅是問題的文字那麼簡單。它是一個連接我們的想法和AI模型的橋樑。如何建立這座橋樑,將深刻影響AI模型給出的結果。在使用AI模型時,「如何準備提示」成為了一個關鍵的問題。我們必須學習如何下達適切的指令,以獲得最佳的結果。

在上一篇文章中,我們探討了如何使用Prompt提示指令的一些基本原則,以避免「垃圾進,垃圾出」的情況。而今天,我們將要實際使用這些提示指令,實作一個翻譯應用程式,透過這個應用程式的實作一步一步揭開AI的神秘面紗。

指出明確目標

當我們理解AI如何運作時,便會開始了解到「正確使用提示」的重要性與不可或缺。這就像是在一場舞會中,播放舞曲的曲風,將決定共舞者的舞蹈方式和步伐。AI的核心機制,是根據輸入的提示推測接下來的文字,這意味著每一個字,每一個標點,都可能成為舞曲的旋律。

當然,若問題簡單到像是「你叫什麼名字」,這種直接而明確的問題時,AI的回應通常也會簡單明瞭。但是,當問題需要更具體的回應時,這時候提示的設計的好壞就變得至關重要。比如說,當您要求AI以特定的語言或風格回答時,這不僅是一個要求,更是一種引導。

例如,當我們提出「請以中文回答」,AI需以中文的形式進行回覆。可能會出現的答案是以簡體中文進行回答,當然其中使用的會是中國的用語。但是若進一步以「請以台灣繁體中文回答」作為指令提示,就比較可能出現使用繁體中文台灣的用語,但有時候也會出現將中國的用語直接以繁體中文顯示的狀況。這時,我們可以再進一步的以指令「請以台灣繁體中文並且使用台灣用語回答」進行提示,回覆的結果就會有更高的比例是使用台灣用語的繁體中文。

這種調整方式就是一種「提示設計」,就像是在對AI進行細微調整,確保它能在我們期望的框架內思考和回答。這並不需要複雜的命令或技術,只需要在我們的提示中加入一些清晰的條件或限制。透過這種方式,我們就能更有效地利用AI,讓它成為一個更貼合我們需求的工具。

設計您的指令提示

設計指令提示的基本步驟包括明確指定對文本的特定要求或限制。在構建提示時,「指示」是一個關鍵元素。通常情況下,這些指示會被置於提示的前端。讓我們看看一個典型的例子:

請對以下段落進行OO(具體行為)處理:
要處理的內容...

在這個結構中,第一行明確「指示」了對AI的具體要求,而「要處理的內容」則是需要AI處理的目標內容。這裡的「OO」代表具體特定的處理行動,如「翻譯」、「摘要」或「改寫」等。這種組合方式,將指示與主要內容清晰分開,是實現有效提示設計的基礎。

因此,就像這樣將指令提示製作成「指示」和「目標內容」的組合,可以說是提示設計的第一步。

指示: 請對以下段落進行OO(具體行為)處理:
目標內容: 要處理的內容...

此外,設計提示不僅限於提出問題,還涉及到為了獲得精確回答而必須提供的額外資訊。這些補充資訊有時甚至比原始問題(指示中的主要內容)更為關鍵。透過考慮這些要素,我們可以更精準地引導AI,以獲得我們所期望的回答。

翻譯的指令

當我們談到有關指令的應用,其中一個最直覺且明顯的例子是翻譯。透過設定特定的翻譯指令,AI模型能夠準確地將指定的文字翻譯成目標語言。例如,當我們使用如下指令:

請將以下的句子翻譯為法文:
法國最美麗的都市是哪一個?

這個例子中,我們有兩行文字。

  • 第一行「請將以下的句子翻譯為法文:」的指令是用來告訴AI模型要做的工作。
  • 第二行「法國最美麗的都市是哪一個?」則是要AI模型翻譯的主要內容。

重要的是,AI模型將會專注於將這個問句(第二行)翻譯成法文,而不會嘗試對這個問題提供回答或解釋。

以下是透過ChatGPT4測試的結果。對於「法國最美麗的都市是哪一個?」這個問題,我們不會看到任何關於法國城市美醜的回答。AI的任務是將這句話(第二行)翻譯成法文,而非回答該(第二行的)問題。同時,「請將以下的句子翻譯為法文:」這句指示並不包含在翻譯的範圍內,因為它僅僅是個指令,並不是翻譯的目標。

這個例子清楚地展示了AI模型如何專注於執行明確的指令,並且只對指定的主要內容進行處理,而不會超出這個範圍。這種方式使得我們能夠精準地使用AI進行特定的任務,如翻譯,而不需擔心模型會超出我們的預期或指示。

中翻英簡單應用程式實作

在這個以數位為主、快速變化的時代,我們經常需要跨越語言障礙連接世界,而技術則是我們最好的助手。

今天,我們將透過使用「指示內容」風格的指令,並且使用Python這個強大而簡潔的語言,來建立一個簡單的中文翻譯為英文的應用程式。

我們從先前提到過「精簡啟動應用程式」的一篇文章中開始,其中有一個access_openai函式。誇張的說,這個函式就像是個魔法盒一般,可以連接到OpenAI的數位海洋,並顯示其結果。

就是這段程式碼,它簡單而充滿無限可能:

def access_openai(prompt_value):
openai.api_key = api_key
response = openai.Completion.create(
model="text-davinci-003",
prompt=prompt_value,
max_tokens=100,
n=2,
stop=None,
temperature=0.5
)
return response.choices[0].text.strip()

實際上,這個函式原本是被設計來執行其他更廣泛的任務,但我們會稍作修改,讓它「專注於翻譯工作」。

現在,我們就要把這個函式轉變成一個翻譯的法杖。透過添加一行簡單的文字「請將以下的內容翻譯為英文:」,與一番簡化和調整,我們賦予了這段代碼一個新的生命,將它變成一個如下的程式碼,它專注於翻譯的工具。

def access_openai(prompt_value):
openai.api_key = api_key
response = openai.Completion.create(
model="text-davinci-003",
prompt=f"請將以下的內容翻譯為英文:\n\n {prompt_value}",
max_tokens=200,
)
result = response.choices[0].text.strip()
print(result)
return result

這個小改變,使得任何輸入的中文文字都會被視為需要翻譯的主要內容,並由AI以我們所期望的方式進行處理,將中文字轉化成英文。舉例來說當我們輸入如下的句子:

大雨特報:
東北風影響,臺北市山區已有豪雨發生;今(21)日基隆北海岸、
宜蘭地區及臺北市山區有局部大雨發生的機率,請注意。

AI就會將它們轉化成英文,就像下面這樣的結果。

又如,當我們輸入一個詢問關於台北的問題時:

我想去台北玩,有什麼景點可以介紹?

這個程式不會去尋找問題的答案,而是專注於將該問題翻譯成英文。這說明了AI僅僅專注於執行我們所賦予的翻譯任務,精確地完成我們的目標。

總結來說,當我們測試這個應用程式時,無論是將一段天氣報告翻譯成英文,還是尋求關於旅遊的建議,我們都會發現AI僅僅專注於執行我們所賦予的任務。透過這個簡單的實作,我們不僅學會了如何使用AI進行特定任務,也學會了如何與這個AI時代的新伙伴合作。

結論

在旅程結束之際,回顧這段路程,本文讓我們解了到指令提示結構的兩要素,它不僅包含了「指示」,還有「目標內容」。並且發現「指令提示」並不僅僅是提出問題那麼簡單。它是一種溝通的藝術,是一種讓我們與機器對話的方式。

透過中翻英的實作,見證了一個簡單卻富有啟發性的事實:只有「目標內容」會被翻譯成指定的語言。這就像是告訴我們,AI的聚焦是如此精確,它只會按照我們的指示行動。即使在要翻譯的內容中包含了問題,AI也不會嘗試去回答它,因為它的任務僅限於翻譯。

這讓我們明白,若要避免「垃圾進,垃圾出」的情況,就需要在「設計提示」上下功夫。因此,我們必須學習如何下達適切的指令,以獲得最佳的結果。

這不僅是一個技術問題,更是一種思維方式的轉變。當我們學會與AI對話,我們就能更好地利用這項驚人的技術,開啟一扇通往未知世界的大門。

程式碼

以下是這次的app.py的程式碼,供大家參考。

# PART 1: Import the necessary modules
from flask import Flask, render_template, request
import openai

# PART 2: Set your OpenAI API key
api_key = "<YOUR API KEY HERE>"

# PART 3: Create a Flask web application
app = Flask(__name__)

# PART A: Define the home route
@app.route('/')
def index():
# Render the index.html template with no question and result values
return render_template('index.html', question=None, result=None)


# PART B: Define the submit route
@app.route('/', methods=['POST'])
def submit():
# Retrieve the prompt from the form submission
prompt = request.form['prompt']
# Call the access_openai function passing in the prompt value
result = access_openai(prompt)
# Render the index.html template with the prompt and result values
return render_template('index.html', question=prompt, result=result)


# Part C: Define the access_openai function

def access_openai(prompt_value):
openai.api_key = api_key
response = openai.Completion.create(
model="text-davinci-003",
prompt=f"請將以下的內容翻譯為英文:\n\n {prompt_value}",
max_tokens=200,
)
result = response.choices[0].text.strip()
print(result)
return result

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。