国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章

這篇具有很好參考價值的文章主要介紹了使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

原文:Developing Apps with GPT-4 and ChatGPT

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

第四章:GPT-4 和 ChatGPT 的高級技術(shù)

現(xiàn)在你已經(jīng)熟悉了 LLM 的基礎(chǔ)知識和 OpenAI API,是時候?qū)⒛愕募寄芴嵘较乱粋€水平了。本章涵蓋了強大的策略,將使你能夠充分利用 ChatGPT 和 GPT-4 的潛力。從提示工程、零-shot 學習和少-shot 學習到為特定任務微調(diào)模型,本章將為你提供創(chuàng)建任何你能想象的應用所需的所有知識。

提示工程

在深入研究提示工程之前,讓我們簡要回顧一下聊天模型的completion函數(shù),因為本節(jié)將廣泛使用它。為了使代碼更緊湊,我們將定義該函數(shù)如下:

def chat_completion(prompt, model="gpt-4", temperature=0):
    res = openai.ChatCompletion.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        temperature=temperature,
    )
    print(res["choices"][0]["message"]["content"])

該函數(shù)接收一個提示,并在終端顯示完成的結(jié)果。模型和溫度是兩個可選的特性,默認分別設(shè)置為 GPT-4 和 0。

為了演示提示工程,我們將回到示例文本“正如笛卡爾所說,我思故我在”。如果將此輸入傳遞給 GPT-4,模型自然會通過迭代添加最有可能的標記來完成句子:

chat_completion("As Descartes said, I think therefore")

因此,我們得到以下輸出消息:

I am. This famous philosophical statement, also known as "Cogito, ergo sum," 
emphasizes the existence of the self through the act of thinking or doubting.
Descartes used this statement as a foundational principle in his philosophy,
arguing that one's own existence is the most certain and indubitable fact
that can be known.

提示工程是一門新興的學科,專注于制定構(gòu)建 LLM 的最佳輸入的最佳實踐,以便盡可能以編程方式產(chǎn)生理想的輸出。作為一名 AI 工程師,你必須知道如何與 AI 交互,以獲取可利用的結(jié)果,如何提出正確的問題,以及如何編寫高質(zhì)量的提示;這些都是我們將在本節(jié)中涵蓋的所有主題。

應該注意,提示工程可能會影響使用 OpenAI API 的成本。你將支付的金額與你發(fā)送和接收的令牌數(shù)量成正比。如在第二章中提到的,強烈建議使用max_token參數(shù),以避免賬單上的不愉快的驚喜。

還要注意,你應該考慮在openai方法中可以使用的不同參數(shù),因為如果你使用temperature、top_pmax_token等參數(shù),即使使用相同的提示,也可能得到顯著不同的結(jié)果。

設(shè)計有效的提示

通過提示可以執(zhí)行許多任務。它們包括摘要、文本分類、情感分析和問題回答。在所有這些任務中,通常在提示中定義三個要素:角色、上下文和任務,如圖 4-1 所示。

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章,人工智能,chatgpt

圖 4-1。一個有效的提示

這三個要素并非總是必要的,它們的順序也可以改變,但如果你的提示構(gòu)造得當,要素定義得當,你應該能夠得到良好的結(jié)果。請注意,即使在使用這三個要素時,對于復雜的任務,你可能需要使用更高級的技術(shù),如零-shot 學習、少-shot 學習和微調(diào)。這些高級技術(shù)將在本章后面討論。

上下文

提示中的第一個基本要素是上下文。當你為 LLM 編寫輸入文本時,你必須盡可能詳細地描述上下文。為了說明這一點,假設(shè)你想使用 GPT-4 創(chuàng)建一個應用程序,為午餐建議主菜。接下來,我們將比較在兩種不同上下文下獲得的結(jié)果。第一個上下文將有很少的細節(jié),第二個將有更多的細節(jié)。

對于一個簡短的輸入消息,比如:

chat_completion("Give me a suggestion for the main course for today's lunch.")

我們得到以下輸出消息:

Grilled chicken with roasted vegetables and quinoa.

現(xiàn)在,關(guān)于輸入消息的上下文的更多細節(jié):

prompt = """
Context: I do 2 hours of sport a day. I am vegetarian, and I don't like green 
vegetables. I am conscientious about eating healthily. 
Task: Give me a suggestion for a main course for today's lunch."""
chat_completion(prompt)

我們得到以下輸出消息:


For today's lunch, you can try a Chickpea and Sweet Potato Curry served with
Quinoa. This dish is packed with protein, fiber, and essential nutrients,
while also being vegetarian and not relying on green vegetables. The curry
can be made with chickpeas, sweet potatoes, tomatoes, onions, garlic, and a
blend of spices like turmeric, cumin, and coriander. Cook the quinoa
separately and serve it alongside the curry for a delicious and healthy meal.

在第二個例子中,句子更加詳細,因為模型有更多的上下文:它建議了一個富含蛋白質(zhì)的健康素食菜肴。

上下文指導 GPT 的“思考”,為其回應增加價值。構(gòu)建具有良好上下文的提示是一個迭代的過程,通常需要試錯步驟。有時確定上下文必須包含的要點是有些棘手的。為了確定可能的改進,您可以向 GPT-4 尋求建議。在以下示例中,我們改變了提示:不是要求模型回答我們的問題,而是指示它在努力實現(xiàn)更好的完成時詢問上下文的問題。

使用以下輸入消息:

prompt = """
Context: I do 2 hours of sport a day. I am vegetarian and I don't like green 
vegetables. I am very careful to eat healthily.
Task: Give me a suggestion for a main course for today's lunch?
Do not perform the requested task! Instead, can you ask me questions about the 
context so that when I answer, you can perform the requested task more
efficiently?
"""
chat_completion(prompt)

我們從 GPT-4 模型中得到以下問題:

Sure, I have a few questions to help me suggest a suitable main course for you:
1\. What type of sport do you do, and do you have any specific nutritional
  requirements related to it?
2\. Are there any other vegetables or ingredients that you particularly enjoy
  or dislike?
3\. Do you prefer a hot or cold meal for lunch?
4\. Are you open to trying new recipes or do you prefer sticking to
  familiar dishes?

模型提出的問題通常是相關(guān)的。根據(jù)這些問題,您可以更新提示中的上下文。因此,我們建議您在構(gòu)建提示時經(jīng)常使用這個技巧。

任務

任務定義了您對 GPT-4 模型的使用,并且應該明確定義和具體。您應該為任務提供足夠的信息,并在提示中使用適當?shù)亩陶Z來引導模型達到期望的結(jié)果。

在前面的部分中,任務是讓模型建議午餐的主菜。我們可以添加細節(jié)來澄清我們想要什么。在這里,我們要求模型添加一個表格,其中包含每種食材和所需數(shù)量(以克為單位):

prompt = """
Context: I do 2 hours of sport a day. I am vegetarian, and I don't like green 
vegetables. I am conscientious about eating healthily.
Task: Give me a suggestion for a main course for today's lunch.
With this suggestion, I also want a table with two columns where each row 
contains an ingredient from the main course.
The first column in the table is the name of the ingredient.
The second column of the table is the number of grams of that ingredient needed 
for one person. Do not give the recipe for preparing the main course.
"""
chat_completion(prompt)

該模型給出了以下輸出:

Suggestion for today's lunch: Stuffed Bell Peppers with Quinoa and Black Beans
| Ingredient          | Grams per person |
|---------------------|------------------|
| Bell peppers        | 200g             |
| Quinoa              | 60g              |
| Black beans         | 75g              |
| Onion               | 50g              |
| Garlic              | 5g               |
| Olive oil           | 10g              |
| Tomato sauce        | 50g              |
| Cumin               | 1g               |
| Chili powder        | 1g               |
| Salt                | 1g               |
| Pepper              | 1g               |
| Shredded cheese     | 30g              |

在OpenAI API 示例頁面上,有一個包含 48 個 GPT 模型可以執(zhí)行的任務示例列表,始終與相關(guān)提示和演示一起。雖然這些示例使用了 GPT-3 模型和完成端點,但對于聊天端點原則是相同的,這些示例很好地說明了如何向 OpenAI 模型提供任務。我們不會在這里逐個討論它們,但以下是其中的一些:

語法糾正

糾正句子到標準英語。

提示:

Correct this to standard English: She no went to the market.

為二年級學生總結(jié)

將復雜的文本轉(zhuǎn)化為更簡單的概念。

提示:

Summarize this for a second-grade student: Jupiter is the fifth planet [...]

TL;DR 總結(jié)

TL;DR 代表“太長了;沒讀”。已經(jīng)觀察到,可以通過簡單地在末尾添加T``l;dr來總結(jié)一段文本。

提示:

A neutron star [...] atomic nuclei. Tl;dr

Python 轉(zhuǎn)自然語言

用人們能理解的語言解釋一段 Python 代碼。

提示:

# Python 3 
def hello(x): 
print('hello '+str(x)) 
# Explanation of what the code does

計算時間復雜度

找到函數(shù)的時間復雜度。

提示:

# Python 3 
def hello(x, n):
     for i in range(n):
        print('hello '+str(x))
# The time complexity of this function is 

Python 錯誤修復程序

修復包含錯誤的代碼。

提示:

### Buggy Python
def hello(x, n):
     for i in rang(n):
        print('hello '+str(x))
### Fixed Python

SQL 請求

簡單的 SQL 查詢構(gòu)建。

提示:

Create a SQL request to find all users who live in California and have
over 1000 credits.

類比制造者

可以對兩個單詞進行類比。

提示:

Create an analogy for this phrase. Questions are arrows in that:

總結(jié)筆記

總結(jié)會議記錄。

提示:

Convert my shorthand into a first-hand account of the meeting:
Tom: Profits up 50%
Jane: New servers are online
Kjel: Need more time to fix software

角色

在撰寫提示時影響模型的最后一種方法是給它一個角色。當然,角色和上下文可以獨立使用,但同時使用可以增加您對模型輸出的控制。在以下示例中,我們讓模型扮演體育營養(yǎng)專家的角色:

prompt = """
Role: You are a nutritionist designing healthy diets for high-performance 
athletes. You take into account the nutrition needed for a good recovery.
Context: I do 2 hours of sport a day. I am vegetarian, and I don't like green 
vegetables. I am conscientious about eating healthily.
Task: Based on your expertise defined in your role, give me a suggestion for a 
main course for today's lunch. With this suggestion, I also want a table with
two columns where each row in the table contains an ingredient from the main 
course. The first column in the table is the name of the ingredient.
The second column of the table is the number of grams of that ingredient needed
for one person. Do not give the recipe for preparing the main course.
"""
chat_completion(prompt)

然后我們得到以下結(jié)果:

Main Course Suggestion: Quinoa and Chickpea Stuffed Bell Peppers
Ingredient Table:
| Ingredient          | Grams per Person |
|---------------------|------------------|
| Quinoa              | 60               |
| Chickpeas           | 100              |
| Bell Peppers        | 200              |
| Olive Oil           | 10               |
| Onion               | 50               |
| Garlic              | 5                |
| Tomato              | 100              |
| Feta Cheese         | 30               |
| Kalamata Olives     | 20               |
| Fresh Basil         | 5                |
| Salt                | 2                |
| Black Pepper        | 1                |

正如您所見,提示可以用來調(diào)整 GPT 模型等 LLM 的概率分布集。它們可以被視為指導模型產(chǎn)生特定類型結(jié)果的指南。雖然提示設(shè)計沒有確定的結(jié)構(gòu),但一個有用的框架是上下文、角色和任務的組合。

重要的是要理解,這只是一種方法,提示可以在不明確定義這些元素的情況下創(chuàng)建。有些提示可能會受益于不同的結(jié)構(gòu),或者根據(jù)您的應用程序的特定需求需要更有創(chuàng)意的方法。因此,這個上下文-角色-任務框架不應限制您的思維,而應該是幫助您在適當時有效地設(shè)計提示的工具。

逐步思考

眾所周知,GPT-4 不擅長計算。它無法計算 369 × 1,235:

prompt = "How much is 369 * 1235?"
chat_completion(prompt)

我們得到以下答案:454965

正確答案是 455,715。GPT-4 不能解決復雜的數(shù)學問題嗎?請記住,模型通過預測答案中的每個標記來逐個順序生成答案,從左邊開始。這意味著 GPT-4 首先生成最左邊的數(shù)字,然后將其作為上下文的一部分來生成下一個數(shù)字,依此類推,直到形成完整的答案。這里的挑戰(zhàn)是每個數(shù)字都是獨立于最終正確值的預測。GPT-4 將數(shù)字視為標記;沒有數(shù)學邏輯。

注意

在第五章中,我們將探討 OpenAI 如何通過插件豐富了 GPT-4。一個例子是用于提供準確數(shù)學解決方案的計算器插件。

有一個技巧可以增加語言模型的推理能力。例如,當要求解 369×1235 時,我們可以看到模型試圖直接在一次嘗試中回答。考慮到你可能也無法在沒有鉛筆和一張紙的幫助下解決這個乘法??梢酝ㄟ^提示來鼓勵模型進行中間推理。就像你用鉛筆和紙一樣,如果給模型足夠的時間來推理,它就可以解決更復雜的問題。

在提示的末尾添加“讓我們一步一步地思考”已經(jīng)被實驗證明能夠使模型解決更復雜的推理問題。這種技術(shù)被稱為零射擊 CoT 策略,它是由 Kojima 等人在 2022 年發(fā)表的科學論文“大型語言模型是零射擊推理者”中介紹的。

CoT代表思維鏈;它在這里指的是使用鼓勵模型模仿逐步推理的提示技術(shù)。術(shù)語零射擊意味著模型不依賴于特定任務的示例來執(zhí)行這種推理;它準備好根據(jù)其一般訓練來處理新任務。與需要模型看到任務示例的少量學習等技術(shù)不同(我們將很快討論),零射擊學習試圖在不需要特定任務示例的情況下進行泛化。

正如我們將看到的,通過將這個句子添加到提示中,模型開始通過將問題分解為子問題來進行推理。因此,它可能需要時間來推理,從而能夠找到以前只能在一次嘗試中無法解決的問題的解決方案。讓我們看看如果我們改變我們的輸入提示會發(fā)生什么:

prompt = "How much is 369 * 1235 ? Let's think step by step."
chat_completion(prompt)

我們得到了以下輸出:

Step 1: Multiply 369 by 5 (the last digit of 1235).
369 * 5 = 1845
Step 2: Multiply 369 by 30 (the second last digit of 1235 is 3, so multiply by
   3 and add a 0 at the end).
369 * 30 = 11070
Step 3: Multiply 369 by 200 (the third digit of 1235 is 2, so multiply by 2 and
   add two 0s at the end).
369 * 200 = 73800
Step 4: Multiply 369 by 1000 (the first digit of 1235 is 1, so multiply by 1 and 
   add three 0s at the end).
369 * 1000 = 369000
Step 5: Add the results from steps 1 to 4.
1845 + 11070 + 73800 + 369000 = 455715
So, 369 * 1235 = 455,715.

模型的方法發(fā)生了顯著的轉(zhuǎn)變。它現(xiàn)在將主要問題分解為更小、更易管理的步驟,而不是試圖直接解決問題。

警告

盡管提示模型“一步一步地思考”是至關(guān)重要的,但您仍然需要仔細評估其響應,因為 GPT-4 并非萬無一失。對于像 3695×123548 這樣更復雜的計算,即使使用這個技巧,LLM 也無法找到正確的解決方案。

當然,很難從一個例子中判斷這個技巧是否普遍有效,或者我們只是幸運。在各種數(shù)學問題的基準測試中,實證實驗證明這個技巧顯著提高了 GPT 模型的準確性。盡管這個技巧對大多數(shù)數(shù)學問題都有效,但并不適用于所有情況?!洞笮驼Z言模型是零射擊推理者》的作者發(fā)現(xiàn),它對多步算術(shù)問題、涉及符號推理的問題、涉及策略的問題以及其他涉及推理的問題最有益。它并不適用于常識問題。

實施少量學習

少樣本學習,由 Brown 等人在《語言模型是少樣本學習者》中介紹,指的是 LLM 僅憑少量示例就能概括和產(chǎn)生有價值的結(jié)果的能力。通過少樣本學習,您可以給出您希望模型執(zhí)行的任務的幾個示例,如圖 4-2 所示。這些示例指導模型處理所需的輸出格式。

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章,人工智能,chatgpt

圖 4-2。包含幾個示例的提示

在這個例子中,我們要求 LLM 將特定單詞轉(zhuǎn)換為表情符號。很難想象要在提示中放入什么指令來執(zhí)行這個任務。但是通過少樣本學習,這很容易。給它一些示例,模型將自動嘗試復制它們。

prompt="""I go home -->  go my dog is sad --> my  is I run fast -->  run I love my wife -->  my wifethe girl plays with the ball --> the  with the The boy writes a letter to a girl --> """chat_completion(prompt)

從前面的例子中,我們得到以下消息作為輸出:

The   a  to a 

少樣本學習技術(shù)提供了具有期望輸出的輸入示例。然后,在最后一行,我們提供了我們想要完成的提示。這個提示與之前的示例的形式相同。自然地,語言模型將根據(jù)給定示例的模式執(zhí)行完成操作。

我們可以看到,僅憑幾個示例,模型就可以復制指令。通過利用 LLM 在訓練階段獲得的廣泛知識,它們可以快速適應并根據(jù)僅有的幾個示例生成準確的答案。

注意

少樣本學習是 LLM 的一個強大方面,因為它使它們能夠高度靈活和適應,只需要有限的額外信息就能執(zhí)行各種任務。

當您在提示中提供示例時,確保上下文清晰和相關(guān)是至關(guān)重要的。清晰的示例可以提高模型匹配所需輸出格式并執(zhí)行解決問題的能力。相反,不充分或含糊的示例可能導致意外或不正確的結(jié)果。因此,仔細編寫示例并確保它們傳達正確的信息可以顯著影響模型執(zhí)行任務的準確性。

引導 LLM 的另一種方法是一樣本學習。顧名思義,在這種情況下,您只提供一個示例來幫助模型執(zhí)行任務。盡管這種方法提供的指導比少樣本學習少,但對于更簡單的任務或者 LLM 已經(jīng)對主題有相當多的背景知識的情況下,它可能是有效的。一樣本學習的優(yōu)勢在于簡單、更快的提示生成以及更低的計算成本和因此更低的 API 成本。然而,對于復雜的任務或需要更深入理解期望結(jié)果的情況,少樣本學習可能是更適合的方法,以確保準確的結(jié)果。

提示

提示工程已成為一個熱門話題,您會發(fā)現(xiàn)許多在線資源來深入研究這個主題。例如,這個GitHub 存儲庫包含了由 70 多個不同用戶貢獻的有效提示列表。

雖然本節(jié)探討了各種可以單獨使用的提示工程技術(shù),請注意您可以結(jié)合這些技術(shù)以獲得更好的結(jié)果。作為開發(fā)人員,您的工作是找到特定問題的最有效提示。請記住,提示工程是一個反復試驗的迭代過程。

提高提示效果

我們已經(jīng)看到了幾種提示工程技術(shù),可以影響 GPT 模型的行為,以獲得滿足我們需求的更好結(jié)果。我們將以一些在編寫 GPT 模型提示時可以在不同情況下使用的技巧和竅門結(jié)束本節(jié)。

指導模型提出更多問題

以詢問模型是否理解問題并指示模型提出更多問題來結(jié)束提示是一種有效的技術(shù),如果你正在構(gòu)建基于聊天機器人的解決方案。你可以在提示的末尾添加這樣的文本:

Did you understand my request clearly? If you do not fully understand my request,
ask me questions about the context so that when I answer, you can
perform the requested task more efficiently.

格式化輸出

有時候你會希望在更長的過程中使用 LLM 輸出:在這種情況下,輸出格式很重要。例如,如果你想要 JSON 輸出,模型往往會在 JSON 塊之前和之后寫入輸出。如果你在提示中添加“輸出必須被 json.loads 接受”,那么它往往會工作得更好。這種技巧可以在許多情況下使用。

例如,使用這個腳本:

prompt = """
Give a JSON output with 5 names of animals. The output must be accepted 
by json.loads.
"""
chat_completion(prompt, model='gpt-4')

我們得到了以下的 JSON 代碼塊:

{
  "animals": [
    "lion",
    "tiger",
    "elephant",
    "giraffe",
    "zebra"
  ]
}

重復指令

經(jīng)驗表明,重復指令會產(chǎn)生良好的結(jié)果,特別是當提示很長時。思路是多次在提示中添加相同的指令,但每次都用不同的方式表達。

這也可以通過負面提示來實現(xiàn)。

使用負面提示

在文本生成的背景下使用負面提示是一種指導模型的方式,指定你不希望在輸出中看到的內(nèi)容。它們作為約束或指導,用于過濾出某些類型的響應。當任務復雜時,這種技術(shù)特別有用:當任務以不同方式多次重復時,模型往往更精確地遵循指令。

繼續(xù)上一個例子,我們可以通過添加“不要在 json 之前或之后添加任何內(nèi)容?!眮韴猿州敵龈袷降呢撁嫣崾尽?/p>

在第三章中的第三個項目中,我們使用了負面提示:

Extract the keywords from the following question: {user_question}. Do not answer
anything else, only the keywords.

如果沒有這個提示的補充,模型往往不會遵循指令。

添加長度約束

長度約束通常是一個好主意:如果你只期望得到一個單詞的答案或 10 個句子,就把它添加到你的提示中。這就是我們在第三章中在第一個項目中所做的:我們指定了“長度:100 個單詞”來生成一篇合適的新聞文章。在第四個項目中,我們的提示也有一個長度指令:“如果你可以回答問題:ANSWER,如果你需要更多信息:MORE,如果你無法回答:OTHER。只回答一個”“單詞”。如果沒有最后一句,模型會傾向于形成句子,而不是遵循指令。

微調(diào)

OpenAI 提供了許多現(xiàn)成的 GPT 模型。雖然這些模型在各種任務上表現(xiàn)出色,但對特定任務或情境進行微調(diào)可以進一步提高它們的性能。

入門

假設(shè)你想為你的公司創(chuàng)建一個電子郵件回復生成器。由于你的公司在特定行業(yè)中使用特定詞匯,你希望生成的電子郵件回復保留你當前的寫作風格。有兩種策略可以做到這一點:要么你可以使用之前介紹的提示工程技術(shù)來強制模型輸出你想要的文本,要么你可以對現(xiàn)有模型進行微調(diào)。本節(jié)探討了第二種技術(shù)。

對于這個例子,你必須收集大量包含有關(guān)你特定業(yè)務領(lǐng)域的數(shù)據(jù)的電子郵件,客戶的詢問以及對這些詢問的回復。然后,你可以使用這些數(shù)據(jù)對現(xiàn)有模型進行微調(diào),以學習你公司特定的語言模式和詞匯。微調(diào)后的模型本質(zhì)上是從 OpenAI 提供的原始模型中構(gòu)建的新模型,其中模型的內(nèi)部權(quán)重被調(diào)整以適應你的特定問題,使得新模型在類似于它在微調(diào)數(shù)據(jù)集中看到的示例的任務上提高了準確性。通過微調(diào)現(xiàn)有的 LLM,可以創(chuàng)建一個高度定制和專門針對你特定業(yè)務中使用的語言模式和詞匯的電子郵件回復生成器。

圖 4-3 說明了微調(diào)過程,其中使用特定領(lǐng)域的數(shù)據(jù)集來更新現(xiàn)有 GPT 模型的內(nèi)部權(quán)重。目標是使新的微調(diào)模型在特定領(lǐng)域比原始 GPT 模型做出更好的預測。應該強調(diào)的是這是一個新模型。這個新模型在 OpenAI 服務器上:與以前一樣,您必須使用 OpenAI 的 API 來使用它,因為它無法在本地訪問。

圖 4-3。微調(diào)過程
注意

即使您使用自己的特定數(shù)據(jù)對 LLM 進行了微調(diào),新模型仍然保留在 OpenAI 的服務器上。您將通過 OpenAI 的 API 與其進行交互,而不是在本地。

為特定領(lǐng)域的需求調(diào)整 GPT 基礎(chǔ)模型

目前,微調(diào)僅適用于davinci、curie、babbageada基礎(chǔ)模型。每個模型在準確性和所需資源之間都有一個權(quán)衡。作為開發(fā)者,您可以為您的應用程序選擇最合適的模型:較小的模型,如adababbage,可能對于簡單任務或資源有限的應用程序來說更快速和更具成本效益,而較大的模型curiedavinci提供了更先進的語言處理和生成能力,使它們成為更復雜任務的理想選擇,其中更高的準確性至關(guān)重要。

這些是不屬于 InstructGPT 模型系列的原始模型。例如,它們沒有從人類在循環(huán)中進行強化學習階段中受益。通過微調(diào)這些基礎(chǔ)模型,例如根據(jù)自定義數(shù)據(jù)集調(diào)整其內(nèi)部權(quán)重,您可以將它們定制為特定任務或領(lǐng)域。盡管它們沒有 InstructGPT 系列的處理和推理能力,但它們通過利用其預訓練的語言處理和生成能力為構(gòu)建專門應用程序提供了堅實的基礎(chǔ)。

注意

對于微調(diào),您必須使用基礎(chǔ)模型;不可能使用指導模型。

微調(diào)與少樣本學習

微調(diào)是一種重新訓練現(xiàn)有模型的過程,以改善其性能并使其答案更準確。在微調(diào)中,您更新模型的內(nèi)部參數(shù)。正如我們之前所看到的,少樣本學習通過其輸入提示向模型提供有限數(shù)量的良好示例,從而引導模型基于這些少量示例產(chǎn)生期望的結(jié)果。通過少樣本學習,模型的內(nèi)部參數(shù)不會被修改。

微調(diào)和少樣本學習都可以用來增強 GPT 模型。微調(diào)產(chǎn)生了一個高度專業(yè)化的模型,可以為特定任務提供更準確和上下文相關(guān)的結(jié)果。這使其成為在大量數(shù)據(jù)可用的情況下的理想選擇。這種定制確保生成的內(nèi)容更符合目標領(lǐng)域的特定語言模式、詞匯和語氣。

少樣本學習是一種更靈活和數(shù)據(jù)高效的方法,因為它不需要重新訓練模型。當只有有限的示例可用或需要快速適應不同任務時,這種技術(shù)是有益的。少樣本學習允許開發(fā)者快速原型設(shè)計和嘗試各種任務,使其成為許多用例的多功能和實用選擇。選擇兩種方法之間的另一個重要標準是,使用和訓練使用微調(diào)的模型更昂貴。

微調(diào)方法通常需要大量數(shù)據(jù)。可用示例的缺乏經(jīng)常限制了這種類型技術(shù)的使用。為了讓您了解微調(diào)所需的數(shù)據(jù)量,您可以假設(shè)對于相對簡單的任務或僅需要進行輕微調(diào)整時,您可以通過幾百個輸入提示及其相應的期望完成示例來獲得良好的微調(diào)結(jié)果。這種方法適用于預訓練的 GPT 模型在任務上表現(xiàn)良好,但需要輕微調(diào)整以更好地與目標領(lǐng)域?qū)R的情況。然而,對于更復雜的任務或在您的應用程序需要更多定制的情況下,您的模型可能需要使用成千上萬個示例進行訓練。例如,這可以對應我們之前提出的用例,即自動回復符合您寫作風格的電子郵件。您還可以針對非常專業(yè)的任務進行微調(diào),這種情況下,您的模型可能需要數(shù)十萬甚至數(shù)百萬個示例。這種微調(diào)規(guī)??梢詭盹@著的性能改進,并更好地適應特定領(lǐng)域。

注意

遷移學習將從一個領(lǐng)域?qū)W到的知識應用到不同但相關(guān)的環(huán)境中。因此,您有時可能會聽到與微調(diào)相關(guān)的遷移學習術(shù)語。

使用 OpenAI API 進行微調(diào)

本節(jié)將指導您如何使用 OpenAI API 調(diào)整 LLM 的過程。我們將解釋如何準備您的數(shù)據(jù),上傳數(shù)據(jù)集,并使用 API 創(chuàng)建一個經(jīng)過微調(diào)的模型。

準備您的數(shù)據(jù)

要更新 LLM 模型,需要提供一個包含示例的數(shù)據(jù)集。數(shù)據(jù)集應該是一個 JSONL 文件,其中每一行對應一個提示和完成的配對:

{"prompt": "<prompt text>", "completion": "<completion text>"}
{"prompt": "<prompt text>", "completion": "<completion text>"}
{"prompt": "<prompt text>", "completion": "<completion text>"}

JSONL 文件是一個文本文件,每行代表一個單獨的 JSON 對象。您可以使用它來高效地存儲大量數(shù)據(jù)。OpenAI 提供了一個工具,幫助您生成這個訓練文件。該工具可以接受各種文件格式作為輸入(CSV、TSV、XLSX、JSON 或 JSONL),只要它們包含提示和完成列/鍵,并且輸出一個準備好發(fā)送進行微調(diào)過程的訓練 JSONL 文件。該工具還會驗證并提供建議,以改善您的數(shù)據(jù)質(zhì)量。

在您的終端中使用以下代碼行運行此工具:

$ openai tools fine_tunes.prepare_data -f <LOCAL_FILE>

該應用程序?qū)⑻岢鲆幌盗薪ㄗh,以改善最終文件的結(jié)果;您可以接受或拒絕這些建議。您還可以指定選項-q,自動接受所有建議。

注意

當您執(zhí)行pip install openai時,此openai工具已安裝并在您的終端中可用。

如果您有足夠的數(shù)據(jù),該工具將詢問是否有必要將數(shù)據(jù)分成訓練集和驗證集。這是一種推薦的做法。算法將使用訓練數(shù)據(jù)在微調(diào)過程中修改模型的參數(shù)。驗證集可以衡量模型在未用于更新參數(shù)的數(shù)據(jù)集上的性能。

對 LLM 進行微調(diào)有賴于使用高質(zhì)量的示例,最好由專家審查。在使用預先存在的數(shù)據(jù)集進行微調(diào)時,確保數(shù)據(jù)經(jīng)過篩查,排除冒犯性或不準確的內(nèi)容,或者如果數(shù)據(jù)集太大無法手動審核所有條目,則檢查隨機樣本。

使您的數(shù)據(jù)可用

一旦您準備好帶有訓練示例的數(shù)據(jù)集,您需要將其上傳到 OpenAI 服務器。OpenAI API 提供了不同的功能來操作文件。以下是最重要的功能:

上傳文件:

openai.File.create(
    file=open("out_openai_completion_prepared.jsonl", "rb"),
    purpose='fine-tune'
)
  • 有兩個必填參數(shù):filepurpose。將purpose設(shè)置為fine-tune。這將驗證用于微調(diào)的下載文件格式。此函數(shù)的輸出是一個字典,您可以從中檢索id字段中的file_id。目前,總文件大小可達 1GB。如需更多,請聯(lián)系 OpenAI。

刪除文件:

openai.File.delete("file-z5mGg(...)")
  • 一個參數(shù)是必需的:file_id。

列出所有上傳的文件:

openai.File.list()
  • 例如,在開始微調(diào)過程時,檢索文件的 ID 可能會有所幫助。

創(chuàng)建一個經(jīng)過精細調(diào)整的模型

對上傳的文件進行微調(diào)是一個簡單的過程。端點openai.FineTune.create()在 OpenAI 服務器上創(chuàng)建一個作業(yè),以從給定數(shù)據(jù)集中細化指定的模型。此函數(shù)的響應包含排隊作業(yè)的詳細信息,包括作業(yè)的狀態(tài)、fine_tune_id和過程結(jié)束時模型的名稱。

主要輸入?yún)?shù)在表 4-1 中描述。

表 4-1。openai.FineTune.create()的參數(shù)

字段名稱 類型 描述
training_file 字符串 這是包含上傳文件的file_id的唯一必填參數(shù)。您的數(shù)據(jù)集必須格式化為 JSONL 文件。每個訓練示例都是一個具有promptcompletion鍵的 JSON 對象。
model 字符串 這指定了用于微調(diào)的基礎(chǔ)模型。您可以選擇ada、babbagecurie、davinci或先前調(diào)整的模型。默認的基礎(chǔ)模型是curie。
validation_file 字符串 這包含具有驗證數(shù)據(jù)的上傳文件的file_id。如果提供此文件,數(shù)據(jù)將用于在微調(diào)過程中定期生成驗證指標。
suffix 字符串 這是一個最多 40 個字符的字符串,添加到您的自定義模型名稱中。

列出微調(diào)作業(yè)

可以通過以下函數(shù)在 OpenAI 服務器上獲取所有微調(diào)作業(yè)的列表:

openai.FineTune.list()

結(jié)果是一個包含所有精細調(diào)整模型信息的字典。

取消微調(diào)作業(yè)

可以通過以下函數(shù)立即中斷在 OpenAI 服務器上運行的作業(yè):

openai.FineTune.cancel()

此功能只有一個必填參數(shù):fine_tune_id。fine_tune_id參數(shù)是一個以ft-開頭的字符串;例如,ft-Re12otqdRaJ(...) 。它是在使用openai.FineTune.?cre?ate()函數(shù)創(chuàng)建作業(yè)后獲得的。如果您丟失了fine_tune_id,可以使用openai.FineTune.list()來檢索它。

微調(diào)應用

微調(diào)提供了一種強大的方式來增強各種應用程序中模型的性能。本節(jié)將介紹幾種已經(jīng)有效部署微調(diào)的用例。從這些例子中獲得靈感!也許您在您的用例中有相同類型的問題。再次提醒,微調(diào)比基于提示工程的其他技術(shù)更昂貴,因此在大多數(shù)情況下并不是必需的。但是當需要時,這種技術(shù)可以顯著改善您的結(jié)果。

法律文件分析

在這種情況下,LLM 用于處理法律文件并提取有價值的信息。這些文件通常使用特定行話編寫,這使得非專業(yè)人士難以理解這些類型的文本。我們已經(jīng)在第一章中看到,當在統(tǒng)一律師考試上進行測試時,GPT-4 的得分位于 90 分位數(shù)。在這種情況下,微調(diào)可以使模型專門針對特定領(lǐng)域和/或允許其協(xié)助非專業(yè)人士參與法律流程。通過在特定主題的法律語料庫上對 LLM 進行微調(diào),或者針對特定類型的最終用戶,模型可以更好地處理法律語言的復雜性,并更擅長執(zhí)行與特定類型最終用戶相關(guān)的任務。

通過使用大量數(shù)據(jù)對 LLM 進行微調(diào),以分析法律文件,可以顯著提高模型在這些任務中的性能,使其能夠更好地處理通常超出提示工程技術(shù)能力范圍的法律語言的細微差別。

自動代碼審查

在這種用例中,微調(diào)可以幫助模型分析并提出開發(fā)人員編寫的代碼的改進建議。這需要在包含代碼片段和注釋的數(shù)據(jù)集上訓練模型,使模型能夠處理特定語言的語法、語義和最佳實踐。請注意,這個用例類似于 GitHub 的 Copilot 工具,該工具旨在通過實時提供代碼和整個函數(shù)的建議來幫助開發(fā)人員編寫代碼。您可以使用微調(diào)來訓練模型執(zhí)行特定任務,如代碼審查,并為自己的代碼構(gòu)建一個符合特定標準或?qū)iT用于特定編程框架的項目。

作為這種用例的輸入文件的一個例子,您的 JSONL 文件可以包含代碼和相應的審查評論對。這將幫助模型學習如何提供準確和相關(guān)的代碼質(zhì)量反饋。JSONL 文件的一行可能是這樣的:

{"prompt": "Review the following Python code: 
    'def sum(a, b): return a + b\nresult = sum(5, '5')'",
"completion": "Type error: The 'sum' function is adding an integer and a string. 
    Consider converting the string to an integer using int() before passing it
    to the function."}

財務文件摘要

在財務文件合成中,經(jīng)過微調(diào)的 LLM 可以生成財務文件的簡潔準確摘要,如收益報告、財務報表和分析報告。通過在與財務記錄明確相關(guān)的數(shù)據(jù)集上微調(diào)語言模型,生成的模型可以更準確地理解這些文件的術(shù)語和上下文。例如,該模型可以將央行利率上調(diào)的詳細報告壓縮成簡潔而富有信息的摘要。

要調(diào)整現(xiàn)有模型以獲得更好的財務文件摘要,您需要已經(jīng)有大量樣本摘要。然后,您需要向模型提供一個包含財務文件及其理想摘要對的 JSONL 文件。例如:

{"prompt": "The central bank announced a 0.25% increase in the benchmark 
    interest rate, citing concerns about inflationary pressures. This move is
    expected to affect borrowing costs for consumers and businesses.",
"completion": "Bank increases rate 0.25% for inflation worry. May affect people,
    business borrowing costs."}

技術(shù)文件翻譯

使用微調(diào)來翻譯技術(shù)文件可以顯著提高基礎(chǔ)模型的性能,與少量樣本學習相比。主要原因是技術(shù)文件通常包含專業(yè)詞匯和復雜的句子結(jié)構(gòu),少量樣本學習無法有效處理。基礎(chǔ)模型是未經(jīng)調(diào)整的 GPT-3 模型,如 InstructGPT-3 模型,使用強化學習和人類反饋技術(shù)。要使用它們,需要進行微調(diào)。要調(diào)整現(xiàn)有的基礎(chǔ)模型,您需要準備一個包含訓練數(shù)據(jù)的 JSONL 文件。對于技術(shù)文件翻譯的用例,該文件的內(nèi)容將包括將技術(shù)文本翻譯成目標語言的內(nèi)容。

針對利基主題的新聞文章生成

在這種用例中,經(jīng)過微調(diào)的模型可以為高度專業(yè)化的主題生成高質(zhì)量、引人入勝和與上下文相關(guān)的新聞文章,這些主題基礎(chǔ)模型可能沒有足夠的數(shù)據(jù)來準確生成。與所有其他用例一樣,您需要創(chuàng)建一個訓練數(shù)據(jù)集,以使您的模型專門用于撰寫文章。為此,您需要準備許多關(guān)于特定利基主題的文章。這些數(shù)據(jù)將用于創(chuàng)建包含提示-完成對的 JSONL 文件。以下是一個小例子:

{"prompt": "Write an introductory article about a new environmentally friendly
    cryptocurrency: 'EcoCoin: The Green Cryptocurrency Taking
    the Market by Storm'",
"completion": "As concerns over the environmental impact of cryptocurrency
    mining (...) mining process and commitment to sustainability."}

為電子郵件營銷活動生成和微調(diào)合成數(shù)據(jù)

在這個例子中,我們將為電子郵件營銷機構(gòu)制作一個文本生成工具,利用定向內(nèi)容為企業(yè)創(chuàng)建個性化的電子郵件營銷活動。這些電子郵件旨在吸引受眾并推廣產(chǎn)品或服務。

假設(shè)我們的機構(gòu)有一個支付處理行業(yè)的客戶,他們要求幫助他們運行直接電子郵件營銷活動,為電子商務提供新的支付服務。電子郵件營銷機構(gòu)決定為這個項目使用微調(diào)技術(shù)。我們的電子郵件營銷機構(gòu)將需要大量數(shù)據(jù)來進行微調(diào)。

在我們的情況下,我們需要為演示目的合成生成數(shù)據(jù),正如您將在下一小節(jié)中看到的。通常,最好的結(jié)果是使用人類專家的數(shù)據(jù),但在某些情況下,合成數(shù)據(jù)生成可能是一個有用的解決方案。

創(chuàng)建合成數(shù)據(jù)集

在以下示例中,我們從 GPT-3.5 Turbo 創(chuàng)建人工數(shù)據(jù)。為此,我們將在提示中指定要將促銷句子發(fā)送給特定商家以銷售電子商務服務。商家的特征是活動領(lǐng)域、商店所在城市和商店的大小。我們通過將提示發(fā)送到之前定義的chat_completion函數(shù)中的 GPT-3.5 Turbo 來獲得促銷句子。

我們通過定義三個列表來開始我們的腳本,分別對應于商店類型、商店所在的城市和商店的大?。?/p>

l_sector = ['Grocery Stores', 'Restaurants', 'Fast Food Restaurants',
              'Pharmacies', 'Service Stations (Fuel)', 'Electronics Stores']
l_city = ['Brussels', 'Paris', 'Berlin']
l_size = ['small', 'medium', 'large'] 

然后我們在一個字符串中定義第一個提示。在此提示中,角色、上下文和任務都很明確,因為它們是使用本章前面描述的提示工程技術(shù)構(gòu)建的。在此字符串中,大括號中的三個值將在代碼中稍后替換為相應的值。這個第一個提示用于生成合成數(shù)據(jù):

f_prompt = """ 
Role: You are an expert content writer with extensive direct marketing 
experience. You have strong writing skills, creativity, adaptability to 
different tones and styles, and a deep understanding of audience needs and
preferences for effective direct campaigns.
Context: You have to write a short message in no more than 2 sentences for a
direct marketing campaign to sell a new e-commerce payment service to stores. 
The target stores have the following three characteristics:
- The sector of activity: {sector} `- The city where the stores are located:` `{city}`
`- The size of the stores:` `{size}` ``Task: Write a short message for the direct marketing campaign. Use the skills`
`defined in your role to write this message! It is important that the message`
`you create takes into account the product you are selling and the`
`characteristics of the store you are writing to.`
`"""``

以下提示僅包含三個變量的值,用逗號分隔。它不用于創(chuàng)建合成數(shù)據(jù);僅用于微調(diào):

f_sub_prompt = "{sector}, {city}, {size}"

然后是代碼的主要部分,它迭代我們之前定義的三個值列表。我們可以看到循環(huán)中的代碼塊很簡單。我們用兩個提示的大括號中的值替換為適當?shù)闹?。變?code>prompt與函數(shù)chat_completion一起使用,以生成保存在response_txt中的廣告。然后將sub_promptresponse_txt變量添加到out_openai_completion.csv文件中,這是我們微調(diào)的訓練集。

df = pd.DataFrame()
for sector in l_sector:
    for city in l_city:
        for size in l_size:
            for i in range(3):  ## 3 times each
                prompt = f_prompt.format(sector=sector, city=city, size=size)
                sub_prompt = f_sub_prompt.format(
                    sector=sector, city=city, size=size
                )
                response_txt = chat_completion(
                    prompt, model="gpt-3.5-turbo", temperature=1
                )
                new_row = {"prompt": sub_prompt, "completion": response_txt}
                new_row = pd.DataFrame([new_row])
                df = pd.concat([df, new_row], axis=0, ignore_index=True)
df.to_csv("out_openai_completion.csv",  index=False)

請注意,對于每種特征組合,我們生成三個示例。為了最大化模型的創(chuàng)造力,我們將溫度設(shè)置為1。在此腳本結(jié)束時,我們有一個存儲在out_openai_completion.csv文件中的 Pandas 表。它包含 162 個觀察結(jié)果,其中有兩列包含提示和相應的完成。這個文件的前兩行如下:

"Grocery Stores, Brussels, small",Introducing our new e-commerce payment service - 
the perfect solution for small Brussels-based grocery stores to easily and 
securely process online transactions. "Grocery Stores, Brussels, small",
Looking for a hassle-free payment solution for your small grocery store in
Brussels? Our new e-commerce payment service is here to simplify your
transactions and increase your revenue. Try it now!

現(xiàn)在我們可以調(diào)用工具從out_openai_completion.csv生成訓練文件,如下所示:

$ openai tools fine_tunes.prepare_data -f out_openai_completion.csv

正如您在以下代碼行中所看到的,這個工具提出了改進我們提示-完成對的建議。在文本的結(jié)尾,它甚至提供了如何繼續(xù)微調(diào)過程以及在微調(diào)過程完成后如何使用模型進行預測的建議。

Analyzing...
- Based on your file extension, your file is formatted as a CSV file
- Your file contains 162 prompt-completion pairs
- Your data does not contain a common separator at the end of your prompts. 
Having a separator string appended to the end of the prompt makes it clearer
to the fine-tuned model where the completion should begin. See
https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset
for more detail and examples. If you intend to do open-ended generation, 
then you should leave the prompts empty
- Your data does not contain a common ending at the end of your completions. 
Having a common ending string appended to the end of the completion makes it
clearer to the fine-tuned model where the completion should end. See
https://oreil.ly/MOff7 for more detail and examples.
- The completion should start with a whitespace character (` `). This tends to
produce better results due to the tokenization we use. See 
https://oreil.ly/MOff7 for more details
Based on the analysis we will perform the following actions:
- [Necessary] Your format `CSV` will be converted to `JSONL`
- [Recommended] Add a suffix separator ` ->` to all prompts [Y/n]: Y
- [Recommended] Add a suffix ending `\n` to all completions [Y/n]: Y
- [Recommended] Add a whitespace character to the beginning of the completion
[Y/n]: Y
Your data will be written to a new JSONL file. Proceed [Y/n]: Y
Wrote modified file to `out_openai_completion_prepared.jsonl`
Feel free to take a look!
Now use that file when fine-tuning:
> openai api fine_tunes.create -t "out_openai_completion_prepared.jsonl"
After you’ve fine-tuned a model, remember that your prompt has to end with the 
indicator string ` ->` for the model to start generating completions, rather
than continuing with the prompt. Make sure to include `stop=["\n"]` so that the
generated texts ends at the expected place.
Once your model starts training, it'll approximately take 4.67 minutes to train
a `curie` model, and less for `ada` and `babbage`. Queue will approximately
take half an hour per job ahead of you.

在此過程結(jié)束時,將會有一個名為out_openai_completion_prepared.jsonl的新文件可供使用,并準備好發(fā)送到 OpenAI 服務器以運行微調(diào)過程。

請注意,如函數(shù)消息中所解釋的,提示已被修改,末尾添加了字符串->,并且所有完成都添加了以\n結(jié)尾的后綴。### 使用合成數(shù)據(jù)集微調(diào)模型

以下代碼上傳文件并進行微調(diào)。在此示例中,我們將使用davinci作為基礎(chǔ)模型,生成的模型名稱將以direct_marketing作為后綴:

ft_file = openai.File.create(
    file=open("out_openai_completion_prepared.jsonl", "rb"), purpose="fine-tune"
)
openai.FineTune.create(
    training_file=ft_file["id"], model="davinci", suffix="direct_marketing"
)

這將啟動davinci模型的更新過程,使用我們的數(shù)據(jù)。這個微調(diào)過程可能需要一些時間,但完成后,您將擁有一個適合您任務的新模型。微調(diào)所需的時間主要取決于數(shù)據(jù)集中的示例數(shù)量、示例中的標記數(shù)量以及您選擇的基礎(chǔ)模型。為了讓您了解微調(diào)所需的時間,我們的示例中不到五分鐘就完成了。但是,我們也看到一些情況下微調(diào)需要超過 30 分鐘:

$ openai api fine_tunes.create -t out_openai_completion_prepared.jsonl \ 
                -m davinci --suffix "direct_marketing"

Upload progress: 100%|| 40.8k/40.8k [00:00<00:00, 65.5Mit/s]
Uploaded file from out_openai_completion_prepared.jsonl: file-z5mGg(...)
Created fine-tune: ft-mMsm(...)
Streaming events until fine-tuning is complete...
(Ctrl-C will interrupt the stream, but not cancel the fine-tune)
[] Created fine-tune: ft-mMsm(...)
[] Fine-tune costs $0.84
[] Fine-tune enqueued. Queue number: 0
[] Fine-tune started
[] Completed epoch 1/4
[] Completed epoch 2/4
[] Completed epoch 3/4
[] Completed epoch 4/4
警告

正如終端中的消息所解釋的那樣,您可以通過在命令行中鍵入 Ctrl+C 來斷開與 OpenAI 服務器的連接,但這不會中斷微調(diào)過程。

要重新連接到服務器并獲取正在運行的微調(diào)作業(yè)的狀態(tài),可以使用以下命令fine_tunes.follow,其中fine_tune_id是微調(diào)作業(yè)的 ID:

$ openai api fine_tunes.follow -i ***fine_tune_id***

當您創(chuàng)建工作時,會得到此 ID。在我們之前的示例中,我們的fine_tune_idft-mMsm(...) 。如果您丟失了fine_tune_id,可以通過以下方式顯示所有模型:

$ openai api fine_tunes.list

要立即取消微調(diào)作業(yè),請使用此命令:

$ openai api fine_tunes.cancel -i ***fine_tune_id***

要刪除微調(diào)作業(yè),請使用此命令:

$ openai api fine_tunes.delete -i ***fine_tune_id***

使用微調(diào)模型進行文本完成

構(gòu)建新模型后,可以通過不同的方式訪問它以進行新的完成。測試它的最簡單方法可能是通過游樂場。要在此工具中訪問您的模型,可以在游樂場界面右側(cè)的下拉菜單中搜索它們(請參見圖 4-4)。所有您微調(diào)的模型都在此列表的底部。選擇模型后,可以使用它進行預測。

圖 4-4。在游樂場中使用微調(diào)模型

我們在以下示例中使用了微調(diào)的 LLM,輸入提示為Hotel, New York, small ->。沒有進一步的說明,模型自動生成了一則廣告,以出售紐約的小型酒店的電子商務支付服務。

我們已經(jīng)使用了一個僅包含 162 個示例的小數(shù)據(jù)集獲得了出色的結(jié)果。對于微調(diào)任務,通常建議有幾百個實例,最好是幾千個。此外,我們的訓練集是通過合成生成的,理想情況下應該由營銷專家編寫。

要將其與 OpenAI API 一起使用,我們按照以前的方式進行,使用openai.Completion.?cre?ate(),只是需要使用我們的新模型的名稱作為輸入?yún)?shù)。不要忘記以->結(jié)束所有提示,并將\n設(shè)置為停用詞:

openai.Completion.create(
  model="davinci:ft-book:direct-marketing-2023-05-01-15-20-35",
  prompt="Hotel, New York, small ->",
  max_tokens=100,
  temperature=0,
  stop="\n"
)

我們得到了以下答案:

<OpenAIObject text_completion id=cmpl-7BTkrdo(...) at 0x7f2(4ca5c220> JSON: {
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "text": " \"Upgrade your hotel's payment system with our new e-commerce \ 
service, designed for small businesses.
    }
  ],
  "created": 1682970309,
  "id": "cmpl-7BTkrdo(...)",
  "model": "davinci:ft-book:direct-marketing-2023-05-01-15-20-35",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 37,
    "prompt_tokens": 8,
    "total_tokens": 45
  }
}

正如我們所展示的,微調(diào)可以使 Python 開發(fā)人員根據(jù)其獨特的業(yè)務需求定制 LLM,特別是在我們的電子郵件營銷示例等動態(tài)領(lǐng)域。這是一種定制語言模型的強大方法,可以幫助您更好地為客戶服務并推動業(yè)務增長。 ##微調(diào)成本

使用微調(diào)模型是昂貴的。首先,您必須為培訓付費,一旦模型準備就緒,每次預測都會比使用 OpenAI 提供的基本模型多一點。

價格可能會有所變化,但在撰寫本文時,看起來像是表 4-2。

表 4-2。撰寫本書時微調(diào)模型的定價

模型 培訓 用法
ada 每 1,000 個標記 0.0004 美元 每 1,000 個標記 0.0016 美元
babbage 每 1,000 個標記 0.0006 美元 每 1,000 個標記 0.0024 美元
curie 每 1,000 個標記 0.0030 美元 每 1,000 個標記 0.0120 美元
davinci 每 1,000 個標記 0.0300 美元 每 1,000 個標記 0.1200 美元

作為比較,gpt-3.5-turbo模型的價格為每 1,000 個標記 0.002 美元。如前所述,gpt-3.5-turbo具有最佳的性價比。

要獲取最新價格,請訪問OpenAI 定價頁面。 #摘要

本章討論了解鎖 GPT-4 和 ChatGPT 的全部潛力的高級技術(shù),并提供了關(guān)鍵的可操作的要點,以改進使用 LLM 開發(fā)應用程序。

開發(fā)人員可以通過了解 prompt 工程、零-shot 學習、few-shot 學習和微調(diào)來創(chuàng)建更有效和有針對性的應用程序。我們探討了如何通過考慮上下文、任務和角色來創(chuàng)建有效的提示,從而實現(xiàn)與模型更精確的交互。通過逐步推理,開發(fā)人員可以鼓勵模型更有效地推理和處理復雜任務。此外,我們討論了 few-shot 學習提供的靈活性和適應性,突出了其數(shù)據(jù)高效的特性和快速適應不同任務的能力。

表 4-3 提供了所有這些技術(shù)的快速摘要,何時使用它們以及它們的比較。

表 4-3。不同技術(shù)的比較

零-shot 學習 few-shot 學習 prompt 工程技巧 微調(diào)
定義 預測沒有先前示例的未見任務 提示包括輸入和期望的輸出示例 可包括上下文、角色和任務的詳細提示,或者“逐步思考”等技巧 模型在更小、更具體的數(shù)據(jù)集上進一步訓練;使用的提示很簡單
用例 簡單任務 定義明確但復雜的任務,通常具有特定的輸出格式 創(chuàng)造性、復雜的任務 高度復雜的任務
數(shù)據(jù) 不需要額外的示例數(shù)據(jù) 需要一些示例 數(shù)據(jù)量取決于 prompt 工程技術(shù) 需要大型訓練數(shù)據(jù)集
定價 使用:每個令牌(輸入+輸出)的定價 使用:每個令牌(輸入+輸出)的定價;可能導致長提示 使用:每個令牌(輸入+輸出)的定價,可能導致長提示 訓練:使用:每個令牌(輸入+輸出)的定價,與 GPT-3.5 Turbo 相比,fine-tuned davinci大約貴 80 倍。這意味著如果其他技術(shù)導致提示長度增加 80 倍,經(jīng)濟上更傾向于進行微調(diào)。
結(jié)論 默認使用 如果零-shot 學習不起作用,因為輸出需要特定的話,使用 few-shot 學習。 如果零-shot 學習不起作用,因為任務太復雜,嘗試 prompt 工程。 如果您有一個非常具體和大型的數(shù)據(jù)集,其他解決方案效果不夠好,這應該作為最后的手段。

為了確保構(gòu)建 LLM 應用程序的成功,開發(fā)人員應該嘗試其他技術(shù),并評估模型的響應是否準確和相關(guān)。此外,開發(fā)人員應該意識到 LLM 的計算限制,并相應地調(diào)整他們的提示以獲得更好的結(jié)果。通過整合這些先進技術(shù)并不斷完善他們的方法,開發(fā)人員可以創(chuàng)建功能強大和創(chuàng)新的應用程序,釋放 GPT-4 和 ChatGPT 的真正潛力。

在下一章中,您將發(fā)現(xiàn)將 LLM 功能集成到您的應用程序中的另外兩種方法:插件和 LangChain 框架。這些工具使開發(fā)人員能夠創(chuàng)建創(chuàng)新的應用程序,訪問最新信息,并簡化集成 LLM 的應用程序的開發(fā)。我們還將提供關(guān)于 LLM 未來及其對應用程序開發(fā)的影響的見解。

第五章:通過 LangChain 框架和插件提升 LLM 功能

本章探討了 LangChain 框架和 GPT-4 插件的世界。我們將看看 LangChain 如何實現(xiàn)與不同語言模型的交互,以及插件在擴展 GPT-4 功能方面的重要性。這些高級知識將對依賴 LLM 的復雜、尖端應用程序的開發(fā)至關(guān)重要。

LangChain 框架

LangChain 是一個專門用于開發(fā) LLM 驅(qū)動應用程序的新框架。您會發(fā)現(xiàn),集成 LangChain 的代碼比第三章中提供的示例更加優(yōu)雅。該框架還提供了許多額外的可能性。

使用pip install langchain可以快速輕松地安裝 LangChain。

警告

在撰寫本文時,LangChain 仍處于 beta 版本 0.0.2XX,幾乎每天都會發(fā)布新版本。功能可能會發(fā)生變化,因此我們建議在使用該框架時謹慎操作。

LangChain 的關(guān)鍵功能被分為模塊,如圖 5-1 所示。

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章,人工智能,chatgpt

圖 5-1。LangChain 模塊

以下是這些模塊的簡要描述:

模型

模型模塊是 LangChain 提供的標準接口,通過它可以與各種 LLM 進行交互。該框架支持來自各種提供商的不同模型類型集成,包括 OpenAI、Hugging Face、Cohere、GPT4All 等。

提示

提示正在成為編程 LLM 的新標準。提示模塊包括許多用于提示管理的工具。

索引

該模塊允許您將 LLM 與您的數(shù)據(jù)結(jié)合起來。

通過這個模塊,LangChain 提供了鏈接口,允許您創(chuàng)建一個調(diào)用序列,結(jié)合多個模型或提示。

代理

代理模塊介紹了代理接口。代理是一個可以處理用戶輸入、做出決策并選擇適當工具來完成任務的組件。它是迭代工作的,采取行動直到達到解決方案。

內(nèi)存

內(nèi)存模塊允許您在鏈或代理調(diào)用之間保持狀態(tài)。默認情況下,鏈和代理是無狀態(tài)的,這意味著它們獨立處理每個傳入請求,就像 LLM 一樣。

LangChain 是不同 LLM 的通用接口;您可以在其文檔頁面上查看所有的集成。OpenAI 和許多其他 LLM 提供商都在這個集成列表中。這些集成大多需要它們的 API 密鑰來建立連接。對于 OpenAI 模型,您可以像我們在第二章中看到的那樣進行設(shè)置,將密鑰設(shè)置在OPENAI_API_KEY環(huán)境變量中。

動態(tài)提示

展示 LangChain 工作原理的最簡單方法是向您呈現(xiàn)一個簡單的腳本。在這個例子中,使用 OpenAI 和 LangChain 來完成一個簡單的文本補全:

from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
template = """Question: {question} `Let's think step by step.`
`Answer: """`
`prompt` `=` `PromptTemplate``(``template``=``template``,` `input_variables``=``[``"question"``])`
`llm` `=` `ChatOpenAI``(``model_name``=``"gpt-4"``)`
`llm_chain` `=` `LLMChain``(``prompt``=``prompt``,` `llm``=``llm``)`
`question` `=` `""" What is the population of the capital of the country where the`
`Olympic Games were held in 2016? """`
`llm_chain``.``run``(``question``)`

輸出如下:

Step 1: Identify the country where the Olympic Games were held in 2016.
Answer: The 2016 Olympic Games were held in Brazil.
Step 2: Identify the capital of Brazil.
Answer: The capital of Brazil is Brasília.
Step 3: Find the population of Brasília.
Answer: As of 2021, the estimated population of Brasília is around 3.1 million.
So, the population of the capital of the country where the Olympic Games were 
held in 2016 is around 3.1 million. Note that this is an estimate and may
vary slightly.'

PromptTemplate負責構(gòu)建模型的輸入。因此,它是生成提示的可重復方式。它包含一個稱為模板的輸入文本字符串,其中的值可以通過input_variables指定。在我們的示例中,我們定義的提示自動將“讓我們逐步思考”部分添加到問題中。

本例中使用的 LLM 是 GPT-4;目前,默認模型是gpt-3.5-turbo。該模型通過ChatOpenAI()函數(shù)放置在變量llm中。該函數(shù)假定 OpenAI API 密鑰設(shè)置在環(huán)境變量OPENAI_API_KEY中,就像在前幾章的示例中一樣。

函數(shù)LLMChain()將提示和模型組合在一起,形成一個包含這兩個元素的鏈。最后,我們需要調(diào)用run()函數(shù)來請求使用輸入問題完成。當執(zhí)行run()函數(shù)時,LLMChain使用提供的輸入鍵值(如果可用,還使用內(nèi)存鍵值)格式化提示模板,將格式化的字符串傳遞給 LLM,最后返回 LLM 輸出。我們可以看到,模型通過應用“讓我們一步一步地思考”規(guī)則自動回答問題。

正如您所看到的,動態(tài)提示是復雜應用和更好的提示管理的一個簡單但非常有價值的功能。## 代理和工具

代理和工具是 LangChain 框架的關(guān)鍵功能:它們可以使您的應用程序變得非常強大。它們使您能夠通過使 LLMs 執(zhí)行操作并與各種功能集成來解決復雜問題。

工具是圍繞一個函數(shù)的特定抽象,使語言模型更容易與之交互。代理可以使用工具與世界進行交互。具體而言,工具的接口具有單個文本輸入和單個文本輸出。LangChain 中有許多預定義的工具。這些工具包括 Google 搜索、維基百科搜索、Python REPL、計算器、世界天氣預報 API 等。要獲取完整的工具列表,請查看 LangChain 提供的工具頁面的文檔。您還可以構(gòu)建自定義工具并將其加載到您正在使用的代理中:這使得代理非常靈活和強大。

正如我們在第四章中所學到的,“讓我們一步一步地思考”在提示中,可以在某種程度上增加模型的推理能力。將這個句子添加到提示中,要求模型花更多時間來回答問題。

在本節(jié)中,我們介紹了一個適用于需要一系列中間步驟的應用程序的代理。代理安排這些步驟,并可以訪問各種工具,決定使用哪個工具以有效地回答用戶的查詢。在某種程度上,就像“讓我們一步一步地思考”一樣,代理將有更多的時間來規(guī)劃其行動,從而能夠完成更復雜的任務。

代理的高級偽代碼如下:

  1. 代理從用戶那里接收一些輸入。

  2. 代理決定使用什么工具(如果有的話)以及輸入到該工具的文本。

  3. 然后,該工具使用該輸入文本進行調(diào)用,并從該工具接收一個輸出文本。

  4. 工具的輸出被饋送到代理的上下文中。

  5. 步驟 2 到 4 重復進行,直到代理決定不再需要使用工具,然后直接回應用戶。

您可能會注意到,這似乎接近我們在第三章中所做的事情,例如可以回答問題并執(zhí)行操作的個人助理的示例。LangChain 代理允許您開發(fā)這種行為……但更加強大。

為了更好地說明代理如何在 LangChain 中使用工具,圖 5-2 提供了對交互的視覺演示。

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章,人工智能,chatgpt

圖 5-2. LangChain 中代理和工具的交互

對于這一部分,我們希望能夠回答以下問題:2016 年奧運會舉辦國家的首都人口的平方根是多少?這個問題并沒有真正的興趣,但它很好地演示了 LangChain 代理和工具如何為 LLMs 增加推理能力。

如果我們直接向 GPT-3.5 Turbo 提出這個問題,我們會得到以下回答:

The capital of the country where the Olympic Games were held in 2016 is Rio de
Janeiro, Brazil. The population of Rio de Janeiro is approximately 6.32 million
people as of 2021\. Taking the square root of this population, we get 
approximately 2,513.29\. Therefore, the square root of the population of 
the capital of the country where the Olympic Games were held in 2016 is
approximately 2,513.29.

這個答案在兩個層面上是錯誤的:巴西的首都是巴西利亞,而不是里約熱內(nèi)盧,632 萬的平方根是 2513.96。通過添加“逐步思考”或使用其他提示工程技術(shù),我們可能能夠獲得更好的結(jié)果,但由于模型在推理和數(shù)學運算方面的困難,仍然很難相信結(jié)果。使用 LangChain 可以更好地保證準確性。

以下代碼給出了一個簡單的例子,說明了代理如何在 LangChain 中使用兩個工具:維基百科和計算器。在通過load_tools()函數(shù)創(chuàng)建工具之后,使用initialize_agent()函數(shù)創(chuàng)建代理。代理的推理需要 LLM;在這里,使用了 GPT-3.5 Turbo。參數(shù)zero-shot-react-description定義了代理在每一步選擇工具的方式。通過將verbose值設(shè)置為true,我們可以查看代理的推理,并理解它是如何得出最終決定的:

from langchain.chat_models import ChatOpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
tools = load_tools(["wikipedia", "llm-math"], llm=llm)
agent = initialize_agent(
    tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
question = """What is the square root of the population of the capital of the
Country where the Olympic Games were held in 2016?"""
agent.run(question)
注意

要運行維基百科工具,需要安裝相應的 Python 包wikipedia??梢允褂?code>pip install wikipedia來完成。

正如你所看到的,代理決定查詢維基百科關(guān)于 2016 年夏季奧運會的信息:

> Entering new chain...
I need to find the country where the Olympic Games were held in 2016 and then find
the population of its capital city. Then I can take the square root of that population.
Action: Wikipedia
Action Input: "2016 Summer Olympics"
Observation: Page: 2016 Summer Olympics
[...]

輸出的下幾行包含了維基百科關(guān)于奧運會的摘錄。接下來,代理使用了維基百科工具兩次:

Thought:I need to search for the capital city of Brazil.
Action: Wikipedia
Action Input: "Capital of Brazil"
Observation: Page: Capitals of Brazil
Summary: The current capital of Brazil, since its construction in 1960, is
Brasilia. [...]
Thought: I have found the capital city of Brazil, which is Brasilia. Now I need 
to find the population of Brasilia.
Action: Wikipedia
Action Input: "Population of Brasilia"
Observation: Page: Brasilia
[...]

作為下一步,代理使用了計算器工具:

Thought: I have found the population of Brasilia, but I need to calculate the
square root of that population.
Action: Calculator
Action Input: Square root of the population of Brasilia (population: found in 
previous observation)
Observation: Answer: 1587.051038876822

最后:

Thought:I now know the final answer
Final Answer: The square root of the population of the capital of the country
where the Olympic Games were held in 2016 is approximately 1587.
> Finished chain.

正如你所看到的,代理展示了復雜的推理能力:在得出最終答案之前,它完成了四個不同的步驟。LangChain 框架允許開發(fā)人員只需幾行代碼就能實現(xiàn)這種推理能力。

提示

雖然可以使用多個 LLM 作為代理,而 GPT-4 是其中最昂貴的,但我們經(jīng)驗上發(fā)現(xiàn)對于復雜問題,使用 GPT-4 可以獲得更好的結(jié)果;我們觀察到當使用較小的模型進行代理推理時,結(jié)果可能很快變得不一致。您可能還會因為模型無法以預期格式回答而收到錯誤。

記憶

在某些應用中,記住以前的交互在短期和長期內(nèi)都是至關(guān)重要的。使用 LangChain,您可以輕松地向鏈和代理添加狀態(tài)以管理記憶。構(gòu)建聊天機器人是這種能力最常見的例子。您可以使用ConversationChain很快地完成這個過程,基本上只需幾行代碼就可以將語言模型轉(zhuǎn)化為聊天工具。

以下代碼使用text-ada-001模型制作了一個聊天機器人。這是一個能夠執(zhí)行基本任務的小型模型。然而,它是 GPT-3 系列中最快的模型,成本最低。這個模型從未被微調(diào)成為聊天機器人,但我們可以看到,只需兩行代碼,我們就可以使用 LangChain 來使用這個簡單的完成模型進行聊天:

from langchain import OpenAI, ConversationChain
chatbot_llm = OpenAI(model_name='text-ada-001')
chatbot = ConversationChain(llm=chatbot_llm , verbose=True)
chatbot.predict(input='Hello')

在上述代碼的最后一行,我們執(zhí)行了predict(input='Hello')。這導致聊天機器人被要求回復我們的Hello消息。正如你所看到的,模型的回答是:


> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is
talkative and provides lots of specific details from its context. If the AI
does not know the answer to a question, it truthfully says it does not know.
Current conversation:
Human: Hello
AI:
> Finished chain.
' Hello! How can I help you?'

由于在ConversationChain中使用了verbose=True,我們可以查看 LangChain 使用的完整提示。當我們執(zhí)行predict(input='Hello')時,LLMtext-ada-001接收到的不僅僅是'Hello'消息,而是一個完整的提示,位于> Entering new ConversationChain chain…> Finished chain標簽之間。

如果我們繼續(xù)對話,你會發(fā)現(xiàn)這個函數(shù)會在提示中保留對話歷史。如果我們問“我可以問你一個問題嗎?你是人工智能嗎?”對話的歷史也會出現(xiàn)在提示中:

> Entering new ConversationChain chain...
Prompt after formatting:
The following [...] does not know.
Current conversation:
Human: Hello
AI:  Hello! How can I help you?
Human: Can I ask you a question? Are you an AI?
AI:
> Finished chain.
'\n\nYes, I am an AI.'

ConversationChain對象使用提示工程技術(shù)和記憶技術(shù),將任何進行文本完成的 LLM 轉(zhuǎn)化為聊天工具。

警告

即使這個 LangChain 功能允許所有語言模型具有聊天功能,但這個解決方案并不像gpt-3.5-turbogpt-4這樣強大,后者已經(jīng)專門針對聊天進行了優(yōu)化。此外,OpenAI 已宣布廢棄text-ada-001。

嵌入

將語言模型與您自己的文本數(shù)據(jù)相結(jié)合是個性化應用程序中使用的模型知識的強大方式。其原理與第三章中討論的相同:第一步是信息檢索,指的是獲取用戶的查詢并返回最相關(guān)的文檔。然后將文檔發(fā)送到模型的輸入上下文中,要求其回答查詢。本節(jié)展示了如何使用 LangChain 和嵌入來輕松實現(xiàn)這一點。

LangChain 中一個重要的模塊是document_loaders。使用這個模塊,您可以快速將文本數(shù)據(jù)從不同的來源加載到您的應用程序中。例如,您的應用程序可以加載 CSV 文件、電子郵件、PowerPoint 文檔、Evernote 筆記、Facebook 聊天、HTML 頁面、PDF 文檔以及許多其他格式。完整的加載器列表可在官方文檔中找到。每個加載器都非常容易設(shè)置。本示例重用了探險者指南:塞爾達傳說:荒野之息的 PDF。

如果 PDF 文件在當前工作目錄中,以下代碼加載其內(nèi)容并按頁面進行劃分:

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("ExplorersGuide.pdf")
pages = loader.load_and_split()
注意

要使用 PDF 加載程序,需要安裝 Python 的pypdf包??梢允褂?code>pip install pypdf來完成。

要進行信息檢索,需要嵌入每個加載的頁面。正如我們在第二章中討論的那樣,嵌入是信息檢索中使用的一種技術(shù),用于將非數(shù)值概念(如單詞、標記和句子)轉(zhuǎn)換為數(shù)值向量。嵌入使模型能夠有效地處理這些概念之間的關(guān)系。使用 OpenAI 的嵌入端點,開發(fā)人員可以獲得輸入文本的數(shù)值向量表示,而 LangChain 有一個包裝器來調(diào)用這些嵌入:

from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
注意

要使用OpenAIEmbeddings,請使用pip install tiktoken安裝tiktoken Python 包。

索引保存頁面的嵌入并使搜索變得容易。LangChain 以向量數(shù)據(jù)庫為中心。可以在許多向量數(shù)據(jù)庫中進行選擇;完整的列表可在官方文檔中找到。以下代碼片段使用了FAISS 向量數(shù)據(jù)庫,這是 Meta 的基礎(chǔ) AI 研究小組主要開發(fā)的相似性搜索庫:

from langchain.vectorstores import FAISS
db = FAISS.from_documents(pages, embeddings)
注意

要使用 FAISS,需要使用pip install faiss-cpu安裝faiss-cpu Python 包。

為了更好地說明 PDF 文檔的內(nèi)容是如何轉(zhuǎn)換為嵌入頁面并存儲在 FAISS 向量數(shù)據(jù)庫中的,圖 5-3 以可視化方式總結(jié)了這個過程。

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章,人工智能,chatgpt

圖 5-3. 從 PDF 文檔創(chuàng)建和保存嵌入

現(xiàn)在可以輕松搜索相似之處了:

q = "What is Link's traditional outfit color?"
db.similarity_search(q)[0]

從前面的代碼中,我們得到以下內(nèi)容:

Document(page_content='While Link’s traditional green `tunic` `is` `certainly` `an` `iconic` `look``,` `his` 
              `wardrobe` `has` `expanded` `[``...``]` `Dress` `for` `Success``',` ``metadata``=``{``'source'``:` `'ExplorersGuide.pdf'``,` `'page'``:` `35``})`` 

``問題的答案是林克的傳統(tǒng)服裝顏色是綠色,我們可以看到答案在所選內(nèi)容中。輸出顯示答案在ExplorersGuide.pdf的第 35 頁。請記住,Python 從零開始計數(shù);因此,如果返回到探險者指南:塞爾達傳說:荒野之息的原始 PDF 文件,解決方案在第 36 頁(而不是第 35 頁)。

圖 5-4 顯示了信息檢索過程如何使用查詢的嵌入和向量數(shù)據(jù)庫來識別與查詢最相似的頁面。

圖 5-4。信息檢索尋找與查詢最相似的頁面

您可能希望將您的嵌入式信息集成到您的聊天機器人中,以便在回答您的問題時使用它檢索到的信息。同樣,在 LangChain 中,這只需要幾行代碼就可以輕松完成。我們使用RetrievalQA,它以 LLM 和向量數(shù)據(jù)庫作為輸入。然后我們以通常的方式向獲得的對象提問:

from langchain.chains import RetrievalQA
from langchain import OpenAI
llm = OpenAI()
chain = RetrievalQA.from_llm(llm=llm, retriever=db.as_retriever())
q = "What is Link's traditional outfit color?"
chain(q, return_only_outputs=True)

我們得到了以下答案:

{'result': " Link's traditional outfit color is green."}

圖 5-5 展示了RetrievalQA如何使用信息檢索來回答用戶的問題。正如我們在這個圖中看到的,“創(chuàng)建上下文”將信息檢索系統(tǒng)找到的頁面和用戶的初始查詢組合在一起。然后將這個豐富的上下文發(fā)送給語言模型,語言模型可以使用上下文中添加的額外信息來正確回答用戶的問題。

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章,人工智能,chatgpt

圖 5-5。為了回答用戶的問題,檢索到的信息被添加到 LLM 的上下文中

您可能會想知道為什么在將信息從文檔發(fā)送到語言模型的上下文之前需要進行信息檢索。事實上,當前的語言模型無法考慮到具有數(shù)百頁的大文件。因此,如果輸入數(shù)據(jù)太大,我們會對其進行預過濾。這就是信息檢索過程的任務。在不久的將來,隨著輸入上下文的增加,可能會出現(xiàn)一些情況,使用信息檢索技術(shù)可能不是技術(shù)上必要的。

GPT-4 插件

雖然語言模型,包括 GPT-4,在各種任務中都證明了其幫助性,但它們也存在固有的局限性。例如,這些模型只能從它們所訓練的數(shù)據(jù)中學習,這些數(shù)據(jù)通常已經(jīng)過時或不適用于特定的應用。此外,它們的能力僅限于文本生成。我們也看到 LLMs 無法完成一些任務,比如復雜的計算。

本節(jié)重點介紹了 GPT-4 的一個突破性功能:插件(請注意,GPT-3.5 模型無法訪問插件功能)。在 AI 的發(fā)展過程中,插件已經(jīng)成為一種重新定義與 LLMs 交互的新型變革工具。插件的目標是為 LLM 提供更廣泛的功能,使模型能夠訪問實時信息,執(zhí)行復雜的數(shù)學計算,并利用第三方服務。

我們在第一章](ch01.html#gpt_4_and_chatgpt_essentials)中看到,該模型無法執(zhí)行復雜的計算,比如 3,695 × 123,548。在[圖 5-6 中,我們激活了計算器插件,我們可以看到當模型需要進行計算時,模型會自動調(diào)用計算器,從而使其找到正確的解決方案。

通過迭代部署方法,OpenAI 逐步向 GPT-4 添加插件,這使 OpenAI 能夠考慮插件的實際用途以及可能引入的安全性和定制化挑戰(zhàn)。雖然自 2023 年 5 月以來,所有付費用戶都可以使用插件,但在撰寫本文時,尚未為所有開發(fā)人員提供創(chuàng)建新插件的功能。

使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章,人工智能,chatgpt

圖 5-6。GPT-4 使用計算器插件

OpenAI 的目標是創(chuàng)建一個生態(tài)系統(tǒng),插件可以幫助塑造人工智能與人類互動的未來動態(tài)。今天,一家嚴肅的企業(yè)沒有自己的網(wǎng)站是不可想象的,但也許很快,每家公司都需要有自己的插件。事實上,一些早期的插件已經(jīng)由 Expedia、FiscalNote、Instacart、KAYAK、Klarna、Milo、OpenTable、Shopify 和 Zapier 等公司推出。

除了其主要功能外,插件還以多種方式擴展了 GPT-4 的功能。在某種程度上,插件與“LangChain 框架”中討論的代理和工具存在一些相似之處。例如,插件可以使 LLM 檢索實時信息,如體育比分和股票價格,從知識庫中提取數(shù)據(jù),如公司文件,并根據(jù)用戶的需求執(zhí)行任務,如預訂航班或訂餐。兩者都旨在幫助 AI 訪問最新信息并進行計算。然而,GPT-4 中的插件更專注于第三方服務,而不是 LangChain 的工具。

本節(jié)通過探索 OpenAI 網(wǎng)站上提供的示例的關(guān)鍵點,介紹了創(chuàng)建插件的基本概念。我們將以待辦事項定義插件的示例為例。插件仍處于有限的測試版階段,因此我們在撰寫本書時鼓勵讀者訪問OpenAI 參考頁面獲取最新信息。還要注意,在測試版階段,用戶必須在 ChatGPT 的用戶界面中手動啟用他們的插件,作為開發(fā)者,您最多可以與 100 名用戶分享您的插件。

概述

作為插件開發(fā)者,您必須創(chuàng)建一個 API,并將其與兩個描述性文件關(guān)聯(lián)起來:一個插件清單和一個 OpenAPI 規(guī)范。當用戶開始與 GPT-4 進行交互時,如果安裝了您的插件,OpenAI 會向 GPT 發(fā)送一個隱藏的消息。這條消息簡要介紹了您的插件,包括其描述、端點和示例。

然后,模型變成了一個智能的 API 調(diào)用者。當用戶詢問有關(guān)您的插件的問題時,模型可以調(diào)用您的插件 API。調(diào)用插件的決定是基于 API 規(guī)范和自然語言描述您的 API 應該在何種情況下使用。一旦模型決定調(diào)用您的插件,它會將 API 結(jié)果合并到其上下文中,以向用戶提供響應。因此,插件的 API 響應必須返回原始數(shù)據(jù),而不是自然語言響應。這使得 GPT 可以根據(jù)返回的數(shù)據(jù)生成自己的自然語言響應。

例如,如果用戶問“我應該在紐約住在哪里?”,模型可以使用酒店預訂插件,然后將插件的 API 響應與其語言生成能力結(jié)合起來,提供既信息豐富又用戶友好的答案。

API

以下是在OpenAI 的 GitHub上提供的待辦事項定義插件的簡化代碼示例:

import json
import quart
import quart_cors
from quart import request
app = quart_cors.cors(
    quart.Quart(__name__), allow_origin="https://chat.openai.com"
)
# Keep track of todo's. Does not persist if Python session is restarted.
_TODOS = {}
@app.post("/todos/<string:username>")
async def add_todo(username):
    request = await quart.request.get_json(force=True)
    if username not in _TODOS:
        _TODOS[username] = []
    _TODOS[username].append(request["todo"])
    return quart.Response(response="OK", status=200)
@app.get("/todos/<string:username>")
async def get_todos(username):
    return quart.Response(
        response=json.dumps(_TODOS.get(username, [])), status=200
    )
@app.get("/.well-known/ai-plugin.json")
async def plugin_manifest():
    host = request.headers["Host"]
    with open("./.well-known/ai-plugin.json") as f:
        text = f.read()
        return quart.Response(text, mimetype="text/json")
@app.get("/openapi.yaml")
async def openapi_spec():
    host = request.headers["Host"]
    with open("openapi.yaml") as f:
        text = f.read()
        return quart.Response(text, mimetype="text/yaml")
def main():
    app.run(debug=True, host="0.0.0.0", port=5003)
if __name__ == "__main__":
    main()

這段 Python 代碼是一個管理待辦事項列表的簡單插件的示例。首先,變量app使用quart_cors.cors()進行初始化。這行代碼創(chuàng)建了一個新的 Quart 應用程序,并配置它以允許來自https://chat.openai.com的跨域資源共享(CORS)。Quart 是一個 Python Web 微框架,Quart-CORS 是一個允許對 CORS 進行控制的擴展。這個設(shè)置允許插件與指定 URL 上托管的 ChatGPT 應用程序進行交互。

然后,代碼定義了幾個 HTTP 路由,對應于待辦事項插件的不同功能:add_todo函數(shù),關(guān)聯(lián)一個POST請求,以及get_todos函數(shù),關(guān)聯(lián)一個GET請求。

接下來,定義了兩個額外的端點:plugin_manifestopenapi_spec。這些端點提供了插件的清單文件和 OpenAPI 規(guī)范,這對于 GPT-4 和插件之間的交互至關(guān)重要。這些文件包含了關(guān)于插件及其 API 的詳細信息,GPT-4 使用這些信息來了解何時以及如何使用插件。

插件清單

每個插件都需要在 API 的域上有一個 ai-plugin.json 文件。例如,如果您的公司在 thecompany.com 上提供服務,您必須在 https://thecompany.com/.well-known 上托管此文件。在安裝插件時,OpenAI 將在 /.well-known/ai-plugin.json 中查找此文件。沒有這個文件,插件就無法安裝。

以下是所需的 ai-plugin.json 文件的最小定義:

{
    "schema_version": "v1",
    "name_for_human": "TODO Plugin",
    "name_for_model": "todo",
    "description_for_human": "Plugin for managing a TODO list. \
        You can add, remove and view your TODOs.",
    "description_for_model": "Plugin for managing a TODO list. \
        You can add, remove and view your TODOs.",
    "auth": {
        "type": "none"
    },
    "api": {
        "type": "openapi",
        "url": "http://localhost:3333/openapi.yaml",
        "is_user_authenticated": false
    },
    "logo_url": "http://localhost:3333/logo.png",
    "contact_email": "support@thecompany.com",
    "legal_info_url": "http://www.thecompany.com/legal"
}      

字段在 表 5-1 中詳細說明。

表 5-1. ai-plugin.json 文件 中所需字段的描述

字段名稱 類型 描述
name_for_model String 模型用于了解您的插件的簡稱。它只能包含字母和數(shù)字,且不得超過 50 個字符。
name_for_human String 人們看到的名稱。它可以是您公司的全名,但必須少于 20 個字符。
description_for_human String 您的插件功能的簡單解釋。供人們閱讀,應少于 100 個字符。
description_for_model String 詳細的解釋,幫助 AI 理解您的插件。因此,向模型解釋插件的目的至關(guān)重要。描述可以長達 8,000 個字符。
logo_url String 您的插件標志的 URL。標志理想情況下應為 512 × 512 像素。
contact_email String 人們可以使用的電子郵件地址,如果他們需要幫助。
legal_info_url String 一個網(wǎng)址,讓用戶找到有關(guān)您的插件的更多詳細信息。

OpenAPI 規(guī)范

創(chuàng)建插件的下一步是使用 API 規(guī)范創(chuàng)建 openapi.yaml 文件。此文件必須遵循 OpenAPI 標準(參見 “理解 OpenAPI 規(guī)范”)。GPT 模型只通過此 API 規(guī)范文件和清單文件中詳細的信息來了解您的 API。

以下是待辦事項清單定義插件的 openapi.yaml 文件的第一行的示例:

openapi: 3.0.1
info:
  title: TODO Plugin
  description: A plugin that allows the user to create and manage a TODO list
  using ChatGPT. If you do not know the user's username, ask them first before
  making queries to the plugin. Otherwise, use the username "global".
  version: 'v1'
servers:
  - url: http://localhost:5003
paths:
  /todos/{username}:
    get:
      operationId: getTodos
      summary: Get the list of todos
      parameters:
      - in: path
        name: username
        schema:
            type: string
        required: true
        description: The name of the user.
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/getTodosResponse'
[...]

將 OpenAPI 規(guī)范視為足夠自身理解和使用您的 API 的描述性文檔。在 GPT-4 中進行搜索時,信息部分中的描述用于確定插件與用戶搜索的相關(guān)性。其余的 OpenAPI 規(guī)范遵循標準的 OpenAPI 格式。許多工具可以根據(jù)您現(xiàn)有的 API 代碼或反之自動生成 OpenAPI 規(guī)范。

描述

當用戶的請求可能受益于插件時,模型會啟動對 OpenAPI 規(guī)范中的端點描述以及清單文件中的 description_for_model 屬性的掃描。您的目標是創(chuàng)建最合適的響應,這通常涉及測試不同的請求和描述。

OpenAPI 文檔應提供有關(guān) API 的廣泛信息,例如可用函數(shù)及其各自的參數(shù)。它還應包含特定于屬性的“描述”字段,提供有價值的、自然書寫的解釋,說明每個函數(shù)的作用以及查詢字段期望的信息類型。這些描述指導模型最合適地使用 API。

這個過程中的一個關(guān)鍵元素是 description_for_model 屬性。這為您提供了一種方式來告知模型如何使用插件。創(chuàng)建簡潔、清晰和描述性的說明是非常推薦的。

然而,在編寫這些描述時遵循某些最佳實踐是必不可少的:

  • 不要試圖影響 GPT 的情緒、個性或確切的響應。

  • 避免指示 GPT 使用特定的插件,除非用戶明確請求該類別的服務。

  • 不要指定 GPT 使用插件的特定觸發(fā)器,因為它被設(shè)計為自主確定何時使用插件是合適的。

簡而言之,開發(fā) GPT-4 插件涉及創(chuàng)建 API,指定其在 OpenAPI 規(guī)范中的行為,并在清單文件中描述插件及其用法。通過這種設(shè)置,GPT-4 可以有效地充當智能 API 調(diào)用者,擴展其能力超越文本生成。

總結(jié)

LangChain 框架和 GPT-4 插件代表了最大程度發(fā)揮 LLM 潛力的重大進步。

LangChain 憑借其強大的工具和模塊套件,已成為 LLM 領(lǐng)域的中心框架。它在集成不同模型、管理提示、組合數(shù)據(jù)、排序鏈、處理代理和使用內(nèi)存管理方面的多功能性為開發(fā)人員和人工智能愛好者打開了新的途徑。第三章中的示例證明了使用 ChatGPT 和 GPT-4 模型從頭開始編寫復雜指令的限制。請記住,LangChain 的真正潛力在于創(chuàng)造性地利用這些功能來解決復雜任務,并將通用語言模型轉(zhuǎn)化為功能強大、細粒度的應用程序。

GPT-4 插件是語言模型和實時可用的上下文信息之間的橋梁。本章表明,開發(fā)插件需要一個結(jié)構(gòu)良好的 API 和描述性文件。因此,在這些文件中提供詳細和自然的描述是必不可少的。這將幫助 GPT-4 充分利用您的 API。

LangChain 和 GPT-4 插件的激動人心世界證明了人工智能和 LLM 領(lǐng)域迅速發(fā)展的景象。本章提供的見解只是這些工具變革潛力的一小部分。

結(jié)論

本書為您提供了利用 LLM 的力量并將其應用于現(xiàn)實世界應用所需的基礎(chǔ)和高級知識。我們涵蓋了從基本原理和 API 集成到高級提示工程和微調(diào)的一切,引導您朝著使用 OpenAI 的 GPT-4 和 ChatGPT 模型的實際用例。我們以詳細介紹 LangChain 框架和插件如何使您能夠釋放 LLM 的力量并構(gòu)建真正創(chuàng)新的應用程序來結(jié)束了本書。

現(xiàn)在,您擁有了工具,可以在 AI 領(lǐng)域進一步開拓,開發(fā)利用這些先進語言模型的強大應用程序。但請記住,AI 領(lǐng)域不斷發(fā)展,因此必須密切關(guān)注進展并相應地進行調(diào)整。這次進入 LLM 世界的旅程只是開始,您的探索不應該止步于此。我們鼓勵您利用新知識探索人工智能技術(shù)的未來。文章來源地址http://www.zghlxwxcb.cn/news/detail-812281.html

到了這里,關(guān)于使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 計量經(jīng)濟學及Stata應用 第四章習題

    計量經(jīng)濟學及Stata應用 第四章習題

    考慮以下消費函數(shù):Ci = α+βYi+si 共中,Ci為個體i的消費開支,而只Yi為個體三的可支配收入。假設(shè)OLS因歸所得的樣木回歸線為: ?(1)斜率β尖的經(jīng)濟含義是什么? (2)截距項α尖的經(jīng)濟含義是什么?. (3)對于個體i,計算其平均消費傾向(average?propensity?to?consume)Ci/Yi。假設(shè)α尖0,

    2024年02月02日
    瀏覽(28)
  • 第四章認識Node.js模塊化開發(fā)

    Node.js系統(tǒng)模塊 續(xù)上一篇文章第三章認識Node.js模塊化開發(fā)-CSDN博客,這次繼續(xù)來認識和總結(jié)以下node的常用模塊開發(fā) Node.js系統(tǒng)模塊是指Node.js自帶的一些模塊,這些模塊可以直接在Node.js中使用,無需安裝其他包。以下是常用的Node.js系統(tǒng)模塊: fs模塊:用于處理文件系統(tǒng)。 htt

    2024年02月08日
    瀏覽(24)
  • 微信小程序開發(fā)實戰(zhàn)課后習題解答————第四章(作業(yè)版)

    一、填空題 1、 ?組件? 是視圖層的基本組成單元。 2、 swiper內(nèi)部只可以放置 ? swiper-item? ? 組件。 3、 設(shè)置text文本內(nèi)容長按可選的屬性是? ?selectable ? 。? ? 4、navigator組件通過設(shè)置? ?open-type? ? 屬性,來區(qū)分不同的跳轉(zhuǎn)功能。 5、通過image的? mode? ? 屬性來設(shè)定不同的圖

    2024年02月06日
    瀏覽(31)
  • 全文檢索工具elasticsearch:第四章:開發(fā)電商的搜索列表功能

    全文檢索工具elasticsearch:第四章:開發(fā)電商的搜索列表功能

    // skuInfo轉(zhuǎn)化成skuLsInfo for (SkuInfo skuInfo : skuInfos) { SkuLsInfo skuLsInfo = new SkuLsInfo(); BeanUtils.copyProperties(skuInfo,skuLsInfo); // 將skuLsInfo導入到es中 Index index = new Index.Builder(skuLsInfo).index(“gmall”).type(“SkuLsInfo”).id(skuLsInfo.getId()).build(); jestClient.execute(index); } } } @Override public List SkuListByCat

    2024年04月09日
    瀏覽(22)
  • python筆記:第四章使用字典

    說白了就是鍵值對的映射關(guān)系 不會丟失數(shù)據(jù)本身關(guān)聯(lián)的結(jié)構(gòu),但不關(guān)注數(shù)據(jù)的順序 是一種可變類型 鍵的類型:字典的鍵可以是任何不可變的類型,如浮點數(shù),字符串,元組 可以從其他映射或鍵值對創(chuàng)建字典 將字符串格式設(shè)置功能用于字典 使用format_map將兩者結(jié)合起來 就地

    2024年02月13日
    瀏覽(69)
  • 【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.5 鍵盤事件

    【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.5 鍵盤事件

    本章要實現(xiàn)的整體效果如下: QEvent::KeyPress ? 鍵盤按下時,觸發(fā)該事件,它對應的子類是 QKeyEvent QEvent::KeyRelease ? 鍵盤抬起時,觸發(fā)該事件,它對應的子類是 QKeyEvent 本節(jié)通過兩個案例來講解這 2 個事件: 鍵盤按下、釋放事件的基本使用 通過鍵盤的上下左右箭頭,控制標簽

    2024年02月07日
    瀏覽(24)
  • Qt5開發(fā)及實例V2.0-第四章Qt基本對話框

    Qt5開發(fā)及實例V2.0-第四章Qt基本對話框

    首先介紹標準文件對話框(QFileDialog)、標準顏色對話框(QColorDialog)、標準字體對話框(QFontDialog)、標準輸入對話框(QInputDialog)及標準消息對話框(QMessageBox),運行效果如圖4.1所示。 按如圖4.1所示依次執(zhí)行如下操作。 (1)單擊“文件標準對話框?qū)嵗卑粹o,彈出“文

    2024年02月07日
    瀏覽(96)
  • 第四章 linux編輯器——vim的使用

    第四章 linux編輯器——vim的使用

    v i m vim v im 是一個多模式代碼編輯器。vim常用的模式有三類:命令模式(command mode)、插入模式(insert mode)和底行模式(last line mode)。這三種模式的主要功能如下: 命令模式:該模式又叫做正常模式、普通模式等。其主要的作用是控制屏幕光標的移動,控制代碼的刪除、

    2024年02月10日
    瀏覽(32)
  • 第四章 應用SysML基本特性集的汽車示例 P1|系統(tǒng)建模語言SysML實用指南學習

    第四章 應用SysML基本特性集的汽車示例 P1|系統(tǒng)建模語言SysML實用指南學習

    僅供個人學習記錄 主要就是應用練習建模了 Automobile Domain包 將模型組織入包的包圖 汽車規(guī)范中包含系統(tǒng)需求的需求圖 汽車域塊定義圖 描述車輛主要功能的用例圖

    2024年02月06日
    瀏覽(22)
  • 【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標按下、移動、釋放事件

    【QT開發(fā)筆記-基礎(chǔ)篇】| 第四章 事件QEvent | 4.4 鼠標按下、移動、釋放事件

    本章要實現(xiàn)的整體效果如下: QEvent::MouseButtonPress ? 鼠標按下時,觸發(fā)該事件,它對應的子類是 QMouseEvent QEvent::MouseMove ? 鼠標移動時,觸發(fā)該事件,它對應的子類是 QMouseEvent QEvent::MouseButtonRelease ? 鼠標釋放時,觸發(fā)該事件,它對應的子類是 QMouseEvent 本節(jié)通過兩個案例來講

    2024年02月08日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包