LangChain 提供了便捷的工具和框架,簡化了根據大語言模型的應用程式開發流程。本文將逐步示範如何使用 LangChain 結合 OpenAI 的大語言模型,構建功能完善的問答系統和聊天機器人。首先,我們會介紹 LangChain 的核心概念,包括模型 I/O、不同模型型別以及其優勢。接著,將會深入探討如何載入檔案、建立向量儲存、初始化語言模型、建立問答鏈,最後示範如何使用問答鏈進行實際的問答操作。後續將會進一步說明如何利用 LangChain 與 OpenAI 建立簡單的語言模型應用程式,包含匯入必要類別、建立輸出解析器、提示範本、初始化 OpenAI 語言模型、建立鏈式處理以及呼叫鏈式處理的完整程式碼範例。最後,我們將會介紹如何建立一個互動式的聊天機器人,包含匯入必要模組、設定 OpenAI API 金鑰、建立聊天模型例項、定義提示範本、建立 LLMChain 以及呼叫模型的詳細步驟,並提供程式碼範例和流程圖解說,讓讀者能夠輕鬆理解和實作。
使用 LangChain 建立問答系統
LangChain 是一個強大的工具,能夠幫助您建立複雜的 AI 驅動解決方案。以下是使用 LangChain 建立一個基本的問答系統的步驟:
步驟 1:載入檔案
首先,您需要載入您要使用的檔案。這可以使用 TextLoader 類別來完成。例如:
from langchain.document_loaders import TextLoader
loader = TextLoader('your_data.txt')
documents = loader.load()
這將載入 your_data.txt 檔案中的檔案,並將其儲存在 documents 變數中。
步驟 2:建立向量儲存
接下來,您需要建立一個向量儲存,以便儲存檔案的向量表示。這可以使用 FAISS 類別來完成。例如:
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(documents, embeddings)
這將建立一個向量儲存,並使用 OpenAIEmbeddings 類別來計算檔案的向量表示。
步驟 3:初始化語言模型
然後,您需要初始化一個語言模型,以便用於問答系統。這可以使用 ChatOpenAI 類別來完成。例如:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo")
這將初始化一個 gpt-3.5-turbo 語言模型。
步驟 4:建立問答鏈
接下來,您需要建立一個問答鏈,以便用於問答系統。這可以使用 RetrievalQA 類別來完成。例如:
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
這將建立一個問答鏈,並使用 vectorstore 作為檢索器。
步驟 5:使用問答鏈
最後,您可以使用問答鏈來回答問題。例如:
query = "Your question here"
result = qa_chain.invoke({"query": query})
print(result['result'])
這將輸出問答鏈的答案。
圖表翻譯:
這個圖表展示了使用 LangChain 建立問答系統的步驟。
LangChain 入門
LangChain 是一個強大的工具,能夠幫助您建立根據語言模型的應用程式。以下是 LangChain 的基本概念和使用方法。
LangChain 的核心功能
LangChain 的核心功能是 Model IO,它允許您輕鬆地與各種語言模型(LLMs)進行互動。Model IO 提供了一個統一的介面,讓您可以使用不同的語言模型,無需修改程式碼。
LangChain 的模型型別
LangChain 支援兩種型別的模型:一般 LLM 模型和 Chat 模型。
- 一般 LLM 模型:是一種文字完成模型,可以預測輸入文字的最可能續寫。您可以將字串提示作為輸入,並生成字串完成作為輸出。
- Chat 模型:是在 LLMs 的基礎上建立的,專門用於進行人機對話。您可以傳送人類訊息,AI 會以自己的訊息作為回應,對話就這樣不斷進行下去。
建立一個簡單的 Q&A 應用程式
以下是建立一個簡單的 Q&A 應用程式的步驟:
- 匯入必要的函式庫:
from langchain_openai import OpenAI和from langchain_core.prompts import ChatPromptTemplate - 建立一個 OpenAI 物件:
openai = OpenAI() - 定義一個聊天提示範本:
prompt_template = ChatPromptTemplate(input_variables=["question"], template="回答 {question}") - 建立一個 Q&A 鏈:
qa_chain = openai.get_qa_chain(prompt_template) - 問一個問題:
question = "什麼是 LangChain?" - 取得答案:
answer = qa_chain(question)
LangChain 的優點
LangChain 有以下優點:
- 靈活性:LangChain 允許您輕鬆地在不同的語言模型之間切換。
- 易用性:LangChain 提供了一個統一的介面,讓您可以使用不同的語言模型,無需修改程式碼。
- 擴充套件性:LangChain 支援多種型別的模型和應用程式。
內容解密:
上述程式碼示範瞭如何使用 LangChain 建立一個簡單的 Q&A 應用程式。首先,我們匯入必要的函式庫,然後建立一個 OpenAI 物件和一個聊天提示範本。接下來,我們建立一個 Q&A 鏈,並問一個問題。最後,我們取得答案並輸出結果。
from langchain_openai import OpenAI
from langchain_core.prompts import ChatPromptTemplate
openai = OpenAI()
prompt_template = ChatPromptTemplate(input_variables=["question"], template="回答 {question}")
qa_chain = openai.get_qa_chain(prompt_template)
question = "什麼是 LangChain?"
answer = qa_chain(question)
print(answer)
圖表翻譯:
以下是 LangChain 的架構圖:
這個圖表展示了 LangChain 的核心功能 Model IO,以及它如何與不同的語言模型(LLMs)進行互動。Model IO 提供了一個統一的介面,讓您可以使用不同的語言模型,無需修改程式碼。
使用 LangChain 與 OpenAI 建立簡單的語言模型應用
首先,您需要從 LangChain 函式庫中匯入必要的類別,包括 StrOutputParser、ChatPromptTemplate 和 OpenAI。這些類別分別負責解析輸出、建構提示和初始化 OpenAI 語言模型。
步驟 1:匯入必要的類別
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import OpenAI
from langchain_core.prompts import ChatPromptTemplate
步驟 2:建立輸出解析器
建立一個 StrOutputParser 例項,用於將語言模型的輸出轉換為字串。
output_parser = StrOutputParser()
步驟 3:建立提示範本
建立一個 ChatPromptTemplate 例項,包含兩條訊息:一條系統訊息,設定了 AI 的上下文(以健康專家身份行事),以及一條使用者訊息,包含一個 {input} 領域,用於實際查詢。
prompt = ChatPromptTemplate.from_messages([
("system", "您是一位著名的健康專家,尤其是在心血管活動方面。"),
("user", "{input}")
])
步驟 4:初始化 OpenAI 語言模型
初始化 OpenAI 語言模型,請記得替換 "openai_api_key" 為您的實際 OpenAI API 金鑰。
llm = OpenAI(api_key="openai_api_key")
步驟 5:建立鏈式處理
使用 | 運算子建立一個鏈式處理,連線提示、語言模型和輸出解析器。
chain = prompt | llm | output_parser
步驟 6:呼叫鏈式處理
最後,使用特定的輸入呼叫鏈式處理。鏈式處理將:
- 格式化提示以包含給定的輸入。
- 將格式化的提示傳送到 OpenAI 語言模型。
- 使用
StrOutputParser解析語言模型的回應。
output = chain.invoke({"input": "每天走一英里有什麼好處?"})
步驟 7:輸出結果
最終輸出將是一個字串,包含語言模型關於每天走一英里好處的回應,框架為健康專家對心血管活動的看法。
完整的端對端工作程式碼
以下是完整的端對端工作程式碼:
!pip install langchain_core==0.2.17 langchain_openai==0.1.16
from langchain_openai import OpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
#... (上述步驟)
恭喜您,您已經採用了一種簡單 yet 強大的方式與語言模型互動,使用 LangChain 和結構化輸入和輸出在鏈式處理流中。
建立對話式應用程式
與聊天模型對話相當直接,只要你掌握了基本技巧。首先,你需要從 langchain_openai 中匯入 ChatOpenAI 類別,這將允許你與 OpenAI 的聊天模型(如 GPT-3.5 Turbo 和 GPT-4)進行互動。
以下是你可以這樣做的步驟:
步驟 1:匯入必要模組
首先,你必須匯入與 OpenAI 的聊天模型互動、格式化訊息和處理環境變數相關的必要模組。這些模組包括用於與 OpenAI API 互動的類別,以及用於管理聊天會話的工具。
from langchain_openai import ChatOpenAI
from langchain import LLMChain, PromptTemplate
步驟 2:設定 OpenAI API 金鑰
為了使用 OpenAI 的 API,你需要有一個有效的 API 金鑰。你可以從 OpenAI 的官網獲得這個金鑰。一旦你有了金鑰,你就可以將它設定為環境變數或直接在你的程式碼中使用。
import os
# 設定 OpenAI API 金鑰為環境變數
os.environ["OPENAI_API_KEY"] = "你的 OpenAI API 金鑰"
步驟 3:建立聊天模型例項
有了 API 金鑰之後,你就可以建立一個 ChatOpenAI 例項,這將是你與 OpenAI 聊天模型互動的主要介面。
# 建立 ChatOpenAI 例項
chat_model = ChatOpenAI()
步驟 4:定義提示範本
為了與聊天模型進行互動,你需要定義一個提示範本。這個範本將包含使用者的輸入和系統的回應。
# 定義提示範本
template = PromptTemplate(
input_variables=["user_input"],
template="使用者:{user_input}\n系統:"
)
步驟 5:建立 LLMChain
LLMChain 是 LangChain 中的一個類別,允許你定義如何與大語言模型(LLM)互動。透過建立一個 LLMChain 例項,你可以指定如何處理使用者的輸入和模型的回應。
# 建立 LLMChain 例項
chain = LLMChain(
llm=chat_model,
prompt=template
)
步驟 6:呼叫模型
最後,你可以透過 invoke 方法呼叫模型,傳入使用者的輸入作為引數。
# 呼叫模型
output = chain.invoke({"user_input": "你的問題或輸入"})
print(output)
這樣,你就成功建立了一個基本的對話式應用程式,使用 OpenAI 的聊天模型來回應使用者的輸入。
使用 LangChain 與 OpenAI 建立聊天機器人
步驟 1:匯入必要模組
首先,我們需要匯入 langchain_openai 和 langchain_core 中的 ChatOpenAI 和 HumanMessage 類別。這些模組提供了與 OpenAI API 互動的功能。
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
import os
步驟 2:設定 OpenAI API 金鑰
為了安全性,建議將 OpenAI API 金鑰設為環境變數。這樣可以避免在程式碼中直接硬編碼金鑰。
# 設定 OpenAI API 金鑰為環境變數
os.environ["OPENAI_API_KEY"] = "您的 OpenAI 金鑰"
步驟 3:建立 ChatOpenAI 物件
建立一個 ChatOpenAI 的例項,指定使用的模型(本例中為 gpt-3.5-turbo-0125)和您的 OpenAI API 金鑰。溫度引數設為 0,表示模型會生成決定性的回應。
# 建立 ChatOpenAI 物件
chat_model = ChatOpenAI(model="gpt-3.5-turbo-0125", openai_api_key="您的 OpenAI 金鑰", temperature=0)
步驟 4:定義生成回應的函式
定義一個名為 generate_response 的函式,該函式接受使用者輸入的文字並根據此生成聊天機器人的回應。
# 定義生成回應的函式
def generate_response(text):
# 建立一個包含人類訊息的列表
messages = [HumanMessage(content=text)]
# 使用聊天模型生成回應
response = chat_model.invoke(messages)
return response
步驟 5:建立主互動迴圈
最後,建立一個無限迴圈,允許使用者重複與聊天機器人互動。
# 建立主互動迴圈
while True:
# 取得使用者輸入
user_input = input("請輸入訊息:")
# 呼叫 generate_response 函式生成回應
response = generate_response(user_input)
# 顯示聊天機器人的回應
print(response)
詳細解說
messages = [HumanMessage(content=text)]:在generate_response函式內,建立一個包含人類訊息的列表。HumanMessage類別代表由使用者送出的訊息,其內容為使用者的輸入文字。response = chat_model.invoke(messages):呼叫聊天模型的invoke方法,傳入包含人類訊息的列表。聊天模型處理這個訊息並生成一個回應。- 主迴圈允許使用者不斷輸入訊息並從聊天機器人獲得回應,實作互動對話。
圖表翻譯
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title LangChain打造AI問答系統實戰
package "機器學習流程" {
package "資料處理" {
component [資料收集] as collect
component [資料清洗] as clean
component [特徵工程] as feature
}
package "模型訓練" {
component [模型選擇] as select
component [超參數調優] as tune
component [交叉驗證] as cv
}
package "評估部署" {
component [模型評估] as eval
component [模型部署] as deploy
component [監控維護] as monitor
}
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml圖表翻譯:
此圖表描述了使用者與聊天機器人互動的流程。首先,使用者輸入一條訊息(A),然後聊天機器人根據這條訊息生成一個回應(B)。接著,系統顯示這個回應給使用者(C)。最後,程式回到開始,等待使用者下一次的輸入,形成一個迴圈(D)。
從技術架構視角來看,LangChain 提供了簡潔而強大的機制,用於構建根據大語言模型的應用程式。它巧妙地將載入檔案、向量化、語言模型呼叫和輸出解析等步驟抽象成可組合的模組,大幅降低了開發門檻。尤其值得一提的是 Chain 和 Agent 等概念,讓開發者能以更直觀的方式協調複雜的 LLM 工作流程,實作從簡單問答到複雜推理的各種應用。然而,LangChain 本身並未解決 LLM 固有的問題,例如幻覺、偏見和上下文理解的限制。開發者仍需仔細選擇合適的 LLM,並針對特定應用場景進行微調和提示工程最佳化。展望未來,隨著 LLM 技術的持續發展,LangChain 勢必將扮演更重要的角色,成為構建更智慧、更人性化應用程式的根本。對於有意探索 LLM 應用開發的團隊,深入理解 LangChain 的核心概念和最佳實務至關重要。