AI Agent从无到有67: 多智能体实战——构建基于LangGraph的数字人客服助手

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品) 阅读详情

纲要

  • 项目背景
    • 从单智能体到多智能体系统的演进
    • 数字人交互的引入与降级方案
  • 系统架构
    • 前端:HTML + WebRTC 数字人(可降级为纯文本)
    • 通信:WebSocket 双向实时消息
    • 后端:FastAPI 服务 + LangGraph 多智能体引擎
    • 智能体层:监管者模式(主管 + 搜索专家 + AI 程序员)
  • 多智能体设计
    • 监管者模式的核心思想
    • 子 Agent 定义:工具与系统提示
    • 路由逻辑与任务分派
  • 核心实现
    • FastAPI WebSocket 服务与心跳机制
    • LangGraph 监管者 Agent 的构建(含条件路由)
    • 情绪检测与数字人动作映射
  • 完整可运行示例
    • 项目结构
    • 依赖安装与环境配置
    • 后端服务完整代码
    • 前端页面完整代码
  • 运行与测试
  • API 速览
  • Demo 示例
  • 总结
  • 润色纠正的前后对比

项目背景

在单智能体应用的基础上,多智能体系统通过分工协作显著提升了复杂任务的处理能力。本文将展示如何整合 LangGraph、FastAPI 与 WebSocket,构建一个支持数字人交互的多智能体客服系统。系统采用监管者模式,由主管 Agent 根据用户问题自动路由至搜索专家或 AI 程序员,并借助微软 WebRTC 数字人实现语音播报与表情反馈。当数字人服务不可用时,系统可无缝降级为纯文本对话,确保核心业务逻辑独立运行。

系统架构

WebSocket

条件路由

条件路由

结果

结果

最终答案

流式输出 + 情绪标签

SSML 合成

浏览器 HTML

FastAPI 服务

LangGraph 多智能体

搜索专家

AI 程序员

微软数字人

  • 前端层:HTML 页面负责用户交互,通过 WebSocket 与服务端通信。启用数字人时,通过微软 Speech SDK 建立 WebRTC 连接,将服务端返回的文本与情绪动作合成为视频/音频流。
  • 通信层:WebSocket 长连接实现全双工实时消息推送,内置心跳保活机制。
  • 后端层:FastAPI 提供 WebSocket 端点与静态文件服务。接收用户消息后,调用 LangGraph 多智能体引擎进行推理,并将回答以流式方式推送回前端。
  • 智能体层:基于 LangGraph 的 StateGraph 构建监管者模式,内部包含两个专业 Agent:
    • 搜索专家:使用 SerpAPIWrapper 进行在线信息检索。
    • AI 程序员:使用 Python 代码执行沙盒(生产环境建议替换为 RIZA 或 E2B 等安全沙盒)。

多智能体设计

监管者模式(Supervisor Pattern)是多智能体协作的经典架构。主管 Agent 负责分析用户输入,并根据预定义规则将任务路由至最合适的子 Agent。子 Agent 各自拥有独立的工具集与系统提示,专注处理特定类型的问题。

  • 搜索专家:处理概念解释、实时资讯、知识问答等需要外部信息检索的任务。
  • AI 程序员:处理编程调试、代码生成、算法实现等需要代码执行或逻辑推理的任务。

主管 Agent 的提示词中明确约束了行为准则,例如不透露 AI 身份、不展示任务分配过程,以提供自然流畅的用户体验。

核心实现

FastAPI WebSocket 服务

服务端需处理多客户端连接、心跳检测、消息收发以及智能体调用。核心机制如下:

  • 使用 asyncio 创建后台心跳检测任务,每 30 秒检查客户端活跃状态,超时(60 秒)自动断开。
  • 接收消息时区分心跳包(ping/pong)与业务消息。
  • 调用 LangGraph Agent 时采用流式输出,逐块推送至前端,模拟打字机效果。
  • 集成轻量情绪检测链,根据用户输入判断情绪标签(angry/happy/sad)并映射为数字人动作指令。

LangGraph 监管者 Agent

利用 LangGraph 的 StateGraph 与 MessagesState 可快速构建自定义多智能体图。核心步骤包括:

  1. 定义子节点(searcher_node、coder_node)。
  2. 定义路由函数(router),基于用户问题关键词决定下一步流转。
  3. 添加条件边(add_conditional_edges)与固定边(add_edge)。
  4. 使用 MemorySaver 作为检查点存储器,编译生成可执行图。

此种方式相比 create_supervisor 等高级封装更具灵活性,便于开发者精细控制路由逻辑与状态管理。

情绪检测与数字人控制

后端通过简单的关键词匹配(或轻量 LLM 调用)将用户输入映射为情绪标签,并对应到微软数字人支持的 SSML 动作名称(如 headnod、smile)。前端收到后,将情绪标签动态拼接到 SSML 中,驱动数字人做出相应表情与肢体动作。在不使用数字人时,该功能完全透明,不影响核心对话流程。

完整可运行示例

以下提供一个可直接运行的简化版本,不依赖微软数字人服务,仅展示多智能体 + WebSocket 文本聊天。读者可在此基础上添加微软云配置以启用数字人。

项目结构

multi_agent_chat/
├── server.py
├── templates/
│   └── index.html
├── .env
└── requirements.txt

依赖安装

pip install fastapi uvicorn langgraph langchain-openai langchain-community python-dotenv websockets

环境配置 .env

OPENAI_API_KEY=sk-xxxx
SERPAPI_API_KEY=xxxx
RIZA_API_KEY=xxxx   # 可选,若不使用代码沙盒则不需要

后端服务 server.py

import os
import uuid
import json
import asyncio
from typing import Dict
from dotenv import load_dotenv
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from langchain_openai import ChatOpenAI
from langchain_community.utilities import SerpAPIWrapper
from langchain.tools import Tool
from langgraph.graph import StateGraph, END, MessagesState
from langgraph.checkpoint.memory import MemorySaver
from langchain_core.messages import HumanMessage, AIMessage

load_dotenv()

# ---------- 初始化模型与工具 ----------
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

search = SerpAPIWrapper()
search_tool = Tool(
    name="Search",
    func=search.run,
    description="当需要查找实时信息或未知知识时使用此工具。"
)

def python_repl(code: str) -> str:
    """运行Python代码并返回结果(演示用,生产环境请使用安全沙盒)"""
    try:
        exec_globals = {"result": None}
        exec(code, exec_globals)
        result = exec_globals.get("result")
        if result is None:
            return "代码执行完毕(无返回值)"
        return str(result)
    except Exception as e:
        return f"执行错误: {e}"

code_tool = Tool(
    name="PythonREPL",
    func=python_repl,
    description="执行Python代码。当需要调试或运行代码时使用。输入应为有效的Python代码块。"
)

# ---------- 构建多智能体 ----------
def router(state: MessagesState) -> str:
    """路由函数:根据用户问题决定下一步调用哪个子Agent"""
    last_msg = state["messages"][-1]
    content = last_msg.content.lower() if hasattr(last_msg, "content") else ""
    keywords = ["代码", "编程", "python", "调试", "算法", "实现"]
    if any(k in content for k in keywords):
        return "coder"
    return "searcher"

def searcher_node(state: MessagesState) -> dict:
    """搜索专家节点"""
    user_msg = state["messages"][-1]
    prompt = f"你是一个信息搜索专家,请回答问题:{user_msg.content}"
    response = llm.invoke([HumanMessage(content=prompt)])
    return {"messages": [AIMessage(content=response.content)]}

def coder_node(state: MessagesState) -> dict:
    """AI程序员节点"""
    user_msg = state["messages"][-1]
    prompt = f"你是一个AI程序员,请编写代码解决:{user_msg.content}"
    response = llm.invoke([HumanMessage(content=prompt)])
    return {"messages": [AIMessage(content=response.content)]}

builder = StateGraph(MessagesState)
builder.add_node("searcher", searcher_node)
builder.add_node("coder", coder_node)

builder.set_entry_point("searcher")
builder.add_conditional_edges("searcher", router, {"coder": "coder", "searcher": END})
builder.add_edge("coder", END)

memory = MemorySaver()
agent_graph = builder.compile(checkpointer=memory)

# ---------- FastAPI 应用 ----------
fast_app = FastAPI()
fast_app.mount("/static", StaticFiles(directory="templates"), name="static")

class ConnectionManager:
    def __init__(self):
        self.active_connections: Dict[str, WebSocket] = {}
        self.last_activity: Dict[str, float] = {}

    async def connect(self, client_id: str, websocket: WebSocket):
        await websocket.accept()
        self.active_connections[client_id] = websocket
        self.last_activity[client_id] = asyncio.get_event_loop().time()

    def disconnect(self, client_id: str):
        self.active_connections.pop(client_id, None)
        self.last_activity.pop(client_id, None)

    async def send_text(self, client_id: str, message: str):
        ws = self.active_connections.get(client_id)
        if ws:
            await ws.send_text(message)

manager = ConnectionManager()

async def heartbeat_check():
    """后台心跳检测任务,超时断开不活跃连接"""
    while True:
        await asyncio.sleep(30)
        now = asyncio.get_event_loop().time()
        for cid in list(manager.last_activity.keys()):
            if now - manager.last_activity[cid] > 60:
                ws = manager.active_connections.get(cid)
                if ws:
                    try:
                        await ws.close()
                    except:
                        pass
                manager.disconnect(cid)

@fast_app.on_event("startup")
async def startup():
    asyncio.create_task(heartbeat_check())

@fast_app.get("/")
async def get_index():
    with open("templates/index.html", "r", encoding="utf-8") as f:
        return HTMLResponse(f.read())

@fast_app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: str):
    await manager.connect(client_id, websocket)
    try:
        while True:
            data = await websocket.receive_text()
            manager.last_activity[client_id] = asyncio.get_event_loop().time()
            msg = json.loads(data)

            if msg.get("type") == "ping":
                await websocket.send_text(json.dumps({"type": "pong"}))
                continue

            user_message = msg.get("message", "")
            thread_id = msg.get("thread_id", str(uuid.uuid4()))
            config = {"configurable": {"thread_id": thread_id}}

            inputs = {"messages": [HumanMessage(content=user_message)]}
            final_answer = ""

            # 流式执行多智能体
            for chunk in agent_graph.stream(inputs, config, stream_mode="values"):
                if "messages" in chunk and chunk["messages"]:
                    last_msg = chunk["messages"][-1]
                    if hasattr(last_msg, "content"):
                        final_answer = last_msg.content

            # 模拟打字机效果
            for char in final_answer:
                await websocket.send_text(json.dumps({"type": "text", "content": char}))
                await asyncio.sleep(0.02)

            await websocket.send_text(json.dumps({"type": "complete"}))

            # 简单情绪检测(演示)
            emotion = "neutral"
            if any(k in user_message for k in ["生气", "愤怒", "讨厌"]):
                emotion = "angry"
            elif any(k in user_message for k in ["开心", "哈哈", "太好了"]):
                emotion = "happy"
            await websocket.send_text(json.dumps({"type": "emotion", "emotion": emotion}))

    except WebSocketDisconnect:
        manager.disconnect(client_id)

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(fast_app, host="0.0.0.0", port=8000)

前端页面 templates/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>小浪助手 - 多智能体版</title>
    <style>
        body { font-family: system-ui, sans-serif; max-width: 600px; margin: 2em auto; background: #f9fafb; }
        #chat-box { border: 1px solid #d1d5db; height: 350px; overflow-y: auto; padding: 1em; background: white; border-radius: 8px; margin-bottom: 1em; display: flex; flex-direction: column; gap: 0.5em; }
        .user { align-self: flex-end; background: #2563eb; color: white; padding: 0.5em 1em; border-radius: 16px 16px 4px 16px; max-width: 80%; }
        .bot { align-self: flex-start; background: #e5e7eb; color: #1f2937; padding: 0.5em 1em; border-radius: 16px 16px 16px 4px; max-width: 80%; }
        #input-area { display: flex; gap: 0.5em; }
        #user-input { flex: 1; padding: 0.75em; border: 1px solid #d1d5db; border-radius: 8px; font-size: 1rem; }
        button { padding: 0.75em 1.5em; background: #2563eb; color: white; border: none; border-radius: 8px; font-size: 1rem; cursor: pointer; }
        button:hover { background: #1d4ed8; }
    </style>
</head>
<body>
    <h2>🧠 小浪助手(多智能体)</h2>
    <div id="chat-box"></div>
    <div id="input-area">
        <input type="text" id="user-input" placeholder="请输入您的问题..." />
        <button onclick="sendMessage()">发送</button>
    </div>

    <script>
        let ws;
        const threadId = crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2);
        let botMessageDiv = null;

        function initWebSocket() {
            ws = new WebSocket(`ws://localhost:8000/ws/${threadId}`);

            ws.onopen = () => {
                // 每25秒发送一次心跳
                setInterval(() => {
                    if (ws.readyState === WebSocket.OPEN) {
                        ws.send(JSON.stringify({ type: "ping" }));
                    }
                }, 25000);
            };

            ws.onmessage = (event) => {
                const data = JSON.parse(event.data);

                if (data.type === "text") {
                    if (!botMessageDiv) {
                        botMessageDiv = document.createElement('div');
                        botMessageDiv.className = 'bot';
                        document.getElementById('chat-box').appendChild(botMessageDiv);
                    }
                    botMessageDiv.textContent += data.content;
                } else if (data.type === "complete") {
                    botMessageDiv = null;
                } else if (data.type === "emotion") {
                    console.log("[情绪检测]", data.emotion);
                }

                const chatBox = document.getElementById('chat-box');
                chatBox.scrollTop = chatBox.scrollHeight;
            };

            ws.onclose = () => {
                console.warn("WebSocket 断开,尝试重连...");
                setTimeout(initWebSocket, 3000);
            };
        }

        function sendMessage() {
            const input = document.getElementById('user-input');
            const message = input.value.trim();
            if (!message) return;

            // 显示用户消息
            const userDiv = document.createElement('div');
            userDiv.className = 'user';
            userDiv.textContent = message;
            document.getElementById('chat-box').appendChild(userDiv);

            // 发送到服务端
            ws.send(JSON.stringify({
                type: "message",
                message: message,
                thread_id: threadId
            }));

            input.value = '';
            const chatBox = document.getElementById('chat-box');
            chatBox.scrollTop = chatBox.scrollHeight;
        }

        // 回车发送
        document.getElementById('user-input').addEventListener('keydown', (e) => {
            if (e.key === 'Enter') sendMessage();
        });

        window.onload = initWebSocket;
    </script>
</body>
</html>

运行步骤

  1. 安装依赖:pip install fastapi uvicorn langgraph langchain-openai langchain-community python-dotenv
  2. 配置环境变量:在项目根目录创建 .env 文件,填入 OPENAI_API_KEY 与 SERPAPI_API_KEY。
  3. 启动服务:python server.py
  4. 访问应用:浏览器打开 http://localhost:8000,即可开始对话。

API 速览

langgraph.graph.StateGraph

所属库:langgraph.graph

方法签名:StateGraph(state_schema: Type)

说明:构建状态图的核心类,用于定义多智能体工作流。state_schema 指定状态结构(如 MessagesState)。

关键方法:

  • add_node(name: str, func: Callable):添加节点。
  • add_edge(from: str, to: str):添加固定边。
  • add_conditional_edges(from: str, condition: Callable, path_map: dict):添加条件边。
  • compile(checkpointer: BaseCheckpointSaver):编译图为可执行对象。

langgraph.checkpoint.memory.MemorySaver

所属库:langgraph.checkpoint.memory

说明:内存型检查点存储器,用于保存对话状态,支持多轮对话上下文管理。

fastapi.WebSocket

所属库:fastapi

说明:FastAPI 原生 WebSocket 支持,用于处理实时双向通信。

关键方法:

  • accept():接受连接。
  • receive_text():接收文本消息。
  • send_text(data: str):发送文本消息。

Demo 示例

上述 server.py 与 index.html 构成一个完整的可运行 Demo。该示例演示了以下核心技术:

  • 基于 LangGraph 的监管者多智能体模式
  • FastAPI WebSocket 实时双向通信
  • 心跳保活机制
  • 流式输出(打字机效果)
  • 简单的情绪检测与反馈

运行说明:按上述步骤启动服务后,在浏览器中打开 http://localhost:8000 即可体验。

参考文档

官方文档

参考链接

总结

本文完整演示了如何从零构建一个基于 LangGraph 的多智能体数字人客服系统,涵盖监管者模式设计、WebSocket 实时通信、情绪检测与数字人控制等关键环节。

通过分层架构与清晰的路由逻辑,系统具备良好的可扩展性:可替换搜索工具、接入安全代码沙盒、集成微软数字人服务等。文中所附代码均为可直接运行的完整示例,便于读者快速验证与二次开发。

船载 OpenHarmony AIS 航海工作台:告警与防碰撞预警系统 船载OpenHarmony AIS航海工作台的告警与防碰撞系统,集成十余类告警(超速、偏航、会遇、SOS等),通过网格空间索引实现高效邻近判定,保障实时性。告警管理器统一调度规则、去重、通知与日志,支持悬浮球、语音、跑马灯、弹窗多渠道触达,确保航行安全。SOS紧急通道独立运行,避免干扰。系统设计强调性能优化与多场景适配,为航海安全提供核心支撑。 阅读详情

相关推荐

Python脚本自动化芯片设计?PyAether实战教程带你玩转EDA

本文通过PyAether实战教程,详细介绍了如何利用Python脚本实现芯片设计自动化。内容涵盖环境搭建、核心对象模型解析,并重点演示了原理图自动生成、参数化单元创建及设计验证流程集成,帮助EDA工程师从重复性手动操作中解放,显著提升设计效率与一致性。

e4f5g6h的博客 1316

AI产品经理 VS AI应用开发

2026年AI产品经理与AI应用开发职责与薪酬全景报告

Question_123456的博客 350

在统信UOS Server 20上踩坑记:手把手教你搞定openGauss 5.0.0企业版安装(附常见报错解决方案)

本文详细记录了在统信UOS Server 20上安装openGauss 5.0企业版的实战经验,包括环境准备、依赖库问题、目录权限、内存参数调优等常见问题的解决方案。通过伪装系统标识、建立软链接、调整内存参数等方法,成功克服国产操作系统与企业级数据库的兼容性挑战,为开发者提供了一份深度排雷指南。

weixin_28698059的博客 264

AIGC 应用工程师(5-10年)面试题与答案全解析(2026 前沿版)

AIGC 应用工程师面试题与答案全解析(2026 前沿版) 摘要 本文系统整理了 2026 年 AIGC 应用工程师岗位的核心面试内容,包含 19 大模块、68 道关键题目及 15+ 代码示例。内容覆盖: 岗位定位:强调工程落地能力(RAG、Agent、系统集成)与业务闭环思维 技术体系:从基础理论(Transformer、涌现能力)到前沿应用(MCP协议、多模态生成) 工程实践:包含推理优化、成本控制、安全合规等关键落地能力 评估体系:详细讲解 golden set 构建、LLM-as-judge 等评估

weixin_48053866的博客 818

FPGA调试利器:VIO与ILA在Vivado中的实战应用指南

本文详细介绍了Vivado中FPGA调试工具VIO与ILA的实战应用技巧。VIO作为虚拟输入/输出工具,可实时调整参数;ILA作为集成逻辑分析仪,能高效捕获内部信号。文章通过具体案例展示了如何配置ILA采样深度、触发条件,以及VIO的动态参数调整功能,帮助开发者提升上板调试效率,解决常见通信失败、数据不同步等问题。

weixin_42553471的博客 424

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 226

在Windows10上安装WSL2

WSL2是微软提供的Windows子系统,允许在Windows 10和11上运行Linux环境,提供更好的性能和兼容性。安装WSL2需要启用WSL功能、更新系统、安装WSL2内核,并设置为默认版本。之后,可以通过Microsoft Store安装Linux发行版,并使用WSL命令启动和管理它们。

howard2005的专栏 5942

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 400

微观交通流仿真软件:SUMO (Simulation of Urban MObility)_(8).仿真场景创建与编辑

总结文件()包含了仿真过程中的总体统计信息,如车辆生成数、平均速度等。加载总结文件使用Python的提取关键信息通过以上步骤,可以使用SUMO及其相关工具和库创建和编辑交通仿真场景。无论是手动创建、使用工具转换现有数据,还是通过Python脚本自动生成,SUMO都提供了丰富的功能来满足不同需求。此外,Traci库允许在仿真过程中动态调整交通场景,从而实现更精细的控制和优化。最后,通过对输出文件的分析,可以评估仿真结果并进行进一步的改进。

kkchenjj的博客 1270

Vue3 - 实现集成配置百度语音识别转文字,长按或开启录音并将录音文件实时转换为文字,上传音频文件利用百度语音识别API转换为文本并展示(vue3百度智能云API实现上传录音文件并转换成文字案例)

vue3对接百度智能云语音识别,vue3 h5移动端网页中实现语音识别,百度语音识别录音转文字_百度智能云,vue3如何使用百度语音识别,如何将语音转文字,使用vue3实现录音并将录音转换为文字,vue3如何实现语音输入功能功能,vue3集成百度智能云API实现录音转文字详细教程完整示例代码demo,VUE3使用百度语音识别语音转文字,vue调用百度语音识别,vue3百度语音识别文字并展示功能,vue3免费语音转文本api,百度语音识别申请配置教程,Vue3项目配置自定义界面百度语音识别转文字和原生使用方式

🏆 前端领域优质创作者 2728

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

SAP 52策略测试简介

我们看下下层物料的需求,可以看到物料的需求已经跑出来了,我们双击计划订单,发现是没有办法将计划订单转换为采购申请的,这里是否还记得我们在前面创建主数据的时候独立集中我们填写的是1,所以物料继承了上层物料的策略,所以不能将计划订单进行转换。我们在前面测试了50策略按单生产,创建完计划独立需求后,通过主数据中的独立集中的字段控制下层物料是否能通过计划订单转成生产订单和采购订单。可以看到下层物料的计划订单就可以转采购申请了,到这里可以看到52策略和50策略的计划独立需求完全是一样的。

我小时候很黑的博客 1272

您您这可以把问小白的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭

第三层是格式编译层。这个决策背后的判断很清晰:一个批量导出工具的价值,不在于“试三次”,而在于你真正用它处理了几十份技术文档、访谈记录或课程讲义之后,它是否值得留在你的工作流里。问小白的会话列表通过分页接口加载,AI导出鸭 在页面运行时建立旁路监听,捕获每一次分页请求返回的完整对话清单,包括会话 ID、标题、时间戳和隐藏的元数据字段。让AI导出回归优雅——这句话说的是:导出不该是体力活,而应该是一次完整的、可预期的文件交付。注意:这里的“批量”指的是左侧列表里的多个独立会话,不是一条会话内的多轮对话。

laoyunsi的博客 247

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 502

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

河道漂浮物目标检测数据集

目标检测,yolo,河道漂浮物目标检测数据集

DL_data_set的博客 202

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 199

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 558

AI前沿日报 · 2026-11-04 | 祛魅时刻:Astra“纯读权重“神话的崩塌

①Astra"裸权重通吃"被spaCy创始人Honnibal精准祛魅——仅1/3实验真裸读,数学能力提升依赖Python+50次迭代;②Simon Willison用Qwen 3.8-27B端侧复现权重空间编程;③Nvidia开源Auto-Ontology自动知识图谱;④$800开源全域抓取机器人Stringman;⑤OpenAI悄然重开Codex训练开关引信任危机;⑥DeepMind发布Gemini 4 Argon机器人基础模型;⑦美国科技巨头隐性AI债务达3.2万亿美元,6个月增90%。

johnsong2009的博客 574

大模型 Embedding 与向量相似度详解

Embedding 解决的问题:计算机不懂文字,但懂数字│▼文本 → 向量(1024维浮点数数组)│▼相似度解决的问题:怎么判断两个向量(文本)有多接近│▼余弦相似度:看向量方向的夹角,越接近0°越相似│▼最终效果:语义搜索——理解意思,而非字面匹配一句话总结:Embedding 把文字变成数字,余弦相似度比较数字的方向,两者结合实现了"理解语义"的搜索。

T3165919332的博客 90

GPT-1 架构和计算细节

下面配合框图,对 GPT-1 的每个组件做公式展开 + 数值实例(配置:12 层 × 768,12 头,FFN 3072,词表 40478,共 117M 参数)。GPT-1 把翻译模型的编码器-解码器砍掉一半,只留解码器,然后以"预测下一个词"为目标在 BooksCorpus 上预训练。与 2017 原版的四个架构差异(框图中标 ★):h0=E[token]+Epos[position],E∈R40478×768, Epos∈R512×768h^0 = E[\text{token}] + E_{pos}[\

eloudy的专栏 279

终端 AI 审计与 “龙虾” 类智能体风险治理:从可见性到闭环溯源

生成式 AI 办公普及之后,数据泄露风险逐步下沉到终端。员工将合同、源代码、客户资料粘贴至公有大模型,以及龙虾(OpenClaw)这类本地开源 AI 智能体的滥用,成为企业安全新挑战。传统网络边界防护存在审计盲区,本文从风险链路拆解、核心能力模型、分级治理策略、落地踩坑点以及技术局限性多角度,分享终端侧 AI 安全治理的实践思路。

2401_86491085的博客 641

2.53 基于极稀疏指纹的室内定位注意力图元学习

该论文发表于IEEE Transactions on Mobile Computing(TMC)2026年6月,面向极稀疏指纹条件下的WiFi室内定位,针对指纹采集人力成本高、标记指纹稀缺时定位精度大幅下降的痛点,提出注意力图元学习模型AGML(Attentional Graph Meta‑Learning),结合图神经网络、元学习、两种指纹数据增强与分布对齐技术,在标记指纹极少的场景实现高精度室内定位,同时公开了多套真实+仿真定位数据集用于基准测试。场景:二维室内空间,障碍物造成信号遮挡,

weixin_42963026的博客 338

语音识别与语音合成的技术原理及应用

语音识别 #语音合成 #人工智能 #大模型。语音识别与语音合成的技术原理及应用。一、语音识别的核心原理。二、语音合成的核心原理。三、工程落地的主要难点。五、需要关注的现实问题。

weixin_62919816的博客 212

设计师工作室 GEO 实操:如何提升 AI 实体推荐概率

设计工作室 GEO 的本质,是把创意服务转化为 AI 可理解的结构化信息。核心动作可归纳为:区分事实与审美、建立实体图谱、预判用户提问、输出脱敏内容、搭建多信源、持续测试验证。梳理工作室的 6 个实体属性:品类、城市、流程、边界、团队、渠道。在官网或作品集平台发布至少 3 篇结构化项目复盘,只陈述事实。输出 1 篇「设计报价影响因素」科普内容,覆盖甲方高频提问。争取 1 次行业媒体或本地媒体专访,形成第三方信源。每周用「XX 城市 + 品类 + 设计工作室推荐」指令测试,记录出现频率。

goujunwe的博客 338

AI作图软件技术选型:从4个技术维度出发的实测对比

AI作图软件技术选型:从4个技术维度出发的实测对比

Vbaoke的博客 205
上一篇: AI Agent从无到有66: 基于 LangGraph 的提示词生成助手
下一篇: AI Agent从无到有68: 智能体优化——计划执行与反思模式实战
Wang's Blog
博客等级 码龄12年 7423粉丝 2412原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值