LangGraph(二)——QuickStart样例中的第二步
目录
- 1. 添加依赖
- 2. 官网QuickStart——第二步:用工具增强聊天机器人
- 2.1 Tavily Search
- 2.2 简单测试Tavily Search
- 2.3 添加带工具的ChatBot node
- 2.4 添加tool node
- 2.5 添加条件边
- 2.6 可视化StateGraph
- 2.7 构建聊天循环
- 参考
1. 添加依赖
LangGraph(一)——QuickStart样例中的第一步的基础上添加依赖:
uv add tavily-python langchain-community
2. 官网QuickStart——第二步:用工具增强聊天机器人
2.1 Tavily Search
Tavily提供了实时网页搜索和网页内容提取的功能,官网地址为https://app.tavily.com/home。使用之前需要注册账户,注册后会获取默认的API_KEY。
计划等级为Researcher,有1000个信用点,收费如下。基础搜索每次查询消耗1信用点,高级搜索每次查询消耗2信用点;基础提取每5个网址消耗1信用点,高级提取每5个网址消耗2信用点。
2.2 简单测试Tavily Search
首先在Windows上设置环境变量TAVILY_API_KEY,可以如下代码测试Tavily Search:
from langchain_community.tools.tavily_search import TavilySearchResultstool = TavilySearchResults(max_results=2)
tools = [tool]
tool.invoke("LangGraph中的node是什么?")
结果:
[{'title': 'LangGraph: Low Level Conceptual Guide 基础概念指南 - 知乎专栏','url': 'https://zhuanlan.zhihu.com/p/716038940','content': 'Nodes 节点. 在LangGraph中,节点通常是Python函数(同步或异步),其中第一个位置参数是state,第二个位置参数(可选)是“config”,包含可选的可配置参数(例如thread_id)。','score': 0.91306627},{'title': '初学LangGraph 之节点、边和状态 - 知乎专栏','url': 'https://zhuanlan.zhihu.com/p/720864252','content': '节点(Nodes): 是图的基本构建模块 。 每个节点代表一个特定的功能或操作,用来处理当前状态。 节点可以执行计算、修改状态,或者根据接收到的输入生成输出。 简单理解就是在节点内数据的流转是固定的。','score': 0.8706085}]
2.3 添加带工具的ChatBot node
通过bind_tools将指定工具绑定到大语言模型上,目的是为了让大语言模型指导使用工具时要使用何种JSON格式。
rom typing import Annotatedfrom langchain_deepseek import ChatDeepSeek
from typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messagesclass State(TypedDict):messages: Annotated[list, add_messages]graph_builder = StateGraph(State)llm = ChatDeepSeek(model="deepseek-chat")
# Modification: tell the LLM which tools it can call
llm_with_tools = llm.bind_tools(tools)def chatbot(state: State):return {"messages": [llm_with_tools.invoke(state["messages"])]}graph_builder.add_node("chatbot", chatbot)
2.4 添加tool node
创建一个函数以便在调用工具时实际运行tools,并且将该node添加到graph中。下面的代码中实现了BasicToolNode,它检查状态中的最新messages,并在messages包含tool_calls时调用工具。
import jsonfrom langchain_core.messages import ToolMessageclass BasicToolNode:"""A node that runs the tools requested in the last AIMessage."""def __init__(self, tools: list) -> None:self.tools_by_name = {tool.name: tool for tool in tools}def __call__(self, inputs: dict):if messages := inputs.get("messages", []):message = messages[-1]else:raise ValueError("No message found in input")outputs = []for tool_call in message.tool_calls:tool_result = self.tools_by_name[tool_call["name"]].invoke(tool_call["args"])outputs.append(ToolMessage(content=json.dumps(tool_result, ensure_ascii=False),name=tool_call["name"],tool_call_id=tool_call["id"],))return {"messages": outputs}tool_node = BasicToolNode(tools=[tool])
graph_builder.add_node("tools", tool_node)
2.5 添加条件边
edge将控制流从一个node导向下一个node。conditional edge包含if语句,根据当前graph的state导向不同的node。定义conditional edge的函数接收当前graph的state,并返回一个字符串或字符串列表,指示下一步调用哪个node。
下面的代码中定义了一个名为route_tools的路由函数,该函数检查ChatBot输出中的tool_calls,如果tool_calls存在,该函数将graph从当前node导向到tools,否则将graph从当前node导向到END。通过调用add_conditional_edges对graph添加从chatbot到tools和从chatbot到END的两条condtional edges。
def route_tools(state: State,
):"""Use in the conditional_edge to route to the ToolNode if the last messagehas tool calls. Otherwise, route to the end."""if isinstance(state, list):ai_message = state[-1]elif messages := state.get("messages", []):ai_message = messages[-1]else:raise ValueError(f"No messages found in input state to tool_edge: {state}")if hasattr(ai_message, "tool_calls") and len(ai_message.tool_calls) > 0:return "tools"return END# The `tools_condition` function returns "tools" if the chatbot asks to use a tool, and "END" if
# it is fine directly responding. This conditional routing defines the main agent loop.
graph_builder.add_conditional_edges("chatbot",route_tools,# The following dictionary lets you tell the graph to interpret the condition's outputs as a specific node# It defaults to the identity function, but if you# want to use a node named something else apart from "tools",# You can update the value of the dictionary to something else# e.g., "tools": "my_tools"{"tools": "tools", END: END},
)
# Any time a tool is called, we return to the chatbot to decide the next step
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge(START, "chatbot")
graph = graph_builder.compile()
2.6 可视化StateGraph
通过如下的代码可视化graph:
from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:# This requires some extra dependencies and is optionalpass
可视化结果:
2.7 构建聊天循环
通过如下的代码构建聊天循环:
def stream_graph_updates(user_input: str):for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):for value in event.values():print("Assistant:", value["messages"][-1].content)while True:try:user_input = input("User: ")if user_input.lower() in ["quit", "exit", "q"]:print("Goodbye!")breakstream_graph_updates(user_input)except:# fallback if input() is not availableuser_input = "你知道什么关于LangGraph的内容?"print("User: " + user_input)stream_graph_updates(user_input)break
输入“搜索关于LLM-Based Agent的方法论或实现技巧并总结”后,会调用Tavily Search,得到如下两条结果(前文定义工具的时候限定了返回最大结果数为2):
在获取完Tavily Search的结果,会重新返回大模型,进行总结工作:
Assistant: 以下是关于LLM-Based Agent的方法论和实现技巧的总结:### 方法论
1. **任务分解**:- 通过简单的提示(如“XYZ的步骤”或“实现XYZ的子目标是什么”)由LLM完成。- 使用特定任务的指令,例如“为写文章生成大纲”。2. **对话管理**:- **上下文追踪**:需要正确记录用户的历史意图、槽位值和完整的对话历史,确保Agent具备深层次的理解和回应能力。- **状态更新**:动态更新对话状态,保持信息一致性。可以采用高效的算法和数据结构优化更新过程。- **意图更新**:结合历史意图和最新对话轮次的内容,综合判断用户的当前意图。3. **槽位追踪**:- 通过设计的提示语引导用户补充遗漏的槽位信息,提高任务完成率。- 例如,用户未提供送餐地址时,Agent可以生成提示:“请问需要送到什么地址呢?”4. **智能调用功能**:- 将用户的意图和槽位值转换为具体操作,完成用户需求。- 需要关注高效和准确的设计范式。### 实现技巧
1. **对话历史剪裁**:- 对话历史的长度不宜过长(例如不超过3轮),以避免模型产生幻觉。- 在结合参考资料生成内容时(如RAG),需注意内容的正确性,可能需要引入前置分类器或验证机制。2. **状态存储**:- 小规模应用可将状态存储在内存中。- 大规模分布式应用需使用持久化存储(如Redis),通过session ID快速读写对话状态。3. **测试与验证**:- 在面向客户的场景中,需进行大量测试(单元测试、集成测试、用户接受测试)以确保模型的稳定性和准确性。- 持续监控和优化模型,及时发现并解决问题。4. **提示设计**:- 使用自然、不显生硬的提示语(如“请问...”或“我们需要...”),提升用户体验。通过这些方法论和技巧,可以更高效地设计和实现基于LLM的Agent,提升其在任务型对话中的表现。
Goodbye!
参考
https://langchain-ai.github.io/langgraph/tutorials/introduction/
相关文章:
LangGraph(二)——QuickStart样例中的第二步
目录 1. 添加依赖2. 官网QuickStart——第二步:用工具增强聊天机器人2.1 Tavily Search2.2 简单测试Tavily Search2.3 添加带工具的ChatBot node2.4 添加tool node2.5 添加条件边2.6 可视化StateGraph2.7 构建聊天循环 参考 1. 添加依赖 LangGraph(一)——QuickStar…...
机器学习第二篇 多变量线性回归
数据集:世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom,来预测幸福指数得分。 文件一:linear,…...
【MCP Node.js SDK 全栈进阶指南】中级篇(3):MCP高级资源设计
前言 在MCP TypeScript-SDK的初级篇中,我们介绍了资源开发的基础知识,包括静态资源与动态资源的创建、资源模板设计与参数提取,以及基本的资源列表与发现机制。随着应用规模的扩大和复杂性的提高,我们需要更加高级的资源设计方案来应对各种挑战。 本文作为中级篇的第三篇…...
PostgreSQL 常用日志
PostgreSQL 常用日志详解 PostgreSQL 提供了多种日志类型,用于监控数据库活动、排查问题和优化性能。以下是 PostgreSQL 中最常用的日志类型及其配置和使用方法。 一、主要日志类型 日志类型文件位置主要内容用途服务器日志postgresql-<日期>.log服务器运行…...
PostgreSQL认证培训推荐机构
首先来看一张2025年4月份db-engines上的数据库排行情况,前三名是雷打不动的Oracle、MySQL、Microsoft SQL Server,排名第四的就是我们今天的主角 - PostgreSQL数据库,从这张图上可以看出,PostgreSQL数据库的上升超非常明显&#x…...
2025年NISP一级题库试题
NISP一级考试只考50道单选题,难度不算大,话不多说,直接上硬菜! 1、物理销毁的方式不包括() .消磁 B.焚化炉烧毀 C.反复覆写数据 D.机器硏磨粉碎 2、信息安全应该建立贯穿信息系统的整个生命周期…...
pip install pymysql报错
python安装pymysql报错解决 【现象】 很多时候会出现安装pip包报错的问题,看过很多网上教程以及ai都是如下说法: 镜像问题pip版本问题ssh证书问题网络问题… 在遇见这些情况时,上述的各种解决方法都一一实验过但最后都是ERROR。 【解决办…...
达梦官方管理工具 SQLark 更新--不仅支持达梦、Oracle、MySQL,还新增 PostgreSQL 数据库!
SQLark 是一款面向信创应用开发者的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统,已支持达梦、Oracle、MySQL数据库;在最新的 V3.4 版本中,SQLark 新增了对 PostgreSQL 的支持,兼容 PostgreSQL…...
Windows 同步-互锁变量访问
互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行(完全或根本不执行)。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说,你最终不会只更新变量的一部分;所有位都以…...
前端学习笔记
文章目录 前端主要内容基于脚手架创建前端工程vue的基本使用axios 路由Vue-Router路由组成嵌套路由 状态管理 vuex心得 前端主要内容 HTML、CSS JavaScript axios Vue基础语法(router、vuex、typescript) Element UI 基于脚手架创建前端工程 node.js …...
2025-04-22| Docker: --privileged参数详解
在 Docker 中,--privileged 是一个运行容器时的标志,它赋予容器特权模式,大幅提升容器对宿主机资源的访问权限。以下是 --privileged 的作用和相关细节: 作用 完全访问宿主机的设备: 容器可以访问宿主机的所有设备&am…...
Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子
目录 概念 AOP 术语 1. 连接点(Jointpoint): 2. 切入点(Pointcut): 3. 通知(Advice): 4. 方面/切面(Aspect): 5. 引入ÿ…...
macOS安全隐私最佳实践分析
1. 引言 随着数字世界的不断扩展,个人和组织面临的安全与隐私威胁也日益增加。作为专业的安全合规与隐私保护研究团队,Kaamel 对 macOS 系统的安全隐私现状进行了全面分析,并提出了一系列最佳实践建议,旨在帮助用户更好地保护自己…...
WeakSet:JavaScript 中容易被忽视的“弱集合”
目录 WeakSet 详解 基本概念 创建 WeakSet WeakSet 的主要方法 WeakSet 的特性 WeakSet 的使用场景 1. 避免内存泄漏(DOM 元素管理) 2. 临时缓存系统 3. 私有属性模拟 4. 防止循环引用 与其他数据结构的对比 1. WeakSet 没有实例属性 2. We…...
Discuz!+DeepSeek:传统论坛的智能化蜕变之路
在数字化浪潮中,社区论坛作为互联网早期的产物,面临着功能单一、用户体验滞后的发展瓶颈。虎跃办公(https://www.huyueapp.com)通过Discuz!搭建的网址导航网站,在集成DeepSeek的AI能力后,成功实现了从工具导…...
vs2017中,将CMake构建目录设置在项目目录下
修改CMake构建目录位置 在Visual Studio 2017中,可以通过以下方法将CMake构建目录设置在项目目录下: 修改CMakeSettings.json文件: 在VS中生成CMakeSettings.json文件(通过点击编译平台按钮如x64-Debug或x64-Release…...
跨平台.NET 版本 使用率排名
截至2025年4月,跨平台.NET版本的安装使用率排名主要基于版本支持状态、性能优化和企业迁移趋势。以下是结合微软官方政策、行业动态及开发者行为分析的综合结论: 1. .NET 8 (LTS) 占据主导地位 支持周期:作为2023年11月发布的长期支持&…...
基于无障碍跳过广告-基于节点跳过广告
2025-04-22 一些广告的关闭是叉图标,获取到的信息也没什么特征,这种广告怎么跳过 用autojs无障碍的节点定位ui控件位置,点击...
STM32提高篇: WIFI通讯
STM32提高篇: WIFI通讯 一.WIFI通讯介绍1.WiFi的频段5G和2.4G2.WiFi的信道二.ESP32固件烧录及驱动1.一个AT指令响应的完成2.测试其他指令三.Wifi功能初始化和TCP通讯四.volatile关键字一.WIFI通讯介绍 Wi-Fi,又称“无线网路”,是Wi-Fi联盟的商标,一个基于IEEE 802.11标准的…...
资本怪兽贝莱德投资数据分析报告-独家
贝莱德概述 贝莱德集团是全球最大的资产管理公司,其管理的资产规模达到了11.6万亿美元(约合人民币84.18万亿元),这个数字相当于中国2024年GDP的62%。贝莱德通过收购李嘉诚旗下的43个全球港口资产,将在全球运营约100个港口。此外,…...
操作系统-用户级-内核级线程
一、先明确几个基本概念: 用户级线程(ULT): 完全由用户空间的线程库(如 pthread 或 green threads)管理。 操作系统内核对此一无所知。 切换线程时,不需要进入内核,效率高…...
【深度学习】LoRA:低秩适应性微调技术详解
LoRA:低秩适应性微调技术详解 文章目录 LoRA:低秩适应性微调技术详解1. 引言2. LoRA原理解析2.1 核心思想2.2 数学表达 3. LoRA实现细节3.1 适用层选择3.2 缩放因子3.3 初始化策略 4. 代码实现示例5. LoRA在实际应用中的优势5.1 内存效率5.2 训练速度5.3…...
研发效率破局之道阅读总结(3)工程优化
研发效率破局之道阅读总结(3)工程优化 Author: Once Day Date: 2025年4月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...
树莓派超全系列教程文档--(40)树莓派config.txt旧版GPIO控制、超频及条件过滤器
树莓派config.txt旧版GPIO控制、超频及条件过滤器 传统GPIO控制enable_jtag_gpio 传统超频选项超频never_over_voltagedisable_auto_turbo 遗留条件过滤器The [HDMI:*] 过滤器 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 传统GPIO控制 &…...
网络基础概念(下)
网络基础概念(上)https://blog.csdn.net/Small_entreprene/article/details/147261091?sharetypeblogdetail&sharerId147261091&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link 网络传输的基本流程 局域网网络传输流…...
DES、3DES、SM4 加密算法简介
1. DES(Data Encryption Standard) 设计时间:1975 年(IBM 开发,1977 年被 NIST 采纳为美国联邦标准)。 密钥长度:64 位(实际有效 56 位 8 位校验)。 分组长度…...
如何在 Ansys Icepak AEDT 中设置多个流程以加快仿真速度?
您将学习如何进行正确的设置,以通过增加进程数量来加快仿真速度。 Ansys Icepak AEDT 需要与 Icepak Classic 不同的设置。 要设置要在 Ansys Icepak AEDT 中使用的进程数,您需要按照以下步骤作: 首先,转到“工具 - >选项 - …...
【MCP Node.js SDK 全栈进阶指南】初级篇(2):MCP基础服务器开发
引言 在上一篇文章中,我们详细介绍了MCP开发环境的搭建。本文作为MCP TypeScript-SDK系列的第二篇,将深入探讨MCP基础服务器开发的核心内容,包括服务器创建与生命周期管理、McpServer与Server的区别与选择、各种配置选项的详解,以及基本启动与调试技巧。通过本文学习,你将…...
客户端 AI 与服务器端 AI 的深度比较及实践建议?
1. 性能与延迟 客户端AI(In-Browser AI): // 使用TensorFlow.js在浏览器中进行图像分类 const model await tf.loadLayersModel(local-model/model.json);// 实时摄像头处理 const video document.getElementById(webcam); const…...
【(保姆级教程)Ubuntu24.10下部署Dify】
目录 一、下载Ubuntu二、安装Ubuntu三、在 Ubuntu 上安装 Docker Engine1、设置Docker的apt仓库2、安装 Docker 包 四、在 Ubuntu 上安装 Docker Desktop1、先决条件2、下载最新 DEB 包3、安装软件包4、启动 Docker Desktop5、检查版本 五、克隆 Dify 代码仓库六、启动 Dify1、…...
计算机组成原理---总线系统的详细概述
1.数据传输的两个方式 串行传输和并行传输:串行传输和并行传输 串行:适合的就是传输的距离比较远,这个对应的成本也是比较低的; 并行:传输的效率很高,因为分成了不同的线路,这个适合的就是短距离…...
C++静态与动态联编区别解析
在 C++ 中,静态联编(Static Binding)和动态联编(Dynamic Binding)是两种不同的函数调用绑定机制,核心区别在于确定函数调用的时机和多态性的支持。以下是详细解释: 1. 静态联编(Static Binding) 定义:在编译阶段确定函数调用与具体实现的关系。特点: 由编译器直接确…...
Linux 一些常用的命令记录
常见命令如下 查询内容 find / -name 例如:查找 libstdc.so* find / -name "libstdc.so*" 查询运行环境:/lib64/libstdc.so.6 内容是可以修改为其他的 strings /lib64/libstdc.so.6 | grep CXXABI创建软连接(创建超链接&…...
面试题-链表(1)
1.移除链表元素: 203. 移除链表元素 - 力扣(LeetCode) 删除一个链表中的相同元素。 我这里用的方法只需要将链表遍历一次,就可以删除所有节点。 前后指针法: public ListNode removeElements(ListNode head, int val) { //先判…...
【云馨AI-大模型】Dify 1.2.0:极速集成 SearXNG,畅享智能联网搜索新境界,一键脚本轻松部署SearXNG
SearXNG部署目录创建一键脚本SearXNG访问 Dify SearXNG插件安装SearXNG 插件安装进行授权工作流中进行验证工作流测试 SearXNG部署 目录创建 mkdir -p /data/yunxinai && cd /data/yunxinai 一键脚本 git clone https://gitcode.com/yunxinai/rag-sh.git 一键执行脚…...
Python 设计模式:访问者模式
1. 什么是访问者模式? 访问者模式是一种行为设计模式,它允许你在不改变对象结构的前提下,定义新的操作。通过将操作封装在访问者对象中,访问者模式使得你可以在不修改元素类的情况下,向元素类添加新的功能。 访问者模…...
dify工作流之text-2-e-sql,大模型写sql并执行
市面上有太多的text-to-sql工具,但是我这次突发灵感,为什么不做一个可以执行sql得text2sql呢。 dify的安装我不再赘述,我采用的是win10本地docker部署的方式。 mysql的安装也不再介绍,如有需要还请移步其他博主。 1.dify创建工…...
Neo4j 可观测性最佳实践
Neo4j 介绍 Neo4j 是一款领先的图数据库管理系统,采用图数据模型来表示和存储数据。它以节点、关系和属性的形式组织数据,节点代表实体,关系表示节点间的连接,属性则为节点和关系附加信息。Neo4j 使用 Cypher 查询语言࿰…...
【随手记】jupyter notebook绘制交互式图像
在 Jupyter Notebook 中 魔法命令特点%matplotlib notebook图形是交互式的,可缩放、旋转(适合 3D 图)%matplotlib inline图像静态显示,简单快速,适用于大多数2D图绘制 在 %matplotlib notebook 的 3D 图中,…...
[大模型]AI Agent入门01——AI Agent概念梳理
什么是 Agent(智能体) 定义 Agent 是并能够感知环境,同时可以自主采取行动以实现特定目标的实体。 Agent(代理)是计算机科学中的一个概念,指一种置于某种环境中,能够感知环境中的信息并自…...
【锂电池剩余寿命预测】BiLSTM双向长短期记忆神经网络锂电池剩余寿命预测(Matlab源码)
目录 效果一览程序获取程序内容代码分享研究内容BiLSTM双向长短期记忆神经网络锂电池剩余寿命预测摘要关键词1. 引言1.1 研究背景1.2 研究现状与问题1.3 研究目的与意义2. 文献综述2.1 锂电池剩余寿命预测理论基础2.2 传统预测方法概述2.3 基于深度学习的预测方法进展3. BiLSTM…...
基于机器学习的房租影响因素分析系统
基于机器学习的房租影响因素分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】数据可视化及预测分析的完整流程文档 【技术栈】 ①:系统环境:Python 3.8, Django 4.2 ②:开发环境&#…...
【c++深入系列】:万字string详解(附有sso优化版本的string模拟实现源码)
🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 当你想放弃时,想想为什么当初坚持走到了这里 ★★★ 本文前置知识: 类和对象(上) 类和对…...
黑马点评redis改 part 4
Redis消息队列实现异步秒杀 一些额外话语:过来人提醒下,不要用stream,可以跳过不看,用专业的消息队列中间件,同时准备好消息队列的八股,否则简陋的stream很容易被问死。 异步持久化还存在消息丢失、消息重复…...
【Python Web开发】01-Socket网络编程01
文章目录 1.套接字(Socket)1.1 概念1.2 类型1.3 使用步骤 Python 的网络编程主要用于让不同的计算机或者程序之间进行数据交换和通信,就好像人与人之间打电话、发消息一样。 下面从几个关键方面通俗易懂地介绍一下: 1.套接字(Socket) 在 Python 网络编…...
『不废话』之Python管理工具uv快速入门
在『不废话』之大模型推理超参数解释『不废话』之动手学MCP 中提到了uv,很多朋友都说没用过,咨询有什么优势? 通常Python新手都会使用conda、miniconda来管理Python环境,稍微高阶水平的会使用pyenv、poetry、virtualenv等工具来管…...
2025年中国高端家电品牌市场分析:海尔Haier、美的Midea、格力GREE三大本土品牌合计占据70%市场份额
一、市场现状:需求升级与结构性增长并存 2024年,中国高端家电市场在复杂的经济环境中展现出“逆势增长”的韧性。尽管全球经济增速放缓,国内家电零售额同比微降0.4%至6957亿元,但高端家电却成为拉动市场的重要引擎。这一现象的背…...
【漫话机器学习系列】217.监督式深度学习的核心法则(Supervised Deep Learning Rule Of Thumb)
监督式深度学习的核心法则:你需要多少数据? 原图作者:Chris Albon 在进行深度学习项目时,我们常常面临一个核心问题:我到底需要多少训练数据?这是许多初学者甚至资深工程师都会困惑的问题。图中给出了一个非…...
OpenCV --- 图像预处理(六)
OpenCV — 图像预处理(六) 文章目录 OpenCV --- 图像预处理(六)十四,图像边缘检测14.1 高斯滤波14.2 计算图像的梯度与方向14.3 非极大值抑制14.4 双阈值筛选14.5 API和使用 十五,绘制图像轮廓15.1 什么是轮…...
WebRTC服务器Coturn服务器的管理平台功能
1、概述 开源的webrtc服务器提供管理平台功能,用户可以通过web页面进行访问配置coturn服务器,主要包括管理平台功能和telnet的管理功能,coturn相当于telnet服务器,可能通过配置来开启这两个功能,方便查看coturn服务器…...