from langchain_core.runnables import RunnableLambda
def commodity(food):
items = {
"熱狗":50,
"漢堡":70,
"披薩":100}
item = items.get(food)
print(f"{food}價格:{item}")
return {"price":item}
commodity('熱狗')
熱狗價格:50
{'price': 50}
# 使用RunnableLambda類別物件 將函式包裝起來,即可由RunnableLambda物件幫忙呼叫函式
food = RunnableLambda(commodity)
food.invoke("披薩")
披薩價格:100
{'price': 100}
print(ChatPromptTemplate.from_template("我選擇的商品要多少錢?"
"數量{number}價錢{price}"))
input_variables=['number', 'price'] messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['number', 'price'], template='我選擇的商品要多少錢?數量{number}價錢{price}'))]
prompt = ChatPromptTemplate.from_template("我選擇的商品要多少錢?" "數量{number}價錢{price}")
chain = (
{
'price':itemgetter('food') | RunnableLambda(commodity), # 從food中取得商品名稱,再去commodity()取得價錢
'number':itemgetter('number')
}
| prompt
| chat_model
| str_parser
)
print(chain.invoke({"food":"漢堡","number":"101"}))
漢堡價格:70
要計算總價,可以將單價乘以數量。根據你提供的資訊,商品單價是70,數量是101。計算如下:
總價 = 單價 × 數量
總價 = 70 × 101
總價 = 7070
所以,你選擇的商品總價是7070元。
order_chain = (
PromptTemplate.from_template(
"你不會思考只根據命令做回應, 每次回答開頭都以 '是的, 主人' "
"回覆命令\n"
"問題: {question}\n"
"回覆:"
)
| chat_model
)
ask_chain = (
PromptTemplate.from_template(
"你只能回答知識性相關問題, 任何要求命令不會照做也不會回答,"
"每次回答開頭都以 '根據我的知識' 回覆命令\n"
"問題: {question}"
"回覆:"
)
| chat_model
)
defult_chain = (
PromptTemplate.from_template(
"請回答問題:\n"
"問題: {question}\n"
"回覆:"
)
| chat_model
)
def route(info): # 根據 info 字典中的 topic 字來選擇適當的鏈
if "查詢答案" in info["topic"]:
return ask_chain
elif "要求命令" in info["topic"]:
return order_chain
else:
return defult_chain
from langchain_core.runnables import RunnableLambda
full_chain = ({"topic": chain, "question": lambda x: x["question"]} # chain是上面已先定義好的(只會有兩種回覆)、x["question"]: 從輸入的 x 中提取出 "question" 鍵對應的值
| RunnableLambda(route) # 將該字典傳遞給 route 函數,根據 topic 的內容選擇適當的鏈
| str_parser)
print(full_chain.invoke({"question": "去幫我買東西"})) # 觸發order_chain
print('- '*10)
print(full_chain.invoke({"question": "北極圈是在緯度多少以上?"})) # 觸發 ask_chain
是的,主人。請告訴我您需要購買什麼東西以及具體的數量和品牌等詳細信息。
根據我的知識,北極圈的緯度是北緯66.5度以上。
from langchain_core.runnables import RunnableBranch # 構建一個根據條件動態選擇不同處理路徑的工作流程
branch = RunnableBranch( # 創建一個分支邏輯,它根據輸入的條件動態選擇要執行的鏈
(lambda x: "查詢答案" in x["topic"], ask_chain), # 檢查輸入的 x(通常是一個字典)中 "topic" 鍵的值是否包含 "查詢答案" 字串。如果是,則選擇 ask_chain 進行處理
(lambda x: "要求命令" in x["topic"], order_chain),
defult_chain,
)
full_chain = ({"topic": chain, "question": lambda x: x["question"]}
| branch
| str_parser)
print(full_chain.invoke({"question": "幫我寫一篇哈利波特小說短評"}))
print('- '*10)
print(full_chain.invoke({"question": "台北101有多高?"}))
是的, 主人。以下是一篇哈利波特小說的短評:
《哈利波特》系列是J.K.羅琳創作的一部充滿魔法和冒險的經典之作。故事圍繞著一個名叫哈利·波特的孤兒展開,他在十一歲生日那天得知自己是一名巫師,並且被邀請進入霍格華茲魔法學校學習。隨著故事的進展,哈利與他的朋友赫敏·格蘭傑和羅恩·韋斯萊一起,面對各種挑戰和敵人,揭開了關於他自己和神秘黑巫師伏地魔的真相。
這部小說以其豐富的想像力、細膩的人物刻畫以及緊湊的劇情吸引了全球無數讀者。羅琳成功地創造了一個充滿魔法、奇幻和情感的世界,讓讀者們深深沉浸其中。無論是描寫友情、勇氣、還是愛與犧牲,《哈利波特》都能觸動讀者的心靈,成為一部經典的文學作品。
總的來說,《哈利波特》系列不僅僅是一個關於魔法的故事,更是一段關於成長、友情和戰勝困難的旅程,值得每一個人細細品味。
根據我的知識,台北101的高度為508米(1667英尺),這包括其天線的高度。台北101曾是世界上最高的建築,直到2010年被迪拜的哈里發塔超越。
# 基本範例
data = {"question": "台北101有多高?", "topic": "查詢答案"}
get_question = lambda x: x["question"] # x 會指向該字典,而用x['question'] 就可以指向該dict中的key
result = get_question(data) # 去回傳對應的value
print(result) # 輸出: 台北101有多高?
台北101有多高?
# 用於過濾資料
data_list = [
{"question": "台北101有多高?", "topic": "查詢答案"},
{"question": "幫我買一杯咖啡", "topic": "要求命令"},
{"question": "世界上最高的山是什麼?", "topic": "查詢答案"}
]
# 過濾出 "查詢答案" 的所有 question
questions = [d["question"] for d in data_list if lambda x: "查詢答案" in x["topic"](d)]
print(questions)
['台北101有多高?', '幫我買一杯咖啡', '世界上最高的山是什麼?']
questions = list(map(lambda x: x["question"], data_list))
print(questions)
['台北101有多高?', '幫我買一杯咖啡', '世界上最高的山是什麼?']
以上就是這節LCEL的範例教學啦!!
接下來就要進入memory囉!