[Chat-LangChain] 前端用戶界面 | 核心交互組件 | 會話流管理

鏈接:https://python.langchain.com/docs/tutorials/qa_chat_history/

Chat-LangChain技術棧 :

  • LangChain
  • LangGraph
  • Next.js
  • Weaviate (向量存儲)
  • OpenAI (嵌入模型)

docs:chat-langchain

Chat LangChain 是一個智能聊天機器人,專為解答LangChain技術文檔相關問題設計。

它如同智能研究助手,首先將海量信息整合為可搜索知識庫,隨后通過AI核心處理模塊(LangGraph)理解用戶問題檢索相關細節并生成清晰專業的解答*。

該系統還集成可觀測性工具實現持續優化。

架構

在這里插入圖片描述

章節導航

  1. 前端用戶界面
  2. 會話圖譜(LangGraph)
  3. 大語言模型(LLM)
  4. 檢索流程
  5. 向量存儲(Weaviate)
  6. 文檔攝取
  7. 記錄管理器
  8. LangSmith集成

第一章:前端用戶界面

想象我們正在與一臺超級智能機器人對話!

正如我們看到機器人的"面部"并聽到其語音,聊天機器人也需要一個交互界面。這個"面部"或交互屏幕就是我們所說的前端用戶界面

chat-langchain項目這部分解決的問題很簡單:如何讓人輕松與聊天機器人交流并理解其行為邏輯?

本章的目標是理解用戶如何通過可視化界面與聊天機器人互動——從輸入問題到獲取答案,甚至觀察機器人的"思考過程"。

何為前端用戶界面?

在這里插入圖片描述

前端用戶界面(常簡稱為"前端"或"UI")可視為屏幕上的控制面板聊天窗口,是用戶直接交互的可視化部分。其核心功能包括:

  1. 聊天輸入框:用戶在此輸入問題或消息,如同與機器人對話的"嘴巴"
  2. 對話歷史記錄:展示完整的聊天記錄,形成對話"文字實錄"
  3. AI響應區:顯示機器人的回答內容
  4. 內部思考可視化:有時會展示后臺處理過程,例如:
    • 進度狀態:顯示"思考中"、“檢索中”、"響應中"等狀態提示
    • 文檔引用:當使用外部信息時顯示參考文檔來源

讓我們通過chat-langchain的交互流程來具體理解。

首次交互指南

使用chat-langchain應用的典型流程:

  1. 啟動應用:訪問網站或打開應用程序
  2. 輸入問題:在底部輸入框鍵入內容,例如:“什么是LangChain?”
  3. 發送消息:點擊回車鍵或發送按鈕
  4. 獲取響應:界面顯示處理進度,最終呈現機器人的完整回答

這種流暢的交互體驗完全依賴于前端用戶界面的有效運作!

幕后流程:消息傳遞機制

當我們輸入"Hello!"并發送時,后臺將觸發以下處理流程:

在這里插入圖片描述

  1. 用戶觸發:在輸入框完成內容輸入
  2. 前端封裝:界面代碼識別操作并進行消息封裝
  3. 核心處理:通過會話圖譜(LangGraph)進行智能解析(下一章詳述)
  4. 流式響應:后端通過API代理返回處理結果片段
  5. 實時渲染:前端逐步更新界面顯示內容

現在讓我們解析支撐這些功能的代碼結構。

應用入口文件(frontend/app/page.tsx)

該文件作為應用的主入口,負責初始化聊天環境:

// frontend/app/page.tsx
"use client";import React from "react";
import { GraphProvider } from "./contexts/GraphContext";
import { ChatLangChain } from "./components/ChatLangChain";export default function Page(): React.ReactElement {return (<main className="w-full h-full"><React.Suspense fallback={null}>{/* GraphProvider注入核心數據處理邏輯 */}<GraphProvider>{/* ChatLangChain承載可視化聊天界面 */}<ChatLangChain /></GraphProvider></React.Suspense></main>);
}

其中GraphProvider作為數據引擎管理聊天邏輯,ChatLangChain作為可視化組件呈現交互界面,二者協同工作。

核心交互組件(frontend/app/components/ChatLangChain.tsx)

該組件實現消息收發與呈現的核心邏輯:

// frontend/app/components/ChatLangChain.tsx
"use client";import React, { useState } from "react";
import { AppendMessage, AssistantRuntimeProvider } from "@assistant-ui/react";
import { HumanMessage } from "@langchain/core/messages";
import { useGraphContext } from "../contexts/GraphContext";
import { ThreadChat } from "./chat-interface";function ChatLangChainComponent(): React.ReactElement {const { graphData } = useGraphContext(); // 獲取數據上下文const { messages, setMessages, streamMessage } = graphData;const [threadId, setThreadId] = useState<string | null>(null); // 會話線程管理async function onNew(message: AppendMessage): Promise<void> {// 用戶消息處理const humanMessage = new HumanMessage({ content: message.content[0].text });setMessages((prevMessages) => [...prevMessages, humanMessage]); // 更新消息列表await streamMessage(threadId!, { messages: [humanMessage] }); // 觸發消息處理流}const runtime = { messages, onNew, isRunning: false }; // 運行時配置return (<div><AssistantRuntimeProvider runtime={runtime}>{/* 渲染聊天窗口組件 */}<ThreadChat submitDisabled={false} messages={messages} /></AssistantRuntimeProvider></div>);
}export const ChatLangChain = React.memo(ChatLangChainComponent);

onNew函數作為消息處理中樞:

  1. 將用戶輸入轉換為標準消息格式
  2. 實時更新界面消息列表
  3. 調用流式消息處理接口

會話流管理(frontend/app/contexts/GraphContext.tsx)

該上下文管理完整的會話生命周期:

// frontend/app/contexts/GraphContext.tsx
import { createContext, useContext, useState } from "react";
import { AIMessage, BaseMessage, HumanMessage } from "@langchain/core/messages";
import { createClient } from "./utils"; // 服務端連接工具// ... 接口定義及其他依賴 ...export function GraphProvider({ children }: { children: React.ReactNode }) {const [messages, setMessages] = useState<BaseMessage[]>([]);const [isStreaming, setIsStreaming] = useState(false); // 流式狀態標識const streamMessage = async (currentThreadId: string,params: { messages?: Record<string, any>[] },): Promise<void> => {const client = createClient(); // 建立服務連接// 初始化流式會話const stream = client.runs.stream(currentThreadId, "chat", {input: params, // 輸入參數streamMode: "events", // 事件流模式});setIsStreaming(true); // 激活處理狀態try {for await (const chunk of stream) {// 處理響應數據塊if (chunk.data.event === "on_chat_model_stream") {const message = chunk.data.data.chunk;setMessages((prevMessages) => {// 動態更新消息內容const existingIndex = prevMessages.findIndex(msg => msg.id === message.id);if (existingIndex !== -1) {// 增量更新現有消息return [...prevMessages.slice(0, existingIndex),new AIMessage({ ...prevMessages[existingIndex], content: prevMessages[existingIndex].content + message.content }),...prevMessages.slice(existingIndex + 1)];} else {// 新增AI消息return [...prevMessages, new AIMessage({ ...message })];}});}// ... 其他事件處理 ...}} finally {setIsStreaming(false); // 終止處理狀態}};// ... 上下文值傳遞 ...
}

streamMessage函數通過事件流機制實現:

  • 建立與LangGraph服務的持久化連接
  • 動態處理響應數據塊
  • 實時更新界面渲染狀態

界面渲染引擎(frontend/app/components/chat-interface/index.tsx)

該組件實現可視化布局:

// frontend/app/components/chat-interface/index.tsx
"use client";import { ThreadPrimitive } from "@assistant-ui/react";
import { type FC } from "react";
import { AssistantMessage, UserMessage } from "./messages"; // 消息組件
import { ChatComposer } from "./chat-composer"; // 輸入組件export interface ThreadChatProps extends ChatComposerProps {}export const ThreadChat: FC<ThreadChatProps> = (props: ThreadChatProps) => {const isEmpty = props.messages.length === 0;// 可視化增強鉤子// useProgressToolUI(); // 進度指示// useSelectedDocumentsUI(); // 文檔引用展示// useRouterLogicUI(); // 路由邏輯return (<ThreadPrimitive.Root className="flex flex-col h-screen overflow-hidden w-full">{!isEmpty ? (<ThreadPrimitive.Viewport className="flex-1 overflow-y-auto w-full">{/* 消息列表容器 */}<ThreadPrimitive.Messagescomponents={{UserMessage: UserMessage,    // 用戶消息樣式AssistantMessage: AssistantMessage, // AI消息樣式}}/></ThreadPrimitive.Viewport>) : null}{/* 輸入框組件 */}<ChatComposer submitDisabled={props.submitDisabled} messages={props.messages} /></ThreadPrimitive.Root>);
};

組件架構包含:

  • 響應式滾動容器
  • 動態消息列表渲染
  • 可擴展的可視化增強模塊

消息呈現組件(frontend/app/components/chat-interface/messages.tsx)

定義具體消息樣式:

// frontend/app/components/chat-interface/messages.tsx
"use client";import { MessagePrimitive, useMessage } from "@assistant-ui/react";
import { type FC } from "react";
import { MarkdownText } from "../ui/assistant-ui/markdown-text"; // Markdown渲染export const UserMessage: FC = () => {// 用戶消息模板return (<MessagePrimitive.Root className="your-message-styling"><div className="bg-inherit text-white break-words"><MessagePrimitive.Content /></div></MessagePrimitive.Root>);
};export const AssistantMessage: FC = () => {// AI消息模板const isLast = useMessage((m) => m.isLast); // 末條消息標識return (<MessagePrimitive.Root className="ai-message-styling"><div className="bg-inherit text-white max-w-full break-words"><MessagePrimitive.Content components={{ Text: MarkdownText }} />{isLast && (// <FeedbackButtons /> // 反饋功能組件null)}</div></MessagePrimitive.Root>);
};

功能特性:

  • 支持Markdown語法渲染
  • 消息內容自適應布局
  • 擴展反饋功能接口

API代理服務(frontend/app/api/[..._path]/route.ts)

實現安全通信中轉:

// frontend/app/api/[..._path]/route.ts
import { NextRequest, NextResponse } from "next/server";export const runtime = "edge"; // 邊緣計算優化async function handleRequest(req: NextRequest, method: string) {try {const path = req.nextUrl.pathname.replace(/^\/?api\//, ""); // 路徑解析const url = new URL(req.url);const options: RequestInit = {method,headers: {"x-api-key": process.env.LANGCHAIN_API_KEY || "", // 認證密鑰},};if (["POST", "PUT", "PATCH"].includes(method)) {options.body = await req.text(); // 請求體處理}// 請求轉發至核心服務const res = await fetch(`${process.env.API_BASE_URL}/${path}`, options);// 響應回傳return new NextResponse(res.body, { status: res.status, headers: res.headers });} catch (e: any) {return NextResponse.json({ error: e.message }, { status: e.status ?? 500 });}
}// HTTP方法代理
export const GET = (req: NextRequest) => handleRequest(req, "GET");
export const POST = (req: NextRequest) => handleRequest(req, "POST");
// ... 其他方法代理 ...

代理層功能:

  • 請求路徑重定向
  • 安全認證處理
  • 異常狀態攔截
  • 協議方法適配

總結

  • Chat-LangChain是一個基于LangChain技術棧的智能聊天機器人,專為解答LangChain文檔問題設計。

  • 它采用Next.js構建前端交互界面,通過Weaviate向量存儲OpenAI嵌入模型實現高效檢索,并利用LangGraph進行核心對話處理。

  • 系統架構包含用戶界面、對話圖譜、大語言模型、檢索流程等模塊,支持流式響應和思考過程可視化。

  • 前端代碼通過React組件管理消息傳遞和會話狀態,后端則負責語義理解和知識檢索,形成完整的問答系統。項目還集成了LangSmith等工具進行性能監控和優化。

本章深入解析了chat-langchain前端用戶界面,揭示其如何通過可視化組件實現人機交互

我們追蹤了從用戶輸入到響應呈現的完整流程,剖析了核心代碼模塊的協作關系。盡管前端承擔著界面呈現的重要角色,真正的智能處理依賴于會話圖譜(LangGraph)這一"大腦",這將是下一章的重點解析對象。

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

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

相關文章

編寫和運行 Playbook

編寫和運行 Playbook Playbook 介紹 adhoc 命令可以作為一次性命令對一組主機運行一項簡單的任務。不過&#xff0c;若要真正發揮Ansible的能力&#xff0c;需要使用功能 playbook。 playbook 是一個文本文件&#xff0c;其中包含由一個或多個按特定順序運行的play組成的列表。…

uniapp手機端video標簽層級過高問題

當我們想以視頻作為背景時&#xff0c;其他dom通過定位顯示在視頻上方&#xff0c;h5頁面上調試發現可以正常使用&#xff0c;效果如下&#xff1a; 當放在手機上看&#xff0c;會發現&#xff0c;僅僅剩一個視頻&#xff0c;本應在視頻上層的元素不見了。 經過一番排查&#x…

【MyBatis批量更新實現】按照list傳入批量更新

學習目標&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 顯示數據、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通過VOFA顯示數據波形。 一、VOFA 下載 VOFA 是一款面向嵌入式開發的上位機軟件&#xff0c;專注于硬件數據實時可視化與調試。它通過高效協議&#xff08;如FireWater、JustFloat&#xff09;將原始字節流轉化為…

MySQL 插入數據提示字段超出范圍?一招解決 DECIMAL 類型踩坑

MySQL 插入數據提示字段超出范圍&#xff1f;一招解決 DECIMAL 類型踩坑 在日常數據庫操作中&#xff0c;我們經常會遇到各種字段類型相關的問題。今天就來聊聊一個常見的錯誤&#xff1a;插入數據時提示字段值超出范圍&#xff0c;以實際案例帶你搞懂 MySQL 中 DECIMAL 類型的…

一周學會Matplotlib3 Python 數據可視化-繪制誤差條形圖

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

JVM垃圾回收器

垃圾回收算法標記-復制缺點&#xff1a;內存利用率低&#xff0c;有一塊區域無法使用。標記-清除缺點&#xff1a;1. 效率問題 (如果需要標記的對象太多&#xff0c;效率不高)2. 空間問題&#xff08;標記清除后會產生大量不連續的碎片&#xff09;標記-整理分代收集根據對象存…

科研工具的一些注意事項

Origin Origin導入數據之后&#xff0c;可以考慮 [刪除數據連接器…] 導入數據之后&#xff0c;刪除數據連接&#xff0c;這樣當原來的文件移動之后&#xff0c;就不影響origin文件里面的數據。不然就會出現空白數據&#xff1a;當然&#xff0c;沒有數據了也可以加載出來&…

美國服務器環境下Windows容器工作負載智能彈性伸縮

在北美數據中心加速數字化轉型的今天&#xff0c;企業客戶日益重視Windows容器工作負載的智能化管理。本文將深入探討基于Azure Stack HCI&#xff08;混合云基礎設施&#xff09;的彈性伸縮方案如何突破傳統資源調度瓶頸&#xff0c;通過分析指標收集、策略配置、混合云聯動三…

歐姆龍CP系列以太網通訊實現上位機與觸摸屏監控

一、行業痛點在現代工業生產中&#xff0c;自動化生產線的控制系統的高效性與智能化程度對生產效率和產品質量有著至關重要的影響。然而&#xff0c;許多傳統工業生產線中使用的歐姆龍CP系列系列PLC以太網模塊&#xff0c;由于自身設計原因&#xff0c;并未配備以太網接口&…

【大語言模型 00】導讀

【大語言模型00】導讀&#xff1a;你的LLM全棧工程師進階之路關鍵詞&#xff1a;大語言模型、LLM、Transformer、深度學習、AI工程化、全棧開發、技術路線圖摘要&#xff1a;這是一份完整的大語言模型學習指南&#xff0c;涵蓋從數學基礎到商業落地的200篇深度文章。無論你是AI…

Business Magic

題目描述There are n stores located along a street, numbered from 1 to n from nearest to farthest. Last month, the storek had a net profit of rk . If rk is positive, it represents a profit of rk dollars; if rk is negative, it represents a loss of ?rk dolla…

在ubuntu系統上離線安裝jenkins的做法

作者&#xff1a;朱金燦 來源&#xff1a;clever101的專欄 1.安裝java環境和下載war包&#xff1a; Jenkins 依賴于 Java 環境&#xff08;OpenJDK 11 或更高版本&#xff09;&#xff1a; # 安裝OpenJDK 11和字體依賴 sudo dpkg -i openjdk-11-jre-headless_*.deb fontconfi…

圖像相似度算法匯總及Python實現

下面整理了一些圖像相似度算法&#xff0c;可根據不同的需求選擇不同的算法&#xff0c;對每種算法進行了簡單描述并給出Python實現&#xff1a; 1. 基于像素的算法&#xff1a; (1).MSE(Mean Squared Error)&#xff1a;均方誤差&#xff0c;通過計算兩幅圖像對應像素值差的平…

IO流與單例模式

單例模式 單例模式是指一個類只能有一個對象。 餓漢模式 在單例模式下&#xff0c;在程序開始&#xff08;main函數運行前&#xff09;的時候創建一個對象&#xff0c;這之后就不能再創建這個對象。 class HungryMan { public:static HungryMan* getinstance(){return &ins…

Java設計模式之依賴倒置原則使用舉例說明

示例1&#xff1a;司機駕駛汽車 問題場景&#xff1a;司機類直接依賴奔馳車類&#xff0c;新增寶馬車需修改司機類代碼。 // 未遵循DIP class Benz { public void run() { /*...*/ } } class Driver { public void drive(Benz benz) { benz.run(); } } // 遵循DIP&#xff1a;…

【Docker】openEuler 使用docker-compose部署gitlab-ce

docker-compose配置 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlab.example.comenvironment:GITLAB_OMNIBUS_CONFIG: |# Add any other gitlab.rb configuration here, each on its own lineexternal_url https://gi…

ElasticSearch 父子文檔使用簡記

一. ES parent-child 文檔簡介 ES 提供了類似數據庫中 Join 聯結的實現&#xff0c;可以通過 Join 類型的字段維護父子關系的數據&#xff0c;其父文檔和子文檔可以單獨維護。 二. 父子文檔的索引創建與數據插入 ES 父子文檔的創建可以分為下面三步&#xff1a; 創建索引 M…

【Linux】編輯器vim的使用

目錄 1. vim的基本概念 2. vim的基本使用 3. vim命令模式操作 3.1 移動光標 3.2 刪除 3.3 復制 3.4 替換 3.5 撤銷 3.6 更改 3.7 跳轉 4. vim底行模式操作 4.1 列出行號 4.2 跳到文件中的某行 4.3 查找字符 4.4 保存文件 4.5 離開vim 1. vim的基本概念 Vim&…

《零基礎掌握飛算Java AI:核心概念與案例解析》

前引&#xff1a;飛算科技是一家專注于企業級智能化技術服務的公司&#xff0c;核心領域包括AI、大數據、云計算等。其Java AI解決方案主要面向企業級應用開發&#xff0c;提供從數據處理到模型部署的全流程支持&#xff01;飛算Java AI是一款基于人工智能技術的Java開發輔助工…