Chatbot開(kāi)發(fā)三劍客:LLAMA、LangChain和Python
聊天機(jī)器人(Chatbot)開(kāi)發(fā)是一項(xiàng)充滿(mǎn)挑戰(zhàn)的復(fù)雜任務(wù),需要綜合運(yùn)用多種技術(shù)和工具。在這一領(lǐng)域中,LLAMA、LangChain和Python的聯(lián)合形成了一個(gè)強(qiáng)大的組合,為Chatbot的設(shè)計(jì)和實(shí)現(xiàn)提供了卓越支持。
首先,LLAMA是一款強(qiáng)大的自然語(yǔ)言處理工具,具備先進(jìn)的語(yǔ)義理解和對(duì)話(huà)管理功能。它有助于Chatbot更好地理解用戶(hù)意圖,并根據(jù)上下文進(jìn)行智能響應(yīng)。LLAMA的高度可定制性使得開(kāi)發(fā)者可以根據(jù)實(shí)際需求靈活調(diào)整Chatbot的語(yǔ)言處理能力。
LangChain作為一個(gè)全棧語(yǔ)言技術(shù)平臺(tái),為Chatbot提供了豐富的開(kāi)發(fā)資源。它整合了多種語(yǔ)言技術(shù),包括語(yǔ)音識(shí)別、文本處理和機(jī)器翻譯,為Chatbot的多模態(tài)交互提供全面支持。LangChain的強(qiáng)大功能使得開(kāi)發(fā)者能夠輕松構(gòu)建復(fù)雜而靈活的Chatbot系統(tǒng)。
Python作為一種通用編程語(yǔ)言,是Chatbot開(kāi)發(fā)的理想選擇。其簡(jiǎn)潔而強(qiáng)大的語(yǔ)法使得開(kāi)發(fā)過(guò)程更加高效,而豐富的第三方庫(kù)和生態(tài)系統(tǒng)為Chatbot開(kāi)發(fā)提供了廣泛的工具和資源。Python的跨平臺(tái)性也使得Chatbot能夠在不同環(huán)境中運(yùn)行,實(shí)現(xiàn)更廣泛的應(yīng)用。
Chatbot開(kāi)發(fā)離不開(kāi)大型語(yǔ)言模型(LLM),LLM是一種以其實(shí)現(xiàn)通用語(yǔ)言理解和生成能力而備受關(guān)注的語(yǔ)言模型。LLM通過(guò)使用大量數(shù)據(jù)在訓(xùn)練期間學(xué)習(xí)數(shù)十億個(gè)參數(shù),并在訓(xùn)練和運(yùn)行過(guò)程中消耗大量計(jì)算資源來(lái)獲得這些能力。
讓我們使用Langchain、llama和Python構(gòu)建一個(gè)簡(jiǎn)單的聊天機(jī)器人!
在這個(gè)簡(jiǎn)單的項(xiàng)目中,我想創(chuàng)建一個(gè)關(guān)于HIV/AIDS特定主題的聊天機(jī)器人。這意味著我們發(fā)送給聊天機(jī)器人的消息,聊天機(jī)器人將嘗試根據(jù)主題和消息之間的關(guān)聯(lián)進(jìn)行回答。但在此之前,我們必須安裝和下載一些必要的組件:
1、大型語(yǔ)言模型
我使用的是從Hugging Face下載的META AI的LLAMA 2。
2、Langchain
用于開(kāi)發(fā)由語(yǔ)言模型驅(qū)動(dòng)的應(yīng)用程序的框架
pip install langchain
3、安裝Llama-cpp-python
llama.cpp庫(kù)的Python實(shí)現(xiàn)(我嘗試使用最新的llama.cpp版本,但它不起作用,所以我建議使用0.1.78穩(wěn)定版本,并確保安裝了C++編譯器)。
pip install llama-cpp-pythnotallow==0.1.78
4、導(dǎo)入庫(kù)
from langchain.prompts importPromptTemplate
from langchain.llms importLlamaCpp
from langchain.callbacks.manager importCallbackManager
from langchain.callbacks.streaming_stdout import(
StreamingStdOutCallbackHandler
)
PromptTemplate:負(fù)責(zé)創(chuàng)建PromptValue,這是一種根據(jù)用戶(hù)輸入組合動(dòng)態(tài)值的對(duì)象。
llamacpp:Facebook的LLAMA模型的C/C++端口。
CallbackManager:處理來(lái)自L(fǎng)angChain的回調(diào)。
StreamingStdOutCallbackHandler:用于流式處理的回調(diào)處理程序。
代碼
首先,我將為我的模型路徑創(chuàng)建一個(gè)名為 “your_model_path”
的變量,然后因?yàn)槲抑幌胂拗浦黝}為HIV/AIDS,所以我創(chuàng)建了一個(gè)名為 “chat_topic”
的主題變量,并將其填充為 “HIV/AIDS”
,顯然你可以修改這個(gè)主題,如果你不想限制主題,可以刪除 “chat_topic”
并更改模板。之后,我將創(chuàng)建一個(gè)名為 “user_question”
的變量,以接收用戶(hù)輸入,還有一個(gè)稍后將使用的模板。
your_model_path = "寫(xiě)入你的模型路徑"
chat_topic = "hiv/aids"
user_question = str(input("輸入你的問(wèn)題:"))
template= """
請(qǐng)解釋這個(gè)問(wèn)題:“{question}”,主題是關(guān)于{topic}
"""
我將創(chuàng)建一個(gè) PromptTemplate
變量,該變量將使用我們之前創(chuàng)建的模板,并將其分配給 “prompt”
變量,然后更改提示的格式并將其分配給 “final_prompt”
變量。我們使用 “chat_topic”
中的主題和我們之前初始化的 “user_question”中的問(wèn)題
。然后創(chuàng)建一個(gè)名為 “Callbackmanager”
的變量,并將流處理程序分配給它。
prompt = PromptTemplate.from_template(template)
final_prompt = prompt.format(
topic=chat_topic,
questinotallow=user_question
)
CallbackManager= CallbackManager([StreamingStdOutCallbackHandler()])
之后,讓我們創(chuàng)建模型。
llm = LlamaCpp(
model_path=your_model_path,
n_ctx=6000,
n_gpu_layers=512,
n_batch=30,
callback_manager=CallbackManager,
temperature=0.9,
max_tokens=4095,
n_parts=1,
verbose=0
)
model_path
:LLAMA模型的路徑。
n_ctx
:令牌上下文窗口,模型在生成響應(yīng)時(shí)可以接受的令牌數(shù)量。
n_gpu_layers
:要加載到gpu內(nèi)存中的層數(shù)。
n_batch
:并行處理的令牌數(shù)。
callback_manager
:處理回調(diào)。
temperature
:用于抽樣的溫度,較高的溫度將導(dǎo)致更具創(chuàng)意和想象力的文本,而較低的溫度將導(dǎo)致更準(zhǔn)確和實(shí)際的文本。
max_tokens
:生成的最大令牌數(shù)。
n_parts
:要將模型分割成的部分?jǐn)?shù)。
verbose
:打印詳細(xì)輸出。
最后,調(diào)用模型并傳遞提示。
python "你的文件名.py"
要運(yùn)行它,只需在cmd中鍵入上述命令。
演示
完整代碼
from langchain.prompts importPromptTemplate
from langchain.llms importLlamaCpp
from langchain.callbacks.manager importCallbackManager
from langchain.callbacks.streaming_stdout import(
StreamingStdOutCallbackHandler
)
your_model_path = "write your model path"
chat_topic = "hiv/aids"
user_question = str(input("Enter your question : "))
template= """
Please explain this question : "{question}" the topic is about {topic}
"""
prompt = PromptTemplate.from_template(template)
final_prompt = prompt.format(
topic=chat_topic,
questinotallow=user_question
)
CallbackManager= CallbackManager([StreamingStdOutCallbackHandler()])
llm = LlamaCpp(
model_path=your_model_path,
n_ctx=6000,
n_gpu_layers=512,
n_batch=30,
callback_manager=CallbackManager,
temperature=0.9,
max_tokens=4095,
n_parts=1,
verbose=0
)
llm(final_prompt)