iT邦幫忙

2023 iThome 鐵人賽

DAY 16
1

https://ithelp.ithome.com.tw/upload/images/20230920/20154415Hhu9IN5Giv.png
今天,我們將首先實作語言學習助理 LangChain 的「內容摘要」功能。完整的程式碼可在以下連結中找到:D16. LangChain 專案實做 - 內容摘要.ipynb

在深入實作之前,讓我們先簡單了解 LangChain 的基礎概念。

LangChain 模型的輸入/輸出(I/O)

https://ithelp.ithome.com.tw/upload/images/20230920/20154415HuIa6LGV2Y.png
LangChain 的最核心功能在於簡化與語言模型交流時的提示(Prompt)設計。設計完成我們的提示訊息後,這些提示訊息會被傳遞到語言模型中。LangChain 提供了兩種不同類型的語言模型界面,分別是 LLM 和 Chat Model。在輸入提示訊息後,語言模型會返回一個回應。這個回應可以直接作為消息使用,或者進一步解析為結構化數據。LangChain 也提供了一系列實用工具來進行這種解析,我們稍後將詳細介紹這一點。

我們今天的主要焦點則是提示訊息的格式化方法以及 LLM 和 Chat Model 這兩種語言模型的區別。

提示訊息的參數化

LangChain 的提示訊息格式化工具稱為 PromptTemplate。以文本摘要的提示設計為例,我們可以這樣設計提示:

from langchain.prompts import PromptTemplate
 
prompt_digest = """
使用 {lang} 來將下方的影片內容做100字以內的摘要。
影片內容:{content_text}
"""

prompt = PromptTemplate.from_template(prompt_digest)

在上面的例子中,我們用大括弧作為占位符來表示會變動的語言和內容。有了這樣的提示後,我們可以呼叫 from_template 函數,LangChain 便會自動生成一個包含 langcontent_text 變數的 PromptTemplate 物件。有了這個物件,我們就可以進行進一步的訊息格式化。

提示訊息的格式化

一旦我們有了參數化的 PromptTemplate 物件,就可以直接呼叫 format 函數來格式化提示,具體如下:

# 格式化一
# user_lang = '中文'
# content_text: 為文章完整內容
format_text1 = prompt.format(lang=user_lang, content_text=documents[0].page_content)

print(format_text1)

--- 以下為格式化後的輸出 ---
>> 使用 中文 來將下方的影片內容做100字以內的摘要。
影片內容:LangChain is a framework designed to simplify the creation of applications using large language models (LLMs). ... it can read from more than 50 document types and data sources

此外,除了 format,我們也可以使用另一個函數 format_prompt 來進行格式化。當我們使用 format_prompt 時,返回的將是 LangChain 內容使用的儲存結構。請見下方的實際輸出範例:

# 格式化二
format_text2 = prompt.format_prompt(lang=user_lang, content_text=documents[0].page_content)

print(format_text2)

--- 以下為實際的輸出內容 ---
>> text='\n使用 中文 來將下方的影片內容做100字以內的摘要。\n影片內容:LangChain is a framework designed to simplify the creation of applications using large language models (LLMs). ... it can read from more than 50 document types and data sources\n'

使用 LLM 取得回覆

完成提示訊息和它的參數設定後,我們即可以使用 LangChain 提供的語言模型物件來獲得回應。關於 LangChain 的語言模型,我們在文章一開始已經提過,LangChain 提供了兩種語言模型界面。首先,我們將展示如何使用第一種語言模型,即 LLM:

# 取得中文摘要
from langchain.llms import OpenAI

# 建立語言模型物件
llm_model = OpenAI(model_name=model_name, temperature=temperature)

formatted_prompt = prompt.format(lang=user_lang, content_text=documents[0].page_content)

# 輸入提示訊息,取得回應
output_user_lang = llm_model(formatted_prompt)
print(output_user_lang)

在上面的程式碼示例中,我們從 llms 模組中導入了 OpenAI 的 LLM 語言模型,並建立了一個語言模型物件 llm_model。有了這個物件後,我們便可以傳遞格式化後的提示訊息給該物件來獲取模型的回應。

自定義提示訊息的變數

除了使用 from_template 來自動生成提示,我們也可以手動指定變數,程式碼如下:

from langchain.prompts import PromptTemplate
 
prompt_digest = """
使用 {lang} 來將下方的影片內容做100字以內的摘要。
影片內容:{content_text}
"""

prompt2 = PromptTemplate(
    template=prompt_digest,
    # 這裏就是人工指定變數的方式
    input_variables=["lang", "content_text"],
)

使用 from_templateinput_variables 的主要區別在於設計靈活性。input_variables 允許我們在更複雜的提示組合中具有更高的靈活性。而在沒有特殊需求的情況下,您可以直接使用 from_template 來快速開發。

提示訊息變數的檢查

另一個值得一提的功能是 LangChain 對變數的自動檢查。當我們的提示訊息中指定了多個變數後,LangChain 在執行語言模型的回應請求時,會自動檢查所有變數是否都有對應的參數。例如我們下方的例子,若提示訊息缺少 lang 變數,則會收到如下的錯誤訊息:

# variable validation
from langchain.llms import OpenAI

llm_model = OpenAI(model_name=model_name, temperature=temperature)

# 這裏少了 lang 這個變數的參數設定
formatted_prompt = prompt2.format(content_text=documents[0].page_content)
output_learning_lang = llm_model(formatted_prompt)
print(output_learning_lang)

--- 執行以上的程式碼時,我們會得到以下輸出 ---
>> KeyError                                  Traceback (most recent call last)
<ipython-input-38-68a36e787192> in <cell line: 7>()
      5 
      6 # 這裏少了 lang 這個變數的參數設定
----> 7 formatted_prompt = prompt2.format(content_text=documents[0].page_content)
      8 output_learning_lang = llm_model(formatted_prompt)
      9 print(output_learning_lang)
      ...
----> 227             return kwargs[key]
      228 
      229 
KeyError: 'lang'

Chat Model 語言模型

除了前面介紹的 LLM,LangChain 也提供了 Chat Model 類型的語言模型。兩者有何不同呢?

簡單來說,LLM 主要用於簡單的問答交互。但是當你的提示訊息若包含更複雜的指令,例如角色扮演、背景資料資訊時,LLM 語言模型則會將所有資訊放在同一個訊息中。

而 Chat Model 則更進一步,將訊息細分為 SystemMessageHumanMessageAIMessage 這三種類型,這三種訊息類別其實也可以直接對應到 OpenAI API 定義的三個訊息角色:System、User 和 Assistant,如下圖:
https://ithelp.ithome.com.tw/upload/images/20230920/20154415LJYMmvXcLb.jpg
然而,由於我們在之前的文章中已對這些角色進行了詳細解釋,這裡就不再贅述。如果您對這些角色還不太了解,歡迎參考之前的文章: [D8] OpenAI API 入門 - Chat Completion 訊息角色

Chat Model 語言模型的訊息參數化

最後,我們再來看看使用 Chat Model 類型的語言模型時,如何進行提示訊息的變數設定和格式化:

# 使用 chat model
from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chat_models import ChatOpenAI

chat_model = ChatOpenAI(model_name=model_name)

prompt_digest_system = """
你是一個內容摘要器,請將影片內容使用 {lang} 做30個字以內的內容摘要。
"""

prompt_digest_human = """
影片內容:{content_text}
"""

# 這裏是 SystemMessage 的 PromptTempalte 類別
system_message_prompt = SystemMessagePromptTemplate.from_template(prompt_digest_system)

# 這裏是 HumanMessage 的 PromptTempalte 類別
human_message_prompt = HumanMessagePromptTemplate.from_template(prompt_digest_human)

# 將 SystemMessagePromptTemplate 以及 HumanMessagePromptTemplate 彙集成 ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

# 在正式將提示訊息輸入給 chat model 語言模型前,我們需要將它先轉換成 chat model messages 清單
chat_prompt_messages = chat_prompt.format_prompt(lang=user_lang, content_text=documents[0].page_content).to_messages()
#print(f'chat_prompt_message_structre: {chat_prompt}')

# 提交給 chat model 語言模型
response = chat_model(chat_prompt_messages)
print(response)

--- 以下是實際的輸出內容 ---
>> content='LangChain是一個旨在簡化使用大型語言模型(LLM)創建應用程序的框架...API包裝器和Web爬蟲子系統等。' additional_kwargs={} example=False

本文中,我們探討了如何使用 LangChain 的 Chat Model 語言模型來實作內容摘要功能。透過示範,你應該已經了解到,不僅 LangChain 提供了強大而靈活的工具,還簡化了與大型語言模型互動的過程。

如果你有興趣深入了解 LangChain 或者其他相關的主題,請參考以下資源:

感謝您的閱讀!如果您有任何疑問或建議,歡迎在下方留言或者跟我聯絡。


上一篇
[D15] LangChain 專案實做 - Hello LangChain
下一篇
[D17] LangChain 專案實做 - 教學詞彙推薦
系列文
以 OpenAI 以及 LangChain 實做我的聊天機器人41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言