Contents

如何使用 Streamlit 和 Llama 2 建立聊天機器人

/bc/images/how-to-build-a-chatbot-using-streamlit-and-llama-v2-output-1.jpg

Llama 2 是由 Meta 開發的開源大型語言模型。該特定車型具有令人印象深刻的功能,使其成為與 GPT-3.5 和 PaLM 等其他封閉模型相比的強大競爭者。事實上,許多專家認為 Llama 2 在性能方面超越了這些替代品。此模型的架構包括三個不同的預訓練和微調的生成文字模型,每個模型都有不同的複雜程度。這些模型分別包含 70 億、130 億和 700 億個參數的版本。

透過利用 Streamlit 和 Llama 2 的功能建立一個聊天機器人來與用戶即時交互,深入挖掘 Llama 2 的對話潛力。

了解 Llama 2:功能與優點

大型語言模型的最新迭代 Llama 2 與其先前的版本 Llama 1 相比有何不同?

增強模型擁有顯著擴展的架構,包含多達 700 億個參數。如此廣泛的參數計數有助於獲取單字序列中固有的日益複雜的關係。

人類回饋強化學習 (RLHF) 已證明其在增強會話應用程式功能方面的有效性,從而可以在各種複雜的對話中產生更自然、更令人信服的反應。將 RLHF 納入這些模型不僅增強了它們理解上下文的能力,而且使它們能夠提供更連貫和相關的回應,從而提供改進的使用者體驗。

被稱為「分組查詢注意力」的創新技術的引入顯著加快了推理過程,從而能夠開發聊天機器人和虛擬助理等強大的應用程式。

與先前的迭代相比,當前版本在記憶體利用率和計算資源方面都表現出了卓越的效率。

Llama 2 在開源和非商業框架下獲得許可,允許研究人員和開發人員自由使用和修改其功能,而不受商業利益的任何約束或限制。

與先前的迭代相比,Llama 2 在各個方面都表現出了卓越的性能,使其成為眾多實用程式的異常強大的工具,包括聊天機器人互動、虛擬助理和自然語言理解。

為聊天機器人開發設定 Streamlit 環境

為了開始建立您的應用程序,有必要建立一個開發環境,用於將您當前的項目與設備上儲存的任何現有項目分開。

首先,以以下方式利用 Pipenv 函式庫建立虛擬環境:

 pipenv shell 

接下來,我們將繼續安裝所需的軟體元件以建立會話代理程式。

 pipenv install streamlit replicate 

Streamlit 是一個多功能的開源 Web 應用程式開發框架,旨在促進機器學習和資料科學專案的快速部署。

從本質上講,「複製」是指一個雲端運算平台,它為使用者提供了存取廣泛的開源機器學習模型的機會,這些模型可以在各種應用程式中輕鬆部署和使用。

從 Replicate 取得您的 Llama 2 API 令牌

若要取得 Replicate 令牌金鑰,您必須先使用 GitHub 帳戶在 Replicate 上註冊帳戶。

Replicate 只允許透過 GitHub 帳戶 登入。

訪問儀表板後,進入“探索”標籤並找到搜尋欄。在搜尋欄位中輸入「Llama 2 chat」即可查看名為「llama-2–70b-chat」的特定型號。

/bc/images/how-to-build-a-chatbot-using-streamlit-and-llama-v2-llama2.jpg

請從下拉式選單中選擇“Llama 2 API Endpoint”選項並點擊它。完成此操作後,導覽至標有「API 令牌」的部分。在這裡,您將找到一個指定為「Python 應用程式」的按鈕。透過按一下此按鈕,您將獲得在 Python 專案中使用 Llama 2 API 所需的必要憑證的存取權限。

/bc/images/how-to-build-a-chatbot-using-streamlit-and-llama-v2-api.jpg

請複製 API 令牌以進行複製,並確保其安全儲存以供將來使用。

完整的原始程式碼可以透過我們的 GitHub 儲存庫訪問,該儲存庫為開發人員利用和為專案做出貢獻提供了全面的資源。

建構聊天機器人

為了開始 Llama 聊天機器人的開發,首先產生兩個單獨的檔案-一個名為“llama\_chatbot.py”,作為實現聊天機器人功能的主要腳本,另一個名為“.env”的文件,專門為存放正確操作所需的敏感資訊,例如金鑰和API 令牌。透過遵循此初始設置,您可以有效地將敏感資料與主要原始程式碼隔離,同時確保與外部服務的無縫整合。

為了利用「llama_chatbot.py」腳本中的各種功能,需要匯入多個庫。導入這些庫的過程涉及指定它們各自的名稱並確保它們與現有程式碼庫正確整合。這允許無縫操作和執行聊天機器人的預期功能。

 import streamlit as st
 import os
 import replicate 

接下來,我們將透過初始化相關變數來建立「llama-2–70b-chat」語言模型的全域參數。

 # Global variables
REPLICATE_API_TOKEN = os.environ.get('REPLICATE_API_TOKEN', default='')

 # Define model endpoints as independent variables
LLaMA2_7B_ENDPOINT = os.environ.get('MODEL_ENDPOINT7B', default='')
LLaMA2_13B_ENDPOINT = os.environ.get('MODEL_ENDPOINT13B', default='')
LLaMA2_70B_ENDPOINT = os.environ.get('MODEL_ENDPOINT70B', default='') 

為了將 Replicate API 令牌和模型資訊合併到應用程式的環境變數中,您應該使用特定的格式結構將相關詳細資訊附加到「.env」檔案中。這將允許在您的專案中無縫整合這些組件。

 REPLICATE_API_TOKEN='Paste_Your_Replicate_Token'
 MODEL_ENDPOINT7B='a16z-infra/llama7b-v2-chat:4f0a4744c7295c024a1de15e1a63c880d3da035fa1f49bfd344fe076074c8eea'
 MODEL_ENDPOINT13B='a16z-infra/llama13b-v2-chat:df7690f1994d94e96ad9d568eac121aecf50684a0b0963b25a41cc40061269e5'
 MODEL_ENDPOINT70B='replicate/llama70b-v2-chat:e951f18578850b652510200860fc4ea62b3b16fac280f83ff32282f87bbd2e48' 

請複製提供的令牌並確保您已儲存相應的.env 檔案。

設計聊天機器人的對話流程

透過產生概述所需目標的初步提示,可以促進針對特定任務啟動使用 Llama 2 語言模型的過程。例如,如果目標是以助手的身份利用模型,那麼制定合適的啟動聲明將涉及指定這種意圖,並可能描述有效履行該角色所需的任何特定重點領域或領域專業知識。透過預先提供清晰的指令,隨後與人工智慧驅動的虛擬助理的互動將更加高效和準確。

 # Set Pre-propmt
 PRE_PROMPT = "You are a helpful assistant. You do not respond as " \
            "'User' or pretend to be 'User'." \
            " You only respond once as Assistant." 

聊天機器人頁面的設定可以透過多種方式進行安排,具體取決於所需的外觀和功能。需要記住的一些關鍵注意事項包括配色方案、字體選擇和佈局選項等設計元素。此外,確定頁面上將顯示哪些資訊或功能(包括按鈕或表單等任何互動式元件)也很重要。安排的具體細節可能會根據個人喜好和要求而有所不同,但制定明確的計劃有助於確保最終結果符合預期目的和目標。

 # Set initial page configuration
st.set_page_config(
   page_title="LLaMA2Chat",
   page_icon=":volleyball:",
   layout="wide"
) 

透過實作功能過程來啟動和建立特定於會話的變數配置。

 # Constants
LLaMA2_MODELS = {
   'LLaMA2-7B': LLaMA2_7B_ENDPOINT,
   'LLaMA2-13B': LLaMA2_13B_ENDPOINT,
   'LLaMA2-70B': LLaMA2_70B_ENDPOINT,
}

# Session State Variables
DEFAULT_TEMPERATURE = 0.1
DEFAULT_TOP_P = 0.9
DEFAULT_MAX_SEQ_LEN = 512
DEFAULT_PRE_PROMPT = PRE_PROMPT

def setup_session_state():
   st.session_state.setdefault('chat_dialogue', [])
   selected_model = st.sidebar.selectbox(
       'Choose a LLaMA2 model:', list(LLaMA2_MODELS.keys()), key='model')
   st.session_state.setdefault(
       'llm', LLaMA2_MODELS.get(selected_model, LLaMA2_70B_ENDPOINT))
   st.session_state.setdefault('temperature', DEFAULT_TEMPERATURE)
   st.session_state.setdefault('top_p', DEFAULT_TOP_P)
   st.session_state.setdefault('max_seq_len', DEFAULT_MAX_SEQ_LEN)
   st.session_state.setdefault('pre_prompt', DEFAULT_PRE_PROMPT) 

上述過程配置了會話狀態中的關鍵參數,例如chat\_dialoguepre\_promptllmtop\_pmax\_seq\_lentemper。此外,它還方便用戶根據喜好選擇首選的 Llama 2 型號。

以下是如何在 Python 中創建一個函數來為 Streamlit 應用程式呈現側邊欄內容的範例:pythondef render_sidebar():# 為側邊欄產生 HTML 程式碼的程式碼在此處return “ Your sidebar content gone here ”

 def render_sidebar():
   st.sidebar.header("LLaMA2 Chatbot")
   st.session_state['temperature'] = st.sidebar.slider('Temperature:',
         min_value=0.01, max_value=5.0, value=DEFAULT_TEMPERATURE, step=0.01)
   st.session_state['top_p'] = st.sidebar.slider('Top P:', min_value=0.01,
         max_value=1.0, value=DEFAULT_TOP_P, step=0.01)
   st.session_state['max_seq_len'] = st.sidebar.slider('Max Sequence Length:',
         min_value=64, max_value=4096, value=DEFAULT_MAX_SEQ_LEN, step=8)
   new_prompt = st.sidebar.text_area(
         'Prompt before the chat starts. Edit here if desired:',
           DEFAULT_PRE_PROMPT,height=60)
   if new_prompt != DEFAULT_PRE_PROMPT and new_prompt != "" and
 new_prompt is not None:
       st.session_state['pre_prompt'] = new_prompt \+ "\n"
   else:
       st.session_state['pre_prompt'] = DEFAULT_PRE_PROMPT 

上述組件展示了標題和配置參數,可以修改這些參數來優化 Llama 2 聊天機器人的效能,從而促進必要的調整以獲得最佳功能。

以下是使用 HTML 和 CSS 在 Streamlit 應用程式的主要內容區域中渲染聊天歷史記錄的可能實作:pythonimport Streamlit as stfrom Transformers import GPT2LMHeadModel, GPT2Tokenizerfrom streamlit_chat import message# Load Fine-tuned model and tokenstreamlit_chat import message# Load Fine-tuned model and tokenizerfdelp.’)tokenizer=GPT2Tokenizer.from_pretrained(‘meditations_model’)# 定義聊天機器人函數def chatbot(text):input_ids=tokenizer.encode(text, return_tensors=‘pt’)output=model.generate(input_ids=input_idsors=‘pt’)output=model.generate(input_ids=input_idsors=max_length, max_length, max_ids=input_ids=input_ids, max_length, max_le

 def render_chat_history():
   response_container = st.container()
   for message in st.session_state.chat_dialogue:
       with st.chat_message(message["role"]):
           st.markdown(message["content"]) 

此方法遍歷會話狀態中儲存的「chat_dialogue」對象,顯示使用者和助理之間交換的每次通信,並附有其各自的角色識別碼(「使用者」或「助理」)。

提供的程式碼片段似乎是處理使用者輸入的函數的佔位符,但沒有給出實際的實作。為了以更複雜的方式處理使用者輸入,有必要根據應用程式的特定要求在函數內定義和實現適當的演算法或邏輯。

 def handle_user_input():
   user_input = st.chat_input(
"Type your question here to talk to LLaMA2"
)
   if user_input:
       st.session_state.chat_dialogue.append(
{"role": "user", "content": user_input}
)
       with st.chat_message("user"):
           st.markdown(user_input) 

演示組件為使用者提供文字輸入介面,使他們能夠在對話上下文中提交訊息或查詢。收到使用者的輸入後,它將訊息附加到作為會話特定資料的一部分儲存的正在進行的對話中,其中包括指定參與者角色為「使用者」或「機器人」的元資料。

以下是如何使用 Python 和 Hugging Face Transformers 函式庫實現此功能的範例:pythonfrom Transformers import LlamaTokenizer, LlamaForCausalLMimport torchdefgenerate_responses(input_text):# Load the pre-trained Llama tokenizer and modelses(input_text):# Load the pre-trained Llama tokenizer and modelses(input_text):# Load the pre-trained Llama tokenizer and modelses( model=LlamaForCausalLM.from_pretrained(‘facebook/llama-base’)# 將輸入文字編碼為輸入IDsinputs=tokenizer(input_text, return_tensors=‘pt’).input_ids# 生成

 def generate_assistant_response():
   message_placeholder = st.empty()
   full_response = ""
   string_dialogue = st.session_state['pre_prompt']
  
   for dict_message in st.session_state.chat_dialogue:
       speaker = "User" if dict_message["role"] == "user" else "Assistant"
       string_dialogue \+= f"{speaker}: {dict_message['content']}\n"
  
   output = debounce_replicate_run(
       st.session_state['llm'],
       string_dialogue \+ "Assistant: ",
       st.session_state['max_seq_len'],
       st.session_state['temperature'],
       st.session_state['top_p'],
       REPLICATE_API_TOKEN
   )
  
   for item in output:
       full_response \+= item
       message_placeholder.markdown(full_response \+ "–Œ")
  
   message_placeholder.markdown(full_response)
   st.session_state.chat_dialogue.append({"role": "assistant",
"content": full_response}) 

在呼叫延遲複製過程之前,系統會產生過去通訊的檔案,其中包括人類和人工智慧輸入。透過使用人工智慧的最新回應動態更新介面,可以實現無縫對話體驗。

該應用程式的主要任務是渲染 Streamlit 框架內的所有元件,作為使用者的綜合介面。

 def render_app():
   setup_session_state()
   render_sidebar()
   render_chat_history()
   handle_user_input()
   generate_assistant_response()

該應用程式採用有組織的操作序列來建立會話的現狀、顯示側面板、記錄聊天記錄、處理使用者輸入並使用所有先前定義的功能產生幫助回應。

以下範例說明如何修改「index.js」中的「main()」函數以使用「renderApp()」函數並在執行腳本時啟動應用程式:javascriptasync function main() {const app=createContext (無效的) ;//建立具有 null 初始值的 Provider 上下文//使用 try-catch 區塊包裝 renderApp 函數以進行錯誤處理try {renderApp(app, document.getElementById(‘root’));} catch (err) {console.error( 執行根元件時出錯:\n${err.stack} );}}//呼叫main 函數執行應用程式main();這段程式碼透過傳遞null 建立了一個新的Provider 上下文實例

 def main():
   render_app()

if __name__ == "__main__":
   main() 

您的應用程式現在已準備好並準備好部署,可以輕鬆執行。

處理 API 請求

為了實現請求的功能,需要在專案的主目錄中建立一個名為「utils.py」的新 Python 模組。此模組將包含執行指定任務的單一函數。以下是如何實現這一點的範例:pythondef some_function():# 函數程式碼放在這裡…

 import replicate
import time

# Initialize debounce variables
last_call_time = 0
debounce_interval = 2 # Set the debounce interval (in seconds)


def debounce_replicate_run(llm, prompt, max_len, temperature, top_p,
                          API_TOKEN):
   global last_call_time
   print("last call time: ", last_call_time)

   current_time = time.time()
   elapsed_time = current_time - last_call_time

   if elapsed_time < debounce_interval:
       print("Debouncing")
       return "Hello! Your requests are too fast. Please wait a few" \
              " seconds before sending another request."

   last_call_time = time.time()

   output = replicate.run(llm, input={"prompt": prompt \+ "Assistant: ",
                                      "max_length": max_len, "temperature":
                                           temperature, "top_p": top_p,
                                      "repetition_penalty": 1}, api_token=API_TOKEN)
   return output 

此功能結合了去抖機制,以減輕因使用者互動而導致的過於頻繁和浪費的 API 請求的風險,從而確保資源的審慎利用。

透過執行下列步驟,將去抖動響應函數合併到「llama_chatbot.py」腳本:

 from utils import debounce_replicate_run 

現在運行應用程式:

 streamlit run llama_chatbot.py 

預期輸出:

此輸出中顯示的交互作用是 AI 語言模型和人類使用者之間的對話。

Streamlit 和 Llama 2 聊天機器人的實際應用

在各行業中都可以看到 Llama 2 軟體的實際應用實例,例如:

聊天機器人是一種多功能工具,用於開發互動式代理,能夠跨一系列主題進行即時討論,利用自然語言處理和人工智慧演算法根據使用者輸入提供相關回應。

該工具結合了自然語言理解技術,旨在開發能夠以模仿人類互動的方式理解和回復人類通訊的會話代理程式。

語言翻譯技術的利用僅限於翻譯各種語言任務中的語言。

文本摘要涉及將冗長的文章壓縮成更短、更簡潔的版本,保留其基本含義和要點,同時丟棄不必要的細節。此過程在新聞、研究論文或社交媒體等各種環境中都很有用,在這些環境中,快速存取資訊至關重要。透過僅呈現給定主題的最重要方面,摘要使讀者能夠有效地掌握主要思想,而無需逐字閱讀整個文件。

Llama 2 用於研究目的的應用涉及回應一系列主題的詢問。

人工智慧的未來

由於使用大型語言模型(例如 GPT-3.5 和 GPT-4 中的語言模型)帶來的高成本帶來的挑戰限制了較小實體建立值得注意的應用程式的能力,因為通常需要存取這些模型的 API以相當大的費用。

Llama 2 等強大的語言框架向開發兄弟會的揭幕標誌著人工智慧新紀元的開始。這種可能性將促進在實際場景中創造性和富有想像力地利用這些系統,從而推動加快實現超級人工智慧的進程。