上一篇中,我們簡要了解了 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,這裡我們設定 verbose
為 True
以便查看 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的字典。
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 的 Prompt Template 與 Output Parser 的強大功能。透過 Prompt Template,我們能夠清晰地定義任務指示,並在其中動態插入使用者輸入的內容。而 Output Parser 則提供了一個有效的方式來將複雜的字串結構轉換成易於處理的 Python 字典。個人認為Output Parser挺不錯的, 除了方便解析, 還可以讓我們方便控管整個輸出結構.