Lang-Agent:基于LangGraph的可视化AI Agent开发平台实战指南

news2026/5/1 5:01:54
1. 项目概述一个为开发者打造的AI Agent“乐高”平台如果你正在寻找一个能让你像搭积木一样自由、灵活地构建复杂AI应用的工具那么Lang-Agent值得你花时间深入了解。这不是另一个简单的聊天机器人组装器也不是一个封闭的、只能使用预设功能的平台。它的核心定位更像是一个面向开发者和AI应用架构师的可视化编程环境底层基于LangGraph目标是让你能通过拖拽节点和连线实现过去需要编写大量胶水代码才能完成的智能工作流。我最初接触这类工具时常常感到掣肘要么是平台功能太简单只能做线性对话要么是过于复杂需要深入框架底层失去了快速原型验证的乐趣。Lang-Agent的设计理念明确地站在了ComfyUI这一边而非Dify或Coze。这意味着它不追求开箱即用的海量模板而是鼓励你根据自身独特的业务逻辑去开发专属的节点Node从而组装出高度定制化的Agent。它把控制权完全交给了使用者你可以自定义状态变量State来在节点间传递和存储复杂数据用条件边Conditional Edge实现分支逻辑从而构建出能处理判断、循环、工具调用、多模型协作的“智能体”。简单来说它解决的核心问题是如何将LangChain/LangGraph这种强大的编程框架以一种低代码但又不失灵活性的方式呈现出来加速AI应用从想法到原型的进程。无论是想做一个能自动分析报表并生成总结的助手一个能根据用户描述调用外部API订餐的机器人还是一个需要多轮复杂交互的客服系统你都可以在Lang-Agent的画布上将其可视化地搭建出来。2. 核心架构与设计哲学拆解2.1 为什么是LangGraph而不是简单的线性链很多初代的AI工作流工具其底层模型是线性的节点A的输出直接作为节点B的输入。这种模式在处理简单、确定的流程时没问题但一旦涉及决策、循环、状态保持就显得力不从心。例如一个客服Agent可能需要根据用户问题的复杂度决定是直接回答、转接人工还是询问更多信息一个数据分析Agent可能需要循环查询数据库直到收集齐所有数据。LangGraph正是为了解决这些问题而生。它将工作流抽象为一个有向图节点是执行单元边定义了执行路径。最关键的是它引入了状态State的概念。整个图共享一个状态字典每个节点读取并更新这个状态。边可以是无条件的执行完A就到B也可以是有条件的根据状态的某个值决定下一步去哪。这完美对应了编程中的变量、函数和条件判断。Lang-Agent完全拥抱了这一范式。你在画布上拖拽的每个节点最终都会被编译成LangGraph中的一个节点你画的每条边就是图中的边而你定义的“状态变量”就是那个共享的状态字典。这使得你构建的Agent具备了图灵完备的潜力能够表达非常复杂的逻辑。2.2 “有限编程”与“可扩展性”的平衡项目描述中提到的“可有限编程”这个说法非常精准。它并非一个全功能的IDE而是通过一组精心设计的原语Primitives来实现编程逻辑状态变量State Variables这是全局的“变量存储区”。你可以在“开始节点”中声明它们如counter,user_query,final_report然后在任何节点的提示词、条件判断中通过{{variable_name}}来引用节点执行后也可以更新它们。节点Nodes预置了各种功能的执行单元如调用LLM、执行Python代码、操作文件、进行向量检索等。每个节点像是一个函数接收状态执行操作并可能更新状态。边Edges定义了执行流。特别是条件边你可以在边上写一个Python表达式如{{counter}} 5系统会根据当前状态计算表达式的布尔值决定是否走这条路径。这种设计实现了“有限编程”——你无需写完整的Python脚本只需组合这些原语。同时通过自定义节点机制当预置节点无法满足需求时你可以用Python和React分别编写后端逻辑和前端配置界面无缝集成到平台中。这保证了平台的扩展性上限极高可以适应任何垂直领域的特殊需求。2.3 技术栈选型背后的考量后端 FastAPI LangChain/ LangGraphFastAPI是现代Python异步Web框架的佼佼者性能好、异步支持完善与LangChain的异步调用天生契合。LangChain提供了连接各种模型、工具、数据库的标准化接口而LangGraph是工作流引擎的核心。这个组合确保了后端既高效又能直接利用AI生态最主流的库。前端 React React Flow HeroUIReact是构建复杂交互界面的首选。React Flow是一个专业的图编辑库专门用于处理节点、连线、拖拽这是实现可视化编排的核心基础。HeroUI一个基于Tailwind的React组件库则提供了美观、一致的UI组件加速了前端开发。这个选型说明前端体验是项目重点之一。包管理 Poetry Yarn分别用于Python和Node.js的依赖管理保证了项目依赖的精确和环境的可复现这是现代项目专业性的体现。从技术栈可以看出这是一个面向开发者的、追求工程化质量的项目而不是一个简单的演示Demo。3. 从零开始环境部署与项目启动实操虽然README提供了步骤但在实际部署中有几个细节容易踩坑这里结合我的经验详细说明。3.1 后端环境搭建与避坑指南首先克隆项目git clone https://github.com/cqzyys/lang-agent.git cd lang-agent关键步骤1Python版本管理项目依赖特定的Python版本通常会在pyproject.toml中注明建议使用Python 3.9。强烈建议使用conda或pyenv创建独立环境避免污染系统环境。# 使用conda示例 conda create -n lang-agent python3.10 conda activate lang-agent关键步骤2使用Poetry安装依赖进入后端目录使用Poetry安装。如果没安装Poetry需先安装。cd lang-agent-backend # 如果未安装poetry pip install poetry # 使用poetry安装依赖此命令会创建虚拟环境并安装所有依赖 poetry install注意poetry install可能会因为网络问题导致某些包下载缓慢或失败。特别是langchain-ai相关的包。如果遇到问题可以尝试更换PyPI源如阿里云、清华源命令如下poetry source add --priorityprimary mirrors https://mirrors.aliyun.com/pypi/simple/然后再执行poetry install。关键步骤3处理可能的依赖冲突LangChain生态更新频繁有时pyproject.toml中锁定的版本可能与你的环境存在冲突。如果poetry install失败可以尝试让Poetry解析最新兼容版本poetry update但这可能会升级一些包存在一定风险。最稳妥的方式是查看错误信息针对性调整pyproject.toml中的版本约束。关键步骤4启动后端服务依赖安装成功后在poetry shell激活的虚拟环境中启动python -m lang_agent.main默认情况下后端服务会启动在http://localhost:8000。你应该能看到类似Uvicorn running on http://0.0.0.0:8000的日志。3.2 前端环境搭建与启动前端相对直接但需确保Node.js版本合适建议16。cd ../lang-agent-frontend # 安装yarn如果未安装 npm install -g yarn # 安装项目依赖 yarn install注意yarn install同样可能受网络影响。可以配置淘宝镜像加速yarn config set registry https://registry.npmmirror.com安装完成后启动开发服务器yarn dev前端服务通常启动在http://localhost:8820。此时打开浏览器访问该地址应该能看到Lang-Agent的界面。3.3 首次运行的配置检查启动成功后前后端是分离的前端会自动请求后端接口。你需要确保后端API服务localhost:8000正常运行。前端页面能正常加载并且没有控制台Console报错特别是网络请求错误如404或CORS错误。CORS问题如果前端和后端端口不同且后端没有正确配置CORS浏览器会阻止请求。FastAPI后端需要启用CORS中间件。检查lang_agent/main.py或相关启动文件确认包含了类似以下的代码from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins[http://localhost:8820], # 前端地址 allow_credentialsTrue, allow_methods[*], allow_headers[*], )项目通常已配置好如果遇到CORS错误请检查此处。4. 核心功能深度解析与实战配置平台的功能围绕“配置”展开理解每个配置项的含义是高效使用它的关键。4.1 基石模型、MCP与向量库配置在构建Agent之前需要配置好“武器库”。1. 模型配置这是连接AI大脑的通道。点击【模型配置】添加一个模型。名称自定义如gpt-4o-mini-api。类型llm用于对话、推理、vlm视觉语言模型如图片理解、embedding生成文本向量。渠道目前主要是openai。这意味着你需要一个兼容OpenAI API的终端点。这可以是OpenAI官方API (api.openai.com)Azure OpenAI其他任何提供了兼容OpenAI API接口的服务如国内的一些大模型平台。连接参数这是核心。通常以JSON格式填写。最基本的参数包括{ base_url: https://api.openai.com/v1, api_key: your-api-key-here, model: gpt-4o-mini }base_url: API地址。如果是Azure格式类似https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-name}。api_key: 你的API密钥。model: 模型名称。对于OpenAI官方是gpt-4-turbo,gpt-4o-mini等对于Azure是部署名称。实操心得api_key务必保密。如果是团队使用建议通过环境变量传入而不是直接写在配置里。项目应该支持从环境变量读取检查后端代码中处理api_key的方式。2. MCP配置模型上下文协议MCP是一个让大模型安全、标准化调用外部工具如搜索、数据库、计算器的协议。配置MCP就是为Agent提供“手脚”。点击【MCP配置】添加。你需要一个MCP服务器。例如可以配置一个“天气查询”MCP服务器。MCP参数通常需要指定服务器的连接方式如Stdio、SSE、HTTP和命令或URL。具体参数需参考你所使用的MCP服务器文档。例如一个本地Stdio服务器的配置可能如下{ type: stdio, command: path/to/your/mcp/server }配置成功后在创建ReactAgent时就可以选择这个MCP提供的工具了。3. 向量库配置用于存储和检索文本向量是实现“长期记忆”或“知识库问答”的基础。类型支持postgres使用pgvector扩展和milvus。URI/连接信息根据你部署的向量数据库填写。例如一个本地PostgreSQL的配置URI:postgresql://localhost:5432用户名/密码/数据库名你的PG数据库凭证。集合名相当于表名用于存储特定类型的文档向量。嵌入模型选择之前配置好的embedding类型模型。这决定了文档被转换成向量时所使用的算法。4. 向量库文档管理配置好向量库后可以上传文档TXT, PDF, DOCX, MD然后点击“向量化”按钮。这个过程会 1. 用指定的嵌入模型将文档内容切分chunk并转换为向量。 2. 将向量存入指定的向量库集合中。 之后你就可以在Agent中使用“向量召回节点”通过问题检索相关的文档片段了。4.2 Agent编排从画布到智能体的核心操作这是Lang-Agent最核心的部分。点击【Agent配置】-【新增Agent】进入编排界面。1. 理解画布与资源树资源树左侧所有可用的“积木块”分为节点、预制Agent、边。画布右侧你的工作区在这里拖拽组合“积木块”。2. 构建你的第一个Agent一个简单的问答机器人我们来创建一个最简单的线性流程用户提问 - LLM回答 - 输出。 a. 从资源树拖拽一个开始节点到画布。双击或从右侧面板配置 - 名称start- 状态变量默认已有messages我们保持不动。这是用于存储对话历史的特殊变量。 b. 拖拽一个输入节点到画布放在开始节点右侧。配置 - 名称get_user_input- 引导词“请输入您的问题”- 目标状态变量messages(默认) c. 拖拽一个LLM节点到画布放在输入节点右侧。配置 - 名称assistant- 模型选择你配置好的LLM模型如gpt-4o-mini-api。 - 系统提示词“你是一个有帮助的助手。”- 用户提示词{{messages[-1]}}这是关键这个语法表示取messages列表中的最后一个元素即用户刚输入的问题。 d. 拖拽一个结束节点到画布放在LLM节点右侧。 e.连线将鼠标悬停在节点边缘的“桩”小圆点上拖动到下一个节点的“桩”上创建默认边。顺序为start-get_user_input-assistant-end。 f. 点击右上角【运行】。在右下角的聊天窗口你会看到引导词输入问题后LLM会给出回答。双击结束节点可以查看完整运行结果和状态变量。3. 进阶使用状态变量和条件边实现循环对话上面的Agent一次运行就结束了。如何实现多轮对话这就需要状态变量和条件边。 a. 在开始节点我们保持messages状态变量。 b. 沿用之前的输入节点和LLM节点。 c.关键改动删除指向结束节点的边。在LLM节点后我们添加一个条件边。 d. 从资源树拖拽“条件边”到画布它本身不是节点是连接线的一种。将assistant节点的输出桩用条件边连接到get_user_input节点的输入桩。这形成了一个从“回答”回到“提问”的循环。 e.配置条件边选中这条条件边在右侧面板的“条件表达式”中填入len({{messages}}) 6。这个表达式判断对话轮次messages列表长度是否小于6。如果是True则执行循环回到输入节点如果是False则跳出循环。 f. 再从assistant节点拉一条默认边到结束节点。这样LangGraph会根据条件表达式的值决定下一步为真则循环为假则结束。 g. 运行Agent。你会发现你可以连续进行最多5轮对话因为messages初始可能包含系统消息所以len(messages) 6大概对应5轮用户输入。这就是一个带有循环逻辑的聊天机器人。4. 状态变量使用规则详解状态变量是节点间通信的桥梁。规则很简单但强大引用方式在提示词或条件表达式中使用{{variable_name}}来引用自定义状态变量如{{counter}}。对于特殊的messages变量它是一个列表存储了所有对话消息对象。你可以用{{messages[-1]}}获取最新一条消息用{{messages[-1].content}}获取其内容如果结构支持。更新方式节点通过其逻辑更新状态。例如“计数器节点”会将指定的状态变量1“转换器节点”可以将一个状态变量的值处理后赋给另一个。类型目前自定义状态变量主要支持字符串、数字等基本类型复杂类型如列表、字典的支持可能需要查看最新文档或通过自定义节点实现。4.3 预制AgentReactAgent与SupervisorAgent这两个是平台提供的“高级积木”封装了更复杂的模式。1. ReactAgent这是基于ReActReasoning Acting模式的Agent。你给它提供工具通过MCP配置它就能自主地“思考”生成推理轨迹并“行动”调用工具来解决问题。配置在画布中拖入“ReactAgent”节点。需要指定一个LLM模型和一组可用的工具来自已配置的MCP。工作原理当你运行包含ReactAgent的图时该节点会将当前状态如用户问题交给LLM。LLM会根据提示词决定是进行推理还是调用某个工具。调用工具后工具结果会被放回状态LLM继续分析直到它认为可以给出最终答案。适用场景需要动态调用外部API或数据的任务如“查询北京今天的天气然后推荐穿什么衣服”。2. SupervisorAgent这是一个“管理者”Agent它的工作是协调调用其他可复用Agent。配置拖入“SupervisorAgent”节点指定一个LLM模型和一组可用的子Agent这些子Agent需要在配置时勾选“可复用”。工作原理SupervisorAgent接收一个复杂任务通过LLM分析决定将任务分解并派发给哪个子Agent去执行最后汇总结果。这实现了Agent的模块化和分层调度。适用场景构建复杂的多专家系统。例如一个“旅行规划”Supervisor可以调用“航班查询Agent”、“酒店预订Agent”、“景点推荐Agent”来共同完成规划。5. 自定义节点开发释放平台的终极潜力当内置节点无法满足你的业务需求时自定义节点功能就派上用场了。这是Lang-Agent作为“平台”而非“工具”的核心体现。5.1 开发流程概述开发一个自定义节点需要前后端配合前端React在lang-agent-frontend/src/components/nodes/custom/目录下创建一个新的节点组件文件如WeatherNode.tsx定义节点的配置界面有哪些参数需要用户填写。后端Python在lang-agent-backend/lang_agent/node/custom/目录下创建一个对应的节点逻辑文件如weather_node.py实现节点的核心执行逻辑。注册可能需手动或自动扫描确保前后端对节点类型type的定义一致平台会自动将其加载到资源树中。5.2 实战创建一个“天气查询”自定义节点假设我们想创建一个能调用外部天气API的节点。后端实现 (weather_node.py):from typing import Optional, Union from pydantic import Field, TypeAdapter import aiohttp from ..core import BaseNode, BaseNodeData, BaseNodeParam class WeatherNodeData(BaseNodeData): # 定义前端需要配置的参数 city: str Field(..., description要查询的城市名) api_key: str Field(..., description天气API的密钥) output_state_var: str Field(defaultweather_result, description存储结果的状态变量名) class WeatherNodeParam(BaseNodeParam): data: Optional[WeatherNodeData] Field(defaultNone, descriptionNode Data) class WeatherNode(BaseNode): type weather # 节点类型标识必须唯一且与前端的type一致 def __init__(self, param: Union[WeatherNodeParam, dict], **kwargs): adapter TypeAdapter(WeatherNodeParam) param adapter.validate_python(param) super().__init__(param, **kwargs) async def ainvoke(self, state: dict): 异步业务逻辑调用天气API并将结果存入状态 data self.param.data city data.city api_key data.api_key output_var data.output_state_var # 模拟调用天气API (这里用模拟数据实际应调用真实API如OpenWeatherMap) async with aiohttp.ClientSession() as session: # 实际URL和参数需根据具体API调整 # async with session.get(fhttps://api.weatherapi.com/v1/current.json?key{api_key}q{city}) as resp: # result await resp.json() result {city: city, temperature: 22°C, condition: 晴朗} # 模拟数据 # 将结果更新到状态变量中 state[output_var] f{city}的天气是{result[condition]}温度{result[temperature]}。 # 可选也更新messages以便后续LLM节点能读到 # state.setdefault(messages, []).append({role: system, content: state[output_var]}) return state前端实现 (WeatherNode.tsx):import { Handle, Position, NodeResizer } from xyflow/react; import { Card, CardBody, CardHeader, Input, Form } from heroui/react; import { KeyInput, BaseNodeData, DEFAULT_HANDLE_STYLE, NodeProps, NodeConfig, } from /components; export type WeatherNodeData BaseNodeData { city: string; api_key: string; output_state_var: string; }; export type WeatherNodeProps NodePropsWeatherNodeData; const WeatherNode: React.FCWeatherNodeProps ({ id, data, onDataChange, }) { const handleChange (field: keyof WeatherNodeData, value: string) { onDataChange({ ...data, [field]: value }); }; return ( NodeResizer isVisible{false} / Handle idinput position{Position.Left} style{DEFAULT_HANDLE_STYLE} typetarget / Card classNamem-1 bg-slate-50 min-w-[200px] CardHeader classNamebg-slate-200 div classNamefont-black ml-2 w-full天气查询节点/div /CardHeader CardBody Form classNamew-full max-w-xs space-y-2 KeyInput id{id} value{data.name} onChange{(v) handleChange(name, v)} / Input label城市 value{data.city} onValueChange{(v) handleChange(city, v)} placeholder例如北京 / Input labelAPI Key value{data.api_key} onValueChange{(v) handleChange(api_key, v)} placeholder请输入天气API密钥 typepassword / Input label输出变量名 value{data.output_state_var} onValueChange{(v) handleChange(output_state_var, v)} placeholder例如weather_result / /Form /CardBody /Card Handle idoutput position{Position.Right} style{DEFAULT_HANDLE_STYLE} typesource / / ); }; const WeatherNodeConfig: NodeConfigWeatherNodeData { type: weather, // 必须与后端type一致 description: 查询指定城市的天气信息, data: { id: , type: weather, name: 天气查询, city: , api_key: , output_state_var: weather_result, }, component: WeatherNode, }; export default WeatherNodeConfig;开发要点与避坑前后端类型对齐type字段必须完全一致如weather这是节点匹配的关键。数据模型继承前端WeatherNodeData和后端WeatherNodeData的字段应该对应。它们都继承自基础的BaseNodeData其中包含了id,type,name等公共字段。状态更新后端ainvoke方法必须返回更新后的state字典。这是节点影响工作流的唯一方式。错误处理在实际节点中务必添加健壮的错误处理如网络请求失败、API响应异常并考虑如何将错误信息反映到状态中以便后续节点处理或展示给用户。前端样式可以自由使用HeroUI和Tailwind CSS来美化节点的配置界面。开发完成后重启前后端服务你应该能在资源树的“节点”分类下看到新增加的“天气查询节点”可以像使用内置节点一样拖拽和配置它。6. 常见问题排查与性能优化心得在实际使用和开发中你可能会遇到以下问题6.1 部署与连接问题问题现象可能原因排查步骤与解决方案前端页面空白或无法加载1. 后端服务未启动。2. 前端构建失败或服务未启动。3. 浏览器控制台有CORS错误。1. 检查localhost:8000后端API是否可访问。2. 检查localhost:8820前端服务是否运行查看终端是否有报错。3. 检查浏览器开发者工具Console和Network标签确认前端是否成功请求后端以及后端响应头是否包含正确的CORS信息。模型配置测试失败1. API Key或Base URL错误。2. 网络不通如国内访问OpenAI。3. 模型名称不正确或额度不足。1. 仔细核对API Key和端点URL。对于Azure确保base_url和model部署名正确。2. 使用curl或 Postman 直接测试API端点是否通。3. 查看模型供应商后台确认额度或配额。保存或运行Agent时报“内部服务器错误”1. 后端代码异常。2. 数据库连接问题如果用了数据库存储配置。3. 节点逻辑有Bug。1. 查看后端服务日志这是最直接的错误信息来源。2. 检查数据库配置和连接状态。3. 如果是自定义节点重点检查ainvoke方法中的逻辑。6.2 Agent编排与运行问题问题现象可能原因排查步骤与解决方案Agent运行后没有任何输出直接结束1. 图没有正确连接存在断头路。2. 开始节点的状态变量配置有误。3. 某个节点执行出错导致流程中断。1. 检查画布确保从开始节点到结束节点有完整的路径连接。使用“运行”时可以观察右下角Chatbot的实时日志。2. 确认LLM节点的提示词中是否正确引用了状态变量如{{messages[-1]}}。3. 查看后端日志定位是哪个节点报错。条件边不生效总是走默认边或反之1. 条件表达式语法错误。2. 引用的状态变量不存在或值为空。3. 对条件表达式的布尔值理解有误。1. 确保表达式是合法的Python表达式并且用{{}}包裹变量。例如{{counter}} 5。2. 在条件边之前确保用于判断的状态变量已被正确赋值。可以在LLM节点前加一个“转换器节点”来打印或验证状态。3. 记住条件边为True时走条件边为False时走其他边通常是默认边。LLM节点返回内容不符合预期1. 提示词编写不佳。2. 状态变量内容未按预期传递。3. 模型本身能力或参数问题。1. 优化系统提示词和用户提示词。确保指令清晰。可以在提示词中要求模型以特定格式如JSON输出便于后续节点解析。2. 使用“转换器节点”或自定义节点在LLM节点前检查输入给它的状态变量内容是否正确。3. 尝试更换模型或调整模型参数如temperature。多轮对话中历史消息混乱或丢失1.messages状态变量处理不当。2. 节点错误地覆盖了messages。1. LangGraph和LangChain通常期望messages是一个消息对象的列表。确保你的输入节点将用户输入以{role: user, content: ...}格式追加到messages列表LLM节点将其回复以{role: assistant, content: ...}格式追加。2. 避免使用“转换器节点”等直接重置整个messages列表除非你明确需要清空历史。6.3 性能优化与最佳实践异步化确保自定义节点的ainvoke方法是异步的async def并且内部IO操作如网络请求、数据库查询使用异步库如aiohttp,asyncpg避免阻塞整个事件循环。状态变量精简只将必要的数据放入状态变量。过大的状态如整个文档内容会在节点间传递增加序列化/反序列化开销。考虑只传递引用或摘要。图的复杂度过于复杂的图节点和边非常多可能会增加编译和调试难度。尽量将可复用的逻辑封装成可复用Agent然后通过SupervisorAgent或普通节点调用来组织使主图保持清晰。错误处理与超时在自定义节点和Agent配置中为可能失败的操作如外部API调用设置超时和重试机制并将友好的错误信息返回给状态供后续节点判断。提示词工程对于复杂的LLM调用精心设计提示词是成功的关键。利用系统提示词设定角色和规则在用户提示词中清晰提供上下文和指令。可以创建专门的“提示词模板节点”来管理复杂的提示词。利用预制AgentReactAgent和SupervisorAgent封装了强大的模式在适合的场景下直接使用它们比从头构建更高效、更稳定。Lang-Agent将一个强大的编程范式基于图的智能体变成了可视化的操作极大地降低了开发门槛。它的价值不在于提供了多少现成的解决方案而在于提供了一套极其灵活的原语和扩展机制让开发者能够快速构建出贴合自己业务逻辑的AI应用。从简单的自动化脚本到复杂的多智能体协作系统这片画布上的可能性只受限于你的想象力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2551611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…