[Chat-LangChain] 會話圖(LangGraph) | 大語言模型(LLM)

第二章:會話圖(LangGraph)

在第一章中,我們學習了前端用戶界面——這是聊天機器人的"面孔",我們在這里輸入問題并查看答案。

我們看到了消息如何從聊天窗口傳遞到聊天機器人的"大腦"。現在,讓我們深入探索這個"大腦"本身!

聊天機器人的大腦:解決什么問題?

想象我們向一位超級聰明的朋友提出復雜問題:“什么是LangChain?如何用它構建聊天機器人?”

人類朋友不會直接拋出第一個想到的答案。他們可能會:

  1. 理解問題:“好的,這是關于LangChain和構建聊天機器人的”
  2. 制定研究計劃:“首先需要解釋LangChain,然后說明如何用它構建聊天機器人”
  3. 執行研究(步驟1):“查找’什么是LangChain?'相關資料”
  4. 執行研究(步驟2):“搜索’LangChain構建聊天機器人示例’”
  5. 整合信息:“已經收集所有必要信息塊”
  6. 給出清晰答案:“這是LangChain的定義,以及用它構建聊天機器人的方法…”

我們的聊天機器人需要實現類似的流程!它不能僅依賴大語言模型(LLM)一次性完成所有操作。

LLM擅長生成文本,但天然不擅長管理工作流,例如規劃研究步驟、搜索數據庫以及整合不同信息塊。

chat-langchain項目的這個模塊要解決的核心問題是:我們的聊天機器人如何管理復雜對話和任務,將其分解為步驟、做出決策,并協調不同工具來找到最佳答案?

這就是會話圖(使用強大的LangGraph庫構建)的用武之地。它是聊天機器人的"大腦"和"工作流管理器"。

什么是會話圖(LangGraph)?

LangGraph可以看作聊天機器人行為的流程圖配方。它定義了所有可能的執行步驟,以及步驟間的轉移決策邏輯。

核心概念解析:

  • 圖(Graph):在計算機科學中,"圖"是由節點(圓形)和邊(連接線)組成的結構
    • 節點(步驟/動作):聊天機器人可以執行的獨立任務,例如"分析問題"、“搜索信息"或"生成最終答案”
    • 邊(規則/決策):節點間的連接邏輯,例如"完成問題分析后,如果是LangChain相關的問題,則跳轉到’搜索信息’節點"
  • LangGraph:專門為對話式AI構建的流程圖庫,幫助設計包含狀態記憶的復雜工作流
  • 狀態(大腦記憶):當聊天機器人執行流程圖時,需要記憶:
    • 用戶對話歷史
    • 待解決的研究問題列表
    • 已找到的文檔資料
    • LangGraph負責管理這些"記憶"以實現進度跟蹤

簡而言之,LangGraph幫助我們構建能夠執行多步計劃、使用不同工具(如搜索引擎)并做出智能決策的聊天機器人,而不是僅靠猜測生成答案。

會話圖工作原理:以"智能問題"為例

以問題"什么是LangChain?如何用它構建聊天機器人?"為例,演示LangGraph的協調過程:

  1. 接收消息(來自前端用戶界面)
  2. 分析和路由查詢
    • LangGraph"大腦"接收問題
    • 使用LLM分類問題類型(普通聊天/需要更多信息/LangChain相關復雜問題)
    • 決策:“這是關于LangChain的復雜問題”
  3. 創建研究計劃
    • 判定需要分步研究
    • 使用另一個LLM拆分問題
      • 步驟1:“什么是LangChain?”
      • 步驟2:“如何用LangChain構建聊天機器人?”
  4. 執行研究(步驟1)
    • 將第一個研究步驟發送給專用"研究子腦"(也是LangGraph構建的流程圖)
    • 研究子腦生成搜索查詢,通過檢索過程從向量存儲(Weaviate)獲取相關文檔
    • 主腦更新記憶狀態(存儲找到的文檔
  5. 檢查完成狀態
    • 查看研究計劃剩余步驟
    • 決策:“步驟2待處理”
  6. 執行研究(步驟2)
    • 重復研究子腦的文檔檢索過程
    • 主腦更新記憶狀態
  7. 檢查完成狀態
    • 確認所有步驟已完成
  8. 生成響應
    • 將所有對話歷史和檢索文檔發送給最終LLM
    • 生成綜合性的最終答案
  9. 返回前端(通過前端用戶界面展示答案)

整個過程由會話圖協調管理。

幕后機制:LangGraph工作流

大腦流程圖(簡化版)

在這里插入圖片描述

大腦記憶:AgentState

LangGraph通過AgentState類管理記憶狀態,定義見backend/retrieval_graph/state.py

# backend/retrieval_graph/state.py(簡化版)
@dataclass(kw_only=True)
class AgentState:messages: Annotated[list[AnyMessage], add_messages]  # 全部聊天消息router: Router = field(default_factory=lambda: Router(type="general", logic=""))  # 查詢類型steps: list[str] = field(default_factory=list)  # 研究計劃步驟documents: Annotated[list[Document], reduce_docs] = field(default_factory=list)  # 檢索到的文檔answer: str = field(default="")  # 最終答案# ...其他狀態字段...

messages記錄對話歷史,steps存儲研究計劃,documents保存檢索結果。

構建大腦:節點與邊

主流程圖定義在backend/retrieval_graph/graph.py,關鍵組件:

節點1:analyze_and_route_query(決策器)
async def analyze_and_route_query(state: AgentState, *, config: RunnableConfig) -> dict[str, Router]:# 使用LLM分類問題類型model = load_chat_model(config.query_model).with_structured_output(Router)messages = [{"role": "system", "content": config.router_system_prompt}] + state.messagesresponse = cast(Router, await model.ainvoke(messages))return {"router": response}  # 存儲分類結果
節點2:create_research_plan(規劃器)
async def create_research_plan(state: AgentState, *, config: RunnableConfig) -> dict[str, list[str]]:# 生成分步研究計劃model = load_chat_model(config.query_model).with_structured_output(Plan)messages = [{"role": "system", "content": config.research_plan_system_prompt}] + state.messagesresponse = cast(Plan, await model.ainvoke(messages))return {"steps": response["steps"]}  # 返回步驟列表
節點3:conduct_research(研究協調器)
async def conduct_research(state: AgentState) -> dict[str, Any]:# 委托研究子腦執行單個步驟result = await researcher_graph.ainvoke({"question": state.steps[0]})return {"documents": result["documents"], "steps": state.steps[1:]}  # 更新文檔和步驟
節點4:respond(應答生成器)
async def respond(state: AgentState, *, config: RunnableConfig) -> dict[str, list[BaseMessage]]:# 整合信息生成最終答案model = load_chat_model(config.response_model)context = format_docs(state.documents)  # 格式化文檔prompt = config.response_system_prompt.format(context=context)messages = [{"role": "system", "content": prompt}] + state.messagesresponse = await model.ainvoke(messages)return {"messages": [response], "answer": response.content}
流程圖裝配
builder = StateGraph(AgentState, input=InputState, config_schema=AgentConfiguration)# 添加所有節點
builder.add_node("analyze_and_route_query", analyze_and_route_query)
builder.add_node("create_research_plan", create_research_plan)
builder.add_node("conduct_research", conduct_research)
builder.add_node("respond", respond)
# ...其他節點...# 定義狀態轉移邏輯
builder.add_edge(START, "analyze_and_route_query")
builder.add_conditional_edges("analyze_and_route_query",route_query,{"create_research_plan": "create_research_plan","ask_for_more_info": "ask_for_more_info","general": "respond_to_general_query"}
)
# ...更多連接邏輯...graph = builder.compile()
graph.name = "RetrievalGraph"

結論

本章探討了**會話圖(LangGraph)**作為聊天機器人的核心決策系統

通過節點(執行步驟)、(轉移邏輯)和狀態(記憶管理)的協同工作,實現了復雜對話任務的分解與協調。

下一章將深入解析支撐這些功能的大語言模型(LLM)。

第三章:大語言模型(LLM)


第三章:大語言模型(LLM)

在第二章中,我們了解了會話圖(LangGraph)作為聊天機器人的"大腦",它像熟練的項目經理般協調回答問題的各個步驟

但誰是真正執行理解、創造性思維并生成類人文本的智能專家?這正是本章的核心:大語言模型(LLM)

聊天機器人的專家顧問:解決什么問題?

想象我們正在構建復雜項目:項目經理(LangGraph)負責組織協調,但遇到技術文檔理解、解決方案構思或撰寫清晰報告等專業任務時,我們需要聘請專家顧問。

大語言模型(LLM)在chat-langchain中解決的核心理念是:我們的聊天機器人如何真正理解問題,通過創造性思維分解任務,并基于復雜信息生成類人化的智能答案?

LLM是系統的"專家顧問"和"對話專家",負責:

  1. 重述用戶問題(查詢分析:用戶可能基于上下文提出簡短追問,LLM能將其轉化為完整清晰的獨立問題
  2. 生成研究計劃:針對復雜問題,LLM可像人類專家般拆解為分步研究計劃
  3. 構建最終答案:整合檢索過程獲取的信息后,LLM將其轉化為清晰易讀的答案

什么是大語言模型(LLM)?

大語言模型(LLM)本質上是基于海量互聯網文本數據(書籍/文章/網頁等)訓練的強大人工智能,可視為:

  • 超級智能文本生成器:能撰寫文章/詩歌/代碼/摘要等類人化文本
  • 卓越理解者:理解文本含義,識別詞語關系,掌握復雜語境
  • 對話大師:憑借文本理解和生成能力,實現類人對話和問答

chat-langchain中,LLM賦予聊天機器人"智能"——實現文本解析、規劃和創造的能力。

LLM在chat-langchain中的應用

1. 重述用戶問題(查詢分析)

當用戶提出"聊天機器人場景下如何應用?"等簡短追問時,LLM會結合:

  • 完整對話歷史
  • 當前簡短提問

生成獨立清晰的問題:“LangChain如何用于構建聊天機器人?”(參見CONCEPTS.md中的REPHRASE_TEMPLATE提示模板)

2. 生成研究計劃

面對"解釋LangChain代理及其工具使用機制"等復雜問題,會話圖(LangGraph)會請求LLM生成分步計劃,例如:

  1. “什么是LangChain代理?”
  2. “LangChain代理如何使用工具?”

3. 構建最終答案

當會話圖(LangGraph)通過檢索過程收集足夠信息后,LLM會:

  • 整合對話歷史
  • 融合檢索文檔
  • 生成連貫答案(參見MODIFY.md中的RESPONSE_TEMPLATE模板)

在這里插入圖片描述

實現細節:LLM工作機制

工作流中的LLM(簡化版)

在這里插入圖片描述

(LangGraph分解問題,列清單,LLM才是真正執行解答)

1. LLM選擇與加載

chat-langchain支持多種LLM服務商(OpenAI/Anthropic/Google等),配置見backend/retrieval_graph/configuration.py

@dataclass(kw_only=True)
class AgentConfiguration(BaseConfiguration):# 查詢分析和計劃制定的LLMquery_model: str = field(default="anthropic/claude-3-5-haiku-20241022",metadata={"description": "用于查詢處理的語言模型"})# 最終答案生成的LLMresponse_model: str = field(default="anthropic/claude-3-5-haiku-20241022",metadata={"description": "用于生成響應的語言模型"})# 系統提示模板router_system_prompt: str = field(default=prompts.ROUTER_SYSTEM_PROMPT, ...)research_plan_system_prompt: str = field(default=prompts.RESEARCH_PLAN_SYSTEM_PROMPT, ...)response_system_prompt: str = field(default=prompts.RESPONSE_SYSTEM_PROMPT, ...)

通過backend/utils.pyload_chat_model函數加載模型:

def load_chat_model(fully_specified_name: str) -> BaseChatModel:"""根據模型名稱加載LLM(如'openai/gpt-4o-mini')"""if "/" in fully_specified_name:服務商, 模型 = fully_specified_name.split("/", maxsplit=1)else:服務商 = ""模型 = fully_specified_namereturn init_chat_model(模型, model_provider=服務商, temperature=0)  # 溫度參數控制創造性

2. 核心功能實現

查詢分析(路由決策)
async def analyze_and_route_query(state: AgentState, config: RunnableConfig) -> dict[str, Router]:配置 = AgentConfiguration.from_runnable_config(config)模型 = load_chat_model(配置.query_model).with_structured_output(Router)消息 = [{"role": "system", "content": 配置.router_system_prompt}] + state.messages響應 = cast(Router, await 模型.ainvoke(消息))return {"router": 響應}  # 存儲分類結果
研究計劃生成
async def create_research_plan(state: AgentState, config: RunnableConfig) -> dict[str, list[str]]:class 計劃(TypedDict):steps: list[str]模型 = load_chat_model(配置.query_model).with_structured_output(計劃)消息 = [{"role": "system", "content": 配置.research_plan_system_prompt}] + state.messages響應 = cast(計劃, await 模型.ainvoke(消息))return {"steps": 響應["steps"]}
最終答案生成
async def respond(state: AgentState, config: RunnableConfig) -> dict[str, list[BaseMessage]]:模型 = load_chat_model(配置.response_model)上下文 = format_docs(state.documents[:20])  # 取前20個相關文檔提示 = 配置.response_system_prompt.format(context=上下文)消息 = [{"role": "system", "content": 提示}] + state.messages響應 = await 模型.ainvoke(消息)return {"messages": [響應], "answer": 響應.content}

結論

本章深入解析了大語言模型(LLM)作為chat-langchain系統的智能核心。LLM在查詢理解、研究規劃和答案生成中發揮關鍵作用,而會話圖(LangGraph)則負責整體協調。下一章將探討支撐LLM工作的檢索過程

第四章:檢索過程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93214.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flask錯誤處理與會話技術詳解

flask入門day03 錯誤處理 1.abort函數:放棄請求并返回錯誤代碼 詳細狀態碼 from flask import Flask,abort,render_template ? app Flask(__name__) ? app.route(/) def index():return 我是首頁 ? app.route(/error) def error():abort(404)return 沒有找到…

java程序打包成exe,再打成安裝包,沒有jdk環境下可運行

一、前提條件準備:1、要被打包的程序文件:rest_assistant-1.0-SNAPSHOT.jarapplication.yml2、圖標文件tubiao123.ico3、jre4、打包成exe的軟件 config.exe4j5、打成安裝包的軟件 Inno Setup Compiler二、config.exe4j 的 exe打包配置步驟 按照以下圖進行…

區塊鏈技術原理(11)-以太坊交易

文章目錄什么是交易?交易類型交易生命周期關鍵概念:Gas 與交易費用交易狀態與失敗原因總結什么是交易? “交易(Transaction)” 是從一個賬戶向另一個賬戶發送的經過數字簽名的指令 。例如,如果 Bob 發送 A…

小兔鮮兒-小程序uni-app(二)

小兔鮮兒-小程序uni-app7.小兔鮮兒 - 用戶模塊會員中心頁(我的)靜態結構參考代碼會員設置頁分包預下載靜態結構退出登錄會員信息頁靜態結構獲取會員信息渲染會員信息更新會員頭像更新表單信息8.小兔鮮兒 - 地址模塊準備工作靜態結構地址管理頁地址表單頁動態設置標題新建地址頁…

BLE 廣播信道與數據信道:沖突避免、信道映射與自適應跳頻實現

低功耗藍牙(BLE)技術憑借低功耗、短距離、低成本的特性,已廣泛應用于智能家居、可穿戴設備、工業物聯網等領域。在 BLE 協議中,信道管理是保障通信可靠性的核心機制,其中廣播信道與數據信道的設計、沖突避免策略、跳頻技術更是面試中的高頻考點。本文將從基礎原理到實戰真…

nodejs03-常用模塊

nodejs 常用的核心模塊 Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境, 它允許 JavaScript 運行在服務器端。Node.js 擁有豐富的標準庫,也就是核心模塊, 這些模塊提供了各種功能, 使得開發服務器端應用程序變得簡單高…

多路混音聲音播放芯片型號推薦

以下是唯創知音旗下主流的多路聲音播放芯片深度解析,結合精準參數、豐富場景及技術特性,滿足智能設備多樣化音頻需求:一、WTV380/890 系列:高集成多模態交互芯片核心參數通道能力:支持8 路獨立語音輸出,可同…

【C++】自研基 2 Cooley–Tukey

“自研基 2 Cooley–Tukey:倒位序 逐級蝶形,入口 fft(int N, complex f[])”拆成三件事它在講什么 “基 2 Cooley–Tukey” 指的是最常見的 FFT 算法:長度 N 必須是 2 的整數次冪,把離散傅里葉變換分解成一層一層的“2 點蝶形”運…

小白挑戰一周上架元服務——ArkUI04

文章目錄前言一、ArkUI是何方神圣?二、聲明式UI三、組件1.基礎組件2.布局容器組件3.導航組件4.自定義組件5.組件生命周期四、狀態管理1.State裝飾器: 狀態變量2.Prop裝飾器:父子單向同步3.Link裝飾器:父子雙向同步4.Provide/Consume裝飾器&am…

劇本殺小程序系統開發:構建劇本殺社交新生態

在社交需求日益多樣化的今天,劇本殺憑借其獨特的社交屬性,成為了人們熱衷的社交娛樂方式之一。而劇本殺小程序系統開發,則進一步拓展了劇本殺的社交邊界,構建起一個全新的劇本殺社交新生態,讓玩家在推理與角色扮演中&a…

AI提高投放效率的核心策略

內容概要人工智能技術正深刻改變著廣告投放領域,其核心價值在于顯著提升投放效率。通過融合智能算法優化、實時數據分析與自動化投放流程,AI系統能夠以前所未有的速度和精度處理海量信息,驅動更精準的營銷決策。這不僅大幅縮短了傳統人工操作…

OpenBMC 中命令模式的深度解析:從原理到實現

引言 在 OpenBMC 的設計中,命令模式(Command Pattern)被廣泛應用于各種場景,特別是 IPMI 命令處理、異步操作封裝和用戶請求管理等。本文將深入分析 OpenBMC 中命令模式的實現原理、架構設計以及完整的執行流程,并通過…

從0開始跟小甲魚C語言視頻使用linux一步步學習C語言(持續更新)8.15

第十七天 第五十七,五十八,五十九和六十集 第五十六集 刪除鏈表結點 沒什么好說的關鍵部分代碼如圖 鏈表的插入操作 依舊沒有啥可以說的代碼部分大家看視頻就能看懂,大家應該是沒有什么問題的吧? 第五十七集 共用體形式結構與結構…

云服務器網站無法訪問的系統化故障排查指南及多維度解決方案

當云服務器上的網站突然無法訪問時,這種突發狀況往往讓人措手不及。別擔心,我們可以通過系統化的排查流程快速定位問題根源。以下是經過實戰驗證的故障排除指南,幫您分步解決網站訪問異常問題。一、基礎狀態確認 服務器的生命體征就像人體的脈…

strings命令和findstr命令驗證iso文件中ntkrnlmp.exe系統版本

strings命令和findstr命令驗證iso文件中ntkrnlmp.exe系統版本D:\chsads3647\i386>expand.exe Microsoft (R) File Expansion Utility Version 5.2.3647.0 版本所有 (c) Microsoft Corporation. 保留所有權利。未指定文件。D:\chsads3647\i386>strings.exe ntkrnlmp.exe …

C語言:指針(5)

1. sizeof與strlen的對比1.1 sizeofsizeof屬于是操作符,用于計算變量所占的空間大小,單位為字節。如果操作數是類型的話,計算的是使用類型創建的變量所占內存空間的大小。sizeof只計算數據在內存中所占的空間大小,而不在乎內存中存…

rent8 安裝部署教程之 Windows

1. Apache 安裝與配置 1.1. 獲取并解壓 Apache 在 Apache Lounge 網址下載編譯版的 Apache。下載完成后,將壓縮包解壓到 d:\web\Apache24 作為 Apache 的安裝目錄。 1.2. 配置 Apache 打開配置文件 conf\httpd.conf,找到第 37 行配置。 ? Define SRVROO…

邊緣智能實戰手冊:攻克IoT應用三大挑戰的AI戰術

前言:在當前的AIoT(人工智能物聯網)賽道上,將AI能力下沉至邊緣設備已不再是“要不要做”的選擇題,而是“如何做好”的必答題。然而,在實際項目中,工程師們常常會遇到性能、功耗和隱私這“三座大…

【React】use-immer vs 原生 Hook:誰更勝一籌?

1.概述 use-immer 不屬于官方 Hook,是社區維護的第三方庫!use-immer 通過封裝 Immer 的不可變更新機制,為 React 開發者提供了一種更直觀、高效的狀態管理方式。它尤其適合處理復雜嵌套狀態或需要頻繁更新的場景,同時保持了與 Re…

【案例】Vue3 實現高性能級橫向循環滾動生產線效果:基于 requestAnimationFrame 的流暢動畫方案

動畫效果在工業監控系統、生產看板等場景中,經常需要模擬生產線的動態運行效果。本文將基于 Vue3 和 requestAnimationFrame 實現一個高性能的橫向循環滾動效果,完美模擬生產線傳輸帶的視覺體驗。我們將從代碼實現到原理分析,全面講解如何打造…