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

LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷

LangChain系列文章

  1. LangChain 实现给动物取名字,
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
  4. LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  5. LangChain 5易速鲜花内部问答系统
  6. LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
  7. LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
  8. LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
  9. LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
  10. LangChain 10思维链Chain of Thought一步一步的思考 think step by step
  11. LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
  12. LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
  13. LangChain 13输出解析Output Parsers 自动修复解析器
  14. LangChain 14 SequencialChain链接不同的组件
  15. LangChain 15根据问题自动路由Router Chain确定用户的意图
  16. LangChain 16 通过Memory记住历史对话的内容
  17. LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理
  18. LangChain 18 LangSmith监控评估Agent并创建对应的数据库
    在这里插入图片描述

在这里插入图片描述

1. Agents 代理

Agents的核心理念是利用语言模型选择一系列要采取的行动。在Chains中,一系列行动是硬编码的(在代码中)。在Agents中,语言模型被用作推理引擎,以确定要采取哪些行动以及顺序。

概念 这里有几个关键组成部分:

1.1 Agent

这是负责决定下一步该采取什么步骤的链条。这由语言模型和提示驱动。这个链条的输入包括:

  1. 工具:可用工具的描述
  2. 用户输入:高层次目标
  3. 中间步骤:为了实现用户输入而先前执行的任何(动作,工具输出)对

输出是下一步要采取的行动或发送给用户的最终响应(代理动作或代理完成)。动作指定一个工具和该工具的输入。

不同的代理有不同的推理提示风格,不同的编码输入方式和不同的解析输出方式。有关内置代理的完整列表,请参见代理类型。您还可以轻松构建自定义代理,我们将在下面的入门部分中展示如何操作。

1.2 工具

工具是代理可以调用的函数。围绕工具有两个重要的设计考虑:

  1. 为代理提供访问正确工具的权限
  2. 以对代理最有帮助的方式描述工具

如果没有同时考虑这两个方面,你将无法构建一个可工作的代理。如果你不给代理访问正确的工具集,它将永远无法完成你给它的目标。如果你没有很好地描述工具,代理将不知道如何正确使用它们。

LangChain 提供了广泛的内置工具集,但也使定义自己的工具(包括自定义描述)变得容易。有关内置工具的完整列表,请参见工具集成部分。

1.3 工具包

对于许多常见任务,代理将需要一组相关工具。为此,LangChain提供了工具包的概念 - 大约3-5个工具组成,用于实现特定目标。例如,GitHub工具包中有一个用于搜索GitHub问题的工具,一个用于读取文件的工具,一个用于评论的工具等等。

LangChain提供了广泛的工具包供您使用。有关内置工具包的完整列表,请参阅工具包集成部分。

1.4 AgentExecutor

代理执行器是代理的运行时。这实际上是调用代理,执行它选择的动作,将动作输出传递回代理,并重复。在伪代码中,大致如下:

next_action = agent.get_action(...)
while next_action != AgentFinish:observation = run(next_action)next_action = agent.get_action(..., next_action, observation)
return next_action

虽然这可能看起来很简单,但这个运行时为您处理了几个复杂情况,包括:

  1. 处理代理选择不存在的工具的情况
  2. 处理工具出错的情况
  3. 处理代理产生的无法解析为工具调用的输出的情况
  4. 在所有级别(代理决策,工具调用)记录和观察到标准输出和/或LangSmith。

1.5 其他类型的代理运行时

AgentExecutor类是LangChain支持的主要代理运行时。但是,我们还支持其他更实验性的运行时。这些包括:

  • 计划并执行代理
  • Baby AGI
  • Auto GPT

您也可以始终创建自己的自定义执行逻辑,我们将在下面展示如何做到这一点。

2. 开始代码实现​

为了更好地理解代理框架,让我们使用LangChain表达语言(LCEL)从头开始构建一个代理。我们需要构建代理本身,定义自定义工具,并在自定义循环中运行代理和工具。最后,我们将展示如何使用标准的LangChain AgentExecutor来使执行更容易。

一些重要的术语(和模式)需要知道:

  1. AgentAction:这是一个表示代理应该采取的行动的数据类。它有一个工具属性(这是应调用的工具的名称)和一个tool_input属性(该工具的输入)
  2. AgentFinish:这是一个表示代理已经完成并应该返回给用户的数据类。它有一个return_values参数,是一个要返回的字典。它通常只有一个键 - 输出 - 是一个字符串,因此通常只返回这个键。
  3. intermediate_steps:这些代表传递的先前代理操作和相应的输出。这些对于将来的迭代非常重要,这样代理就知道它已经做了什么工作。这被定义为List[Tuple[AgentAction, Any]]。请注意,observation目前被保留为Any类型,以便最大程度地灵活。实际上,这通常是一个字符串。

2.1 设置:LangSmith

根据定义,代理在返回用户可见的输出之前会采取一系列自主确定的、依赖输入的步骤。这使得调试这些系统特别棘手,观察特别重要。LangSmith在这种情况下特别有用。

在使用LangChain构建时,任何使用LCEL构建的内置代理或自定义代理都将自动在LangSmith中被追踪。如果我们使用AgentExecutor,不仅会得到代理规划步骤的完整追踪,还会得到工具的输入和输出的追踪。

要设置LangSmith,我们只需要设置以下环境变量:

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="<your-api-key>"

2.2 定义代理

我们首先需要创建我们的代理。这是负责决定下一步采取什么行动的链条。

在这个例子中,我们将使用OpenAI函数调用来创建这个代理。这通常是创建代理的最可靠方式。

在本指南中,我们将构建一个具有自定义工具访问权限的自定义代理。我们选择这个例子是因为在大多数实际用例中,您将需要自定义代理或工具。我们将创建一个简单的工具,用于计算单词的长度。这很有用,因为由于标记化,LLMs实际上可能会搞砸这个。我们将首先创建它而不带有记忆,但然后我们将展示如何添加记忆。记忆是为了启用对话而必需的。

首先,让我们加载我们将用来控制代理的语言模型。

from langchain.chat_models import ChatOpenAIllm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

我们可以看到它在尝试计算字符串"educa"中的字母时遇到了困难。

llm.invoke("how many letters in the word educa?")
    AIMessage(content='There are 6 letters in the word "educa".')

接下来,让我们定义一些要使用的工具。让我们编写一个非常简单的Python函数来计算传入的单词的长度。

from langchain.agents import tool@tool
def get_word_length(word: str) -> int:"""Returns the length of a word."""return len(word)tools = [get_word_length]

现在让我们创建提示。因为OpenAI函数调用是为工具使用而优化的,我们几乎不需要任何关于如何推理或如何输出格式的指令。我们只需要两个输入变量:输入和agent_scratchpad。输入应该是包含用户目标的字符串。agent_scratchpad应该是包含先前代理工具调用和相应工具输出的消息序列。

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholderprompt = ChatPromptTemplate.from_messages([("system","You are very powerful assistant, but bad at calculating lengths of words.",),("user", "{input}"),MessagesPlaceholder(variable_name="agent_scratchpad"),]
)

代理如何知道它可以使用哪些工具?在这种情况下,我们依赖于OpenAI调用LLMs的功能,它们将函数作为单独的参数,并经过专门训练,知道何时调用这些函数。

要将我们的工具传递给代理,我们只需要将它们格式化为OpenAI函数格式,并将它们传递给我们的模型。(通过绑定函数,我们确保它们在每次调用模型时被传递。)

from langchain.tools.render import format_tool_to_openai_functionllm_with_tools = llm.bind(functions=[format_tool_to_openai_function(t) for t in tools])

将这些部分组合在一起,我们现在可以创建代理。我们将导入最后两个实用程序函数:一个用于格式化中间步骤(代理动作、工具输出对)以将其转换为可以发送到模型的输入消息的组件,以及一个用于将输出消息转换为代理动作/代理完成的组件。

from langchain.agents.format_scratchpad import format_to_openai_function_messages
from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParseragent = ({"input": lambda x: x["input"],"agent_scratchpad": lambda x: format_to_openai_function_messages(x["intermediate_steps"]),}| prompt| llm_with_tools| OpenAIFunctionsAgentOutputParser()
)

现在我们有了我们的代理,让我们来玩一下吧!让我们传递一个简单的问题和空的中间步骤,看看它返回什么:

agent.invoke({"input": "how many letters in the word educa?", "intermediate_steps": []})
    AgentActionMessageLog(tool='get_word_length', tool_input={'word': 'educa'}, log="\nInvoking: `get_word_length` with `{'word': 'educa'}`\n\n\n", message_log=[AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\n  "word": "educa"\n}', 'name': 'get_word_length'}})])

我们可以看到它响应一个AgentAction以采取行动(实际上是AgentActionMessageLog - AgentAction的子类,还跟踪完整的消息日志)。

如果我们设置了LangSmith,我们将看到一个跟踪,让我们检查每个步骤中的输入和输出的序列。https://smith.langchain.com/public/04110122-01a8-413c-8cd0-b4df6eefa4b7/r
在这里插入图片描述

2.3 定义运行时

所以这只是第一步 - 现在我们需要为此编写一个运行时。最简单的方法就是不断循环调用代理,然后执行动作,直到返回AgentFinish为止。让我们在下面编写代码:

from langchain.schema.agent import AgentFinishuser_input = "how many letters in the word educa?"
intermediate_steps = []
while True:output = agent.invoke({"input": user_input,"intermediate_steps": intermediate_steps,})if isinstance(output, AgentFinish):final_result = output.return_values["output"]breakelse:print(f"TOOL NAME: {output.tool}")print(f"TOOL INPUT: {output.tool_input}")tool = {"get_word_length": get_word_length}[output.tool]observation = tool.run(output.tool_input)intermediate_steps.append((output, observation))
print(final_result)
    TOOL NAME: get_word_lengthTOOL INPUT: {'word': 'educa'}There are 5 letters in the word "educa".

Woo! It’s working.

整合代码实现

# 导入与 OpenAI 语言模型交互的模块。
from langchain.llms import OpenAI  # 导入用于创建和管理提示模板的模块。
from langchain.prompts import PromptTemplate  # 导入用于构建基于大型语言模型的处理链的模块。
from langchain.chains import LLMChain  # 导入从 .env 文件加载环境变量的库。
from dotenv import load_dotenv  # 导入创建和管理 OpenAI 聊天模型实例的类。
from langchain.chat_models import ChatOpenAI# 加载 .env 文件中的环境变量。
load_dotenv()  # 设置环境变量,包括项目 ID 和 Langchain API 的相关设置。
import os
from uuid import uuid4
unique_id = uuid4().hex[0:8]
os.environ["LANGCHAIN_PROJECT"] = f"Tracing word length - {unique_id}"# 初始化 LangSmith 客户端。
from langsmith import Client
client = Client()# 创建 ChatOpenAI 实例。
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, verbose=True)# 定义一个自定义工具,用于获取单词的长度。
from langchain.agents import tool@tool
def get_word_length(word: str) -> int:"""Returns the length of a word."""return len(word)tools = [get_word_length]# 创建聊天提示模板。
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholderprompt = ChatPromptTemplate.from_messages([("system", "You are very powerful assistant, but bad at calculating lengths of words."),("user", "{input}"),MessagesPlaceholder(variable_name="agent_scratchpad"),]
)# 将 ChatOpenAI 实例与工具绑定。
from langchain.tools.render import format_tool_to_openai_functionllm_with_tools = llm.bind(functions=[format_tool_to_openai_function(t) for t in tools])# 定义代理。
from langchain.agents.format_scratchpad import format_to_openai_function_messages
from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParseragent = ({"input": lambda x: x["input"],"agent_scratchpad": lambda x: format_to_openai_function_messages(x["intermediate_steps"]),}| prompt| llm_with_tools| OpenAIFunctionsAgentOutputParser()
)# 处理用户输入,使用代理执行循环,直到获取最终结果。
from langchain.schema.agent import AgentFinishuser_input = "how many letters in the word educa?"
intermediate_steps = []
while True:output = agent.invoke({"input": user_input,"intermediate_steps": intermediate_steps,})if isinstance(output, AgentFinish):final_result = output.return_values["output"]breakelse:print(f"TOOL NAME: {output.tool}")print(f"TOOL INPUT: {output.tool_input}")tool = {"get_word_length": get_word_length}[output.tool]observation = tool.run(output.tool_input)intermediate_steps.append((output, observation))
print(final_result)

输出结果

(develop)⚡ % python Agents/chat_agents_word_length.py                    ~/Workspace/LLM/langchain-llm-app
TOOL NAME: get_word_length
TOOL INPUT: {'word': 'educa'}
There are 5 letters in the word "educa".

代码

https://github.com/zgpeace/pets-name-langchain/tree/develop

参考

https://python.langchain.com/docs/modules/agents/

相关文章:

LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…...

12.整数转罗马数字

C不能像Python那样使用c*num的形式&#xff0c;重复字符&#xff0c;老老实实减吧。 class Solution { public:string intToRoman(int num) {string ans "";int res num;while (res ! 0) {if (res > 1000) {ans M;res - 1000;} else if (res > 900) {ans …...

免费AI洗稿软件【2023最新】

很多时候我们需要通过文字来表达观点、推广产品或服务。然而&#xff0c;长时间的文稿创作不仅费时费力&#xff0c;还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…...

PTA:平方回文数

题干 在数学里面&#xff0c;有一种数字正着读和反着读结果都一样&#xff0c;我们把这种数称为回文数。如果一个回文数&#xff0c;它同时还是某一个数的平方&#xff0c;这样的数字叫做平方回数。 本题要求输出小于正整数N的所有平方回数。 &#xff08;注&#xff1a;个位数…...

从“AI证件照”到“AI译制片”,爆款AIGC应用的商业化迷思

让郭德纲飙英文、让霉霉说中文的翻译视频生成工具HeyGen和掀起AI证件照热潮的“妙鸭相机”一样&#xff0c;在一阵疯狂刷屏之后&#xff0c;又迅速在各大群里销声匿迹了。 十月份&#xff0c;由HeyGen制作的各种明星跨语言翻译视频&#xff0c;在全网疯传&#xff0c;大家震撼于…...

JAVA代码优化:Easy Excel(操作Excel文件的开源工具)

Easy Excel官网&#xff1a; EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) https://easyexcel.opensource.alibaba.com/ Easy Excel的特点和优势&#xff1a; 简单易用&#xff1a;Easy Excel提供了简洁的API&#xff0c;使用起来非常方便。开发…...

Linux Python ping3库使用教程(ping3命令、ping命令)

文章目录 Linux Python ping3库使用教程1. 环境准备2. ping3库安装3. ping3基本使用4. ping3进阶使用5. 常见问题解答5.1 ping3库可以在Windows系统中使用吗&#xff1f;5.2 如何处理ping操作超时的情况&#xff1f;5.3 ping3库支持IPv6吗&#xff1f; Linux Python ping3库使用…...

分享一些基于php商城案例

案例1&#xff1a; ​​​​​​http://www.9520.xin/ 案例2&#xff1a; http://ptll.hasbuy.com/ 案例3&#xff1a; http://likeshop.9520.xin/mobile 案例4&#xff1a; http://www.hasbuy.com/...

SpringSecurity 三更草堂 学习笔记

SpringSecurity从入门到精通 0. 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的…...

基于Java SSM仓库管理系统

企业仓库有多个库房&#xff0c;用来分别存放生产需要的各种零件&#xff0c;仓库管理系统对此进行科学的管理。仓库管理系统管理的对象及操作如下&#xff1a; 管理员信息&#xff1a;工号、姓名、性别、年龄、电话、工资等。 库房信息&#xff1a;编号、地址、面积等。 零件信…...

基于Spark对消费者行为数据进行数据分析开发案例

原创/朱季谦 本文适合入门Spark RDD的计算处理。 在日常工作当中&#xff0c;经常遇到基于Spark去读取存储在HDFS中的批量文件数据进行统计分析的案例&#xff0c;这些文件一般以csv或者txt文件格式存在。例如&#xff0c;存在这样一份消费者行为数据&#xff0c;字段包括消费…...

Docker镜像制作与推送

目录 Docker镜像制作 搭建私服 将本地镜像推送到私有库 Docker镜像制作 以创建一个新ubuntu镜像&#xff0c;并安装vim命令示例 运行一个ubuntu镜像&#xff0c;发现在镜像里面无法使用vim命令&#xff0c;因为该ubuntu镜像只包括了其最基本的内核命令 [rootlocalhost ~]…...

Pandas时序数据分析实践—基础(1)

目录 1. Pandas基本结构2. Pandas数据类型2.1. 类型概述2.1.1. 整数类型&#xff08;int&#xff09;&#xff1a;2.1.2. 浮点数类型&#xff08;float&#xff09;&#xff1a;2.1.3. 布尔类型&#xff08;bool&#xff09;&#xff1a;2.1.4. 字符串类型&#xff08;object&a…...

5.C转python

新始: 13.列表可被改变(数据),元组不可被改变(数据),二者皆与C中的数组的大致相同 14.创建列表方法: 1.一个[ ]就是一个空的列表 2.使用list函数来创建列表 如: 15.可以在[ ]内部指定列表的初始值,打印方法: 如: 16.在python中,在同一个列表中,可以放不同类型的变量(也可…...

输出SearchFacesResponse对象的JSON格式字符串回包乱码解决方案

输出SearchFacesResponse对象的JSON格式字符串设置响应内容类型为"application/json;charsetutf-8"获取响应的字符输出流将SearchFacesResponse对象转化为JSON字符串并输出。 代码片段 System.out.println(SearchFacesResponse.toJsonString(resp)); response.setC…...

P7 链表 链表头前方插入新节点

目录 前言 01 链表头插入数据 示例代码 02 指定节点前方插入新节点 测试代码 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨…...

SCAU:主对角线上的元素之和

主对角线上的元素之和 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 输入一个3行4列的整数矩阵&#xff0c;计算并输出主对角线上的元素之和输入格式 3行4列整数矩阵输出格式 主对角线上的元素之和输入样例 1 2 3 4 5 6 7 8 9 10 11 12输出…...

c语言——简单客户端demo

以下是一个简单的C语言客户端示例&#xff0c;用于连接到服务器并发送和接收数据&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h…...

日志检索场景ES->Doris迁移最佳实践:函数篇

函数列表 函数&#xff1a;term函数功能说明&#xff1a;查询某个字段里含有某个关键词的文档参数说明&#xff1a;返回值说明&#xff1a;ES使用示例&#xff1a; {"query": {"term": {"title": "blog"}} }Doris使用示例&#xf…...

【高效开发工具系列】jackson入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...