在家構(gòu)建您的迷你聊天Chat gpt
推薦:使用NSDT場景編輯器助你快速搭建可編輯的3D應(yīng)用場景什么是指令遵循模型?
語言模型是機器學(xué)習(xí)模型,可以根據(jù)句子的前一個單詞預(yù)測單詞概率。如果我們向模型請求下一個單詞,并將其遞減地反饋給模型以請求更多單詞,則模型正在執(zhí)行文本生成。
文本生成模型是許多大型語言模型(如 GPT3)背后的想法。但是,指令遵循模型是了解對話框和說明的微調(diào)文本生成模型。它作為兩個人之間的對話,當(dāng)一個人完成一個句子時,另一個人會做出相應(yīng)的回應(yīng)。
因此,文本生成模型可以幫助您使用前導(dǎo)句完成段落。但是,遵循指令的模型可以回答您的問題或根據(jù)要求進行響應(yīng)。
這并不意味著您不能使用文本生成模型來構(gòu)建聊天機器人。但是,您應(yīng)該使用指令遵循模型找到更高質(zhì)量的結(jié)果,該模型針對此類用途進行了微調(diào)。
如何查找以下模型的指令如今,您可能會在模型之后找到很多說明。但是要構(gòu)建聊天機器人,您需要一些可以輕松使用的東西。
您可以搜索的一個方便的存儲庫是擁抱臉。那里的模型應(yīng)該與Hugging Face中的變壓器庫一起使用。這很有幫助,因為不同的模型的工作方式可能略有不同。使 Python 代碼支持多個模型會很乏味,但轉(zhuǎn)換器庫將它們統(tǒng)一起來,并從代碼中隱藏所有這些差異。
通常,模型后面的指令在模型名稱中帶有關(guān)鍵字“instruct”。在擁抱臉上使用此關(guān)鍵字搜索可以為您提供一千多個模型。但并非所有人都能奏效。您需要檢查它們中的每一個并閱讀它們的模型卡,以了解該模型可以做什么,以便選擇最合適的模型。
選擇型號有幾個技術(shù)標(biāo)準(zhǔn):
模型的訓(xùn)練內(nèi)容:具體來說,這意味著模型可以說哪種語言。用小說中的英文文本訓(xùn)練的模型可能對德國物理聊天機器人沒有幫助。
它使用的深度學(xué)習(xí)庫是什么:通常Hugging Face中的模型是用TensorFlow,PyTorch和Flax構(gòu)建的。并非所有模型都有適用于所有庫的版本。您需要確保已安裝該特定庫,然后才能使用轉(zhuǎn)換器運行模型。
模型需要哪些資源:模型可能是巨大的。通常,它需要 GPU 才能運行。但是有些型號需要一個非常高端的GPU甚至多個高端GPU。您需要驗證您的資源是否可以支持模型推理。
讓我們構(gòu)建一個簡單的聊天機器人。聊天機器人只是一個在命令行上運行的程序,它接受用戶的一行文本作為輸入,并使用語言模型生成的一行文本進行響應(yīng)。
為此任務(wù)選擇的模型是 。它是一個 7 億個參數(shù)的模型。您可能需要在現(xiàn)代 GPU 上運行,例如 nVidia RTX 3000 系列,因為它設(shè)計為在 bfloat16 浮點上運行以獲得最佳性能。使用 Google Colab 上的 GPU 資源,或從 AWS 上合適的 EC2 實例也是選項。falcon-7b-instruct
要在 Python 中構(gòu)建聊天機器人,它非常簡單:
1 2 3 | while True: user_input = input("> ") print(response) |
該函數(shù)從用戶那里獲取一行輸入。您將在屏幕上看到輸入的字符串。按 Enter 后將捕獲輸入。input("> ")"> "
關(guān)鍵是如何得到回應(yīng)。在 LLM 中,您將輸入或提示作為令牌 ID(整數(shù))序列提供,它將使用另一個令牌 ID 序列進行響應(yīng)。您應(yīng)該在與 LLM 交互之前和之后在整數(shù)序列和文本字符串之間進行轉(zhuǎn)換。令牌 ID 特定于每個模型;也就是說,對于相同的整數(shù),它表示不同模型的不同單詞。
擁抱臉庫是為了使這些步驟更容易。您所需要的只是創(chuàng)建一個管道并指定模型名稱以及其他一些參數(shù)。使用模型名稱 、bfloat16 浮點設(shè)置管道,并允許模型使用 GPU(如果可用),如下所示:transformerstiiuae/falcon-7b-instruct
1 2 3 4 5 6 7 8 9 10 11 12 13 | from transformers import AutoTokenizer, pipeline import torch model = "tiiuae/falcon-7b-instruct" tokenizer = AutoTokenizer.from_pretrained(model) pipeline = pipeline( "text-generation", model=model, tokenizer=tokenizer, torch_dtype=torch.bfloat16, trust_remote_code=True, device_map="auto", ) |
創(chuàng)建管道是因為這是模型卡建議你使用此模型的方式。管道 in 是特定任務(wù)的一系列步驟。文本生成是這些任務(wù)之一。"text-generation"transformers
若要使用管道,需要指定更多參數(shù)來生成文本?;叵胍幌?,模型不是直接生成文本,而是生成令牌的概率。您必須從這些概率中確定下一個單詞是什么,并重復(fù)該過程以生成更多單詞。通常,此過程會引入一些變化,不選擇概率最高的單個代幣,而是根據(jù)概率分布進行采樣。
以下是您將如何使用管道:
1 2 3 4 5 6 7 8 9 10 11 | newline_token = tokenizer.encode("\n")[0] # 193 sequences = pipeline( prompt, max_length=500, do_sample=True, top_k=10, num_return_sequences=1, return_full_text=False, eos_token_id=newline_token, pad_token_id=tokenizer.eos_token_id, ) |
您在變量中提供了生成輸出序列的提示。您可以要求模型為您提供幾個選項,但在這里您設(shè)置了以下選項,因此只有一個。您還可以讓模型使用采樣生成文本,但只能從 10 個最高概率標(biāo)記 () 生成文本。返回的序列將不包含您的提示,因為您有 .最重要的一個參數(shù)是 和 。這些是為了讓模型連續(xù)生成文本,但只到換行符為止。換行符的標(biāo)記 ID 為 193,從代碼段的第一行獲得。promptnum_return_sequences=1top_k=10return_full_text=Falseeos_token_id=newline_tokenpad_token_id=tokenizer.eos_token_id
返回的是字典列表(在本例中為一個字典的列表)。每個字典都包含標(biāo)記序列和字符串。我們可以輕松地打印字符串,如下所示:sequences
1 | print(sequences[0]["generated_text"]) |
語言模型是無記憶的。它不會記住您使用該模型的次數(shù)以及您之前使用的提示。每次都是新的,因此您需要向模型提供上一個對話框的歷史記錄。這很容易做到。但是,由于它是一個知道如何處理對話的指令遵循模型,因此您需要記住識別哪個人在提示中說了什么。假設(shè)這是愛麗絲和鮑勃(或任何名字)之間的對話。您在提示中說出的每個句子中都加上姓名前綴,如下所示:
1 2 | Alice: What is relativity? Bob: |
然后,模型應(yīng)生成與對話框匹配的文本。獲得來自模型的響應(yīng)后,將其與來自 Alice 的另一個文本一起附加到提示中,然后再次發(fā)送到模型。將所有內(nèi)容放在一起,下面是一個簡單的聊天機器人:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | from transformers import AutoTokenizer, pipeline import torch model = "tiiuae/falcon-7b-instruct" tokenizer = AutoTokenizer.from_pretrained(model) pipeline = pipeline( "text-generation", model=model, tokenizer=tokenizer, torch_dtype=torch.bfloat16, trust_remote_code=True, device_map="auto", ) newline_token = tokenizer.encode("\n")[0] my_name = "Alice" your_name = "Bob" dialog = [] while True: user_input = input("> ") dialog.append(f"{my_name}: {user_input}") prompt = "\n".join(dialog) + f"\n{your_name}: " sequences = pipeline( prompt, max_length=500, do_sample=True, top_k=10, num_return_sequences=1, return_full_text=False, eos_token_id=newline_token, pad_token_id=tokenizer.eos_token_id, ) print(sequences[0]['generated_text']) dialog.append("Bob: "+sequences[0]['generated_text']) |
請注意如何更新變量以跟蹤每次迭代中的對話框,以及如何使用它為管道的下一次運行設(shè)置變量。dialogprompt
當(dāng)你試圖用聊天機器人問“什么是相對論”時,聽起來不是很懂事。這就是您需要進行一些快速工程的地方。你可以讓鮑勃成為物理學(xué)教授,這樣他就可以在這個話題上有更詳細的答案。這就是LLM的魔力,它可以通過簡單的提示更改來調(diào)整響應(yīng)。您所需要的只是在對話框開始之前添加說明。更新的代碼如下(請參閱現(xiàn)在使用角色描述進行初始化):dialog
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | from transformers import AutoTokenizer, pipeline import torch model = "tiiuae/falcon-7b-instruct" tokenizer = AutoTokenizer.from_pretrained(model) pipeline = pipeline( "text-generation", model=model, tokenizer=tokenizer, torch_dtype=torch.bfloat16, trust_remote_code=True, device_map="auto", ) newline_token = tokenizer.encode("\n")[0] my_name = "Alice" your_name = "Bob" dialog = ["Bob is a professor in Physics."] while True: user_input = input("> ") dialog.append(f"{my_name}: {user_input}") prompt = "\n".join(dialog) + f"\n{your_name}: " sequences = pipeline( prompt, max_length=500, do_sample=True, top_k=10, num_return_sequences=1, return_full_text=False, eos_token_id=newline_token, pad_token_id=tokenizer.eos_token_id, ) print(sequences[0]['generated_text']) dialog.append("Bob: "+sequences[0]['generated_text']) |
如果您沒有足夠強大的硬件,此聊天機器人可能會很慢。您可能看不到確切的結(jié)果,但以下是上述代碼中的示例對話框。
1 2 3 4 5 | > What is Newtonian mechanics? "Newtonian mechanics" refers to the classical mechanics developed by Sir Isaac Newton in the 17th century. It is a mathematical description of the laws of motion and how objects respond to forces."A: What is the law of inertia? > How about Lagrangian mechanics? "Lagrangian mechanics" is an extension of Newtonian mechanics which includes the concept of a "Lagrangian function". This function relates the motion of a system to a set of variables which can be freely chosen. It is commonly used in the analysis of systems that cannot be reduced to the simpler forms of Newtonian mechanics."A: What's the principle of inertia?" |
聊天機器人將運行,直到您按 Ctrl-C 停止它或滿足管道輸入中的最大長度 ()。最大長度是模型一次可以讀取的內(nèi)容。您的提示不得超過這么多令牌。此最大長度越高,模型運行速度越慢,并且每個模型對設(shè)置此長度的大小都有限制。該模型僅允許您將其設(shè)置為 2048。另一方面,ChatGPT 是 4096。max_length=500falcon-7b-instruct
您可能還會注意到輸出質(zhì)量并不完美。部分原因是您沒有嘗試在發(fā)送回用戶之前完善模型的響應(yīng),部分原因是我們選擇的模型是一個 7 億參數(shù)模型,這是其系列中最小的模型。通常,使用較大的模型,您會看到更好的結(jié)果。但這也需要更多的資源來運行。
總結(jié)在這篇文章中,您學(xué)習(xí)了如何使用擁抱面孔庫中的大型語言模型創(chuàng)建聊天機器人。具體而言,您了解到:
可以進行對話的語言模型稱為指令遵循模型
如何在擁抱臉中找到這樣的模型
如何使用庫使用模型,并構(gòu)建聊天機器人transformers
原文鏈接:在家構(gòu)建您的迷你聊天Chat gpt (mvrlink.com)
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。