AI agents系列之智能体框架介绍
1. 引言
智能体AI Agents框架通过赋予自主系统动态感知、推理和行动的能力,彻底改变了AI领域。本节将探讨智能体框架的核心概念,并重点介绍为什么开源解决方案对现代AI开发的创新和可扩展性至关重要。
1.1 什么是智能体框架?
智能体框架代表了人工智能系统设计范式的重大转变。与依赖静态、预定义工作流的传统AI应用不同,智能体框架引入了动态、自适应的系统,能够自主感知、推理和行动。这些框架将复杂任务分解为更小的子任务,由专门的智能体协作完成更广泛的目标。通过利用大语言模型(LLMs),智能体框架可以管理工作流、做出决策并无缝集成工具,使其成为动态决策和实时问题解决等高级应用的理想选择。
关键参考: LangGraph和CrewAI等智能体框架体现了这种动态方法,使开发者能够超越单智能体、线性工作流,进入多智能体协作系统的世界。
1.2 为什么它们很重要?
从零开始构建智能体绝非易事。像LangGraph、CrewAI和OpenAI Swarm这样的框架简化了这一过程,让开发者能够专注于应用逻辑,而不是重新发明状态管理、编排和工具集成的轮子。
智能体框架的核心功能包括:
- 定义智能体和工具的简单方式
- 编排机制
- 状态管理
- 支持更复杂应用的其他工具,例如持久层(记忆)、中断等
我们将在接下来的章节中逐一探讨这些功能。
2. 热门智能体框架与库
现在,让我们深入了解当前最突出的一些AI智能体框架和工具:
图片来源:analyticsvidhya
2.1 Langchain
**LangChain**是一个强大且灵活的框架,简化了基于大语言模型(LLMs)的应用程序开发。凭借其丰富的工具和抽象层,开发者可以设计出具备复杂推理能力、任务执行能力以及与外部数据源和API交互能力的AI智能体。
LangChain解决了开发者在与LLMs协作时面临的诸多挑战,例如在长对话中保持上下文、整合外部信息以及协调多步骤项目。其模块化架构使其能够轻松组合各种组件,适用于多种用途。
- GitHub链接: LangChain GitHub
- 文档链接: https://python.langchain.com/docs/introduction/
2.2 LangGraph
**LangGraph**是LangChain的扩展,支持创建有状态、多参与者的应用程序。它特别适用于构建涉及规划、反思和多智能体协调的复杂交互式AI系统。
- GitHub链接: LangGraph
- 文档链接: LangGraph
2.3 CrewAI
**CrewAI**是一个用于编排角色扮演AI智能体的框架。它允许开发者创建一组具有特定角色和职责的AI智能体,共同完成复杂任务。该框架特别适合构建协作式AI系统,解决需要多样化专业知识和协调努力的多方面问题。
- GitHub链接: CrewAI GitHub
- 文档: CrewAI
2.4 Microsoft Semantic Kernel
**Microsoft Semantic Kernel**旨在弥合传统软件开发与AI能力之间的鸿沟。它特别关注将大语言模型(LLMs)集成到现有应用中。该框架为开发者提供了在不完全重构现有代码库的情况下加入AI功能的工具。
其轻量级特性和对多种编程语言的支持使其能够适应各种开发环境。其编排器允许管理复杂的多步骤AI任务,使开发者能够在应用中创建复杂的AI驱动工作流。
- GitHub链接: Microsoft Semantic Kernel
- 文档链接: Microsoft Semantic Kernel
2.5 Microsoft AutoGen
**Microsoft AutoGen**是一个开源框架,用于构建高级AI智能体和多智能体系统。由微软研究院开发,AutoGen提供了一个灵活而强大的工具包,用于创建对话式和任务完成型AI应用。它强调模块化、可扩展性和易用性,使开发者能够高效构建复杂的AI系统。
- 文档: https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/
- GitHub链接: Microsoft AutoGen
2.6 Smolagents
Smolagents是一个前沿的开源框架,旨在彻底改变AI智能体的开发。它为开发者提供了一套全面的工具包,用于构建智能、协作的多智能体系统。该框架注重灵活性和模块化,支持创建能够在独立或人类监督下运作的复杂AI系统。
- 文档: https://huggingface.co/docs/smolagents/en/index
- GitHub链接: https://github.com/huggingface/smolagents
2.7 AutoGPT
**AutoGPT**基于强大的GPT-4语言模型,能够通过语言输入执行目标导向的活动,代表了自主AI智能体领域的重大进步。这一前沿AI助手将决策能力提升到了新的高度,超越了基本的反射式智能体,集成了复杂功能,使其成为各种应用中不可或缺的工具。
- 文档: https://huggingface.co/docs/smolagents/en/index
- GitHub链接: https://github.com/huggingface/smolagents
2.8 Agno (Phidata)
我们将讨论的最后一个AI智能体框架是**Phidata**。它是一个多模态智能体框架,可以开发协作执行的智能体系统。它还设计为与记忆和工具等组件配合使用,帮助智能体自主且一致地执行任务。
默认情况下,Phidata智能体支持文本、图像和音频等多模态数据,使其无需依赖外部工具即可发挥价值。该框架还提供了Agentic UI,供喜欢与智能体进行视觉交互的用户使用。他们也是Agentic RAG的先驱之一,智能体可以搜索知识库。
- 文档: https://docs.phidata.com/introduction
- GitHub链接: https://github.com/agno-agi/phidata
3. 智能体框架对比
下表提供了本文讨论的关键AI智能体框架的高层次对比。此对比旨在突出每个框架的独特优势和重点领域,帮助开发者和研究人员根据具体需求选择最合适的工具。
4. 深入LangGraph
LangGraph是由LangChain团队构建的一个库,旨在帮助开发者创建基于图的单智能体或多智能体AI应用。作为一个底层框架,LangGraph让你能够控制智能体之间的交互方式、使用的工具以及信息在应用中的流动方式。
4.1 什么是图?
想象一下,你有一堆数据可以表示为一个网络,其中每个数据或实体与其他数据或实体之间存在某种关系,这种关系可以是多种类型(一对一、一对多、多对多等)。图有两个主要组成部分:节点和边。
这种数据的例子包括交通数据或社交媒体网络,其中每个实体或用户与其他实体或用户存在关系,而图可以轻松可视化这种数据。
图有两种类型:
- 有向图:在有向图中,边有方向,表示节点之间的流动或关系(例如,社交媒体上的关注)。
- 无向图:在无向图中,边没有方向,表示对称关系(例如,LinkedIn上的连接)。
图片来源:ionio
4.2 核心概念
4.2.1 图结构
LangGraph设计的核心是基于图的应用工作流表示。该图由两个主要元素组成:
-
节点:工作的构建块
图中的每个节点代表应用中的一个独立工作单元或动作。这些节点本质上是封装特定任务的Python函数。这些任务可以包括多种操作,例如:- 直接与LLM通信以生成文本、摘要或其他基于语言的任务。
- 与外部工具和API交互以获取数据或在现实世界中执行操作。
- 通过格式化、过滤或转换等过程操作数据。
- 与用户交互以获取输入或显示信息。
-
边:引导信息和控制的流动
边是LangGraph中的连接组织,建立信息流动的路径并决定操作序列。LangGraph支持多种边类型:- 简单边:表示从一个节点到另一个节点的直接无条件流动。第一个节点的输出作为后续节点的输入,形成线性进展。
- 条件边:引入动态层,条件边使工作流能够根据特定节点操作的结果进行分支。例如,根据用户的响应,图可以决定终止交互或继续调用工具。这种决策能力对于创建能够适应不同情况的应用至关重要。
4.2.2 状态管理
管理多智能体系统的一个关键方面是确保所有智能体对任务的当前状态有共同的理解。LangGraph通过自动状态管理解决了这一问题。这意味着该库在智能体执行任务时自动跟踪和更新中央状态对象。
此状态对象充当存储关键信息的仓库,这些信息需要在工作流的不同点可访问。这可能包括:
- 对话历史:在聊天机器人应用中,状态可以存储用户与机器人之间的持续对话,从而实现上下文感知的响应。
- 上下文数据:与当前任务相关的信息,如用户偏好、过去行为或相关外部数据,可以存储在状态中供智能体在决策时使用。
- 内部变量:智能体可以使用状态跟踪内部标志、计数器或其他指导其行为和决策的变量。
5. LangGraph实战
5.1 安装
要开始使用LangGraph,你需要先安装它。
在终端或命令提示符中运行以下命令以安装LangGraph:
pip install -U langgraph
此命令将下载并安装最新版本的LangGraph。-U
标志确保你获取的是最新版本。
5.2 用LangGraph创建基础聊天机器人
这个例子是理解LangGraph基础概念的良好起点。
- 导入必要的库:首先从LangGraph和其他相关库中导入所需的类和模块。
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
- 定义状态结构:创建一个类来定义状态对象的结构,该对象将保存图中节点之间需要共享和更新的信息。
class State(TypedDict):# 'messages'将存储聊天机器人的对话历史。# 'add_messages'函数确保新消息被追加到列表中。messages: Annotated[list, add_messages]# 创建StateGraph的实例,传入State类
graph_builder = StateGraph(State)
- 初始化LLM:实例化你选择的LLM模型,提供必要的API密钥或配置参数。此LLM将用于驱动聊天机器人的响应。
#pip install -U langchain_anthropic
from langchain_anthropic import ChatAnthropicllm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
- 创建聊天机器人节点:定义一个Python函数,封装聊天机器人节点的逻辑。此函数将当前状态作为输入,并根据LLM的输出生成响应。
def chatbot(state: State):# 使用LLM基于当前对话历史生成响应。response = llm.invoke(state["messages"])# 返回更新后的状态,新消息被追加return {"messages": [response]}# 将'chatbot'节点添加到图中
graph_builder.add_node("chatbot", chatbot)
- 定义入口和结束点:指定图中工作流的起点和终点。
# 对于这个基础聊天机器人,'chatbot'节点既是入口点也是结束点
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
- 编译图:通过编译创建图的可运行实例。
graph = graph_builder.compile()
- 可视化图:通过运行简单的Python代码,你可以用节点和边可视化图。
from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:# 这需要一些额外的依赖项,是可选的pass
- 运行聊天机器人:实现一个循环与用户交互,将用户输入传递给图并显示聊天机器人的响应。
while True:user_input = input("用户: ")if user_input.lower() in ["quit", "exit", "q"]:print("再见!")break# 通过LangGraph处理用户输入for event in graph.stream({"messages": [("user", user_input)]}):for value in event.values():print("助手:", value["messages"][-1].content)
此代码片段提供了一个LangGraph聊天机器人的基础结构。你可以通过加入更复杂的状态管理、不同的LLM模型或连接外部工具和API来扩展它。关键在于为不同任务定义清晰的节点,并使用边在聊天机器人中建立所需的信息和控制流。
5.3 高级LangGraph技巧
工具集成:将工具集成到你的LangGraph聊天机器人中可以显著增强其能力,使其能够以你喜欢的方式访问和处理信息。
通过工具集成增强基础聊天机器人
让我们修改上一节创建的基础聊天机器人,加入一个可以搜索网络信息的工具。我们将使用langchain_community.tools.tavily_search
中的TavilySearchResults
工具。你需要Tavily API密钥来运行此示例。
#pip install -U tavily-python langchain_community
from typing import Annotated
from langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import BaseMessage
from typing_extensions import TypedDictfrom langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_conditionclass State(TypedDict):messages: Annotated[list, add_messages]graph_builder = StateGraph(State)tool = TavilySearchResults(max_results=2)
tools = [tool]
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
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)tool_node = ToolNode(tools=[tool])
graph_builder.add_node("tools", tool_node)graph_builder.add_conditional_edges("chatbot",tools_condition,
)
# 每当调用工具时,我们返回到聊天机器人以决定下一步
graph_builder.add_edge("tools", "chatbot")
graph_builder.set_entry_point("chatbot")
graph = graph_builder.compile()
解释:
- 导入工具:导入必要的工具类,这里是
TavilySearchResults
。 - 定义并绑定工具:创建工具的实例,并使用
llm.bind_tools()
将其绑定到LLM。这通知LLM可用的工具及其用法。 - 创建工具节点:实例化一个
ToolNode
,传入可用工具列表。 - 将工具节点添加到图中:使用
graph_builder.add_node()
将ToolNode
加入LangGraph。 - 条件路由:使用
graph_builder.add_conditional_edges()
设置基于LLM是否决定调用工具的路由逻辑。tools_condition
函数检查LLM的响应是否包含工具调用指令。 - 循环返回:执行工具后,使用
graph_builder.add_edge()
将流导向chatbot
节点,使对话能够继续。
现在,当你运行聊天机器人并询问需要外部信息的问题时,LLM可以选择调用网络搜索工具,检索相关数据并将其整合到响应中。
6. 为聊天机器人添加记忆
记忆对于创建能够通过记住过去互动进行有意义对话的聊天机器人至关重要。
LangGraph的检查点系统
- 检查点器:当你编译LangGraph时,可以提供一个
checkpointer
对象。此对象负责在不同时间点保存图的状态。 - 线程ID:每次调用图时,你提供一个
thread_id
。此ID由checkpointer
用于跟踪不同的对话线程。 - 自动保存和加载:LangGraph在图的每一步执行后自动保存给定
thread_id
的状态。当你再次用相同的thread_id
调用图时,它会自动加载保存的状态,使聊天机器人能够从上次中断的地方继续对话。
通过检查点实现记忆
基于之前的代码,以下是如何使用LangGraph的检查点功能添加记忆:
# ... (之前的代码定义State、graph_builder、节点和边)from langgraph.checkpoint.memory import MemorySaver# 创建一个MemorySaver对象作为检查点器
memory = MemorySaver()# 编译图,传入'memory'对象作为检查点器
graph = graph_builder.compile(checkpointer=memory)# ... (运行聊天机器人的其余代码)
解释:
- 导入
MemorySaver
:从langgraph.checkpoint.memory
导入MemorySaver
类。 - 创建
MemorySaver
对象:实例化一个MemorySaver
对象,它将处理图的保存和加载状态。 - 传递给
compile()
:编译图时,将memory
对象作为checkpointer
参数传递。
现在,当你运行聊天机器人时,首先使用一个thread_id
作为此对话的键:
config = {"configurable": {"thread_id": "1"}}
每个唯一的thread_id
将有其对话历史存储。
然后开始对话:
while True:user_input = input("用户: ")if user_input.lower() in ["quit", "exit", "q"]:print("再见!")break# 通过LangGraph处理用户输入for event in graph.stream({"messages": [("user", user_input)]}, config):for value in event.values():print("助手:", value["messages"][-1].content)
注意:调用图时,
config
作为第二个位置参数提供。
7. 人机交互(HIL)
人机交互(HIL)的工作流对于需要在AI应用中引入人类监督、验证或决策的场景至关重要。
通过中断实现人机交互(HIL)
以下代码展示了如何使用LangGraph的interrupt_before
或interrupt_after
功能实现人机交互(HIL)。以下是详细说明:
from typing import Annotatedfrom langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import BaseMessage
from typing_extensions import TypedDictfrom langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_conditionclass State(TypedDict):messages: Annotated[list, add_messages]graph_builder = StateGraph(State)tool = TavilySearchResults(max_results=2)
tools = [tool]
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
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)tool_node = ToolNode(tools=[tool])
graph_builder.add_node("tools", tool_node)graph_builder.add_conditional_edges("chatbot",tools_condition,
)
graph_builder.add_edge("tools", "chatbot")
graph_builder.set_entry_point("chatbot")memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory,# 这是新增的!interrupt_before=["tools"],# 注意:如果需要,也可以在动作之后中断。# interrupt_after=["tools"]
)
解释:
在这个特定例子中,图将在执行tools
节点之前暂停。此tools
节点负责运行LLM在其回合中可能请求的任何工具。通过在此点中断,你可以允许人类执行以下操作:
- 批准工具调用:人类可以审查LLM想要调用的工具及其输入。如果他们认为合适,可以简单地让图继续执行,工具将被调用。
- 修改工具调用:如果人类认为需要调整LLM的工具调用(例如,优化搜索查询),他们可以修改图的状态,然后恢复执行。
- 绕过工具调用:人类可能决定不需要工具。也许他们已经知道LLM试图查找的答案。在这种情况下,他们可以用适当的信息更新图状态,LLM将收到这些信息,就像工具返回了这些信息一样。
资源: 这里是关于人机交互(HIL)的更详细理解的笔记本:https://github.com/langchain-ai/langgraph/blob/main/docs/docs/how-tos/human_in_the_loop/review-tool-calls.ipynb
8. LangGraph的实际应用
LangGraph让你能够构建比简单问答机器人更复杂和交互性更强的AI系统,通过管理状态、协调多个智能体并允许人类反馈。以下是LangGraph的一些可能用途:
- 更智能的客户服务:想象一个用于在线购物的聊天机器人,它可以记住你过去的订单和偏好。它可以回答产品问题、跟踪你的货物,甚至在需要时为你连接人工客服。
- AI研究助手:需要研究项目的帮助吗?一个由LangGraph驱动的助手可以搜索大量学术论文和文章,总结关键发现,甚至帮助你整理笔记。
- 个性化学习:LangGraph可以驱动下一代教育平台。想象一个系统能够适应你的学习风格,识别你需要额外帮助的领域,并推荐个性化资源。
- 简化业务流程:许多业务流程涉及多个步骤和人员。LangGraph可以自动化这些工作流的部分内容,例如路由文档以获取批准、分析数据或管理项目。
这些例子突出了LangGraph如何帮助弥合AI能力与现实世界复杂性之间的差距。
9. 总结
智能体框架正在彻底改变AI系统的运作方式,使其能够动态推理、规划和交互。在本博客中,我们探讨了智能体框架的重要性,调查了一些最流行的库,并对比了它们的优势。然后我们深入研究了LangGraph,理解了其基于图的架构、状态管理和实际应用。实战部分展示了如何使用LangGraph构建具有记忆、人在回路能力和可扩展工作流的AI智能体。
随着AI的不断发展,像LangGraph、LangChain、CrewAI等智能体框架将在塑造下一代智能应用中发挥关键作用。无论你是开发聊天机器人、自动化工具还是研究智能体,这些框架都提供了创建更适应和高效AI系统的构建块。
AI的未来是自主的、结构化的和交互式的——而智能体框架正引领这一潮流。现在是开始实验、构建和创新它们的完美时机。
祝你编码愉快!🎉
相关文章:
AI agents系列之智能体框架介绍
1. 引言 智能体AI Agents框架通过赋予自主系统动态感知、推理和行动的能力,彻底改变了AI领域。本节将探讨智能体框架的核心概念,并重点介绍为什么开源解决方案对现代AI开发的创新和可扩展性至关重要。 1.1 什么是智能体框架? 智能体框架代…...
(2025-04-12)向老主机箱中安装新买的显卡及固态硬盘
目录 1 引言2 显卡及其驱动的安装3 固态硬盘的安装及C盘扩容3.1 固态硬盘正确连接到主板上后,操作系统上面仍然不显示对应盘符怎么办?3.2 如何对C盘扩容?3.3 新问题:原有D盘程序不能运行 4 总结 1 引言 今天安装昨天买的新固态硬…...
从 Spring Boot 到 Django —— 后端开发技术类比学习
从 Spring Boot 到 Django —— 后端开发技术类比学习 引言(从javaweb到pythonweb) Django,一个成熟而简洁的 Web 框架时,我们在学习这个框架的过程中不仅可以体验 Python 的便捷生态,更能发现 Django 与 Spring Boo…...
外接键盘与笔记本命令键键位不同解决方案(MacOS)
文章目录 修改键位第一步:打开设置第二步:进入键盘快捷键第三步:修改修饰键设置第四步:调整键位第五步:保存设置tips ikbc c87键盘win键盘没反应的解决亲测的方法这是百度的答案标题常规组合键尝试:型号差…...
测试基础笔记第四天(html)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签(变形金刚)form标签列表标签 htm…...
爱普生SG2520VGN差分晶振5G基站的时钟解决方案
在 5G 通信时代,数据流量呈爆发式增长,5G 基站作为信号的核心中转枢纽,承载着前所未有的数据传输与处理重任。从海量的物联网设备连接,到高速移动用户的数据交互,每一个环节都对基站的性能提出了严苛要求。而精准稳定的…...
广汽滴滴Robotaxi首次亮相,中国自动驾驶加速领跑新赛道
作者 |张马也 编辑 |德新 4月12日,在广汽科技日上,广汽与滴滴合作的前装量产Robotaxi首次正式亮相。 这款车基于广汽埃安的纯电平台打造,搭载了滴滴自动驾驶的全套软硬件方案。滴滴自动驾驶全新一代的硬件平台, 包含激光雷达、…...
从拥堵到畅行,智慧城市如何实现交通魔法?
实时交通监控与数据分析 在智慧城市的建设中,实时交通监控是基础。它依赖于广泛部署的传感器网络,如摄像头、雷达、地磁感应器等,用于收集道路交通信息。这些设备将数据传输至中央管理系统,利用大数据处理技术进行分析࿰…...
边缘计算场景下的模型轻量化:TensorRT部署YOLOv7的端到端优化指南
一、边缘计算场景下的技术挑战与优化路径 在边缘设备(如Jetson系列)部署YOLOv7需兼顾模型精度、推理速度与功耗限制三重约束。TensorRT作为NVIDIA官方推理加速库,通过算子融合、量化压缩和内存复用等优化技术,可将模型推理速度提…...
flutter json解析增强
依赖:xxf_json 反序列化兼容特征一览表 类型\是否兼容 int double num string bool int yes yes yes yes yes double yes yes yes yes yes num yes yes yes yes yes string yes yes yes yes yes bool yes yes yes yes yes 专业词语 .g…...
职坐标解码互联网行业转型发展新动能
当前,互联网行业正以前所未有的速度重塑全球产业格局。工信部最新数据显示,我国互联网企业营收连续三年保持双位数增长,其中百强企业在人工智能、物联网等领域的投入强度同比提升40%,展现出强劲的技术引领力。与此同时,…...
【软考-架构】13.4、质量属性-架构评估
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 质量属性软件架构评估✨质量属性质量属性场景敏感点&权衡点三种常用的评估方式基于场景的架构分析方式SAAM✨架构权衡分析法ATAM成本效益收益法CBAM 考试真题其他评估…...
Gitlab SSH Jenkins Pipeline Supervisor部署
Gitlab SSH Jenkins Pipeline方式部署 准备搞一搞简单部署SpringBoot项目的一种方式,通过Gitlabssh Jenkins Pipeline的方式,简单学习下。 环境准备 本地域名ip地址安装软件作用server01192.168.110.110Gitlab代码托管server02192.168.110.111Jenkins…...
Python Pandas实现导出两个Excel数据集的分组记录数分析
编写Python Pandas代码实现从一个Excel文件中的一个Sheet中的表格里取两个维度字段,根据这两个维度字段的数据分组统计,计算记录数的分组总计值,得到一个包含两个维度字段和记录数字段的分组总计值字段的dataframe,再从另一个Exce…...
维港首秀!沃飞长空AE200亮相香港特别行政区
4月13日-16日,第三届香港国际创科展在香港会议展览中心盛大举办。 作为国内领先、国际一流的eVTOL主机厂,沃飞长空携旗下AE200批产构型登陆国际舞台,以前瞻性的创新技术与商业化应用潜力,吸引了来自全球17个国家及地区的行业领袖…...
PyTorch 根据官网命令行无法安装 GPU 版本 解决办法
最近遇到一个问题,PyTorch 官网给出了 GPU 版本的安装命令,但安装成功后查看版本,仍然是 torch 2.6.0cpu 1. 清理现有 PyTorch 安装 经过探索发现,需要同时卸载 conda 和 pip 安装的 torch。 conda remove pytorch torchvision …...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——USB测试 #USB HOST #USB 鼠标
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——USB…...
Java基础-超全总结
1.Java中的基本数据类型 Java中有四类八种基本的数据类型,四类数据类型包括整型、浮点型、字符型、布尔型。 整型包括:byte、short、int和long浮点型包括:float和double字符型是char布尔型是boolean。 2.Java中的包装类型和基本类型的区别…...
区块链技术在数据隐私保护中的应用:从去中心化到零知识证明
区块链技术在数据隐私保护中的应用:从去中心化到零知识证明 在数字化时代,数据隐私已成为全球关注的焦点。无论是个人身份信息、医疗数据还是企业的敏感业务数据,都面临着泄露、篡改和滥用的风险。传统的安全方案依赖中心化服务器进行加密和…...
【大模型实战篇】--阿里云百炼搭建MCP Agent
MCP协议(Model Communication Protocol,模型通信协议)是大语言模型(LLM)与外部系统或其他模型交互时的一种标准化通信框架,旨在提升交互效率、安全性和可扩展性。 目录 1.阿里云百炼--MCP 1.1.MCP 服务接…...
Android ExifInterface rotationDegrees图旋转角度,Kotlin
Android ExifInterface rotationDegrees图旋转角度,Kotlin import android.media.ThumbnailUtils import android.os.Bundle import android.util.Log import android.util.Size import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity …...
linux 内核 ida机制分析
在描述ida之前,需要读者对linux 内核的radix-tree有一定的了解。关于radix-tree(基数树)的描述,作者在之前有专门的文章对其进行描述,这里不再赘述。 IDA是什么?内核文档中解释如下: /*** IDA description** The IDA is an ID allocator which does not provide the ab…...
linux-定时任务清理buffer、cache
在清理 buffer 和 cache 之前,调用 sync 命令是一个好习惯。sync 会将文件系统缓冲区中的数据强制写入磁盘,确保数据的一致性,避免数据丢失的风险。以下是改进后的脚本,增加了多个 sync 语句: 1、脚本内容:…...
Linux常用命令整理
Linux 系统提供了大量常用命令行工具,涵盖文件操作、权限管理、网络诊断、软件安装、系统监控、脚本编程等各个方面。下面按照不同功能类别,整理常用的 Linux 命令及其中文说明和使用示例。 文件与目录操作 ● ls:列出目录内容,用于显示指定目录下的文件和子目录。常用参数…...
Python爬虫第14节-如何爬取Ajax的数据
目录 前言 一、什么是Ajax 1.1 具体举例 1.2 基本原理 二、Ajax的分析 2.1 查看请求 2.2 过滤请求 三、解析提取Ajax 结果 3.1 分析请求 3.2 分析响应 四、Ajax抓取实战 前言 咱们在使用requests抓取网页的时候,常常会发现,得到的结果和在浏览…...
mac上面使用zip命令压缩一劳永逸
问题 需要将当前目录的文件和目录(包含隐藏目录)都要压缩近一个zip包,但同时部分目录我不想压缩进去例如:.idea这个种idea的配置目录就不想压缩进zip包。 命令 zip -r flask-dev.zip . -x "*.idea*"-r:递归目录.:当前…...
错误地使用了 app.use() 来注册全局组件
我是import globalComponent from "/components"; /* eslint-disable */ // ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 export {}; /* prettier-ignore */ declare module vue { export interface…...
Python Django基于协同过滤算法的招聘信息推荐系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
鹰角:EMR Serverless Spark 在《明日方舟》游戏业务的应用
作者:鹰角网络高级大数据研发 茅旭辉 背景介绍 鹰角网络是一家年轻且富有创新的游戏公司,致力于开发充满挑战性和艺术价值的游戏产品。公司目前涵盖了游戏开发、运营和发行的全生命周期业务。随着业务的扩展,鹰角网络从单一爆款游戏发展到多…...
C语言学习之两个数值交换的算法
前言:本篇文章仅仅是作为作者复习使用 在C语言中,交换两个两个变量的数值是很常见的应用。在学习到指针的时候,我们已经掌握了几种交换的算法了。今天我来做一个小汇总 1创建第三个变量 缺点:需要创造第三个变量 2加减交换 缺点…...
CExercise_13_1排序算法_2归并排序
题目:CExercise_ 请手动实现归并排序算法: void merge_sort(int arr[], int len) 如果学有余力,不妨尝试一下多种临时数组的方式: 1.局部变量数组 2.全局变量数组 3.堆数组 关键点 分析: : 代码 代码块解决…...
富斯i6遥控器,无法切换通道解决办法
开机后长按【OK】键,进入设置 按【DOWN】选择【setup】 点击【ok】进入设置 再点击【OK】进入Reverse 将2设置为下,长按【cancel】保存,返回到设置 进入【Aux.channels】 将第二行【Source】设置为【Source SwC】,长按【CANCEL】保存并返回。…...
Maven 编译指定模版
背景 基于SpringCloud 做的微服务项目,很多都是依赖公共模块下的包,并且多模板都是在一个项目下的。 问题 每次打包都很编译整个项目下的所有模块。这样太耗时间了,把流水线的时间拖的太长了。 解决方案 在maven打包时,我们选…...
solr安装及ik中文分词器配置
提示:solr9.x版本需要jdk17,solr8.x版本需要jdk8 1、Solr 简介 Solr 是Apache 下的一个顶级开源项目,采用 Java 开发,它是基于 Lucene 的全文搜索服务器。Solr 提供了比 Lucene 更为丰富的查询语句,同时实现了可配置、…...
详解LeetCode中用字符串实现整数相加,字符串转整数及其溢出处理详解
目录 题目背景 代码整体逻辑 变量初始化 逐位相加过程 处理最后进位 结果反转 示例演示 总结 在LeetCode中,有一道经典的算法题是实现两个字符串形式的非负整数相加,今天我们就来深入分析一段用C实现该功能的代码,探究其背后的逻辑与…...
vue学习笔记06
学习的课程地址:老杜Vue视频教程,Vue2,Vue3实战精讲,一套通关vue_哔哩哔哩_bilibili 1、vue程序初体验 2、vue核心技术(基础) 3、Vue组件化 前面参见: vue学习笔记01 vue学习笔记02 vue学习笔记03 vue学习笔记…...
如何查看自己抖音的IP属地?详细教程及如何修改
在当今互联网时代,IP属地信息已成为各大社交平台(如抖音、微博、快手等)展示用户真实网络位置的重要功能。以下是关于如何查看抖音IP属地的详细教程及常见问题解答,帮助您快速了解相关信息: 一、如何查看抖音账号的IP属…...
熟悉Linux下的编程
可能 目录 熟悉Linux下Python编程的含义及与非Linux环境编程的区别 一、核心含义解析 二、与非Linux环境的关键区别 三、典型应用场景对比 四、能力培养建议 openfoem的下载之路: 方法一:使用cd命令 方法二:使用快捷方式 方法三&am…...
Uniapp:获取当前定位坐标
目录 一、出现场景二、具体使用 一、出现场景 在项目的开发中,会出现打卡、定位当前位置的功能,那我们如何获取当前位置呢?这就需要使用getLocation来获取当前位置坐标 二、具体使用 uni.getLocation({type: wgs84, // 返回可以用于uni.op…...
GitHub实用手册
文章目录 一、GitHub 的定义二、GitHub 的主要功能三、GitHub 的优势四、GitHub 的使用相关工具GitSourcetreeGithub-Desktop 一、GitHub 的定义 GitHub 是一个基于 Git 的分布式版本控制系统,它允许开发者在本地和远程仓库中管理代码版本,支持多人协作…...
【从零实现高并发内存池】Central Cache从理解设计到全面实现
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
Dijkstra算法求解最短路径—— 从零开始的图论讲解(2)
前言 在本系列第一期:从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序-CSDN博客 笔者给大家介绍了 图的概念,如何存图,如何简单遍历图,已经什么是图的拓扑排序 按照之前的学习规划,今天笔者将继续带大家深入了解图论中的一个核心问题&#x…...
Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7)
Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7),下个月就是 RC1,紧接着就是 GA!,对于我们 Java 开发者来说,这绝对是个值得关注的好消息! 但是对于 Java 学习者来说,…...
如何从 GitHub 镜像仓库到极狐GitLab?
最近 GitHub 封禁中国用户的事情闹得沸沸扬扬,虽然官方发布的报道说中国用户被限制登录是因为配置错误导致,已经撤回了更新,中国用户已经可以正常使用。但是这就像横在国内开发者和企业头上的“达摩克利斯之剑”。为了避免 GitHub 不可用而带…...
大象机器人推出myCobot 280 RDK X5,携手地瓜机器人共建智能教育机
摘要 大象机器人全新推出轻量级高性能教育机械臂 myCobot 280 RDK X5,该产品集成地瓜机器人 RDK X5 开发者套件,深度整合双方在硬件研发与智能计算领域的技术优势,实现芯片架构、软件算法、硬件结构的全栈自主研发。作为国内教育机器人生态合…...
在Android Studio中,`Settings`里的Gradle路径、环境变量以及`gradle - wrapper.properties`文件关联
在Android Studio中,Settings里的Gradle路径、环境变量以及gradle - wrapper.properties文件关联 Android Studio中Settings里的Gradle路径 在Android Studio的Settings(Preferences ) -> Build, Execution, Deployment -> Build Tools -> Gradle 中: Use defau…...
用react 写一个可左右滑动的柱状图
效果图 目录 效果图 ✅ 项目结构 🚀 创建项目步骤 1️⃣ 打开终端或命令行,创建新项目: 2️⃣ 安装 recharts 图表库: 3️⃣ 替换默认代码: 4️⃣ 启动项目: ✅ 项目结构 scrollable-bar-chart/ ├…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——MIPI LCD测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:www.alientek.com 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——MIPI LCD测试4.3 MIPI LCD测试4.3.1 使…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——RS485串口测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:www.alientek.com 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——RS485串口测试 第四章 ATK-DLMP257B功能…...
Sui 的工具生态简化了游戏开发者的 Web3 集成流程
希望利用 Web3 独特协同效应的游戏开发者,常常在强大的区块链功能与流畅的游戏体验之间难以权衡。许多区块链方案要求大幅重构游戏基础架构,增加了开发难度,甚至需要学习全新的智能合约语言。而 Sui 通过直观的工具消除这一阻力,使…...