上一篇:(二)輸入輸出處理——打造智能對話的靈魂
在前兩個階段,我們已經搭建了一個基礎的智能對話,并深入探討了輸入輸出處理的細節。今天,我們將進入智能對話的高級階段——鏈式工作流構建。這一階段的目標是通過鏈式調用和復雜邏輯編排,讓對話系統具備更強大的處理能力和更靈活的應用場景。(建議從第一篇食用)
一、鏈式調用:構建任務處理流水線
鏈式調用是智能對話的核心功能之一,它允許我們將多個處理步驟串聯起來,形成一個完整的任務處理流水線。通過這種方式,我們可以讓智能對話自動完成一系列復雜的任務。
導入相關包
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda
from langchain_core.runnables import RunnableBranch
from langchain_core.runnables.base import RunnableEach
基礎鏈式調用
chain = (RunnablePassthrough() # 傳遞原始輸入| ChatPromptTemplate.from_template("將以下文本翻譯成{language}:{text}")| chat # GLM-4-Flash模型| StrOutputParser() # 提取文本內容
)
result = chain.invoke({"text": "Hello, world!", "language": "中文"})
print(result)
這段代碼展示了如何通過鏈式調用實現文本翻譯功能。輸入的文本首先被傳遞到模板中,然后由模型進行處理,最后通過解析器提取結果。這種流水線式的處理方式不僅高效,而且易于擴展。
結果如下:
你好,世界!
多步驟組合鏈
# 定義子鏈1:生成菜譜
recipe_chain = (ChatPromptTemplate.from_template("生成{cuisine}菜譜")| chat| StrOutputParser()
)# 定義子鏈2:生成購物清單
shopping_chain = (ChatPromptTemplate.from_template("根據菜譜列出食材:{recipe}")| chat| StrOutputParser()
)# 組合鏈
full_chain = {"recipe": recipe_chain, # 先執行菜譜生成"cuisine": RunnablePassthrough() # 傳遞原始輸入
} | shopping_chain # 將菜譜結果傳遞給購物清單鏈result = full_chain.invoke("川菜")
print(result)
通過多步驟組合鏈,我們可以將多個子任務串聯起來,形成一個完整的任務流程。這種設計方式特別適合需要多步驟處理的復雜任務,比如菜譜生成和購物清單生成。
結果如下:
根據您提供的麻婆豆腐菜譜,以下是所需的食材列表:1. 老豆腐
2. 豬肉末
3. 姜蒜末
4. 蔥花
5. 豆瓣醬
6. 花椒粉
7. 食用油
8. 生抽
9. 老抽(可選)
10. 料酒
11. 水淀粉
12. 雞精或味精(可選)
13. 清水
14. 鹽
二、異步處理:提升系統的并發能力
在實際應用中,對話系統往往需要同時處理多個請求。異步處理技術可以顯著提升系統的并發能力,讓系統更加高效。
基礎異步調用
import asyncioasync def async_query():chain = (ChatPromptTemplate.from_template("用比喻解釋{concept}")| chat| StrOutputParser())return await chain.ainvoke({"concept": "機器學習"})# 運行異步任務
result = await async_query()
print(result)
通過異步調用,我們可以讓系統在等待一個任務完成的同時處理其他任務,從而提高系統的整體效率。
結果如下:
機器學習就像是一個聰明的學生,他不需要老師反復講解,只要給他一些例子,他就能自己學會如何解決問題。這個過程就像是一個孩子通過觀察和模仿來學習說話和走路。在這個比喻中,例子就是“數據”,而學生就是“算法”。算法通過不斷分析這些數據,就像孩子通過不斷模仿來學習語言和動作一樣,最終能夠獨立地識別模式和做出決策。
批量異步處理
async def batch_process():chain = (ChatPromptTemplate.from_template("生成關于{theme}的標題")| chat| StrOutputParser())# 并行處理多個請求tasks = [chain.ainvoke({"theme": "人工智能"}),chain.ainvoke({"theme": "氣候變化"})]return await asyncio.gather(*tasks)results = await batch_process()
print(results)
批量異步處理可以同時處理多個請求,特別適合需要同時生成多個結果的場景。
結果如下:(由于是批量處理,所以返回是列表形式)
['1. "人工智能:未來科技浪潮中的引領者"\n2. "智能革命:人工智能如何改變我們的世界"\n3. "從科幻走向現實:人工智能的無限可能"\n4. "AI賦能未來:探索人工智能的無限邊界"\n5. "智能時代來臨:人工智能如何重塑產業格局"\n6. "人工智能:開啟智慧生活新篇章"\n7. "智能進化論:人工智能技術發展歷程解析"\n8. "AI賦能教育:人工智能如何助力人才培養"\n9. "人工智能:推動醫療健康產業變革的力量"\n10. "智能時代,人工智能如何助力社會治理創新"', '1. "全球氣候變暖:挑戰與應對之道"\n2. "極端天氣頻發,氣候變化警鐘長鳴"\n3. "綠色未來:攜手應對氣候變化危機"\n4. "氣候變化下的生態危機:我們能做什么?"\n5. "低碳生活,共建地球家園——應對氣候變化行動指南"\n6. "氣候變化對農業的影響:挑戰與轉型之路"\n7. "從巴黎協定到行動:全球氣候治理的挑戰與機遇"\n8. "城市如何應對氣候變化:可持續發展的綠色策略"\n9. "氣候變化與人類健康:揭示未知風險與應對策略"\n10. "綠色能源革命:推動全球氣候治理新格局"']
三、流式處理:實時響應與分析
流式處理技術可以讓我們實時獲取模型的輸出,并在輸出過程中進行分析和處理。這種技術特別適合需要實時反饋的場景。
基礎流式輸出
chain = (ChatPromptTemplate.from_template("用100字介紹{topic}")| chat| StrOutputParser()
)for chunk in chain.stream({"topic": "人工智能"}):print(chunk, end="", flush=True)
通過流式輸出,我們可以實時獲取模型的輸出,這在需要即時反饋的場景中非常有用。
結果如下:(實時輸出結果,好像打字機一樣,一個或幾個字輸出)
人工智能是計算機科學領域,研究、開發用于模擬、延伸和擴展人的智能的理論、方法、技術及應用系統。它通過算法和機器學習,使計算機具備學習、推理、感知和決策能力,廣泛應用于各行各業。
帶中間狀態的流式處理
def word_counter(input_text):word_count = len(input_text.split())yield f"當前字數:{word_count}\n"analysis_chain = (ChatPromptTemplate.from_template("分析{AI_tool}的市場競爭力")| chat| StrOutputParser()| RunnableLambda(word_counter) # 添加自定義處理
)for chunk in analysis_chain.stream({"AI_tool": "deepseek"}):print(chunk)
通過在流式處理中加入自定義邏輯,我們可以在輸出過程中實時分析和處理數據。
結果如下:
當前字數:61
四、復雜邏輯編排:讓系統更智能
復雜邏輯編排是智能對話系統的核心能力之一。通過條件分支和循環處理,我們可以讓系統根據不同的輸入執行不同的邏輯。
條件分支路由
def classify_input(text: str) -> str:if "笑話" in text:return "joke"elif "新聞" in text:return "news"return "other"# 定義子鏈
joke_chain = (ChatPromptTemplate.from_template("生成關于{topic}的笑話")| chat| StrOutputParser()
)
news_chain = (ChatPromptTemplate.from_template("寫一則關于{topic}的簡訊")| chat| StrOutputParser()
)
default_chain = (ChatPromptTemplate.from_template("回答關于{topic}的問題")| chat| StrOutputParser()
)# 構建分支邏輯
branch = RunnableBranch((lambda x: classify_input(x["topic"]) == "joke", joke_chain),(lambda x: classify_input(x["topic"]) == "news", news_chain),default_chain
)# 測試分支
print(branch.invoke({"topic": "人工智能笑話"})) # 輸出笑話
print(branch.invoke({"topic": "科技新聞"})) # 輸出簡訊
通過條件分支,我們可以讓系統根據輸入的不同執行不同的邏輯。這種設計方式特別適合需要處理多種類型輸入的場景。
結果如下:
# 第一個輸出
為什么人工智能不喜歡去健身房?因為它只想“訓練數據”,而不是“鍛煉身體”!😄
# 第二個輸出
【科技新聞簡訊】
我國科學家成功研發新型太陽能電池,效率提升30%近日,我國科研團隊在太陽能電池領域取得重大突破,成功研發出一種新型太陽能電池。該電池采用新型材料,通過優化設計,將光電轉換效率提升至30%,創下了國際領先水平。據悉,該技術有望廣泛應用于光伏發電、太陽能充電等領域,為我國新能源產業發展提供有力支持。目前,該成果已申請國際專利,并計劃在未來五年內實現產業化應用。
循環處理
prompt = ChatPromptTemplate.from_template("什么是{topic}")
model = chat
output_parser = StrOutputParser()chain = prompt | model | output_parserloop_chain = RunnableEach(bound=chain)response = loop_chain.invoke([{'topic': '人工智能'},{'topic': '機器學習'},{'topic': '深度學習'}
])
print(response)
通過循環處理,我們可以批量處理多個輸入,特別適合需要批量生成內容的場景。
結果如下:
['人工智能(Artificial Intelligence,簡稱AI)是指由人制造出來的系統所表現出的智能行為。這種智能可以是機器學習、自然語言處理、視覺識別、決策制定、問題解決等多種形式。人工智能的目標是使計算機能夠執行通常需要人類智能才能完成的任務。\n\n以下是人工智能的一些關鍵特點:\n\n1. **機器學習**:通過算法從數據中學習并改進性能。\n2. **自然語言處理**:讓機器能夠理解和生成人類語言。\n3. **計算機視覺**:讓機器能夠“看到”和理解圖像或視頻。\n4. **機器人技術**:將人工智能集成到物理機器人中。\n5. **專家系統**:模擬人類專家解決問題的能力。\n\n人工智能的應用領域非常廣泛,包括但不限于以下方面:\n\n- **醫療**:輔助診斷、藥物研發等。\n- **交通**:自動駕駛、交通流量管理等。\n- **金融**:風險評估、欺詐檢測等。\n- **教育**:個性化學習、自動評分等。\n- **娛樂**:游戲、虛擬助手等。\n\n人工智能的發展對人類社會具有深遠的影響,但也帶來了一些倫理和安全方面的挑戰。因此,在推動人工智能發展的同時,也需要關注其潛在的風險和影響,并采取措施確保其健康、可持續發展。', '機器學習是人工智能(AI)的一個分支,它使計算機系統能夠從數據中學習并做出決策或預測,而無需顯式編程。簡單來說,機器學習就是讓計算機通過經驗改進其性能的過程。\n\n以下是機器學習的一些關鍵點:\n\n1. **數據驅動**:機器學習依賴于大量數據來訓練模型。這些數據可以是結構化的(如數據庫中的表格)或非結構化的(如圖像、文本、音頻和視頻)。\n\n2. **算法**:機器學習使用各種算法來分析數據并從中學習。這些算法可以是監督學習、無監督學習或強化學習。\n\n3. **監督學習**:在這種方法中,模型從標記的數據(即已知結果)中學習。例如,通過學習大量已標記的電子郵件,模型可以學會將新電子郵件分類為垃圾郵件或非垃圾郵件。\n\n4. **無監督學習**:在這種方法中,模型從未標記的數據中學習。例如,無監督學習可以用于發現客戶購買模式或市場趨勢。\n\n5. **強化學習**:在這種方法中,模型通過與環境的交互來學習。它通過嘗試不同的行動并從中學習來優化其行為。\n\n6. **應用**:機器學習在各個領域都有廣泛的應用,包括自然語言處理、圖像識別、推薦系統、醫療診斷、自動駕駛汽車等。\n\n7. **挑戰**:盡管機器學習有許多優勢,但也面臨一些挑戰,如數據隱私、偏見、可解釋性和倫理問題。\n\n總之,機器學習是一種強大的技術,它使計算機能夠從數據中學習,并在此過程中不斷提高其性能。', '深度學習是機器學習的一個子領域,主要研究的是如何使用神經網絡來模擬人腦處理信息的方式,以實現對數據的自動學習和提取特征。它通過構建具有多層節點的神經網絡模型,使得模型能夠自動從原始數據中學習到更深層次的特征表示。\n\n以下是深度學習的一些關鍵點:\n\n1. **神經網絡**:深度學習的基礎是神經網絡,特別是深度神經網絡(DNN)。神經網絡由多個層組成,包括輸入層、隱藏層和輸出層。\n\n2. **多層結構**:與傳統的單層神經網絡相比,深度神經網絡包含多個隱藏層,這使得模型能夠學習更復雜的特征和模式。\n\n3. **自動特征提取**:深度學習模型可以自動從原始數據中提取特征,無需人工干預。這使得深度學習在圖像識別、語音識別等領域具有顯著優勢。\n\n4. **大規模數據**:深度學習通常需要大量的數據進行訓練,以使模型能夠學習到有效的特征表示。\n\n5. **優化算法**:深度學習模型通常使用梯度下降等優化算法進行訓練,以最小化預測誤差。\n\n6. **應用領域**:深度學習在多個領域取得了顯著成果,包括圖像識別、語音識別、自然語言處理、推薦系統等。\n\n深度學習在近年來取得了巨大進展,推動了人工智能技術的發展。隨著計算能力的提升和數據量的增加,深度學習有望在更多領域發揮重要作用。']
總結
鏈式工作流構建是智能對話的核心能力,它不僅決定了處理效率,還影響著靈活性和擴展性。通過鏈式調用、異步處理、流式處理和復雜邏輯編排等技術,我們可以讓對話變得更加智能、高效和實用。
未來,我們可以進一步探索以下方向:
- 更復雜的任務編排:結合 RAG 技術,實現多步驟任務的自動化處理。
- 實時交互優化:通過流式處理和異步技術,進一步提升系統的響應速度。
- 多模態支持:支持圖片、語音等多種輸入輸出形式,讓對話系統更加多樣化。
祝我們學習愉快! 😊
下一篇:(四)數據檢索與增強生成——讓對話系統更智能、更高效