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 應用程式的步驟:

  1. 匯入必要的函式庫:from langchain_openai import OpenAIfrom langchain_core.prompts import ChatPromptTemplate
  2. 建立一個 OpenAI 物件:openai = OpenAI()
  3. 定義一個聊天提示範本:prompt_template = ChatPromptTemplate(input_variables=["question"], template="回答 {question}")
  4. 建立一個 Q&A 鏈:qa_chain = openai.get_qa_chain(prompt_template)
  5. 問一個問題:question = "什麼是 LangChain?"
  6. 取得答案: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 函式庫中匯入必要的類別,包括 StrOutputParserChatPromptTemplateOpenAI。這些類別分別負責解析輸出、建構提示和初始化 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:呼叫鏈式處理

最後,使用特定的輸入呼叫鏈式處理。鏈式處理將:

  1. 格式化提示以包含給定的輸入。
  2. 將格式化的提示傳送到 OpenAI 語言模型。
  3. 使用 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_openailangchain_core 中的 ChatOpenAIHumanMessage 類別。這些模組提供了與 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 提供了簡潔而強大的機制,用於構建根據大語言模型的應用程式。它巧妙地將載入檔案、向量化、語言模型呼叫和輸出解析等步驟抽象成可組合的模組,大幅降低了開發門檻。尤其值得一提的是 ChainAgent 等概念,讓開發者能以更直觀的方式協調複雜的 LLM 工作流程,實作從簡單問答到複雜推理的各種應用。然而,LangChain 本身並未解決 LLM 固有的問題,例如幻覺、偏見和上下文理解的限制。開發者仍需仔細選擇合適的 LLM,並針對特定應用場景進行微調和提示工程最佳化。展望未來,隨著 LLM 技術的持續發展,LangChain 勢必將扮演更重要的角色,成為構建更智慧、更人性化應用程式的根本。對於有意探索 LLM 應用開發的團隊,深入理解 LangChain 的核心概念和最佳實務至關重要。