[LangChain 學習筆記-第二筆]如何使用Prompt Template與Output Parser

Kuei
6 min readJan 13, 2024

--

上一篇中,我們簡要了解了 LangChain 的優勢和學習資源,同時完成了套件的安裝。今天,我們將嘗試實作 LangChain 中的 Prompt Template 與 Output Parser。這兩個模組代表了LLM服務的輸入與輸出,因此在部署LLM服務中扮演著相當重要的角色。

在這次的實作中,我們將使用LLM來執行命名實體辨識(Named Entity Recognition,NER)的任務。簡單來說,這個任務的目的是從文本中提取出關鍵字詞。

整個運算流程如下:首先,使用者輸入的語句會通過 Prompt Template 模組,獲得完整的任務指示。接著,LLM執行回答,最後 Output Parser 將LLM的回答解析成後續程式易於操作的字典格式。

命名實體辨識流程

接下來就開始依序實作吧!

1. Import 需要的套件

from langchain.prompts import PromptTemplate
from langchain_community.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser

2. 實作Prompt Template

首先,我們應該編寫任務指示的 Prompt。這裡需要特別注意的是字串中的 {input_sentence},這是 LangChain 將使用者輸入的字串插入的地方,類似Python的 F-string 用法。

ner_prompt = """ 
# CONTEXT #
你將會接收到一段文字, 該段文字會被涵蓋在html的tag之中,
看到<text>代表句子的開始,看到</text>代表句子的結束

# OBJECTIVE #
你的任務是將接受到的文字進行命名實體的辨識, 你需要辨識的實體會以"WEATHER"與"ACTIVITY"這兩項

# RESPONSE #
回覆的格式會是JSON的格式key會是實體的類別, value則是辨識出的實體

<text>
{input_sentence}
</text>

"""

接下來建立 Prompt Template 與 LLM Chain,這裡我們設定 verboseTrue 以便查看 LangChain 的運算過程。

prompt_template = PromptTemplate.from_template(ner_prompt)
llm = ChatOpenAI()
chain = LLMChain(llm=llm,prompt=prompt_template,verbose=True)

3. 執行LLM Chain 並觀察結果

建立問題並輸入至剛剛建立好的LLM Chain

question = "今天是晴天,很適合出外踏青"
res = chain.run({"input_sentence":question})

執行後,我們可以看到以下訊息,可以發現原本的 {input_sentence} 變成我們所設定的字串了:

> Entering new LLMChain chain...
Prompt after formatting:

# CONTEXT #
你將會接收到一段文字, 該段文字會被涵蓋在html的tag之中,
看到<text>代表句子的開始,看到</text>代表句子的結束

# OBJECTIVE #
你的任務是將接受到的文字進行命名實體的辨識, 你需要辨識的實體會以"WEATHER"與"ACTIVITY"這兩項

# RESPONSE #
回覆的格式會是JSON的格式key會是實體的類別, value則是辨識出的實體

<text>
今天是晴天,很適合出外踏青
</text>

觀察辨識結果,可以發現結果看起來很不錯,中英混雜的理解變得不再是問題。但資料型態為字串,這會不方便後續程式的讀取與使用,因此我們需要使用 Output Parser 來將字串解析成Python的字典。

LLM輸出結果

4. 使用Output Parser來解析

首先使用 ResponseSchema 定義每個 Entity 的名稱與描述,定義完成後,使用 StructuredOutputParser 建立 output parser:

weather_schema = ResponseSchema(name="WEATHER",
description="從句子中,所辨識出的天氣實體")

activity_schema = ResponseSchema(name="ACTIVITY",
description="從句子中,所辨識出的活動實體.")

response_schemas = [weather_schema, activity_schema]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

建立完成後, 就可以開始進行解析了

res_dict = output_parser.parse(res)

執行結果:

經Langchain Output Parser的結果

結論

這次的實作過程讓我們初步體驗了 LangChain 的 Prompt Template 與 Output Parser 的強大功能。透過 Prompt Template,我們能夠清晰地定義任務指示,並在其中動態插入使用者輸入的內容。而 Output Parser 則提供了一個有效的方式來將複雜的字串結構轉換成易於處理的 Python 字典。個人認為Output Parser挺不錯的, 除了方便解析, 還可以讓我們方便控管整個輸出結構.

--

--

No responses yet