昨天進行LangChain的核心功能Chain的使用,定義一系列的有順序的任務流程,那麼今天我們也會介紹另一個核心功能PromptTemplates,在任務流程當中,我們可能重複著使用同一種Prompt,但接收多個使用者輸入,那麼PromptTemplates就會幫助很大!
昨天的程式碼
import os
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
os.environ["OPENAI_API_KEY"] = "你的OpenAI key"
model = ChatOpenAI(model="gpt-4o")
text = "hi!"
parser = StrOutputParser()
chain = model | parser
result = chain.invoke(text)
print(result)
現在我們import PromptTemplate,並且嘗試去使用系統訊息以及使用者輸入
from langchain_core.prompts import ChatPromptTemplate
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
若想要使用這個PromptTemplate,直接將字典作為輸入,替換需要的部分
result = prompt_template.invoke({"language": "Chinese", "text": "hi"})
最後可以結合之前的Chain,來將這個PromptTemplate加入工作流程!
chain = prompt_template | model | parser
完整的程式碼
import os
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
os.environ["OPENAI_API_KEY"] = "你的OpenAI key"
model = ChatOpenAI(model="gpt-4o")
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
# 需要輸出解析器
parser = StrOutputParser()
# 使用 | 組合提示模型和解析器
chain = prompt_template | model | parser
text = chain.invoke({"language": "Chinese", "text": "hi"})
print(text)
你好
為了展示出更多的應用價值,我們再展示出一個對話劇本產生器,輸入2個角色以及對話的背景,就可以產生出一段劇本
import os
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
os.environ["OPENAI_API_KEY"] = "你的OpenAI key"
model = ChatOpenAI(model="gpt-4o")
# 定義系統訊息,設置對話角色和情境
system_template = "創建一個對話場景包含 {character1} 和 {character2}."
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{dialogue_start}")]
)
# 需要輸出解析器
parser = StrOutputParser()
# 使用 | 組合提示模型和解析器
chain = prompt_template | model | parser
# 輸入對話角色和開始的對話
text = chain.invoke({"character1": "偵探", "character2": "嫌疑犯",
"dialogue_start": "你為什麼會在犯罪現場?"})
print(text)
偵探: (凝視著嫌疑犯)你為什麼會在犯罪現場?我們有目擊者說看到你在那裡。
嫌疑犯: (顯得有些緊張)我……我只是剛好路過。我那天晚上有點喝多了,所以走了一條平時不會走的路。
偵探: 喝多了?那你怎麼解釋你身上有受害者的血跡?
嫌疑犯: (睜大眼睛)血跡?不可能!我根本不知道有什麼犯罪發生了!
偵探: (把一張照片推到嫌疑犯面前)這是你當時穿的衣服,上面有明顯的血跡。你還要繼續否認嗎?
嫌疑犯: (低頭看著照片,沉默片刻)好吧,我承認我當時確實在那裡,但我沒有殺人!我只是看到有人倒在地上,我想幫忙,但看到他已經不行了,我就慌了。
偵探: (冷靜地)那麼,你看到的是誰?還有其他人在場嗎?
嫌疑犯: (深吸一口氣)我……我記得有一個穿著黑色風衣的人在那裡,但我沒看清他的臉。他看到我就跑了。
偵探: 好,這是一個開始。接下來你最好什麼都不要隱瞞,否則對你不利。你還記得其他細節嗎?
嫌疑犯: (努力回憶)我記得那人手上好像有什麼東西閃了一下,可能是刀。我真的沒有參與這件事,請你相信我。
偵探: (點頭)我們會調查你提供的線索。但如果我們發現你在說謊,你會面臨更嚴重的後果。現在,你最好交代清楚所有你知道的事情。
嫌疑犯: 好……我會說實話。希望你能找到真正的兇手。
明天我們會介紹LangServe,快速部屬應用程式