使用 LangChain 構建聊天機器人

banq發表於2024-03-13

在本教程中,我們將學習如何使用 LangChain 構建 Chatbot Webapp。LangChain是一個Python模組。LangChain用於使用標準語言構建應用程式。它為其他文件的通訊標準提供了框架,並與各種 API 進行互動。LangChain 的設計宗旨是易於使用,即使開發人員需要更加熟悉語言結構。

大語言模型(LLM),人工智慧技術已經發展到人類可以輕鬆與聊天機器人互動的水平,類似於人類互動。很快,聊天機器人將成為我們日常生活的重要組成部分。它可用於各種型別的問題解決技能。

什麼是LangChain?
LangChain是一個開源工具。它是用Python程式語言編寫的。LangChain可以使大規模語言模型變得資料敏感和中介。大多數商業法學碩士(例如 GPT-3.5 和 GPT-4)對其使用的資訊都有限制。例如,ChatGPT是當今流行的AI工具。但 ChatGPT 只能回答它以前見過的問題。因此,如果您獲得任何未知的程式設計或競爭性程式碼,那麼 ChatGPT 無法回答這些問題。LangChain是一個框架。它可以編排一系列提示以達到預期的結果。

2021 年 9 月之後的一切仍在確定中。這是LangChain解決的主要問題。無論是Word文件還是單個PDF,我們都可以將文件輸入LLM。輸入文件後,我們可以獲得類似人類的響應。它具有向量資料庫、聊天模型和嵌入函式等工具的包裝器,使得僅使用 LangChain 即可輕鬆構建 AI 應用程式。

LangChain是一個LLM環境。

LangChain的工作原理
LangChain 的工作原理是提供一組促進與語言結構互動的抽象。下面討論LangChain的工作原理——

Agent代理:
LangChain的主要組成部分是Agent。代理正在執行特定任務:建立文字、編寫內容、摘要和回答問題。

Chain鏈:
鏈是一串代理。它用於完成特定任務。例如,可以在特定主題上使用字串來編寫長文字或回答問題。

Memories記憶:
記憶用於儲存對代理的呼叫狀態。這使得智慧體能夠從過去的互動中學習並在未來做出更好的決策。因此,透過使用記憶,LangChain可以提高其效能。

為什麼我們使用LangChain?
使用 LangChain 有幾個原因,如下所述 -
1、功能強大:
浪鏈比人類強大得多。所以,我們使用了LangChain。

2. 易於使用:
LangChain非常容易使用。開發者在不正確瞭解LangChain的情況下也可以輕鬆使用LangChain。

3、可擴充套件:
浪鏈的重要特點之一就是可擴充套件。因此,使用者可以在LangChain的框架中新增自己的鏈和代理。

4、靈活:
靈活性是浪鏈的重要特點之一。靈活的框架可用於構建各種型別的應用程式。

安裝
pip install langchain

LangChain 中有各種模組。透過使用這些模組,開發人員可以輕鬆構建應用程式。模組名稱如下:

  1. Models
  2. Memory
  3. Prompt
  4. Chain
  5. Agent
  6. Call Backs

現在,我們將簡要討論這些模組,具體如下

1.Model模型
模型是 LangChain 的模組之一。它指的是大型語言模組(LLM)。它們的大小是這些 LLM 的特徵。它們擁有引數眾多的神經網路,並在大量匿名資料的基礎上進行訓練。這家科技公司已經生產了多個大型語言模組(LLM),具體如下

  • 谷歌建立了 LaMDA。
  • 谷歌還建立了 BERT。
  • 谷歌建立了 PaLM。
  • OpenAI 開發了 ChatGPT、GPT 3、GPT 3.5 和 GPT 4。
  • Meta AI 開發了 LLaMA。
  • OpenAI 開發了 GPT 4,比 GPT 3 更為成功。

現在我們以 Python 中的 LangChain 模組為例。示例如下

from langchain.llms import OpenAI  
import os  
   
os.environ['OPENAI_API_KEY'] = 'Enter your openAI API key'  
model = OpenAI(temperature=0.8)  
   
p = model(<font>"Please Tell me the weather report")  
   
print(p)  

輸出:
現在我們用 Python 編譯上述程式碼,編譯成功後執行它。輸出結果如下

Q: What is the weather report for today?
A: Saturday, 10:00 am, Haze, 31°C

2.記憶
LangChain 中的鏈和代理預設以無人值守模式執行。它們自行處理所有查詢。但是,在聊天機器人等一些應用中,儲存短期和長期的過往互動非常重要。因此,LangChain 需要記憶體。記憶體用於儲存與代理的通話狀態。

LangChain 中有兩類記憶記憶體元件。

  • 首先,LangChain 提供了一項服務,用於管理和控制所設計的先前會話。無論如何使用,它都是標準且有用的。
  • 其次,LangChain 提供了將這些電子裝置整合到鏈中的簡便方法。這使得它們在任何情況下都能發揮作用。

在 LangChain 中,有幾種實現記憶體的方法,下面將一一介紹。

I.記憶摘要Summary Memory:
摘要儲存器儲存任何歷史記錄的摘要。

II.緩衝儲存器Buffer Memory:
緩衝儲存器是最簡單的儲存器形式。它可以輕鬆地將以前的資訊作為緩衝儲存器儲存起來。

III.序列到序列儲存器Sequence to Sequence Memory:
序列到序列記憶體用於表示對話的歷史。這可用於提高語言構造的效能,如回答使用者的問題。

現在我們以 Python 中的 LangChain 記憶體模組為例。示例如下

from langchain.memory import ChatMessageHistory  
  
h = ChatMessageHistory()  
h.add_user_message(<font>"Hello coders!!")  
  
h.add_ai_message(
"Welcome to JavaTpoint!!")  
h.messages  

輸出:
現在我們用 Python 編譯上述程式碼,編譯成功後執行它。輸出結果如下
[HumanMessage(content='Hello coders!!', additional_kwargs={}),
 AIMessage(content='Welcome to JavaTpoint!!', additional_kwargs={})]

3.提示
提示是 LangChain 的另一個重要模組。我們知道,指令是我們給任何系統的想法,以便根據我們的資料更有針對性地完善我們的答案。它是一個非常強大的工具。提示報告基於使用者輸入、其他靜態資料和固定字串。

提示在許多應用中都有使用,下面將對此進行討論:

I.程式碼生成:
提示符用於程式碼生成系統。它可以根據任何自然語言的描述輕鬆生成程式碼。

II.聊天機器人
提示符還可用於建立聊天機器人。聊天機器人可以輕鬆理解使用者的查詢,然後根據該查詢生成結果。

III.回答問題
提示器用於回答使用者的問題。它能以正確、翔實的方式輕鬆回答任何問題。

IV.總結文章:
提示語還可用於任何文章的摘要。它可以用一句話輕鬆概括一篇簡短的文章。

from langchain import PromptTemplate  
   
temp = <font>"My favourite programming language is {name}"  
   
prompt = PromptTemplate(input_variables=[
"name"], temp = temp)  
exp = prompt.format(name=
"Python")  
   
print(exp)  

現在我們在 Python 中編譯上述程式碼,編譯成功後執行它。輸出結果如下

My favourite programming language is Python

現在我們再來看一個 Python 中 LangChain 的 Prompt 模組的例子。在這裡,我們基本上設定了一個長模板,並檢查 prompt 模組是否可以在任何型別的模板中工作。示例如下

from langchain import PromptTemplate  
  
template = <font>""
I want to join a software company as a programmer. 
What is the good role of a{product}? 
"""  
prompt = PromptTemplate(  
    input_variables=[
"product"],  
    template=template,  
)  
prompt.format(product=
"software company")  

現在我們在 Python 中編譯上述程式碼,編譯成功後執行它。輸出結果如下
I want to join a software company as a programmer.
What is the good role of a software company

4. Chain:
Chain鏈是 LangChain 的另一個重要模組。鏈是將各種元件組合成統一應用程式的一種方式。例如,您可以建立一個使用使用者輸入的鏈。使用 PromptTemplate 建立它。然後將響應傳送到 LLM。透過將多個鏈與其他產品組合,可以建立多個鏈。鏈可以輕鬆解決任何複雜任務。

LLMChain 是廣泛使用的平臺之一。根據目前的模式,它可以格式化兩類金鑰:輸入金鑰和儲存金鑰(如果有)。然後,格式化後的字串被髮送到 LLM。然後,LLM 建立返回物件。

呼叫模型後,可以採取措施呼叫模型。當您想將一個呼叫的輸出作為另一個呼叫的輸入時,這一點尤為重要。在這個鏈序列中,每個鏈都有一個輸入和一個輸出。該輸出被用作下一步的輸入。這一過程在鏈序列中持續執行。

現在我們以 Python 中的 LangChain 的 Chain 模組為例。如果您設定了一個帶有黑色空格的提示模板,並設定了一個鏈來填補空白。那麼鏈模組就可以幫助完成這個提示模板的空白填充。示例如下

from langchain.chat_models import ChatOpenAI  
from langchain.prompts.chat import (  
    ChatPromptTemplate,  
    HumanMessagePromptTemplate,  
)  
human_message_prompt = HumanMessagePromptTemplate(  
        prompt=PromptTemplate(template=<font>" I want to join a software company as a programmer. What is the good role of a{name}?",  
            input_variables=[
"name"],  
        )  
    )  
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])  
chat = ChatOpenAI(temperature=0.7)  
  
chain = LLMChain(llm=chat, prompt=chat_prompt_template)  
print(chain.run(
"software company "))  

現在我們在 Python 中編譯上述程式碼,編譯成功後執行它。輸出結果如下
I want to join a software company as a programmer.
What is the good role of a software company

5. Agent:
代理是 LangChain 的另一個重要模組。有些應用可能需要根據使用者輸入預先確定 LLM/其他工具和不確定性。這類系統包括可以訪問各種裝置的 "代理"。代理可以訪問裝置系統,然後根據使用者輸入決定呼叫其中的哪些工具。代理可以使用多種工具。它可以利用前一個動作的輸出輕鬆決定模組的下一個動作。它獲取前一個操作的輸出,然後將其作為下一個操作的輸入。

代理主要有以下兩種型別
a.計劃和執行代理--
計劃和執行代理首先決定如何完成一組操作,然後在不更新計劃的情況下完成所有工作。

b.行動代理
行動代理用於在每個時間步中利用前一個行動的輸出決定下一個行動。

示例 1:
現在我們以 Python 中的 LangChain 代理模組為例。該模組可以幫助回答您的問題。為此,我們需要匯入一些模組,即 OpenAI、ConversationChain 和 ConversationBufferMemory。示例如下

from langchain.llms import OpenAI  
from langchain.chains import ConversationChain  
from langchain.memory import ConversationBufferMemory  
import os  
os.environ['OPENAI_API_KEY'] = 'Please enter your api key here'  
   
model = OpenAI(temperature=0.6)  
chain = ConversationChain(llm=model,  
    verbose=True,  
    memory=ConversationBufferMemory()  
    )  
   
print(chain.predict(input=<font>"Please tell me something about JavaTpoint"))  


現在我們在 Python 中編譯上述程式碼,編譯成功後執行它。輸出結果如下

> Entering the new chain......
Prompt after formatting:
The following is a friendly conversation between people and AI. AI is talkative. It can provide a lot of unique content. If the AI does not know the answer to a question, it will say it doesn't.
Current conversation:
Human: Please tell me something about JavaTpoint.
AI:
> Finished chain.
 Sure! JavaTpoint offers many programming languages and technologies for people who want to learn and master. After checking the website constantly, I can confidently say that JavaTpoint has great content and features that make it the go-to place for programmers of all levels. Programming languages such as Java, Python, and C+ are well documented, with extensive tutorials, templates, and clear explanations to help develop the necessary skills. 

使用 LangChain 構建聊天機器人 Web 應用程式:
本文介紹了 LangChain 的所有模組。在這裡,我們還了解了聊天機器人。現在,我們需要使用 LangChain 構建一個聊天機器人 Webapp。該 Webapp 可用於建立 YouTube 影片的指令碼和標題。因此,首先我們需要安裝一些模組,以便使用 LangChain 構建該 Web 應用程式。模組如下

! pip install streamlit   
! pip install langchain  
! pip install OpenAI  
! pip install WikipediaAPIWrapper  

步驟 1:
現在設定 OPENAI_API_KEY 環境變數的值。設定為您的 API 金鑰。然後,你需要建立一個 OpenAI 賬戶來獲取 API 程式碼。之後,你將獲得 API 程式碼。環境變數用於儲存此任務的配置結果。在本例中,環境變數儲存在 API 金鑰中。

必須將 API 金鑰設定為環境變數,因為使用 API 時需要身份驗證。將 API 金鑰儲存為環境變數後,無需編碼即可安全、輕鬆地訪問程式碼。這一過程有助於將 API 金鑰等敏感資料與資料中心分開。它還有助於降低暴露風險。

現在,我們編寫程式程式碼來設定 OPENAI_API_KEY 環境變數的值。程式碼如下

import os  
os.environ['OPENAI_API_KEY'] = "Please enter your API key here"  

第 2 步
在下面的程式碼中,第一行匯入了 "streamlit "模組。"streamlit "模組用於構建任何網路應用程式。然後,我們將網路應用程式的標題設定為 "JavaTpoint"。第三行建立使用者可以輸入的文字輸入框。為了建立提示模板,我們使用了 "PromptTemplate "類。它是用於建立提示的字串。第一個標準現在用於建立 YouTube 影片的標題。第二個提示模板用於為 YouTube 影片生成指令碼。PromptTemplate "類的 "input_variables "引數指定了提示模板中使用的變數。

收集使用者輸入的方法多種多樣。變數 "wiki_research "用於儲存來自維基百科的研究成果。PromptTemplate "類的模板引數指定了提示模板的文字。

當前標題的模板是 "YouTube 影片的名稱是{概念}"。文字提示模板的模板是 "使用維基百科研究中的知識和資訊,在標題"{title}"下建立一個精美的 YouTube 影片指令碼:{wiki_research}"。

因此,現在我們給出如下程式碼

import streamlit as st  
st.title('JavaTpoint')  
input_text = st.text_input('Please enter your text here: ')  
from langchain.prompts import PromptTemplate  
title_template = PromptTemplate(  
    input_variables = ['concept'],  
    template=' Name of the YouTube video is {concept}'  
)  
script_template = PromptTemplate(  
    input_variables = ['title', 'wiki_research'],  
  template=''''' Create a beautiful YouTube video script under the title <font>"{title}" using knowledge and information from Wikipedia research: {wiki_research}'''  
)  

步驟 3
對於 ConversationBufferMemory 類,我們建立了兩個例項。該類儲存使用者與語言模型之間的對話歷史。這些資訊可用於提高目標使用者的語言理解能力,並建立更好、更綜合的回覆。memoryP "物件儲存名稱的會話引數。memoryQ "物件儲存文字通訊緩衝區。

input_key 引數指定用於儲存使用者輸入的變數。memory_key "引數指定用於在模型中儲存通訊引數的金鑰。

這裡我們使用了 LLMChain 類。該類用於連結多條指令。程式碼會建立兩個 LLMChain 類的例項。ChainP 物件用於根據使用者輸入建立列表。script_chainS "物件用於透過新聞和維基百科搜尋生成指令碼。

LLM 引數指定用於渲染文字的廣義語言模型。prompt 引數指定用於渲染文字的提示符。verbose 引數指定 LLMChain 物件是否列印建立資訊。output_key 引數指定用於在模型中儲存輸出的金鑰。

現在我們給出如下程式碼

memoryP = ConversationBufferMemory(input_key='concept', memory_key='chat_history')  
memoryQ = ConversationBufferMemory(input_key='title', memory_key='chat_history')  
model = OpenAI(temperature=0.9)  
chainP = LLMChain(llm=model, prompt=title_template, verbose=True, output_key='title', memory=memoryT)  
chainQ = LLMChain(llm=model, prompt=script_template, verbose=True, output_key='script', memory=memoryS)  

第 4 步
在這裡,我們建立了一個與維基百科應用程式介面互動的介面。它用於從文字中建立文章和維基百科研究報告,使用意義和教育構建文章,並在使用 Streamlit 建立的網頁的擴充套件部分展示文章、文章和維基百科研究報告。程式碼如下

wikipedia = WikipediaAPIWrapper()  
if input_text:  
    title = chainT.run(input_text)  
    wiki_research = wikipedia.run(input_text)  
    script = chainS.run(title=title, wiki_research=w_research)  
    qp.write(title)  
    qp.write(script)  
    with st.expander('Wikipedia-based exploration: '):  
        qp.info(w_research)  


總結:
在本教程中,我們將學習如何使用 LangChain 構建聊天機器人 Webapp。即使開發人員不熟悉語言結構,LangChain 也能輕鬆使用。在這裡,我們討論了 LangChain 的所有模組。最後,我們將分享構建聊天機器人 Webapp 的分步步驟。

相關文章