当前位置: 首页 > news >正文

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录

  • 前言
  • 一、智能体
    • 1-1、Agent概述
    • 1-2、Agent与ChatGPT的区别
  • 二、多智能体框架MetaGPT
    • 2-1、安装&配置
    • 2-2、使用已有的Agent(ProductManager)
    • 2-3、多智能体系统介绍
    • 2-4、多智能体案例分析
      • 2-4-1、构建智能体团队
      • 2-4-2、动作/行为 定义
      • 2-4-3、角色/智能体 定义
      • 2-4-4、创建队伍,添加角色
      • 2-4-5、内部机制介绍
      • 2-4-6、人工介入
      • 2-4-7、记忆/内存
  • 附录
    • 1、react_mode(智能体的思维范式介绍)
      • 1-1、ReAct
      • 1-2、By order
      • 1-3、Plan and act
  • 总结


前言

用公式来讲,智能体=大语言模型LLM+观察+思考+行动+记忆

一、智能体

1-1、Agent概述

Agent(智能体): 具有一定自主性和目标导向性,可以在没有持续人类干预的情况下执行任务和作出决策。以下为Agent的一些特性:

(1)自主性和目标导向性

  • 自主性:Agent具备自主执行任务的能力,不需要外部指令即可根据设定的目标进行操作。
  • 目标导向性:Agent设置并追求特定的目标或任务,这些目标指导其决策过程和行为模式。

(2)复杂的工作流程

  • 任务规划与执行:Agent能够规划如何达到其目标,包括任务分解、优先级排序以及实际执行。
  • 自我对话和内部决策:在处理问题时,Agent可以进行内部对话,以自我推理和修正其行动路径,而无需外部输入。

(3)学习和适应能力

  • 反思和完善:Agent能从自身的经验中学习,评估过去的行为,从错误中吸取教训,并改进未来的策略。
  • 环境适应性:在遇到变化的环境或不同的挑战时,Agent能够适应并调整其行为以最大化目标达成。

(4)记忆机制

  • 短期记忆:使用上下文信息来做出即时决策。
  • 长期记忆:保留关键信息,供未来决策使用,通常通过外部数据库或持久存储实现。(例如使用向量数据库)

(5)工具使用与集成

  • API调用和外部数据访问:Agent可以利用外部资源(如API、数据库)来获取信息,填补其知识空白,或执行无法直接通过模型内部处理的任务。
  • 技术整合:Agent能整合多种技术和服务,如代码执行能力和专业数据库访问,以丰富其功能和提高效率。

LLM 驱动的自主Agents系统概述如下图所示:(包含工具调用、记忆、计划、执行模块)
在这里插入图片描述

1-2、Agent与ChatGPT的区别

Agent与ChatGPT的区别: Agent与ChatGPT在设计、功能和目标上有一些关键区别。虽然它们都是基于人工智能技术,但应用方式和交互性质大不相同。下面是这两者的主要区别:

(1)目标和自主性

  • ChatGPT:主要是一个响应型模型,专注于对用户的特定输入生成一次性、相关且连贯的回答。它的主要目的是解答问题、提供信息或进行对话模拟。
  • AI Agent:更强调在持续的任务中表现出自主性。它能够设定和追求长期目标,通过复杂的工作流程自主地完成任务,比如从错误中自我修正、连续地追踪任务进展等。

(2) 交互方式

  • ChatGPT:用户与ChatGPT的交互通常是线性的和短暂的,即用户提问,ChatGPT回答。它不保留交互的历史记忆,每次交互都是独立的。
  • AI Agent:可以维持跨会话的状态和记忆,具有维持长期对话的能力,能够自动执行任务并处理一系列相关活动,例如调用API、追踪和更新状态等。

(3)任务执行和规划能力

  • ChatGPT:通常只处理单个请求或任务,依赖用户输入来驱动对话。它不具备自我规划或执行连续任务的能力。
  • AI Agent:具备规划能力,可以自行决定执行哪些步骤以完成复杂任务。它可以处理任务序列,自动化决策和执行过程。

(4)技术整合与应用

  • ChatGPT:主要是文本生成工具,虽然能够通过插件访问外部信息,但核心依然是文本处理和生成。
  • AI Agent:可能整合多种技术和工具,如API调用、数据库访问、代码执行等,这些都是为了实现其目标和改善任务执行的效率。

(5)学习和适应

  • ChatGPT:它的训练是在离线进行,通过分析大量数据来改进。
  • AI Agent:除了离线学习,更复杂的AI Agent可能具备实时学习能力,能够从新的经验中迅速适应和改进,这通常需要一定的记忆和自我反思机制。

二、多智能体框架MetaGPT

在这里插入图片描述

2-1、安装&配置

安装: 必须要python版本在3.9以上 ,这里使用conda,尝鲜安装。

conda create -n metagpt python=3.9 && conda activate metagpt

开发模式下安装: 为开发人员推荐。实现新想法和定制化功能。

git clone https://github.com/geekan/MetaGPT.git
cd ./MetaGPT
pip install -e .

模型配置: 在文件 ~/.metagpt/config2.yaml下,有关于各大厂商模型的配置详细列表参考:LLM API Configuration

llm:api_type: "openai"  # or azure / ollama / groq etc. Check LLMType for more optionsmodel: "gpt-4-turbo"  # or gpt-3.5-turbobase_url: "https://api.openai.com/v1"  # or forward url / other llm urlapi_key: "YOUR_API_KEY"

2-2、使用已有的Agent(ProductManager)

概述: 调用ProductManager Agent,注意,会话上下文是需要独立创建的

import asynciofrom metagpt.context import Context
from metagpt.roles.product_manager import ProductManager
from metagpt.logs import loggerasync def main():msg = "Write a PRD for a snake game"context = Context()  # The session Context object is explicitly created, and the Role object implicitly shares it automatically with its own Action objectrole = ProductManager(context=context)while msg:msg = await role.run(msg)logger.info(str(msg))if __name__ == '__main__':asyncio.run(main())

输出结果:
在这里插入图片描述

2-3、多智能体系统介绍

多智能体系统: 即智能体社会,用公式表示为:

MultiAgent = 智能体 + 环境 + 标准化的操作程序(SOP)+ 通信 +经济

各个部分的详细介绍:

  • Agent:每个智能体都可能有独特的LLM、观察、思想、行动和记忆,在多智能体系统中,各个智能体协同工作,就像人类社会一样。
  • 环境: 环境是各个Agent交互的共同空间,Agent从环境中观察与自身有关的重要信息,并执行相应的操作。
  • 标准化操作程序(Standardized operating procedure): 即设置好的程序,用来管理智能体的行为以及智能体间的交互,确保系统的有序、高效进行。
  • 通讯:通讯,即Agent之间的信息交换。
  • 经济:指的是多智能体环境中的价值交换系统,决定了资源如何分配和任务的优先级。

简单示例:

在这里插入图片描述

具体介绍如下:

  • 在该环境下,三个智能体Alice、Bob、Charlie彼此交互。
  • 每个智能体都可以把信息或者是行为结果输出到环境中。
  • 以Agent——Charlie的内部进程为例(其他Agent类似),基于LLM,即决策🧠,并且拥有观察、思考、行动能力。思想和其进一步的行动主要是由LLM决策的,并且同时拥有使用工具的能力。
  • 智能体Charlie通过观察Alice智能体的相关文档以及Bob智能体的代码需求,参考上下文记忆,思考如何编写代码并采取行动,最终行动输出代码文件。
  • 智能体Charlie的输出结果刚好是智能体Bob观察的对象,智能体Bob在环境中得到了Charlie的输出结果,并且做出了进一步的响应。

2-4、多智能体案例分析

概述: 虽然单智能体可以解决很多任务,但是复杂的任务还是需要多智能体之间的协作。

2-4-1、构建智能体团队

构建智能体团队的步骤如下:

  • 定义每个能执行特定动作的角色
  • 标准化操作程序,即SOP的构建,确保每个角色遵守程序。实现过程:让每个角色观察自己的上游输出,根据上游输出做出相应的响应,并且输出内容到下游。
  • 初始化所有智能体,创建一个带有环境的队伍,让他们能够互相交互。(主要是根据上游角色发布到环境中的消息来做出响应。)

具体的智能体以及对应的行为定义如下:

  • 角色:SimpleCoder, 动作:SimpleWriteCode,接收用户指令并且写出主要代码
  • 角色:SimpleTester , 动作:SimpleWriteTest,从动作/行为SimpleWriteCode的输出中获取主要的代码并且提供测试用例。
  • 角色:SimpleReviewer , 动作:SimpleWriteReview,从动作/行为SimpleWriteTest 的输出中获取测试用例,检查测试用例的覆盖程度以及质量,输出报告。

2-4-2、动作/行为 定义

写代码行为如下:

from metagpt.actions import Actionclass SimpleWriteCode(Action):PROMPT_TEMPLATE: str = """Write a python function that can {instruction}.Return ```python your_code_here ```with NO other texts,your code:"""name: str = "SimpleWriteCode"async def run(self, instruction: str):prompt = self.PROMPT_TEMPLATE.format(instruction=instruction)rsp = await self._aask(prompt)code_text = parse_code(rsp)return code_text

测试用例代码书写行为如下:

class SimpleWriteTest(Action):PROMPT_TEMPLATE: str = """Context: {context}Write {k} unit tests using pytest for the given function, assuming you have imported it.Return ```python your_code_here ```with NO other texts,your code:"""name: str = "SimpleWriteTest"async def run(self, context: str, k: int = 3):prompt = self.PROMPT_TEMPLATE.format(context=context, k=k)rsp = await self._aask(prompt)code_text = parse_code(rsp)return code_text

测试用例评审行为如下:

class SimpleWriteReview(Action):PROMPT_TEMPLATE: str = """Context: {context}Review the test cases and provide one critical comments:"""name: str = "SimpleWriteReview"async def run(self, context: str):prompt = self.PROMPT_TEMPLATE.format(context=context)rsp = await self._aask(prompt)return rsp

2-4-3、角色/智能体 定义

写代码角色定义:

  • 使用set_actions函数,为角色装配行为。
  • 使用_watch函数,观察上游重要信息(来自于用户或者是其他智能体),这里UserRequirement代表的是用户输入
class SimpleCoder(Role):name: str = "Alice"profile: str = "SimpleCoder"def __init__(self, **kwargs):super().__init__(**kwargs)self._watch([UserRequirement])self.set_actions([SimpleWriteCode])

代码测试角色定义:

  • 同样的, 使用set_actions函数,为角色装配行为。
  • 同理,使用_watch函数,观察上游重要信息(来自于用户或者是其他智能体),这里主要的观察来源是SimpleWriteCode。
  • 这里,重写act函数,使用所有对话内容作为测试行为的上下文,写出更加精准的测试用例。
class SimpleTester(Role):name: str = "Bob"profile: str = "SimpleTester"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([SimpleWriteTest])self._watch([SimpleWriteCode])# 既观察SimpleWriteCode,也观察SimpleWriteReview,这样可以做到一个循环的自我修正。# self._watch([SimpleWriteCode, SimpleWriteReview])  # feel free to try this tooasync def _act(self) -> Message:logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})")todo = self.rc.todo# context = self.get_memories(k=1)[0].content # use the most recent memory as contextcontext = self.get_memories()  # use all memories as contextcode_text = await todo.run(context, k=5)  # specify argumentsmsg = Message(content=code_text, role=self.profile, cause_by=type(todo))return msg

测试用例评审角色定义: 同上。

class SimpleReviewer(Role):name: str = "Charlie"profile: str = "SimpleReviewer"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([SimpleWriteReview])self._watch([SimpleWriteTest])

2-4-4、创建队伍,添加角色

概述: 使用Team来雇佣三位角色

  • idea: 即复杂任务描述,代表用户输入
  • investment: 投资人工智能公司的金额,暂时不清楚有什么用
  • n_round: 模拟的回合数,大部分情况,该数字越大越好,但是也并不是绝对的,简单任务,回合少点就ok,复杂任务需要调试一个相对均衡的回合。多了有可能复读机或者性能下降。
import asyncio
import typer
from metagpt.logs import logger
from metagpt.team import Team
app = typer.Typer()@app.command()
def main(idea: str = typer.Argument(..., help="write a function that calculates the product of a list"),investment: float = typer.Option(default=3.0, help="Dollar amount to invest in the AI company."),n_round: int = typer.Option(default=5, help="Number of rounds for the simulation."),
):logger.info(idea)team = Team()team.hire([SimpleCoder(),SimpleTester(),SimpleReviewer(),])team.invest(investment=investment)team.run_project(idea)asyncio.run(team.run(n_round=n_round))if __name__ == '__main__':app()

输出:

在这里插入图片描述

2-4-5、内部机制介绍

概述: 详细介绍整个多智能体系统的运行机制。

  • 如右图所示,Role(智能体)将观察来自于环境的输出信息。(只观察特定Action,这要看参数设置)
  • 如果一个特定的行为输出了信息到环境,并且恰好是Role要观察的行为,那么Role将做出反馈。
  • 首先,Role将会思考并选择一种行为作为接下来要执行的,之后会执行该行为并且得到输出,输出后续将会被投入到环境中去。

在这里插入图片描述

2-4-6、人工介入

概述: 在真实场景下,我们往往需要人类介入来修正多智能体团队协作中的一些错误。

在2-4-4中,我们设置SimpleReviewer的is_human参数为True即可。这样我们可以控制协作流程,代替测试用例评审角色,作为测试用例评审角色来参与到整个流程中。每次轮到我们响应时(测试用例评审角色),正在运行的进程都会暂停等待我们的输入。我们可以根据其他Agent的输出,提出合理要求以参与到整个交互中。

team.hire([SimpleCoder(),SimpleTester(),# SimpleReviewer(), # the original lineSimpleReviewer(is_human=True), # change to this line]
)

2-4-7、记忆/内存

概述: 记忆是Agent的核心,Agent需要依靠记忆来做决策。类Memory是Agent记忆的抽象表示,当角色初始化时,以self.rc.memory初始化记忆,它将把它随后观察到的每条消息存储在一个列表中,以便将来检索。当记录的记忆被需要时,你可以使用self.get_memories来获取记忆。

def get_memories(self, k=0) -> list[Message]:"""A wrapper to return the most recent k memories of this role, return all when k=0"""return self.rc.memory.get(k=k)

例如在2-4-3中: 我们调用整个函数是为了向测试智能体提供完整的历史记录。

async def _act(self) -> Message:logger.info(f"{self._setting}: ready to {self.rc.todo}")todo = self.rc.todo# context = self.get_memories(k=1)[0].content # use the most recent memory as contextcontext = self.get_memories() # use all memories as contextcode_text = await todo.run(context, k=5) # specify argumentsmsg = Message(content=code_text, role=self.profile, cause_by=todo)return msg

添加记忆: 使用self.rc.memory.add(msg)添加记忆,并且msg必须是Message对象。

Notice: 角色通常需要记住它之前说过或做过什么,以便采取下一步行动。所以建议在复写act函数的逻辑时,建议将动作输出的消息添加到角色的内存中。

附录

1、react_mode(智能体的思维范式介绍)

概述: 接收到对环境的观察后,智能体会进行思考以及做出一些行为来应对,MetaGPT目前提供两种方式,即ReAct和By Order。

1-1、ReAct

ReAct: 先思考,后行动,直到Agent决定停止循环。每次思考(_think)时,角色会选择一种行为来回应观察,并且执行选择的行为在_act函数,而行为的输出结果将会是下一次思考的观察对象,LLM作为大脑,动态的选择行为去执行。

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS: ReAct详细介绍可以参考我的另一篇文章:REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS【大模型的协同推理】

在这里插入图片描述

Notice: 如果你想要角色执行更多次思考-行动循环,那么你可以设置参数max_react_loop。实验证明,设置该参数非常有必要,在react的过程中,如果思考-行动循环少,往往会做出错误的决策,即少执行或者错误执行行为

self._set_react_mode(react_mode="react", max_react_loop=6)

1-2、By order

By order: 按照set_actions中设定的行为去依次执行。该情况适用于我们清楚Agent该依次执行哪些行为。

在这里插入图片描述

例如在目录2-4-2的案例中,我们就是顺序执行行为,先写代码,后执行代码。

class RunnableCoder(Role):name: str = "Alice"profile: str = "RunnableCoder"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([SimpleWriteCode, SimpleRunCode])self._set_react_mode(react_mode="by_order")async def _act(self) -> Message:...

1-3、Plan and act

先拟定计划,之后使用计划去执行一系列动作:

在这里插入图片描述

参考文章:

《MetaGPT智能体开发入门》教程
Datawhale教程.
MetaGPT—GitHub官网
openAI研究主管文章
awesome-ai-agents——AI agent汇总
MetaGPT智能体入门——官方文档

LLM图形化界面:
川虎 Chat 🐯 Chuanhu Chat
chatgpt-KnowledgeBot


总结

好困好困😩

相关文章:

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent(ProductManager)2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…...

C#中GridControl的数据源双向绑定

1. 什么是双向数据绑定? 双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步。这意味着当模型数据发生变化时,UI会自动更新,反之亦然。这种双向数据绑定极大地简化了UI和模型数据之间…...

sklearn详细基础教程(科普篇)

Scikit-learn(简称sklearn)是Python中一个强大且易于使用的机器学习库,它基于NumPy、SciPy和matplotlib等Python库构建,提供了丰富的工具集,包括数据预处理、特征选择、模型训练、评估和预测等功能。以下是sklearn的详…...

el-table列的显示与隐藏

需求:实现 表字段的显示与隐藏。效果图 代码实现 写在前面 首先 我部分字段有自定义的排序逻辑,和默认值或者 数据的计算 所以是不能简单的使用 v-for 循环column 。然后 我需要默认展示一部分字段,并且 当表无数据时 提示不能 显示隐藏 …...

使用命令快速删除项目中的node_modules

描述 直接调用了系统自带的命令行工具,无需额外安装任何第三方库或工具。 同时,这些命令经过优化,能够快速处理大量文件,从而实现快速删除。 步骤 1、进入项目文件夹; 2、如果是Mac/Linux 环境下,执行&a…...

leetCode15三数之和(双指针)

目录 1、题目 2、思路 3、代码 4、总结 1、题目 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为…...

数据挖掘-数据预处理

来自🥬🐶程序员 Truraly | 田园 的博客,最新文章首发于:田园幻想乡 | 原文链接 | github (欢迎关注) 文章目录 3.3.1 数据的中心趋势平均数和加权平均数众数,中位数和均值描述数据的离散程度 &a…...

【调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gitee 仓库的 URL】

调试笔记-系列文章目录 调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gitee 仓库的 URL 文章目录 调试笔记-系列文章目录调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gite…...

《GPT-4o mini:开启开发与创新的新纪元》

在科技发展的快速进程中,OpenAI 推出的 GPT-4o mini 模型如同一阵春风,给开发者们带来了新的希望和机遇。它以其卓越的性能和极具吸引力的价格,成为了行业内热议的焦点。 当我首次听闻 GPT-4o mini 的消息时,内心充满了好奇与期待…...

生成树协议配置与分析

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、相关知识 1、生成树协议简介 生成树协议(STP)是一种避免数据链路层逻辑环路的机制,它通过信息交互识别环路并…...

Golang | Leetcode Golang题解之第287题寻找重复数

题目: 题解: func findDuplicate(nums []int) int {slow, fast : 0, 0for slow, fast nums[slow], nums[nums[fast]]; slow ! fast; slow, fast nums[slow], nums[nums[fast]] { }slow 0for slow ! fast {slow nums[slow]fast nums[fast]}return s…...

【音视频SDL2入门】创建第一个窗口

文章目录 前言创建窗口的流程需要使用的函数1. 初始化 SDL 库2. 创建 SDL 窗口3. 获取与窗口关联的表面SDL_FillRect 函数介绍4. 更新窗口表面5. 延迟一定时间6. 销毁窗口并退出 SDL 库示例代码总结 前言 SDL2(Simple DirectMedia Layer)是一个跨平台的…...

《置身事内:中国政府与经济发展》生活过得好一点,比大多数宏伟更宏伟

《置身事内:中国政府与经济发展》生活过得好一点,比大多数宏伟更宏伟 兰小欢,复旦大学中国社会主义市场经济研究中心、经济学院副教授,上海国际金融与经济研究院研究员。美国弗吉尼亚大学经济学博士。 上海人民出版社 文章目录 《…...

MongoDB教程(十八):MongoDB MapReduce

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MapRed…...

HTML前端面试题之<iframe>标签

面试题:iframe 标签的作用是什么?有哪些优缺点 ? 讲真,刷这道面试题之前我根本没有接触过iframe,网课没讲过,项目实战没用过,但却在面试题里出现了!好吧,我只能说:前端路漫漫&…...

Docker-Compose实现MySQL之主从复制

1. 主服务器(IP:192.168.186.77) 1.1 docker-compose.yml services:mysql-master:image: mysql:latest # 使用最新版本的 MySQL 镜像container_name: mysql-master # 容器的名称environment:MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码MYSQL_DATABASE: masterd…...

jetson显卡没有加速,而是在用cpu推理?

jetson的库,特别是使用显卡的库,大多需要单独安装 大概率是重装了pytorch,可以使用jetson官网的pytorch! 下面是官网的链接 PyTorch for Jetson - Announcements - NVIDIA Developer Forums 安装完成之后先使用命令查看是否安…...

Linux下如何安装配置Fail2ban防护工具

Fail2ban是一款在Linux服务器上用于保护系统免受恶意攻击的防护工具。它通过监视系统日志,检测到多次失败的登录尝试或其他恶意行为后,会自动将攻击源的IP地址加入防火墙的黑名单,从而阻止攻击者进一步访问服务器。本文将介绍如何在Linux系统…...

js的深浅拷贝

深浅拷贝是编程中对数据复制的两种不同方式,它们在处理对象和数组等复合数据结构时尤为重要。下面将详细解释这两种拷贝方式。 浅拷贝(Shallow Copy) 浅拷贝创建了原始对象的一个新实例,但这个新实例的属性只是原始对象属性的引…...

实验八: 彩色图像处理

目录 一、实验目的 二、实验原理 1. 常见彩色图像格式 2. 伪彩色图像 3. 彩色图像滤波 三、实验内容 四、源程序和结果 (1) 主程序(matlab (2) 函数FalseRgbTransf (3) 函数hsi2rgb (4) 函数rgb2hsi (5) 函数GrayscaleFilter (6) 函数RgbFilter 五、结果分析 1. …...

Python酷库之旅-第三方库Pandas(048)

目录 一、用法精讲 171、pandas.Series.nlargest方法 171-1、语法 171-2、参数 171-3、功能 171-4、返回值 171-5、说明 171-6、用法 171-6-1、数据准备 171-6-2、代码示例 171-6-3、结果输出 172、pandas.Series.nsmallest方法 172-1、语法 172-2、参数 172-3、…...

springboot爱宠屋宠物商店管理系统-计算机毕业设计源码52726

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…...

自训练和增量训练word2vec模型

1、自己准备训练语料文件 根据自己的业务场景准备训练数据,比如用户在商城上的同购行为序列或同浏览行为序列。 我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。 1.1 准备语料库文件 # 示例:准备自己的一个大规模的语…...

华三路由器开启web访问

配置路由器: # 配置Web用户名为admin,认证密码为admin,服务类型为http,用户角色为network-admin。 [Sysname] local-user admin [Sysname-luser-manage-admin] service-type http [Sysname-luser-manage-admin] authorization…...

C++软件开发值得推荐的十大高效软件分析工具

目录 1、概述 2、高效软件工具介绍 2.1、窗口查看工具SPY 2.2、Dependency Walker 2.3、剪切板查看工具Clipbrd 2.4、GDI对象查看工具GDIView 2.5、Process Explorer 2.6、Prcoess Monitor 2.7、API Monitor 2.8、调试器Windbg 2.9、反汇编工具IDA 2.10、抓包工具…...

vue2老项目中node-sass更换dart-sass

更换原因:node-sass经常会出现node版本问题,就很麻烦 卸载项目中的node-sass sass-loader npm uninstall sass-loader sass 安装dart-sas sass-loader 推荐安装sass1.26.2 sass-loader7.3.1 npm install sass-loader7.3.1 sass1.26.2 从新配置vue.…...

源/目的检查开启导致虚拟IP背后的LVS无法正常访问

情况描述 近期发现48网段主机无法访问8.83这个VIP(虚拟IP),环境是 8.83 绑定了两个LVS实例,然后LVS实例转发到后端的nginx 静态资源;整个流程是,客户端发起对VIP的请求,LVS将请求转发到后端实例…...

类和对象(四)

构造函数中的初始化列表 之前在实现构造函数时,主要是在函数体内进行赋值,而构造函数还有另一种初始化方式,通过初始化列表进行初始化。 初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,…...

<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?

前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…...

在Git项目中添加并应用“.gitignore”文件

在Git项目中添加并应用.gitignore文件 创建或修改.gitignore文件: 在项目的根目录下创建一个名为.gitignore的文件。如果已经有此文件,可以直接修改。 在文件中添加您希望Git忽略的文件和目录。例如: # 忽略所有的log文件 *.log# 忽略所有的…...

LeetCode Hot100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…...

iOS中的KVO(Key-Value Observing)详解

iOS中的KVO(Key-Value Observing)详解 一、KVO概述 KVO(Key-Value Observing),即键值观察/监听,是苹果提供的一套事件通知机制。它允许一个对象(观察者)观察/监听另一个对象&#…...

算法 —— 暴力枚举

目录 循环枚举 P2241 统计方形(数据加强版) P2089 烤鸡 P1618 三连击(升级版) 子集枚举 P1036 [NOIP2002 普及组] 选数 P1157 组合的输出 排列枚举 P1706 全排列问题 P1088 [NOIP2004 普及组] 火星人 循环枚举 顾名思…...

构造+有序集合,CF 1023D - Array Restoration

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1023D - Array Restoration 二、解题报告 1、思路分析 先考虑合法性检查: 对于数字x,其最左位置和最右位置 之间如果存在数字比x小,则非法 由于q次操作,第q…...

Scrapy 爬取旅游景点相关数据(四)

本节内容主要为: (1)创建数据库 (2)创建数据库表 (3)爬取数据进MYSQL库 1 新建数据库 使用MYSQL数据库存储数据,创建一个新的数据库 create database scrapy_demo;2 新建数据表 CR…...

Vue常用指令及其生命周期

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.常用指令 1.1 v-bind 1.2 v-model 注意事项 1.3 v-on 注意事项 1.4 v-if / v-else-if / v-else 1.5 v-show 1.6 v-for 无索引 有索引 生命周期 定义 流程 1.常用指令 Vue当中的指令…...

简化数据流:Apache SeaTunnel实现多表同步的高效指南

Apache SeaTunnel除了单表之间的数据同步之外,也支持单表同步到多表,多表同步到单表,以及多表同步到多表,下面简单举例说明如何实现这些功能。 单表 to 单表 一个source,一个sink。 从mysql同步到mysql,…...

均匀圆形阵列原理及MATLAB仿真

均匀圆形阵列原理及MATLAB仿真 目录 前言 一、均匀圆阵原理 二、圆心不存在阵元方向图仿真 三、圆心存在阵元方向图仿真 四、MATLAB仿真代码 总结 前言 本文详细推导了均匀圆形阵列的方向图函数,对圆心不放置阵元和圆心放置阵元的均匀圆形阵列方向图都进行了仿…...

vue2使用univerjs

1、univerjs Univer 提供了一个全面的企业级文档与数据协同的解决方案,支持电子表格、文本文档和演示幻灯片三大核心文档类型。通过灵活的 API 和插件机制,开发者可以在 Univer 的基础上进行个性化功能的定制和扩展,以适应不同用户在不同场景…...

VUE3 el-table-column header新增必填*

1.在需要加必填星号的el-table-column上添加render-header属性 <el-table-column :label"getName(产品代码)" :render-header"addRedStart" prop"MODELCODE" min-width“4.5%”> <template v-slot"scope"> <el-input …...

条件概率和贝叶斯公式

...

Kali中docker与docker-compose的配置

权限升级 sudo su 升级为root用户 更新软件 apt-get update安装HTTPS协议和CA证书 apt-get install -y apt-transport-https ca-certificates下载docker apt下载docker apt install docker.io 验证docker安装是否成功 查版本 docker -v 启动docker systemctl start …...

C++ | Leetcode C++题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {int n nums.size(), left 0, right 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left;}right;}} };...

Exponential Moving Average (EMA) in Stable Diffusion

1.Moving Average in Stable Diffusion (SMA&EMA) 1.Moving average 2.移动平均值 3.How We Trained Stable Diffusion for Less than $50k (Part 3) Moving Average 在统计学中&#xff0c;移动平均是通过创建整个数据集中不同选择的一系列平均值来分析数据点的计算。 …...

017、Vue动态tag标签

文章目录 1、先看效果2、代码 1、先看效果 2、代码 <template><div class "tags"><el-tag size"medium"closable v-for"item,index in tags":key"item.path":effect"item.title$route.name?dark:plain"cl…...

RocketMQ 架构概览

Apache RocketMQ 是一个分布式消息中间件和流计算平台&#xff0c;提供低延迟、高性能和可靠的队列服务&#xff0c;并且支持大规模的分布式系统。在详细介绍 RocketMQ 的整体架构之前&#xff0c;先了解其设计目标和核心特性是很重要的。RocketMQ 主要用于处理大规模的消息&am…...

优化医疗数据管理:Kettle ETL 数据采集方案详解

在现代医疗保健领域&#xff0c;数据的准确性、完整性和及时性对于提高医疗服务质量和患者护理至关重要。为了有效管理和利用医疗数据&#xff0c;Kettle ETL&#xff08;Extract, Transform, Load&#xff09;数据采集方案成为了许多医疗机构的首选工具之一。本文将深入探讨Ke…...

spring-from表单

在spring boot当中,from表单怎样开发(name=value) 先列出接口所需信息(抓包得到请求信息),将这些必要信息以注解的方式表达出来 步骤: 梳理前置条件(请求地址,请求header,请求方法,请求数据,响应结果)编辑一个普通类,在类上标记注解@Controller: 标记在类上,让类…...

【.NET】asp.net core 程序重启容器后redis无法连接,连接超时

环境是容器化部署asp.net core 程序当有大量请求打到容器如果此时重启容器会出现&#xff0c;redis无法连接情况。 使用 csredis 库报错&#xff1a; Status unavailable, waiting for recovery. Connect to server timeout 使用StackExchange.Redis 报错&#xff1a; Time…...

【vue前端项目实战案例】Vue3仿今日头条App

本文将开发一款仿“今日头条”的新闻App。该案例是基于 Vue3.0 Vue Router webpack TypeScript 等技术栈实现的一款新闻资讯类App&#xff0c;适合有一定Vue框架使用经验的开发者进行学习。 项目源码在文章末尾 1 项目概述 该项目是一款“今日头条”的新闻资讯App&#xf…...