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

AutoGen多代理对话项目示例和工作流程分析

在这篇文章中,我将介绍AutoGen的多个代理的运行。这些代理将能够相互对话,协作评估股票价格,并使用AmCharts生成图表。

我们创建对话的目的是要求代理分析特定公司的股票价格,并制作股票价格图表。

为了实现这一目标,我们创建一下代理并协同工作:

金融分析师:分析师的任务是获取股票价格数据,进行分析,然后将数据传递给UI设计人员以创建图表。它还负责执行UI设计器的代码来生成和显示图表,并且可以在必要时请求丢失的数据。

软件工程师:软件工程师的主要角色是检索由财务分析师指定的所需天数的股票价格信息的函数。

UI设计师:UI设计师的主要职责是使用Amcharts股票图表库创建股票图表。这包括生成完整的代码,无缝地集成金融分析师提供的股票价格数据,并准备立即执行的代码。

AutoGen

AutoGen是一个框架,它通过使用可以彼此对话的多个代理来共同处理各种任务,从而促进大型语言模型(LLM)应用程序的创建。

AssistantAgent是专门设计用来作为人工智能助手来解决LLM任务的。

UserProxyAgent在每个交互回合中主要寻求人工输入作为其默认响应时进行调用。它还具有执行代码和调用函数的能力。如果不提供人工用户输入,该代理将在识别传入消息中的可执行代码块并自动启动代码执行。可以通过将code_execution_config参数配置为False来禁用代码执行。可以理解为它是代理的代理,可以执行代码并向其他代理提供反馈。

代码样板

首先,我们需要安装AutoGen库。

 !pip install pyautogen~=0.1.0

创建配置文件OAI_CONFIG_LIST。

 [{"model": "gpt-4-32k","api_key": "","api_base": "","api_type": "azure","api_version": "2023-07-01-preview"}]

加载配置文件

 config_list = autogen.config_list_from_json("OAI_CONFIG_LIST",filter_dict={"model": ["gpt-4", "gpt-4-0314", "gpt4", "gpt-4-32k", "gpt-4-32k-0314", "gpt-4-32k-v0314"],},)

创建is_termination_msg函数来检查是否有终止消息来结束对话。

 def is_termination_msg(data):has_content = "content" in data and data["content"] is not Nonereturn has_content and "TERMINATE" in data["content"]

创建函数fetch_prices_for_symbol和fetch_prices检索指定时间范围内的历史价格数据,输入参数symbol和days。

 def fetch_prices_for_symbol(symbol: str, days: int) -> pd.DataFrame:# Define the date range for historical dataend_date = pd.Timestamp.now()start_date = end_date - pd.DateOffset(days=days)# Fetch historical data using yfinancedata = yf.download(symbol, start=start_date, end=end_date)# Reset the index and select relevant columnsdata.reset_index(inplace=True)data = data[["Date", "Open", "High", "Low", "Close", "Volume"]]data.rename(columns={"Date": "date", "Open": "open", "High": "high", "Low": "low", "Close": "close", "Volume": "volume"}, inplace=True)return datadef fetch_prices(days: int, symbol: str) -> str:symbol_df = fetch_prices_for_symbol(symbol, days)symbol_txt = symbol_df.to_string(index=None)    return f"""{symbol_txt}""".strip()

通过llm_config定义LLM推理配置。这里还指定了函数fetch_prices和所需的输入参数days和symbol。

 llm_config = {"config_list": config_list,"use_cache": False,"temperature": 0,"request_timeout": 120,"functions": [{"name": "fetch_prices","description": "Fetch daily stock prices","parameters": {"type": "object","properties": {"days": {"type": "integer","description": "days"},"symbol": {"type": "string","description": "symbol"}},"required": ["days", "symbol"]}}]}

代理配置

各个代理角色的配置主要通过Prompt来进行指定:

1、金融分析师

 analyst_system_message = f"""Financial Analyst: As a Senior Financial Analyst responsible for a stock price indicator.Follow the plan:1. Obtain stock price data from the engineer.2. Analyze the stock price data, provide comment, and pass it to the UI designer for chart creation.3. Upon receiving the code from the UI designer along with the complete dataset, if it's not provided, kindly request the UI designer to provide the missing data.4. Execute the code received from the UI designer on your local machine to generate and display the chart.Upon successful completion of the plan, add "TERMINATE" to conclude the message."""analyst = AssistantAgent(name = "analyst",system_message = analyst_system_message,llm_config=llm_config,is_termination_msg=is_termination_msg,code_execution_config=False)

2、软件工程师

 engineer_system_message = f"""Engineer. You are a Senior Software Engineer that executes the fetch_prices functions as requested by the Financial Analyst."""engineer = AssistantAgent(name="engineer",system_message=engineer_system_message,llm_config=llm_config,function_map={"fetch_prices": fetch_prices},code_execution_config=False)

3、UI设计师

 uidesigner_system_message = f"""UI Designer: You are a Senior UI/UX designer with a specialization in crafting charts using the Amcharts Stock Chart library (referenced at https://www.amcharts.com/demos/stock-chart/), your assignment is to develop a stock chart using the stock price data supplied by the Senior Financial Analyst.Your responsibility involves:1. Generating comprehensive code, including the actual COMPLETE data, for the Senior Analyst to successfully run the chart.2. Ensuring that the code is prepared for immediate execution, WITHOUT ANY PLACEHOLDERS TEXT or missing data.3. Guaranteeing the seamless integration of the received stock price data into the code.4. Structuring the code for execution and utilizing the Amcharts library to present the stock chart."""uidesigner = AssistantAgent(name = "uidesigner",system_message=uidesigner_system_message,code_execution_config=False,  # set to True or image name like "python:3" to use dockerllm_config=llm_config)

4、UserProxyAgent,最后我们在定义一个人工的管理员,这样可以在需要进行人工干预时进行处理

 user_proxy = UserProxyAgent(name="admin",system_message="Human Admin: Let's engage with the analyst to have a discussion about the stock price report. Please ensure that the final report is shared with me for approval before it's finalized.",code_execution_config=False,  # set to True or image name like "python:3" to use dockerhuman_input_mode="NEVER",is_termination_msg=is_termination_msg)

最后我们把这些角色加入到讨论群组中,并且指定讨论的轮数:

 groupchat = autogen.GroupChat(agents=[user_proxy, analyst, uidesigner, engineer], messages=[], max_round=20)manager=autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

最后就是调用

 message = f"""Analyze stock price for GRAB for the last 30 days and create a chart."""user_proxy.initiate_chat(manager, clear_history=True, message=message)

日志解析

我们来看看并分析他们的对话,这样可以了解到工作的具体细节

对话由人工发起,也就是我们最后调用代码的prompt

 admin (to chat_manager):Analyze stock price for GRAB for the last 30 days and create a chart.

聊天管理器向分析师发送了一条消息,要求检索过去30天的Grab股票数据,并向聊天管理器提供输入参数。随后,聊天管理器将此信息传达给工程师。

 analyst (to chat_manager):***** Suggested function Call: fetch_prices *****Arguments: {"days": 30,"symbol": "GRAB"}

在收到来自聊天管理器的指令后,工程师继续执行该函数,获取输出,然后通知聊天管理器。

 >>>>>>>> EXECUTING FUNCTION fetch_prices...[*********************100%%**********************]  1 of 1 completedengineer (to chat_manager):***** Response from calling function "fetch_prices" *****date  open  high   low  close    volume2023-09-20  3.50 3.545 3.410   3.46  136397002023-09-21  3.45 3.460 3.380   3.46  137814002023-09-22  3.48 3.510 3.425   3.43   87082002023-09-25  3.43 3.470 3.385   3.43  109900002023-09-26  3.38 3.450 3.360   3.40  114588002023-09-27  3.40 3.460 3.360   3.38  209211002023-09-28  3.38 3.490 3.360   3.47  144823002023-09-29  3.52 3.590 3.520   3.54  155802002023-10-02  3.49 3.570 3.460   3.48  198456002023-10-03  3.48 3.480 3.330   3.35  273703002023-10-04  3.32 3.410 3.230   3.40  182243002023-10-05  3.37 3.500 3.370   3.48  169040002023-10-06  3.45 3.520 3.445   3.50   93869002023-10-09  3.47 3.480 3.380   3.44  135126002023-10-10  3.51 3.570 3.500   3.53  114927002023-10-11  3.51 3.550 3.480   3.49  109622002023-10-12  3.54 3.560 3.410   3.47  132169002023-10-13  3.44 3.460 3.360   3.42  254741002023-10-16  3.40 3.460 3.370   3.42  228835002023-10-17  3.39 3.460 3.380   3.43  119978002023-10-18  3.40 3.450 3.320   3.33  105019002023-10-19  3.29 3.330 3.260   3.30  14663405*********************************************************

按照分析师的计划,聊天管理器将股票价格数据提供给UI设计师,UI设计师随后使用AmCharts为图表创建代码,并随后向聊天管理器报告。

 uidesigner (to chat_manager):Here is the complete code for the stock chart using the Amcharts library. The code includes the actual data for the last 30 days of the GRAB stock price.```html<!DOCTYPE html><html><head><title>AmCharts Stock Chart</title><script src="https://www.amcharts.com/lib/3/amcharts.js"></script><script src="https://www.amcharts.com/lib/3/serial.js"></script><script src="https://www.amcharts.com/lib/3/amstock.js"></script><script src="https://www.amcharts.com/lib/3/themes/light.js"></script></head><body><div id="chartdiv" style="width: 100%; height: 500px;"></div><script>var chartData = [{ "date": new Date(2023, 8, 20), "open": 3.50, "high": 3.545, "low": 3.410, "close": 3.46, "volume": 13639700 },{ "date": new Date(2023, 8, 21), "open": 3.45, "high": 3.460, "low": 3.380, "close": 3.46, "volume": 13781400 },{ "date": new Date(2023, 8, 22), "open": 3.48, "high": 3.510, "low": 3.425, "close": 3.43, "volume": 8708200 },{ "date": new Date(2023, 8, 25), "open": 3.43, "high": 3.470, "low": 3.385, "close": 3.43, "volume": 10990000 },{ "date": new Date(2023, 8, 26), "open": 3.38, "high": 3.450, "low": 3.360, "close": 3.40, "volume": 11458800 },{ "date": new Date(2023, 8, 27), "open": 3.40, "high": 3.460, "low": 3.360, "close": 3.38, "volume": 20921100 },{ "date": new Date(2023, 8, 28), "open": 3.38, "high": 3.490, "low": 3.360, "close": 3.47, "volume": 14482300 },{ "date": new Date(2023, 8, 29), "open": 3.52, "high": 3.590, "low": 3.520, "close": 3.54, "volume": 15580200 },{ "date": new Date(2023, 9, 2), "open": 3.49, "high": 3.570, "low": 3.460, "close": 3.48, "volume": 19845600 },{ "date": new Date(2023, 9, 3), "open": 3.48, "high": 3.480, "low": 3.330, "close": 3.35, "volume": 27370300 },{ "date": new Date(2023, 9, 4), "open": 3.32, "high": 3.410, "low": 3.230, "close": 3.40, "volume": 18224300 },{ "date": new Date(2023, 9, 5), "open": 3.37, "high": 3.500, "low": 3.370, "close": 3.48, "volume": 16904000 },{ "date": new Date(2023, 9, 6), "open": 3.45, "high": 3.520, "low": 3.445, "close": 3.50, "volume": 9386900 },{ "date": new Date(2023, 9, 9), "open": 3.47, "high": 3.480, "low": 3.380, "close": 3.44, "volume": 13512600 },{ "date": new Date(2023, 9, 10), "open": 3.51, "high": 3.570, "low": 3.500, "close": 3.53, "volume": 11492700 },{ "date": new Date(2023, 9, 11), "open": 3.51, "high": 3.550, "low": 3.480, "close": 3.49, "volume": 10962200 },{ "date": new Date(2023, 9, 12), "open": 3.54, "high": 3.560, "low": 3.410, "close": 3.47, "volume": 13216900 },{ "date": new Date(2023, 9, 13), "open": 3.44, "high": 3.460, "low": 3.360, "close": 3.42, "volume": 25474100 },{ "date": new Date(2023, 9, 16), "open": 3.40, "high": 3.460, "low": 3.370, "close": 3.42, "volume": 22883500 },{ "date": new Date(2023, 9, 17), "open": 3.39, "high": 3.460, "low": 3.380, "close": 3.43, "volume": 11997800 },{ "date": new Date(2023, 9, 18), "open": 3.40, "high": 3.450, "low": 3.320, "close": 3.33, "volume": 10501900 },{ "date": new Date(2023, 9, 19), "open": 3.29, "high": 3.330, "low": 3.260, "close": 3.30, "volume": 14663405 }];var chart = AmCharts.makeChart("chartdiv", {"type": "stock","theme": "light","dataSets": [{"fieldMappings": [{"fromField": "open","toField": "open"}, {"fromField": "high","toField": "high"}, {"fromField": "low","toField": "low"}, {"fromField": "close","toField": "close"}, {"fromField": "volume","toField": "volume"}],"dataProvider": chartData,"categoryField": "date"}],"panels": [{"showCategoryAxis": false,"title": "Value","percentHeight": 70,"stockGraphs": [{"id": "g1","valueField": "close","comparable": true,"compareField": "close","balloonText": "[[title]]:<b>[[value]]</b>","compareGraphBalloonText": "[[title]]:<b>[[value]]</b>"}],"stockLegend": {"periodValueTextComparing": "[[percents.value.close]]%","periodValueTextRegular": "[[value.close]]"}}, {"title": "Volume","percentHeight": 30,"stockGraphs": [{"valueField": "volume","type": "column","showBalloon": false,"fillAlphas": 1}],"stockLegend": {"periodValueTextRegular": "[[value.close]]"}}],"chartScrollbarSettings": {"graph": "g1"},"chartCursorSettings": {"valueBalloonsEnabled": true,"fullWidth": true,"cursorAlpha": 0.1,"valueLineBalloonEnabled": true,"valueLineEnabled": true,"valueLineAlpha": 0.5},"periodSelector": {"position": "left","periods": [{"period": "MM","selected": true,"count": 1,"label": "1 month"}, {"period": "YYYY","count": 1,"label": "1 year"}, {"period": "YTD","label": "YTD"}, {"period": "MAX","label": "MAX"}]},"dataSetSelector": {"position": "left"},"export": {"enabled": true}});</script></body></html>

This code will generate a stock chart for the GRAB stock price for the last 30 days. The chart includes open, high, low, close prices, and volume. The chart also includes a period selector and a data set selector.


因为这个过程不需要任何的人工干预,所以管理员admin没有任何的输入

admin (to chat_manager):



最后分析师提供对股票价格的分析,并与Admin共享反馈,以及生成的图表代码,发送TERMINATE消息以结束对话。

analyst (to chat_manager):

The stock price data for GRAB over the last 30 days shows a slight decrease in the closing price from 3.46 to 3.30. The highest closing price in this period was 3.54, and the lowest was 3.30. The volume of stocks traded also varied significantly, with the highest volume being 27,370,300 and the lowest being 8,708,200.

The chart created by the UI designer will provide a visual representation of these trends, making it easier to understand the stock’s performance over the last month.

TERMINATE


上面就是AutoGen工作的一个完整的流程## 总结我们用AutoGen创建了多个代理。这些代理协作分析股票价格并使用AmCharts生成图表。软件工程师根据分析师的要求检索股票价格信息。设计师拿到股票价格数据、创建图表。而分析师则可以进行分析。AutoGen的AssistantAgents,促进了代理交互和代码执行,以对话的方式执行复杂的任务。[https://avoid.overfit.cn/post/2a2396c634a04041b1c0ffe6cf047ed1](https://avoid.overfit.cn/post/2a2396c634a04041b1c0ffe6cf047ed1)

相关文章:

AutoGen多代理对话项目示例和工作流程分析

在这篇文章中&#xff0c;我将介绍AutoGen的多个代理的运行。这些代理将能够相互对话&#xff0c;协作评估股票价格&#xff0c;并使用AmCharts生成图表。 我们创建对话的目的是要求代理分析特定公司的股票价格&#xff0c;并制作股票价格图表。 为了实现这一目标&#xff0c;…...

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-CNN-…...

使用高防IP防护有哪些优势

高防IP是针对互联网服务器在遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;用户可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;确保源站的稳定可靠。高防IP相当于搭建完转发的服务器。 高防IP有两种接入方式&a…...

android-xml语法

xml解析器 Android的XML文件语法是由Android系统中的解析器解析的。具体来说&#xff0c;Android使用了一个名为"Android Asset Packaging Tool (AAPT)"的工具来解析和处理XML文件。AAPT负责将XML文件编译为二进制格式&#xff0c;并在构建过程中将其打包到Android应…...

【银行测试】第三方支付平台业务流,功能/性能/安全测试方法...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、第三方支付平台…...

全志V3s之显示当前文件路径

新移植的kernel和根文件系统&#xff0c;其终端显示只有一个#号&#xff0c;不方便查看&#xff0c;更改以下配置&#xff0c;使得可以显示全路径。修改如下&#xff1a; export PS1[\u\h \w]\$这个是即时生效的&#xff0c;所以如果要重启或者重新打开窗口也生效的话就要把这…...

小程序跳转tabbar,tabbar页面不刷新

文章地址&#xff1a;12.小程序 之切换到tabBar页面不刷新问题_360问答 解决办法备份&#xff1a; wx.switchTab&#xff1a;跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面 wx.reLaunch&#xff1a;关闭所有页面&#xff0c;打开到应用内的某个页面。 wx.reLa…...

在SpringData JPA 中实现对持久层的操作

1.导入依赖 hibernate 这个依赖自带实现JPA接口 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depen…...

C++ SEH结构化异常捕获处理(双平台支持 Linux、Windows)。

测试&#xff1a; try_ctor();try_call([](){printf("1111111111111111111111\r\n");int* p NULL;*p 100;throw 1;// try_eeh();}, [](){printf("2222222222222222222222\r\n");}); 设置NULL指针P的值引发程式崩溃&#xff0c;可以被正确捕获&#xff0…...

jvm-sandbox-repeater 精简版部署之standalone模式

jvm-sandbox-repeater 仅仅提供了录制回放的能力&#xff0c;如果需要完成业务回归、实时监控、压测等平台&#xff0c;后面须要有一个数据中心负责采集数据的加工、存储、搜索&#xff0c;repeater-console提供了简单的demo示例&#xff1b;一个模块管理平台负责管理JVM-Sandb…...

【JavaWeb笔记】单选框,结合Servlet

各个部分的作用 jsp部分 form action"..."&#xff1a;表单标签&#xff0c;供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio"&#xff1a;输入类型为单选框。把name设置为一样的&#xff0c;这样效果上就是单选&#xff…...

Docker 与 Podman:揭示容器编排的最佳 25 大常见问题解答

让我们告诉你一件事。 这不仅仅是这两个强大平台之间的普通比较。 相反&#xff0c;我们分析并列出了有关 Docker 与 Podman 的最紧迫问题。 但这里有一件事——这些问题不仅被技术角度所包围。 我们还深入研究了业务环境&#xff0c;因为我们知道这不仅仅是关于代码。这是…...

Spark分布式内存计算框架

目录 一、Spark简介 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;Spark和MapReduce区别 &#xff08;三&#xff09;Spark历史 &#xff08;四&#xff09;Spark特点 二、Spark生态系统 三、Spark运行架构 &#xff08;一&#xff09;基本概念 &#x…...

安装python第三方库后,在pycharm中不能正常导入

python小白学习opencv&#xff0c;使用pip安装完opencv库后import cv2报错&#xff0c;按照如下设置解决&#xff1a; 需要正确设置python解释器路径...

从“食”到“用”,燕之屋的未来增长价值几何?

12月12日&#xff0c;燕窝行业头部企业燕之屋在港交所上市。 作为新消费的热门赛道&#xff0c;近年滋补品的关注度一直比较高。“领头燕”登陆资本市场&#xff0c;是消费者健康养生意识不断提高&#xff0c;滋补品成为营养补充主流的一个积极信号。 长期以来&#xff0c;中…...

C++使用策略模式,减少使用switch...case...

目录 原理函数类模板函数使用switch...case...不使用switch...case... 知识点decltypestd::remove_reference 原理 函数 #include <iostream> #include <functional> #include <map>void fun1(int a, int b) {std::cout << "fun1 : a "<…...

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)

WebAppDbTest 项目准备 项目准备1、.net cli 创建项目2、nuget 包引用和项目结构2.1、项目添加相关 nuget 包2.2、WebAppDbTest 项目结构 3、项目代码说明3.1、CSharp/C# 类文件说明3.2、json 配置文件说明 4、项目运行预览 数据库 .db 文件准备1、创建 SQLite 数据库1.1、在 W…...

2024 年,新程序员如何与AI共赢!!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

Debian 系统镜像下载

最近在看一些网络相关的文章需要用到 debian 11.x 的系统网上找了好多都发下载&#xff0c;在官网看一下 有个 11.8 的版本我无法下载&#xff0c;提示被最新的 debian-12.4.0 所代替&#xff0c;于是找到了这个链接 Index of /cdimage/unofficial/non-free/cd-including-fi…...

数据结构和算法(全)

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...