前言:
在上一篇文章中,我們初步探索了 LangChain 的基礎鏈式操作——LLMChain。它巧妙地將大語言模型(LLM)與提示模板(Prompt Template)相結合,為模型交互邏輯的封裝提供了一種簡潔而高效的方式。
然而,LangChain 的強大之處遠不止于此。在 LLMChain 的基礎上,LangChain 還提供了眾多實用的 Chain 工具,其中 Sequential Chain 尤為引人注目。Sequential Chain 可以被視為一種高級的工作流工具,它專為那些需要多步驟連續處理的大語言模型任務量身定制。
在現實的工作場景中,我們常常會遇到這樣的情況:任務的完成并非僅僅依靠簡單的問答就能達成,而是需要經過一系列復雜的邏輯推理和信息處理步驟。Sequential Chain 正是為解決這一難題而生。它能夠將這些分散的步驟有序地串聯起來,使得每一步的輸出無縫地成為下一步的輸入,從而實現整個任務的連貫處理。無論是對復雜問題進行逐步拆解、逐層提取關鍵信息,還是進行多階段的推理分析,Sequential Chain 都能大顯身手,極大地提高工作效率,為完成多步驟任務提供堅實有力的支撐。
在 LangChain 的 Sequential Chain 設計中,主要存在兩種類型:
? ? ?SimpleSequentialChain?:它適用于單一輸入和輸出的場景,每個鏈僅處理一個輸入,并基于此生成一個輸出。
? ? ?SequentialChain:這種類型能夠處理多個輸入和多個輸出,從而可以勝任更復雜的任務邏輯和數據流情況。
借助這兩種鏈類型,LangChain 有能力靈活地應對從簡單到復雜的多步驟任務,為開發者構建基于大語言模型的工作流提供高效的工具支持。
1:Simple Sequential Chain
Simple Sequential Chain 是 LangChain 中一種較為基礎的鏈式結構,主要用于將多個鏈依次串聯起來。其工作流程是,第一個鏈接收輸入,經過處理后生成輸出,這個輸出隨即作為第二個鏈的輸入,以此類推,直至最后一個鏈生成最終的結果。
從圖中可以看出,整個流程是線性和連續的,非常適合處理單一輸入和單一輸出的簡單任務場景。通過這種方式,任務被分解為多個獨立的步驟,易于管理和調試,同時保持邏輯的清晰性和處理的高效性。
接下來我們嘗試調用這個鏈-還是要先導入必要的庫
import os
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain.chains import LLMChain
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain.memory import ConversationBufferMemory
from langchain.chains import SimpleSequentialChain
# 設置 API 密鑰
os.environ["DASHSCOPE_API_KEY"] = 'sk-63f00f6776fd4f64beb06ed5edf197eb'
# 初始化通義千問模型
llm = ChatTongyi()
# 第一個提示模板,用于生成公司名稱
first_prompt = ChatPromptTemplate.from_template(
? ? "用一句話描述一個制作 {product} 的公司最合適的名稱是什么?"
)
# 鏈 1:根據產品生成公司名稱
chain_one = LLMChain(llm=llm, prompt=first_prompt)
# 第二個提示模板,用于生成公司描述
second_prompt = ChatPromptTemplate.from_template(
? ? "為以下公司寫一段 20 個詞的描述:{company_name}"
)
# 鏈 2:根據公司名稱生成公司描述
chain_two = LLMChain(llm=llm, prompt=second_prompt)
# 第三個提示模板,用于生成廣告語
third_prompt = ChatPromptTemplate.from_template(
? ? "根據以下公司描述生成一句創意廣告語:{company_description}"
)
# 鏈 3:根據公司描述生成廣告語
chain_three = LLMChain(llm=llm, prompt=third_prompt)
# 構建包含三個鏈的 SimpleSequentialChain
overall_simple_chain = SimpleSequentialChain(
? ? chains=[chain_one, chain_two, chain_three], ?# 將新鏈加入到鏈的順序中
? ? verbose=True# 輸出詳細日志
)
# 輸入產品信息,運行整個鏈
prodcut = '褲子'
print(overall_simple_chain.run(product))
從這里我們可以看出,利用這個SimpleSequentialChain鏈可以輕松構建出完整的工作流程。以總結一篇論文為例,我們的目標并不是簡單地讓大模型直接總結整篇文章,而是將任務拆解成更細的步驟:先讓模型分別總結第一段、第二段和第三段的內容,然后再對這些部分的總結進行匯總。通過這種將復雜問題逐步拆解的方式,可以顯著提升模型的回復質量和能力,確保結果更加精準和全面。
2:? ?Sequential Chain
? ? ?SequentialChain 是 LangChain 中一種功能強大的鏈式結構,相較于 SimpleSequentialChain,它提供了更高的靈活性和復雜性。SequentialChain 允許多個鏈并行處理不同的輸入,并且能夠將多個輸出進行合并或分別傳遞到后續的鏈中。從流程設計的角度來看,SimpleSequentialChain 只支持單一的線性順序,而 SequentialChain 則支持更復雜的流程設計,可以滿足更廣泛的業務需求。這種設計使得 SequentialChain 在處理復雜的多步驟任務時更加高效和靈活,能夠更好地適應各種復雜的場景和任務需求。
具體來說,SequentialChain 比 SimpleSequentialChain 的優勢在于:
? 輸入靈活性?:SequentialChain 支持用戶同時傳遞多個輸入,這些輸入可以分別進入不同的鏈條。例如,用戶可以將不同的數據集或參數分別傳遞給 Chain 1 和 Chain 3。
? 輸出管理?:每個鏈的輸出不僅可以作為下一個鏈的輸入,還可以分發到多個后續鏈。例如,Chain 2 和 Chain 3 的輸出都可以傳遞給 Chain 4。
? 多路合并:最后的鏈(如 Chain 4)可以整合來自多個鏈條的結果,生成最終輸出。這種設計使得 SequentialChain 在處理復雜的多步驟任務時更加靈活和強大,能夠更好地適應各種復雜的場景和任務需求。
假如我們希望按著圖片上的模式來進行定制Sequential Chain的話,第一步其實還是要先把SequentialChain導入
以下是一個完整示例:
import os
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain.chains import LLMChain
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain.chains import SequentialChain
# 設置 API 密鑰
os.environ["DASHSCOPE_API_KEY"] = 'sk-63f00f6776f197ea'
# 初始化通義千問模型
llm = ChatTongyi()
# 提示模板 1:將評論翻譯成中文
first_prompt = ChatPromptTemplate.from_template(
? ? "將以下評論翻譯成中文:"
? ? "\n\n{Review}"
)
# 鏈 1:輸入= Review,輸出= Chinese_Review
chain_one = LLMChain(
? ? llm=llm,
? ? prompt=first_prompt,
? ? output_key="Chinese_Review"# 定義輸出變量的名稱
)
# 提示模板 2:總結中文評論
second_prompt = ChatPromptTemplate.from_template(
? ? "請用一句話總結以下評論:"
? ? "\n\n{Chinese_Review}"
)
# 鏈 2:輸入= Chinese_Review,輸出= summary
chain_two = LLMChain(
? ? llm=llm,
? ? prompt=second_prompt,
? ? output_key="summary"# 定義輸出變量的名稱
)
# 提示模板 3:檢測評論的語言
third_prompt = ChatPromptTemplate.from_template(
? ? "以下評論是用什么語言寫的:\n\n{Review}"
)
# 鏈 3:輸入= Review,輸出= language
chain_three = LLMChain(
? ? llm=llm,
? ? prompt=third_prompt,
? ? output_key="language"# 定義輸出變量的名稱
)
# 提示模板 4:根據總結和語言生成回復
fourth_prompt = ChatPromptTemplate.from_template(
? ? "根據以下總結和指定語言,以一個商家的視角,寫一條對應語言的后續回復(最終只需要輸出一條即可):"
? ? "\n\n總結: {summary}\n\n語言: {language}"
)
# 鏈 4:輸入= summary, language,輸出= followup_message
chain_four = LLMChain(
? ? llm=llm,
? ? prompt=fourth_prompt,
? ? output_key="followup_message"# 定義輸出變量的名稱
)
# 創建 SequentialChain,將所有鏈條整合為一個流程
# 輸入= Review,輸出= Chinese_Review, summary, followup_message
overall_chain = SequentialChain(
? ? chains=[chain_one, chain_two, chain_three, chain_four], ?# 定義鏈條的順序
? ? input_variables=["Review"], ?# 定義輸入變量
? ? output_variables=["Chinese_Review", "summary", "followup_message"], ?# 定義輸出變量
)
# 提取評論并運行鏈條
review = 'I love this product!' ?
print(overall_chain(review))
通過這個例子,我們可以清晰地看到,由于這種鏈式結構允許自定義內部的輸入和輸出,它非常適合處理復雜的任務場景,例如:
1. 整合來自不同渠道的信息(如數據分析和用戶行為總結)。
2. 將任務分解為多個步驟進行處理,然后匯總結果。
3. 創建復雜的工作流程,例如多步驟問答、多段落文本生成和多維度分析等。
這種鏈式結構的靈活性和可定制性使其成為處理復雜任務的理想選擇,能夠有效地支持各種高級應用場景。
小結
SimpleSequentialChain 適合于那些需要單一輸入和單一輸出的場景,任務按照順序一步步處理,每一步的輸出直接成為下一步的輸入。這種結構簡單直觀,非常適合那些邏輯線性、步驟明確且清晰的工作流程。
而 SequentialChain 則是對 SimpleSequentialChain 的擴展,它支持多輸入和多輸出,提供了更大的靈活性。這種結構能夠將復雜的任務分解成多個部分,并通過明確的輸入輸出變量將它們連接起來,從而實現更復雜的流程設計和任務整合。
通過這兩種鏈結構,我們不僅可以清晰地定義任務邏輯,還可以靈活地適應不同的場景需求。例如,在多語言客戶服務場景中,SequentialChain 可以輕松地完成從評論翻譯、總結、語言檢測到個性化回復生成的整個工作流程。
總的來說,無論是處理單一線性任務,還是需要多路并行和輸出合并的復雜流程,LangChain 提供的鏈式工具都能顯著提高大語言模型任務的執行效率和可擴展性,為開發者構建智能化工作流提供了強有力的支持。