在家構建您的迷你聊天Chat gpt
推薦:使用NSDT場(chǎng)景編輯器助你快速搭建可編輯的3D應用場(chǎng)景什么是指令遵循模型?
語(yǔ)言模型是機器學(xué)習模型,可以根據句子的前一個(gè)單詞預測單詞概率。如果我們向模型請求下一個(gè)單詞,并將其遞減地反饋給模型以請求更多單詞,則模型正在執行文本生成。
文本生成模型是許多大型語(yǔ)言模型(如 GPT3)背后的想法。但是,指令遵循模型是了解對話(huà)框和說(shuō)明的微調文本生成模型。它作為兩個(gè)人之間的對話(huà),當一個(gè)人完成一個(gè)句子時(shí),另一個(gè)人會(huì )做出相應的回應。
因此,文本生成模型可以幫助您使用前導句完成段落。但是,遵循指令的模型可以回答您的問(wèn)題或根據要求進(jìn)行響應。
這并不意味著(zhù)您不能使用文本生成模型來(lái)構建聊天機器人。但是,您應該使用指令遵循模型找到更高質(zhì)量的結果,該模型針對此類(lèi)用途進(jìn)行了微調。
如何查找以下模型的指令如今,您可能會(huì )在模型之后找到很多說(shuō)明。但是要構建聊天機器人,您需要一些可以輕松使用的東西。
您可以搜索的一個(gè)方便的存儲庫是擁抱臉。那里的模型應該與Hugging Face中的變壓器庫一起使用。這很有幫助,因為不同的模型的工作方式可能略有不同。使 Python 代碼支持多個(gè)模型會(huì )很乏味,但轉換器庫將它們統一起來(lái),并從代碼中隱藏所有這些差異。
通常,模型后面的指令在模型名稱(chēng)中帶有關(guān)鍵字“instruct”。在擁抱臉上使用此關(guān)鍵字搜索可以為您提供一千多個(gè)模型。但并非所有人都能奏效。您需要檢查它們中的每一個(gè)并閱讀它們的模型卡,以了解該模型可以做什么,以便選擇最合適的模型。
選擇型號有幾個(gè)技術(shù)標準:
模型的訓練內容:具體來(lái)說(shuō),這意味著(zhù)模型可以說(shuō)哪種語(yǔ)言。用小說(shuō)中的英文文本訓練的模型可能對德國物理聊天機器人沒(méi)有幫助。
它使用的深度學(xué)習庫是什么:通常Hugging Face中的模型是用TensorFlow,PyTorch和Flax構建的。并非所有模型都有適用于所有庫的版本。您需要確保已安裝該特定庫,然后才能使用轉換器運行模型。
模型需要哪些資源:模型可能是巨大的。通常,它需要 GPU 才能運行。但是有些型號需要一個(gè)非常高端的GPU甚至多個(gè)高端GPU。您需要驗證您的資源是否可以支持模型推理。
讓我們構建一個(gè)簡(jiǎn)單的聊天機器人。聊天機器人只是一個(gè)在命令行上運行的程序,它接受用戶(hù)的一行文本作為輸入,并使用語(yǔ)言模型生成的一行文本進(jìn)行響應。
為此任務(wù)選擇的模型是 。它是一個(gè) 7 億個(gè)參數的模型。您可能需要在現代 GPU 上運行,例如 nVidia RTX 3000 系列,因為它設計為在 bfloat16 浮點(diǎn)上運行以獲得最佳性能。使用 Google Colab 上的 GPU 資源,或從 AWS 上合適的 EC2 實(shí)例也是選項。falcon-7b-instruct
要在 Python 中構建聊天機器人,它非常簡(jiǎn)單:
1 2 3 | while True: user_input = input("> ") print(response) |
該函數從用戶(hù)那里獲取一行輸入。您將在屏幕上看到輸入的字符串。按 Enter 后將捕獲輸入。input("> ")"> "
關(guān)鍵是如何得到回應。在 LLM 中,您將輸入或提示作為令牌 ID(整數)序列提供,它將使用另一個(gè)令牌 ID 序列進(jìn)行響應。您應該在與 LLM 交互之前和之后在整數序列和文本字符串之間進(jìn)行轉換。令牌 ID 特定于每個(gè)模型;也就是說(shuō),對于相同的整數,它表示不同模型的不同單詞。
擁抱臉庫是為了使這些步驟更容易。您所需要的只是創(chuàng )建一個(gè)管道并指定模型名稱(chēng)以及其他一些參數。使用模型名稱(chēng) 、bfloat16 浮點(diǎn)設置管道,并允許模型使用 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
若要使用管道,需要指定更多參數來(lái)生成文本?;叵胍幌?,模型不是直接生成文本,而是生成令牌的概率。您必須從這些概率中確定下一個(gè)單詞是什么,并重復該過(guò)程以生成更多單詞。通常,此過(guò)程會(huì )引入一些變化,不選擇概率最高的單個(gè)代幣,而是根據概率分布進(jìn)行采樣。
以下是您將如何使用管道:
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, ) |
您在變量中提供了生成輸出序列的提示。您可以要求模型為您提供幾個(gè)選項,但在這里您設置了以下選項,因此只有一個(gè)。您還可以讓模型使用采樣生成文本,但只能從 10 個(gè)最高概率標記 () 生成文本。返回的序列將不包含您的提示,因為您有 .最重要的一個(gè)參數是 和 。這些是為了讓模型連續生成文本,但只到換行符為止。換行符的標記 ID 為 193,從代碼段的第一行獲得。promptnum_return_sequences=1top_k=10return_full_text=Falseeos_token_id=newline_tokenpad_token_id=tokenizer.eos_token_id
返回的是字典列表(在本例中為一個(gè)字典的列表)。每個(gè)字典都包含標記序列和字符串。我們可以輕松地打印字符串,如下所示:sequences
1 | print(sequences[0]["generated_text"]) |
語(yǔ)言模型是無(wú)記憶的。它不會(huì )記住您使用該模型的次數以及您之前使用的提示。每次都是新的,因此您需要向模型提供上一個(gè)對話(huà)框的歷史記錄。這很容易做到。但是,由于它是一個(gè)知道如何處理對話(huà)的指令遵循模型,因此您需要記住識別哪個(gè)人在提示中說(shuō)了什么。假設這是愛(ài)麗絲和鮑勃(或任何名字)之間的對話(huà)。您在提示中說(shuō)出的每個(gè)句子中都加上姓名前綴,如下所示:
1 2 | Alice: What is relativity? Bob: |
然后,模型應生成與對話(huà)框匹配的文本。獲得來(lái)自模型的響應后,將其與來(lái)自 Alice 的另一個(gè)文本一起附加到提示中,然后再次發(fā)送到模型。將所有內容放在一起,下面是一個(gè)簡(jiǎn)單的聊天機器人:
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']) |
請注意如何更新變量以跟蹤每次迭代中的對話(huà)框,以及如何使用它為管道的下一次運行設置變量。dialogprompt
當你試圖用聊天機器人問(wèn)“什么是相對論”時(shí),聽(tīng)起來(lái)不是很懂事。這就是您需要進(jìn)行一些快速工程的地方。你可以讓鮑勃成為物理學(xué)教授,這樣他就可以在這個(gè)話(huà)題上有更詳細的答案。這就是LLM的魔力,它可以通過(guò)簡(jiǎn)單的提示更改來(lái)調整響應。您所需要的只是在對話(huà)框開(kāi)始之前添加說(shuō)明。更新的代碼如下(請參閱現在使用角色描述進(jì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']) |
如果您沒(méi)有足夠強大的硬件,此聊天機器人可能會(huì )很慢。您可能看不到確切的結果,但以下是上述代碼中的示例對話(huà)框。
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 停止它或滿(mǎn)足管道輸入中的最大長(cháng)度 ()。最大長(cháng)度是模型一次可以讀取的內容。您的提示不得超過(guò)這么多令牌。此最大長(cháng)度越高,模型運行速度越慢,并且每個(gè)模型對設置此長(cháng)度的大小都有限制。該模型僅允許您將其設置為 2048。另一方面,ChatGPT 是 4096。max_length=500falcon-7b-instruct
您可能還會(huì )注意到輸出質(zhì)量并不完美。部分原因是您沒(méi)有嘗試在發(fā)送回用戶(hù)之前完善模型的響應,部分原因是我們選擇的模型是一個(gè) 7 億參數模型,這是其系列中最小的模型。通常,使用較大的模型,您會(huì )看到更好的結果。但這也需要更多的資源來(lái)運行。
總結在這篇文章中,您學(xué)習了如何使用擁抱面孔庫中的大型語(yǔ)言模型創(chuàng )建聊天機器人。具體而言,您了解到:
可以進(jìn)行對話(huà)的語(yǔ)言模型稱(chēng)為指令遵循模型
如何在擁抱臉中找到這樣的模型
如何使用庫使用模型,并構建聊天機器人transformers
原文鏈接:在家構建您的迷你聊天Chat gpt (mvrlink.com)
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。