精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

五分鐘理透 LangChain 的 Chain

人工智能
本文主要聊了 LangChain 中的 Chain 概念。Chain 是 LangChain 中的核心組件,我們對多個組件的一系列調用就是Chain。

LangChain幾乎是LLM應用開發的第一選擇,它的野心也比較大,它致力于將自己打造成LLM應用開發的最大社區。而LangChain最核心的部分非 Chain 莫屬。

那Chain到底是個啥,概念比較模糊,像霧像雨又像風,這篇文章將帶你快速理透 LangChain 中的 Chain 概念。

1. Chain是核心

LangChain的Chain到底是什么?一句話總結:Chain是指對 LangChain 多個組件的一系列調用。

再看看官網的解釋:Chain是指調用的序列 - 無論是調用 LLM、工具還是數據預處理步驟,主要支持的方法是使用 LCEL。

官網里還提到了LCEL,LCEL是LangChain 表達式語言,是一種更加高效簡介的鏈接 LangChain 組件的方式,也是官網推薦的方式。

從下圖官網的描述,也可以看到,Chain可以是從最簡單的“prompt + LLM”鏈 到 最復雜的鏈(運行了包含 100 多個步驟的鏈)。

2. 為什么需要Chain

我們所期待的LLM是能處理許多復雜任務,而非簡單的一問一答,也不是簡單的處理單一任務。

所以,最終我期待的LLM處理任務的流程應該是這樣,它中間的復雜過程對用戶來說是一個黑盒:

既然定位是完成復雜任務,那自然就需要通過某個機制將多個單一任務串起來,形成一個大的鏈條,多個步驟共同完成某個復雜任務。

Chain可以將多個步驟連接到一起,最終完成各種復雜繁瑣的任務。這就是Chain存在的必要性了。我很喜歡LangChain的Logo,很形象地表達了這一思想。

Chain需要對多個組件一系列的調用或者一系列的串聯,這樣才能完成復雜任務。當然,我們也可以把 Chain 看作是流水線。通過使用 Chain,你可以將各個步驟定義為獨立的模塊,然后按順序串聯起來。這樣不僅大大簡化了代碼邏輯,也使得整個流程更加直觀和易于管理。

而LCEL的存在,也只是為了讓構建鏈的過程更簡單,讓鏈的表達力更清晰更簡單。

接下來,我將通過一個示例展示沒有 Chain 和有Chain的2種實現方式,以便更清晰地理解 Chain 的價值。

3. 如果沒有Chain

這里舉個例子,比如:我們給LLM輸入一段項目描述,讓LLM給這個項目起一個名稱和Slogan。

如果不使用Chain的話,我們可以這樣實現。

# 本次需求:我們給LLM輸入一段項目描述,讓LLM給這個項目起一個名稱和Slogan
# 以下是實現:

from langchain.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser


proj_desc = """
    我們本次的項目是去森林里探險救援,我們有一個10人小隊,
    我們要到達一個叫做“蝴蝶谷”的目的地,去那里解救一位被困的科學家。
    這期間我們可能會遇到許多危險,我們需要共同合作,互相幫助,歷經磨難,才能到達目的地。
    我們的任務是要在5天內到達目的地并且救出探險家,才算完成這次探險,否則任務失敗,我們將受到懲罰。
    出發前我們要各自準備好自己的裝備和干糧,加油!
"""


def name_slogan_by_desc(project_desc):
    """
    根據項目描述,生成項目名稱和slogan
    """
    str_parser = StrOutputParser()

    promt_template_project_name = "請你根據<desc>標簽里的關于某個項目的描述,生成一個項目名稱,只需要返回項目名稱。<desc>{project_desc}</desc>"
    promt_project_name = PromptTemplate.from_template(promt_template_project_name)
    final_promt_project_name = promt_project_name.invoke({"project_desc": project_desc})
    res_project_name = model.invoke(final_promt_project_name)
    parsed_res_project_name = str_parser.invoke(res_project_name)


    promt_template_slogan = "請你根據<desc>標簽里的關于某個項目的描述,和這個項目的名稱{project_name},給這個項目起一個slogan,slogan要求干脆簡潔積極向上,只返回slogan。<desc>{project_desc}</desc>"
    promt_slogan = PromptTemplate.from_template(promt_template_slogan)
    final_promt_slogan = promt_slogan.invoke(
        {"project_desc": project_desc, "project_name": parsed_res_project_name}
    )
    response_slogan = model.invoke(final_promt_slogan)
    parsed_response_slogan = str_parser.invoke(response_slogan)


    final_result = {
        "project_name": parsed_res_project_name,
        "slogan": parsed_response_slogan,
    }
    return final_result

# 輸入項目描述,輸出項目名稱和slogan
result = name_slogan_by_desc(proj_desc)
print(result)

執行結果如下:

{'project_name': '蝴蝶谷救援行動', 'slogan': '拯救科學家,共同合作,蝴蝶谷等你來!'}

可以看到,實現過程比較繁瑣,變量和代碼也多,不夠直觀,很容易出錯。這還只是簡單場景,如果碰到復雜場景就更麻煩了。

4. 因為有了Chain

接下來,我們使用 LangChain 的 Chain 功能,來實現相同的功能。代碼如下:

# 本次需求:我們給LLM輸入一段項目描述,讓LLM給這個項目起一個名稱和Slogan
# 以下是實現:

from operator import itemgetter
from langchain.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.chains import LLMChain, SequentialChain

proj_desc = """
    我們本次的項目是去森林里探險救援,我們有一個10人小隊,
    我們要到達一個叫做“蝴蝶谷”的目的地,去那里解救一位被困的科學家。
    這期間我們可能會遇到許多危險,我們需要共同合作,互相幫助,歷經磨難,才能到達目的地。
    我們的任務是要在5天內到達目的地并且救出探險家,才算完成這次探險,否則任務失敗,我們將受到懲罰。
    出發前我們要各自準備好自己的裝備和干糧,加油!
"""

def name_slogan_by_desc(project_desc):
    """
    根據項目描述,生成項目名稱和slogan
    """

    # 第1條鏈
    promt_template_project_name = "請你根據<desc>標簽里的關于某個項目的描述,生成一個項目名稱,只需要返回項目名稱。<desc>{project_desc}</desc>"
    chain_one = LLMChain(
        llm=model,
        prompt=PromptTemplate.from_template(promt_template_project_name),
        output_parser=StrOutputParser(),
        output_key="project_name",
    )

    # 第2條鏈
    promt_template_slogan = "請你根據<desc>標簽里的關于某個項目的描述,和這個項目的名稱{project_name},給這個項目起一個slogan,slogan要求干脆簡潔積極向上,只返回slogan。<desc>{project_desc}</desc>"
    chain_two = LLMChain(
        llm=model,
        prompt=PromptTemplate.from_template(promt_template_slogan),
        output_parser=StrOutputParser(),
        output_key="slogan",
    )

    # 串聯兩條鏈
    sequential_chain = SequentialChain(
        chains=[chain_one, chain_two],
        input_variables=["project_desc"],
        output_variables=["project_name", "slogan"],
    )
    final_res = sequential_chain(project_desc)

    final_result = {
        "project_name": final_res["project_name"],
        "slogan": final_res["slogan"],
    }
    return final_result

# 輸入項目描述,輸出項目名稱和slogan
result = name_slogan_by_desc(proj_desc)
print(result)

執行結果如下:

{'project_name': '蝴蝶谷救援行動', 'slogan': '團結合作,共赴蝴蝶谷'}

可以看到代碼更簡潔,也很直觀,當然,也可以使用LCEL讓整個鏈條更加簡潔清晰。

5. LCEL表達式

LCEL方式的代碼如下:

# 本次需求:我們給LLM輸入一段項目描述,讓LLM給這個項目起一個名稱和Slogan
# 以下是實現:

from langchain.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

proj_desc = """
    我們本次的項目是去森林里探險救援,我們有一個10人小隊,
    我們要到達一個叫做“蝴蝶谷”的目的地,去那里解救一位被困的科學家。
    這期間我們可能會遇到許多危險,我們需要共同合作,互相幫助,歷經磨難,才能到達目的地。
    我們的任務是要在5天內到達目的地并且救出探險家,才算完成這次探險,否則任務失敗,我們將受到懲罰。
    出發前我們要各自準備好自己的裝備和干糧,加油!
"""

def name_slogan_by_desc(project_desc):
    """
    根據項目描述,生成項目名稱和slogan
    """

    # 第1條鏈
    promt_template_project_name = "請你根據<desc>標簽里的關于某個項目的描述,生成一個項目名稱,只需要返回項目名稱。<desc>{project_desc}</desc>"
    chain_one = (
        PromptTemplate.from_template(promt_template_project_name)
        | model
        | {"project_name": StrOutputParser(), "project_desc": lambda x: project_desc}
    )

    # 第2條鏈
    promt_template_slogan = "請你根據<desc>標簽里的關于某個項目的描述,和這個項目的名稱{project_name},給這個項目起一個slogan,slogan要求干脆簡潔積極向上,只返回slogan。<desc>{project_desc}</desc>"
    chain_two = (
        PromptTemplate.from_template(promt_template_slogan)
        | model
        | {"slogan": StrOutputParser(), "project_info": lambda x: chain_one}
    )

    # 串聯兩條鏈
    final_chain = chain_one | chain_two
    final_res = final_chain.invoke({"project_desc": project_desc})

    final_result = {
        "project_name": final_res["project_info"]["project_name"],
        "slogan": final_res["slogan"],
    }

    return final_result

# 輸入項目描述,輸出項目名稱和slogan
result = name_slogan_by_desc(proj_desc)
print(result)

普通方式和LCEL方式的核心代碼對比:

普通方式:

LCEL方式:

責任編輯:趙寧寧 來源: 程序員半支煙
相關推薦

2024-06-25 12:25:12

LangChain路由鏈

2023-05-25 08:02:09

構建工具源碼JS

2009-11-16 10:53:30

Oracle Hint

2025-03-13 06:22:59

2024-12-11 07:00:00

面向對象代碼

2020-06-16 08:47:53

磁盤

2025-01-07 08:11:06

ArrayArrayList場景

2021-09-07 09:40:20

Spark大數據引擎

2021-06-07 09:51:22

原型模式序列化

2019-08-09 10:33:36

開發技能代碼

2009-10-22 16:18:19

Oracle表空間

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2025-01-20 08:50:00

2009-11-05 14:53:54

Visual Stud

2021-10-19 07:27:08

HTTP代理網絡

2023-09-07 23:52:50

Flink代碼

2022-12-16 09:55:50

網絡架構OSI

2009-11-16 09:53:56

PHP上傳類

2009-11-17 14:50:50

Oracle調優

2025-01-21 07:39:04

Linux堆內存Golang
點贊
收藏

51CTO技術棧公眾號

欧美日韩大陆在线| 久久久亚洲午夜电影| 久久亚洲精品国产亚洲老地址| 无码国产精品一区二区高潮| 麻豆av在线免费观看| av电影在线观看一区| 日韩av电影在线网| 裸体武打性艳史| 日韩啪啪网站| 日韩一级免费观看| aⅴ在线免费观看| 黄色成人影院| 久久久久久久综合色一本| 91在线免费观看网站| 男女啊啊啊视频| 一区二区三区在线| 亚洲男人av在线| 久久无码人妻一区二区三区| 亚洲黄色免费看| 亚洲蜜臀av乱码久久精品| 久久久久成人精品免费播放动漫| 一级特黄特色的免费大片视频| 激情久久一区| 久久人人爽人人爽人人片亚洲| 亚洲黄色免费在线观看| 亚洲久草在线| 黑人巨大精品欧美一区二区三区 | 亚洲专区一二三| 日韩精品av一区二区三区| 亚洲精品成人电影| 精品一区二区久久| 国产97在线亚洲| 国产精品第九页| 天天天综合网| 在线观看欧美视频| 国产传媒第一页| 国产乱人伦丫前精品视频| 欧美无砖专区一中文字| 国产美女无遮挡网站| 青草影视电视剧免费播放在线观看| 国产人成亚洲第一网站在线播放| 久久久com| 色窝窝无码一区二区三区成人网站| 精品无人区卡一卡二卡三乱码免费卡 | 免费观看av网站| 久久av国产紧身裤| 精品久久99ma| 无码人妻一区二区三区一| 青娱乐极品盛宴一区二区| 91国产福利在线| 国产精品无码专区av在线播放| av中文在线资源库| 亚洲一区二区三区不卡国产欧美| 超碰97免费观看| 97超碰在线公开在线看免费| 亚洲人成网站在线| 欧美另类videosbestsex日本| 成人免费看片| 亚洲精品v日韩精品| 久久久99精品视频| 欧洲成人综合网| 午夜欧美视频在线观看| 秋霞无码一区二区| 色吧亚洲日本| 色系网站成人免费| caoporn超碰97| 欧美不卡高清一区二区三区| 欧美性生交片4| 老司机午夜性大片| 国内不卡的一区二区三区中文字幕 | 中文字幕精品网| 女教师淫辱の教室蜜臀av软件| 93在线视频精品免费观看| www.国产一区| 欧美激情国产精品免费| 亚洲免费激情| 国产成人精品免高潮在线观看| 男人天堂视频网| 久久99精品国产麻豆不卡| 亚洲精品欧美极品| 欧美一区二区三区黄片| 久久综合五月天婷婷伊人| 婷婷四月色综合| 91福利国产在线观看菠萝蜜| 亚洲风情在线资源站| av免费播放网址| 久久夜夜久久| 精品国产一区久久| 亚洲精品国产91| 中国成人一区| 欧美一乱一性一交一视频| 在线观看一二三区| 成人免费观看视频| 日韩av在线电影观看| 97caopor国产在线视频| 欧美午夜女人视频在线| 欧美激情第3页| 国偷自产av一区二区三区| 亚洲无限av看| 国产大片中文字幕| 免费观看成人av| 国产精品9999久久久久仙踪林| 欧美91精品久久久久国产性生爱| 最新热久久免费视频| 日韩人妻无码精品久久久不卡| 婷婷激情一区| 精品国产一区二区三区四区四 | 凹凸成人精品亚洲精品密奴| 九九热99久久久国产盗摄| 无码人妻精品一区二区三区不卡 | 在线成人黄色| 国产精品美女呻吟| 性xxxfllreexxx少妇| 亚洲丝袜精品丝袜在线| 久久国产乱子伦免费精品| 国产在线一区不卡| 尤物九九久久国产精品的特点| 欧美国产在线看| 欧美a一区二区| 精品国产免费久久久久久尖叫| 日韩精品成人av| 日本道精品一区二区三区| 国产xxxx视频| 欧美a级在线| 国产日韩欧美夫妻视频在线观看| 亚洲欧洲精品视频| 亚洲一级二级在线| www.桃色.com| 日本a级不卡| 青青久久aⅴ北条麻妃| 亚洲美女福利视频| 亚洲人成电影网站色mp4| 黄色免费网址大全| 久久不卡国产精品一区二区 | 在线观看17c| 久久精品黄色| 在线视频日本亚洲性| 精品国产午夜福利| 91网上在线视频| 国产二区视频在线| ccyy激情综合| 欧美高清一级大片| 亚洲第一天堂网| 一区二区三区精密机械公司| 香蕉视频999| 欧美xxxx中国| 成人性生交xxxxx网站| 欧美日韩在线看片| 欧美疯狂性受xxxxx喷水图片| 天堂资源在线视频| 美女视频一区二区| 亚洲一区二区三区涩| 国产一区二区色噜噜| 伊人av综合网| 亚洲天天综合网| 亚洲色图一区二区| 一级黄色大片儿| 国产精品地址| 国产一区二区久久久| 色戒汤唯在线观看| 亚洲日韩中文字幕在线播放| 自拍偷拍福利视频| 亚洲欧美日韩电影| 国产sm在线观看| 国产手机视频一区二区| 麻豆91av| 日本在线一区二区| 欧美另类在线播放| 手机在线观看免费av| 精品久久久久久久久久久| 国产男男chinese网站| 奇米777欧美一区二区| 中文字幕日韩精品一区二区| 蜜桃在线一区| 91精品国产91久久久| 蝌蚪视频在线播放| 欧美三级电影在线看| 日韩va亚洲va欧美va清高| 国产suv一区二区三区88区| 日韩av中文字幕第一页| 国产探花在线精品一区二区| 成人黄色av网| free性护士videos欧美| 亚洲欧美中文另类| 97超碰中文字幕| 亚洲国产精品精华液网站| 亚洲成人网在线播放| 久久精品国产久精国产| 妞干网视频在线观看| 国产精品亚洲人成在99www| 成人字幕网zmw| 免费毛片b在线观看| 中文字幕亚洲无线码在线一区| 国产视频在线免费观看| 午夜精品aaa| 欧美h片在线观看| 9l国产精品久久久久麻豆| 日本三级黄色网址| 亚洲国内自拍| 在线视频一区观看| 四虎影视精品| 99re视频在线播放| 日韩不卡免费高清视频| 欧美高跟鞋交xxxxhd| 99视频在线观看地址| 日韩欧美一二三| 日韩久久久久久久久久| 亚洲国产aⅴ天堂久久| 性少妇xx生活| 91毛片在线观看| 伊人影院在线观看视频| 日本成人在线一区| 午夜免费福利小电影| 999精品一区| 欧美一区二区三区在线播放| 中文字幕一区二区三区四区久久| 国产精品久久久久久亚洲影视| 女子免费在线观看视频www| 伊人久久五月天| 青梅竹马是消防员在线| 欧美大片一区二区三区| 国产女人高潮时对白| 欧洲另类一二三四区| 日韩精品在线免费视频| 亚洲香肠在线观看| 少妇影院在线观看| 亚洲欧洲精品一区二区三区| 国产真实乱人偷精品人妻| 99热99精品| 麻豆精品国产传媒av| 高清在线不卡av| 亚洲精品国产久| 久久99久久久欧美国产| 免费大片在线观看| 国产农村妇女精品一二区| 和岳每晚弄的高潮嗷嗷叫视频| 午夜精品999| 日日噜噜夜夜狠狠久久丁香五月| 日本电影一区二区| 色综合电影网| 日本一区二区免费高清| 日韩高清专区| 国产亚洲第一伦理第一区| 欧美二区在线| 免费视频一区三区| 你懂的网址一区二区三区| 日韩大片在线免费观看| 久久久综合亚洲91久久98| 青青一区二区| 欧美精品二区三区四区免费看视频| 欧洲精品一区| 玛丽玛丽电影原版免费观看1977 | 国产乱码精品一区二区三| 天堂中文av在线| 国产在线一区二区综合免费视频| 午夜大片在线观看| 国产精品99久久久久久有的能看| www.国产福利| 风间由美性色一区二区三区 | 97精品国产97久久久久久免费| 国产福利在线免费观看| 97精品一区二区视频在线观看| 成年男女免费视频网站不卡| 97视频在线观看网址| 韩国主播福利视频一区二区三区| 国产99久久精品一区二区 夜夜躁日日躁| 天堂а√在线最新版中文在线| 欧美最近摘花xxxx摘花| 91综合国产| **亚洲第一综合导航网站| 久久久久毛片免费观看| 国产伦精品一区二区三区在线| 亚洲第一二三区| 亚洲乱码国产乱码精品天美传媒| 久久久久亚洲| 国产美女在线一区| 视频一区中文字幕| 国产乱码一区二区三区四区| 高清不卡一二三区| www.久久av| 18成人在线视频| 青青草av在线播放| 欧美日韩一级二级| 丁香花免费高清完整在线播放 | 欧美午夜电影网| 午夜老司机福利| 亚洲人成电影在线| huan性巨大欧美| 日本精品视频在线播放| 91精品一区| 就去色蜜桃综合| 一精品久久久| 国产成人精品无码播放| 国产精品一品二品| 91精品人妻一区二区三区| 国产精品成人一区二区艾草| 国产一级在线观看视频| 欧美日韩一区三区| 天天摸天天干天天操| 久久精品视频网站| 裤袜国产欧美精品一区| 亚洲影院在线看| 精品国内自产拍在线观看视频 | 激情另类小说区图片区视频区| 蜜臀av粉嫩av懂色av| 中文字幕制服丝袜成人av| 成年免费在线观看| 制服.丝袜.亚洲.中文.综合| 韩国中文免费在线视频| 欧美激情久久久久| 亚洲成人a级片| 欧美一区二区在线| 激情亚洲网站| a级大片免费看| 国产精品美女久久久久久久久久久 | 成人激情电影在线看| 欧美激情精品久久久久久| a成人v在线| 欧美一进一出视频| 国产欧美精品久久| 99精品一区二区三区无码吞精| 成人免费视频在线观看| 最近中文字幕av| 亚洲美女激情视频| 九色porny丨首页入口在线| 97se国产在线视频| 亚洲成av人片乱码色午夜| 九九热在线免费| 久久久久久久久伊人| 国产成人综合欧美精品久久| 精品国产一区二区三区忘忧草| 99热国产在线| 99re国产| 欧美三级黄美女| 亚洲欧美激情一区二区三区| 亚洲日本护士毛茸茸| ,一级淫片a看免费| 中文欧美在线视频| 国产精品原创视频| 亚洲开发第一视频在线播放| 日韩电影免费一区| 亚洲一区二区自偷自拍| 91福利视频网站| 北岛玲日韩精品一区二区三区| 国产精品99久久99久久久二8| 夜色77av精品影院| av片中文字幕| 国产日产欧美一区| 中文字幕免费高清网站| 亚洲三级av在线| 黄色成人小视频| 少妇熟女一区二区| 国产精品资源站在线| 劲爆欧美第一页| 精品国产欧美一区二区| sm捆绑调教国产免费网站在线观看 | 中日韩免视频上线全都免费| 欧美 日韩精品| 国产午夜三级一区二区三| 久久午夜鲁丝片| 日韩中文字幕在线观看| 国产午夜亚洲精品一级在线| 久久免费一级片| 成人av在线观| 加勒比在线一区| 色偷偷88888欧美精品久久久| 欧美天堂一区| av在线免费观看国产| av电影一区二区| 免费黄色小视频在线观看| 日韩在线观看免费网站| 亚洲日本va中文字幕| 国产视频九色蝌蚪| 欧美极品美女视频| av老司机久久| 4438全国成人免费| 成人国产精品一级毛片视频| 欧美一级免费在线| 精品欧美aⅴ在线网站 | 国产精品国产三级国产专播品爱网 | 精品国产乱码久久久久久1区2区| 欧美激情20| 中文精品一区二区三区| 成人三级在线视频| 中文字幕永久在线| 久热国产精品视频| 欧美男人操女人视频| 人人干人人干人人| 亚洲香肠在线观看| 午夜激情视频在线观看| 国产一区国产精品| 久久精品免费看| 日本一区二区欧美| 中文字幕日韩专区| 美女av一区| 国产免费中文字幕| 欧美午夜视频一区二区| 搞黄网站在线观看| 日韩高清国产精品| av网站免费线看精品|