iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
生成式 AI

LLM 應用、開發框架、RAG優化及評估方法 系列 第 10

Day10 GAI爆炸時代 - LCEL 進階介紹

  • 分享至 

  • xImage
  •  

在流程鏈中使用函式

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度以上。

使用 RunnableBranch

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年被迪拜的哈里發塔超越。

補充:Lambda 教學

# 基本範例
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囉!


上一篇
Day9 GAI爆炸時代 - LCEL 進階介紹
下一篇
Day11 GAI爆炸時代 - LangChain - memory記憶功能
系列文
LLM 應用、開發框架、RAG優化及評估方法 26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言